欢迎光临散文网 会员登陆 & 注册

一文深入理解Linux进程!

2022-07-21 14:38 作者:补给站Linux内核  | 我要投稿

进程

程序是指储存在外部存储(如硬盘)的一个可执行文件, 而进程是指处于执行期间的程序, 进程包括  和 , 除了代码段和数据段外, 进程一般还包含打开的文件, 要处理的信号和CPU上下文等等.代码段(text section)数据段(data section)

进程描述符

Linux进程使用 来描述(include/linux/sched.h), 如下:struct task_struct

Linux把所有的进程使用双向链表连接起来, 如下图(来源<Linux设计与实现>):



Linux内核为了加快获取当前进程的的task_struct结构, 使用了一个技巧, 就是把task_struct放置在内核栈的栈底, 这样就可以通过 快速获取到当前运行进程的task_struct结构.如下图:esp寄存器


【文章福利】小编推荐自己的Linux内核技术交流群:【891587639】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!(含视频教程、电子书、实战项目及代码)     

  

取当前运行进程的task_struct代码如下:

进程状态

进程描述符的state字段用于保存进程的当前状态, 进程的状态有以下几种:

  • TASK_RUNNING (运行)– 进程处于可执行状态, 在这个状态下的进程要么正在被CPU执行, 要么在等待执行(CPU被其他进程占用的情况下).

  • TASK_INTERRUPTIBLE (可中断等待)– 进程处于等待状态, 其在等待某些条件成立或者接收到某些信号, 进程会被唤醒变为运行状态.

  • TASK_UNINTERRUPTIBLE (不可中断等待)– 进程处于等待状态, 其在等待某些条件成立, 进程会被唤醒变为运行状态, 但不能被信号唤醒.

  • TASK_TRACED (被追踪)– 进程处于被追踪状态, 例如通过ptrace命令对进程进行调试.

  • TASK_STOPPED (停止)– 进程处于停止状态, 进程不能被执行.一般接收到SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU信号进程会变成TASK_STOPPED状态.

个钟状态间的转换如下图:


进程的创建

在Linux系统中,进程的创建使用fork()系统调用,fork()调用会创建一个与父进程一样的子进程,唯一不同就是fork()的返回值,父进程返回的是子进程的进程ID,而子进程返回的是0。

Linux创建子进程时使用了,也就是创建子进程时使用的是父进程的内存空间,当子进程或者父进程修改数据时才会复制相应的内存页。写时复制(Copy On Write)

当调用fork()系统调用时会陷入内核空间并且调用sys_fork()函数,sys_fork()函数会调用do_fork()函数,代码如下(arch/i386/kernel/process.c):

do_fork()主要的工作是申请一个进程描述符, 然后初始化进程描述符的各个字段, 包括调用 copy_files() 函数复制打开的文件, 调用 copy_sighand() 函数复制信号处理函数, 调用 copy_mm() 函数复制进程虚拟内存空间, 调用 copy_namespace() 函数复制命名空间.代码如下:

值得注意的是do_fork() 还调用了 copy_thread() 这个函数, copy_thread()这个函数主要用于设置进程的CPU执行上下文 结构.代码如下:struct thread_struct

do_fork() 函数最后调用 wake_up_process() 函数唤醒子进程, 让子进程进入运行状态.

内核线程

Linux内核有很多任务需要去做, 例如定时把缓冲中的数据刷到硬盘, 当内存不足的时候进行内存的回收等, 这些工作都需要通过内核线程来完成.内核线程与普通进程的主要区别就是: 内核线程没有自己的 , 每次内核线程执行的时候都是借助当前运行进程的虚拟内存空间结构来运行, 因为内核线程只会运行在内核态, 而每个进程的内核态空间都是一样的, 所以借助其他进程的虚拟内存空间结构来运行是完成可行的.虚拟空间结构(struct mm)

内核线程使用 kernel_thread() 函数来创建, 代码如下:

因为这个函数式使用嵌入汇编来实现的, 所以有点难懂, 不过主要过程就是通过调用  来创建一个新的进程, 而创建进程是通过传入  标志来指定进程借用其他进程的虚拟内存空间结构_clone()函数CLONE_VM








一文深入理解Linux进程!的评论 (共 条)

分享到微博请遵守国家法律