第三章:进程管理-进程描述符及任务结构

内核把进程的列表存放在叫做任务队列(task_list)的双向循环链表中,链表中每一项都是类型为task_struct、称为进程描述符的结构。
进程描述符包含了一个具体进程的所有信息。
进程描述符中包含的数据能完整地描述一个正在进行的程序:它打开的文件、进程的地址空间、挂起的信号、进程的状态,还有其他更多信息。
Linux通过slab分配器分配task_struct结构,这样能达到对象复用和缓存着色的目的。
内核通过一个唯一的进程标识值PID来标识每个进程。
内核把每个进程的PID存放在它们各自的进程描述符中。
PID的最大值为32768;
PID的最大值很重要,因为它实际上是系统中允许同时存在的进程的最大数量。
进程数据量越小,转一圈就越快,本来数值大的进程比数值的进程迟运行,但是这样一来就破坏了这一原则。
在内核中,访问任务通常需要获得指向其task_struct的指针。实际上内核中大部分处理进程的代码都是直接通过task_struct进行的。
 
进程状态
进程描述符中的state域描述了进程的当前状态,系统中每个进程都必然处于五种状态中的一种:
  • task_running(运行)
进程是可以执行的,它或者正在执行,或者在运行队列中等待执行。这是进程在用户空间中执行的唯一可能状态。
  • task_interruptible(可中断)
进程正在休眠(也就是说它被阻塞),等到某些条件达成,一旦条件达成,内核就会把进程状态设置为运行。处于此状态的进程也会因为接收到信号而提前被唤醒并随时准备投入运行。
  • task_uninterruptible(不可中断)
除了就算是接收到信号也不会被唤醒或者准备投入运行外,这个状态与可中断状态相同,这个状态通常在进程必须在等待时不受干扰或者等待事件很快会发生时出现。
  • _task_traced
被其他进程跟踪的进程。
  • _task_stopped(停止)
进程停止状态,进程没有投入运行也不能投入运行。
 
进程上下文
可执行程序代码是进程的重要组成部分。这些代码从一个可执行文件载入到进程的地址空间执行。
一般程序在用户空间运行。
但一个程序调用执行了系统调用或者触发了某个异常,它就会陷入内核空间。此时我们成内核“代表进程执行”并处于进程上下文中。
 
特别提醒:在一个拥有大量进程的系统中通过重复来遍历所有的进程代价很大,因此,如果没有充足的理由,别这样做。

猜你喜欢

转载自www.cnblogs.com/use-D/p/10680814.html