linux系统中的进程调度

linux系统中的进程调度:

linux系统支持实时和非实时两种进程,

实时进程采用SCHED_FIFO或者SCHE_RR调度策略,普通进程采用SCHE_OTHER调度策略。在调度算法的实现上,linux内核中每个任务都用task_struct结构体来表示,在该结构中有四个与调度相关的策划那个晕,是rt_proiritypolicyproority(nice)counter。内核调度程序根据这四个成员进行调度。

SVHED_OTHER调度策略中调度器总是选择哪个priority+counter值最大的进程来调度执行。从逻辑上分析,SCHED_OTHER调度策略存在着调度周期(epoch),每一个调度周期中,一个进程的prioritycounter值的大小影响而来当前时刻应该调度哪一个进程来执行,其中priority是一个固定不变的值,在进程创建时就已经确定,它代表了该进程的优先级,也代表着该进程在每个调度周期中能够得到的时间片的多少;counter是一个动态变化的值,它反映了一个进程在当前的调度周期中还剩下的时间片,不再与本调度周期的进程调度。当所有的时间片都用完时,一个调度周期结束,周而复始。在2.4内核版本以上的内核中,prioritynice取代,但二者类似。

所以SCHRD_OTHER调度策略本质上是一种比例共享的调度策略,它的这种设计方法能够保证进程调度的公平性——一个低级优先级的进程在每个epoch中欧冠也会得到自己应得的CPU时间,也提供了不同优先级别的区分,具有较高的priority值的进程能够获得更多的饿CPU时间片

实时进程使用的是基于实时优先级rt_priority的优先级调度策略,但根据不用的调度策略,同一实时优先级的进程之间的调度方法有所不同:

(1) ECHED_FIFO:不同的进程根据静态优先级进行排队,然后再同一个优先级的队列中,谁先准备好运行就点调度谁,并且正在运行的进程不会被终止直到以下情况发生;

a.被拥有更高优先级的进程所抢占CPU

b.自己因为资源请求而阻塞

c.自己主动放弃CPU(调用sched_yield

(2) SCHED_RR:这种调度策略跟上面的一样,除了给每个进程分配一个时间片。时间片到了正在执行的进程就放弃执行;时间片的程度可以通过sched_rr_get_intrval.

你可能感兴趣的:(linux,算法,struct,任务,linux内核)