一、Linux进程的R、S、D、T、Z、X状态
R(TASK_RUNNING):进程处于ready状态,及可执行状态
S(TASK_INTERRUPTIBLE):可以中断的睡眠状态
D(TASK_UNINTERRUPTIBLE):不可中断的睡眠状态,很少见
T(TASK_STOPPED or TASK_TRACED):暂停或者跟踪状态,收到sigstopt信号变为暂停状态,收到sigcont变为running状态;gdb调试及跟踪状态
Z(TASK_DEAD-TASK_ZOMBIE):退出状态,进程称为僵尸进程(子进程退出)
X(TASK_DEAD-EXIT_DEAD):退出状态,进程即将被销毁(一个进程cancel另一个进程)
在平时工作中其中R和S最常见,当进程接受消息队列,sleep等,进程处于阻塞状态(S)。
一般状态变化,R-S,S-R
二、Linux提供两种优先级:普通进程优先级、实时进程优先级
实时进程优先级
实时优先级采用两种调度算法:SCHED_FIFO(先入先出调度算法)、SCHED_RR(时间片轮询调度算法)
实时优先级调度特点:只有静态优先级,不会调整优先级,默认优先级0-99(MAX_RT_PRIO=100)。nice值只影响100~100+40的进程优先级.
总结:对FIFO,只有当进程执行完毕才能轮到其他进程执行
对RR,一旦时间片消耗完,则将该进程放到队列末端,其他进程才能执行。
普通进程优先级
普通优先级采用的调度算法:SCHED_NORMAL(CFS调度器实现)
普通优先级调度特点:根据动态优先级调度,动态优先级由静态优先级调整而来。静态优先级由内核隐藏,但是提供接口:由nice值计算得到:
static_prio = MAX_RT_PRIO(默认100)+ nice +20
nice取值范围是 -20~19,所以静态优先级100~139
并且进程时间片也是有静态优先级得到:
If( static_prio < 120 )
time = ( 140 – static_prio )*20
else if( static_prio >= 120)
time = ( 140 –static_prio )*5
动态优先级主要考虑的两个因素:静态优先级和进程平均运行时间bouns值,计算公式:
dynamic_prio = max( 100,min(static_prio-bouns+5 ,139)
bouns值的大小0-10,当大于5表示优先级提高,当小于5时优先级变低;Linux内核会根据进程的平均运行时间动态的改变进程的动态优先级。一般来说,交互式进程的平均运行时间比较长,因此Linux内核会奖励从而增加bouns的值。
总结:实时进程只考虑静态优先级;普通进程一般不需要太在意进程优先级,因为内核会动态调整进程的优先级。