进程的目的就是担当分配资源的实体,一个进程又几个用户线程程。每个线程代表一个执行流。线程的实现方法有三种:1、用户级线程;2、内核级线程;3、混合线程模型。Linux内核中的进程和线程都用相同的数据结构task_struct表示;线程是特殊的进程,共享同一地址空间、共同合作。
进程描述符都是task_struct,包含了与进程相关的所有信息。一般来说能被调度的每个执行上下文都必须拥有自己的task_struct,即使是轻量级线程。
进程状态
可执行状态(TASK_RUNNING):处于这个状态要么在CPU上执行,要么准备执行。
可中断的睡眠状态(TASK_INTERRUPTIBLE):进程被挂起,指导某个条件变为真,产生一个硬件中断,释放进程正在等待的资源或传递一个信号把进进程唤醒,从而使等待的进程回到TASK_RUNNING。
不可中断的睡眠状态(TASK_UNINTERRUPTIBLE):不能通过信号唤醒。
暂停状态(TASK_STOPPED ):进程收到SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU信号进入暂停状态。
跟踪状态( TASK_TRACED):进程的执行已由debugger程序暂停。
僵死状态(EXIT_ZOMBIE):进程的执行被终止,但是父进程还没有发布wait4()或waitpid()系统调用来返回关于死亡进程的信息。发布wait()系统调用之前,内核不能丢弃包含在死亡进程描述符中的数据,因为父进程还需要它。
僵死撤销状态(EXIT_DEAD):父进程刚发布wait4()或waitpid()系统调用,因而进程被删除。
task_struct结构
Linux用task_struct结构表示进程,2.6内核的task_struct结构相对于2.4内核有很大变化。该结构记录了进程的重要信息,与进程调度有关的信息包括:
(1)state
进程状态由state成员变量表示。一个进程共有7种可能状态,分别是:TASK_RUNNING、TASK_INTERRUPTIBLE、TASK_UNINTERRUPTIBLE、TASK_STOPPED、TASK_TRACED、EXIT_ZOMBIE和EXIT_DEAD
(2)timestamp
进程发生调度事件的时间(单位是
(3)prio,
进程的优先级和静态优先级。Prio表示进程的动态优先级,与2.4内核中goodness()的计算结果相当。在0~MAX_PRIO-1之间取值(MAX_PRIO
(4)sleep_avg
进程的平均等待时间,在0到NS_MAX_SLEEP_AVG之间取值,初值为0,相当于进程等待时间与运行时间的差值。它是动态优先级计算的关键因子,sleep_avg越大,计算出来的进程优先级也越高。
(5)interactive_credit
该变量表示进程的交互程度。在-CREDIT_LIMIT到CREDIT_LIMIT+1之间取值,初始值为0,而后根据不同的条件加1减1,一旦该值超过CREDIT_LIMIT,即表示该进程是交互进程。
(6)array
指向当前CPU的active就绪进程队列。
(7)run_list
进程通过这个list_head变量连接自己到prio_array数组中queue队列,这样相同优