关闭

窥探 kernel --- 初识进程调度器 http://blog.csdn.net/muge0913/article/details/7561323

291人阅读 评论(0) 收藏 举报
分类:

窥探 kernel --- 初识进程调度器

分类: 嵌入式linux kernel篇 2437人阅读 评论(0) 收藏 举报

本文章由张同浩编写,转载请注明出处:http://blog.csdn.net/muge0913/article/details/7561323


多任务操作系统可分为非抢占式多任务和抢占式多任务。和大多数现代操作系统一样,linux也采用了抢占式多任务模式。这也就是说任务占用cpu的时间由调度器来决定。

 

调度策略:

决定在什么时候用怎样的方式选择一个新的进程在哪个cpu上运行多长时间的规则称为调度策略。

 

通常情况下,使用什么样的调度策略与进程的类型有关。进程常分为cpu消耗型和IO消耗型。

另一种分类方式为:

1、交互式进程(interactiveprocess):此类进程需要大量的人机交互,这样的进程会不断的睡眠,等待键盘和鼠标操作将其唤醒。这样的进程对系统响应时间要求高。典型的进程如文本编辑程序。

2、批处理进程(batch process):这样的进程不需要人机交互,常在后台进程,能忍受响应的迟缓,如编译器。

3、实时进程(real-time process):这样的进程对系统响应时间要求很高。如视频音频播放软件。

注:为了与实时进程对应,交互进程和批处理进程常称为普通进程。


策略标志:

SCHED_NORMAL:默认的调度策略,在旧版本中名为SCHED_OTHER, 分时调度策略

SCHED_BATCH:针对批处理进程。

SCHED_IDLE:使用此调度器的进程的优先级最低。在实现CFS时引入。

SCHED_FIFO:针对实时进程的先进先出策略。一旦占用cpu就一直进行,直到有更高的优先级的进程或自己放弃cpu。适合时间要求高,每次运行时间短的进程。

SCHED_RR:针对实时进程的时间片轮转策略。进程的时间片用完后,系统会重新为其分配时间片,并把它放到队列的尾端。这样就能让每个进程都能运行一段时间。适用于每次执行时间较长的进程。

 

总结:SCHED_NORMAL,SCHED_BATCH,SCHED_IDLE:都是用与普通进程。区别:SCHED_NORMAL为默认的调度策略。SCHED_BATCH用于批处理进程。SCHED_IDLE用于优先级最低的后台程序。SCHED_NORMAL和SCHED_BATCH求别只是在唤醒时有区别。唤醒较频繁的进程不适合SCHED_BATCH。进程采用的调度策略反应在policy中,它的值为上面的值。子进程会继承父进程的policy。同时我们也可以通过sched_setscheduler来修改它。

 

 

 

所有任务都采用linux分时调度策略时。

1,创建任务指定采用分时调度策略,并指定优先级nice值(-20~19)。

2,将根据每个任务的nice值确定在cpu上的执行时间(counter)。

3,如果没有等待资源,则将该任务加入到就绪队列中。

4,调度程序遍历就绪队列中的任务,通过对每个任务动态优先级的计算(counter+20-nice)结果,选择计算结果最大的一个去运行,当这个时间片用完后(counter减至0)或者主动放弃cpu时,该任务将被放在就绪队列末尾(时间片用完)或等待队列(因等待资源而放弃cpu)中。

5,此时调度程序重复上面计算过程,转到第4步。

6,当调度程序发现所有就绪任务计算所得的权值都为不大于0时,重复第2步。

 

 

所有任务都采用FIFO时,

1,创建进程时指定采用FIFO,并设置实时优先级rt_priority(1-99)。

2,如果没有等待资源,则将该任务加入到就绪队列中。

3,调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值最高的任务使用cpu,该FIFO任务将一直占有cpu直到有优先级更高的任务就绪(即使优先级相同也不行)或者主动放弃(等待资源)。

4,调度程序发现有优先级更高的任务到达(高优先级任务可能被中断或定时器任务唤醒,再或被当前运行的任务唤醒,等等),则调度程序立即在当前任务堆栈中保存当前cpu寄存器的所有数据,重新从高优先级任务的堆栈中加载寄存器数据到cpu,此时高优先级的任务开始运行。重复第3步。

5,如果当前任务因等待资源而主动放弃cpu使用权,则该任务将从就绪队列中删除,加入等待队列,此时重复第3步。

 

 

所有任务都采用RR调度策略时

1,创建任务时指定调度参数为RR,并设置任务的实时优先级和nice值(nice值将会转换为该任务的时间片的长度)。

2,如果没有等待资源,则将该任务加入到就绪队列中。

3,调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值最高的任务使用cpu。

4,如果就绪队列中的RR任务时间片为0,则会根据nice值设置该任务的时间片,同时将该任务放入就绪队列的末尾。重复步骤3。

5,当前任务由于等待资源而主动退出cpu,则其加入等待队列中。重复步骤3。

 

 

 

系统中既有分时调度,又有时间片轮转调度和先进先出调度

1,RR调度和FIFO调度的进程属于实时进程,以分时调度的进程是非实时进程。

2,当实时进程准备就绪后,如果当前cpu正在运行非实时进程,则实时进程立即抢占非实时进程。

3,RR进程和FIFO进程都采用实时优先级做为调度的权值标准,RR是FIFO的一个延伸。FIFO时,如果两个进程的优先级一样,则这两个优先级一样的进程具体执行哪一个是由其在队列中的位置决定的,这样导致一些不公正性(优先级是一样的,为什么要让你一直运行?),如果将两个优先级一样的任务的调度策略都设为RR,则保证了这两个任务可以循环执行,保证了公平。











 


版权声明:本文为博主原创文章,未经博主允许不得转载。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    文章分类