Linux 进程调度简单理解

一、Linux进程的RSDTZX状态

RTASK_RUNNING:进程处于ready状态,及可执行状态

STASK_INTERRUPTIBLE):可以中断的睡眠状态

DTASK_UNINTERRUPTIBLE:不可中断的睡眠状态,很少见

TTASK_STOPPED or TASK_TRACED):暂停或者跟踪状态,收到sigstopt信号变为暂停状态,收到sigcont变为running状态;gdb调试及跟踪状态

ZTASK_DEAD-TASK_ZOMBIE):退出状态,进程称为僵尸进程(子进程退出)

XTASK_DEAD-EXIT_DEAD):退出状态,进程即将被销毁(一个进程cancel另一个进程)

在平时工作中其中RS最常见,当进程接受消息队列,sleep等,进程处于阻塞状态(S)。

一般状态变化,R-S,S-R

通过ps -l查看进程状态 s(state)那列

ready.PNG

二、Linux提供两种优先级:普通进程优先级、实时进程优先级

1、  实时进程优先级

实时优先级采用两种调度算法:SCHED_FIFO(先入先出调度算法)、SCHED_RR(时间片轮询调度算法)

实时优先级调度特点:只有静态优先级,不会调整优先级,默认优先级0-99MAX_RT_PRIO=100)。nice值只影响100~100+40的进程优先级.

总结:对FIFO,只有当进程执行完毕才能轮到其他进程执行

RR,一旦时间片消耗完,则将该进程放到队列末端,其他进程才能执行。

2、  普通进程优先级

普通优先级采用的调度算法:SCHED_NORMALCFS调度器实现)

普通优先级调度特点:根据动态优先级调度,动态优先级由静态优先级调整而来。静态优先级由内核隐藏,但是提供接口:由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的值。

总结:实时进程只考虑静态优先级;普通进程一般不需要太在意进程优先级,因为内核会动态调整进程的优先级。


猜你喜欢

转载自blog.51cto.com/zhaoxiaohu/2413406