Linux内核之进程管理

进程:

进程就是处于执行期的程序以及它包含的资源总和。
线程是进程中的活动对象,每个线程拥有一个独立的程序计数器、进程栈和一组进程寄存器。
内核调度的是线程,而不是进程。

进程描述符:

  内核的进程描述符为task_struct结构体,定义在<linux/sched.h>,进程描述符包含了一个进程的所有信息。包括:进程标识符、进程当前状态、栈地址空间、内存地址空间、文件系统、打开的文件、信号量等。
  内核把进程的列表存放在叫做任务列表(task list)的双向循环链表,链表中每一项都是类型为task_struct的进程描述符。
进程描述符在内存的中存放位置比较有特点,由于系统需要频繁的获取当前进程描述符的地址,为提高效率,linux设置了current宏。
  Linux在内核栈的末端存放一个特殊的结构体thread_info,在thread_info中的task存放着task_struck的位置,于是就能找到进程描述符。

进程状态:

task_struck中的state描述进程的状态

  • TASK_RUNNING(运行):进程正在执行或者在等待队列中等待执行
  • TASK_INTERRUPTIBLE(可中断):进程正在睡眠(就是被阻塞)等待某些条件达成,条件达成后内核就会把进程状态设置为运行,处在这个状态的进程可能会收到信号而提前被唤醒
  • TASK_UNINTERRUPBLE(不可中断):在等待的过程中对信号不作响应,较少使用
  • _TASK_TRACED:被其他进程跟踪的进程
  • _TASK_STOPPED:停止执行,通常发生在进程收到SIGSTOP/SIGTSTP/SIGTTIN/SIGTTOU等信号后进入该状态
    盗一张图来说明一下进程状态转换的过程:

 

Linux内核之进程管理

进程上下文

  应用程序一般在用户空间执行,当执行系统调用时或者触发某个异常,就会陷入内核空间。此时,我们称内核“代表进程执行”并处于进程上下文中。系统调用和异常处理程序是对内核明确定义的接口,进程只有通过这些接口才能陷入内核执行—-对内核的所有访问都必须通过这些接口。
  进程上下文和中断上下文是操作系统中很重要的两个概念,不太好理解。处理器总处于以下三种状态之一:
- 内核态,运行于进程上下文,内核代表进程运行于内核空间
- 内核态,运行于中断上下文,内核代表硬件运行于内核空间
- 用户态,运行于用户空间
  用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递 很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存 器值、变量等。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。