Linux 进程调度简单理解

1、Linux进程的RSDTZX状态算法

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

STASK_INTERRUPTIBLE):能够中断的睡眠状态spa

DTASK_UNINTERRUPTIBLE:不可中断的睡眠状态,不多见调试

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

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

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

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

通常状态变化,R-S,S-R进程

经过ps -l查看进程状态 s(state)那列消息队列

ready.PNG

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

一、  实时进程优先级

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

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

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

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

二、  普通进程优先级

普通优先级采用的调度算法: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的值。

总结:实时进程只考虑静态优先级;普通进程通常不须要太在乎进程优先级,由于内核会动态调整进程的优先级。

相关文章
相关标签/搜索