Linux内核进程调度

进程可以分为I/O消耗型和处理器消耗型
 I/O消耗型的进程大部分时间都用在了提交IO请求或者等待IO请求,这样的进程经常处于可运行状态,但是通常都是运行短短的一会,因为它等待更多的IO请求时最后总是被阻塞.(IO包括键盘活动等,并不仅仅局限于磁盘IO)


处理器消耗型:把时间都用在了执行代码上,除非被抢占,否则他们通常都一直不停的运行,从系统得速度考虑,不应该让这样的进程经常运行,调度策略是尽可能降低它们的运行频率。 


调度策略在两个矛盾中寻找平衡:进程响应速度(响应时间短)和最大系统利用率(高吞吐量)


进程调度更倾向于调度IO消耗型的进程.




调度算法基于优先级,就是优先级高的进程先运行,低的后运行相同优先级按照轮转方式进行调度,(优先级高的进程时间片也较长),调度程序总是选择时间片未用完而且优先级最高的进程运行.


Linux根据以上的思想实现了动态优先级的调度算法。例如一个进程在IO等待上耗费的时间多于其运行的时间,那么该进程明显属于IO消耗型的进程,它的动态优先级就会被提高。如果一个进程的全部时间片一下就被耗尽,那么该进程属于处理器消耗型的进程,它的动态优先级就会被降低.


Linux内核提供了两种优先级范围:


1.nice值:(静态优先级)
 -20到+19
 默认是0
时间片的长度是800 100 5毫秒
2.实时优先级
   默认范围是0到99.任何实时的进程的优先级都高于普通的进程。Linux对POSIX实时优先级支持


进程具有一个初始的优先级就是静态优先级,被用户指定后,不能被修改。而动态优先级以nice值为基数再加上-5和+5之间的进程交互性的奖励和罚分。


例如:一个交互性很强的进程,即使它的nice值是10,它的动态优先级最终也有可能达到5,相反一个温和的处理器吞噬者,虽然本来nice值一样是10,但它最后的动态优先级有可能是12.


调度程序通过进程的休眠时间来判断进程是IO消耗型还是处理器消耗型
  
  例如:
      一个进程的大部分时间都是在休眠,那么它就是IO消耗型的,如果一个进程的执行时间比休眠的时间长,那么它就是一个处理器消耗型的.




进程类型                    nice值             时间片长度
----------------------------------------------------------------------------
初始创建的进程            父进程的值             父进程的一半
优先级最低的进程              +19                  5毫秒(MIN_TIMESLICK)
默认优先级的进程               0                  100毫秒(DEF_TIMESLICK)
优先级最高的进程             -20                  800毫秒(MAX_TIMESLICK)
 
===========================================================================


时间片重新计算:


    它以静态优先级为基础来计算时间片


在一个进程创建的时候,新建的子进程和父进程均分父进程剩余的进程时间片.
每一个进程fork一个新的进程时候 父子进程的时间片为父进程fork前的时间片的一半.
子进程分享父进程的时间片.


进程抢占


   当一个进程进入TASK_RUNNING状态,内核会检查它的优先级是否高于当前正在执行的进程,如果是,调度程序就会被唤醒,抢占当前正在运行的进程并且运行新的可运行进程,当一个进程的时间片变为0时,它会被抢占,调度程序被唤醒以选择一个新的进程.


Linux2.6内核实现了以下目标:
   1.充分实现O(1)程度
   2.全面实现SMP的可扩展性 每个处理器有自己的锁和可执行队列
   3.强化SMP的亲和力.尽量将一组任务分配给一个CPU进行连续的执行,只有在需要平衡任务队列大小时才在CPU之间移动进程.
   4.加强交互性能.即使在系统处于相当负载的情况下,也能保证系统得响应,并立即调度交互式进程.
   5.保证公平。在合理设定的时间范围内,没有进程会处于饥饿状态.同样也不会有进程能够显失公平得得到大量的时间片.
   6.显然最常见的优化情况就是系统中只有1到2个可运行进程,但是优化也完全有能力扩展到具有多处理器且每个处理器上运行多个进程的系统中。


进程休眠和唤醒


休眠的进程处于一个特殊的不可执行状态.休眠的两种相关进程状态:TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE.
它们两个唯一的区别就是处于TASK_UNINTERRUPTIBLE的进程会忽略信号,而处于TASK_INTERRUPTIBLE状态的进程如果接收到一个信号会被提前唤醒并响应该信号.两个进程都处于同一个等待队列上,等待某些事件不能够运行.




负载平衡程序
 
它负责保证可执行队列之间的负载处于均衡状态。负载平衡程序会拿当前处理器的可执行队列和系统中的其他可运行队列来做比较.如果它发现了不均衡,就会把相对繁忙的队列中的进程抽到当前可运行的队列中来.附在程序已经很接近的做到了每个队列上的进程数据相等.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值