linux内核学习-进程调度一

进程调度:

    多任务系统可划分为非抢占式多任务和抢占式多任务

    调度策略,I/O消耗型和处理器消耗型进程,I/O消耗型指进程大部分时间用来提交I/O请求或等待I/O请求。处理器消耗型指进程把大多数时间花费在执行代码上,没有太多I/O请求,对于这类响应要求不高的进程,调度策略是尽量降低运行频率,延长其运行时间,调度策略往往在进程响应速度和最大系统利用率之间寻求平衡。

   进程优先级,动态优先级的调度方法:如果一个进程在i/o等待上耗费的时间多余其他的运行时间,明显属于I/O 消耗型进程,它的优先级被提高,如果一个进程的全部时间片一下被耗尽,该进程属于处理器消耗型,他的优先级动态降到最低。(为了响应迅速,动态提高I/O消耗型进程,降低处理器消耗型进程)

    linux内核提供两组独立的优先级范围。第一种是nice值(-20~19)默认值是0.nice值越大,优先级越低。nice值决定分配给进程的时间片的长短。第二种是实时优先级,默认(0~99)任何实时进程优先级高于普通进程。

     时间片:时间片太长会导致系统对交互的响应表现欠佳,时间片太短会明显增大进程切换带来的处理器消耗。linux动态提高交互式程序优先级并可以根据优先级动态分配时间片,这种动态分配的机制非常稳定且强健。且进程的时间片不必一次全部耗尽,可以分几次重复调度,当时间片耗尽时,认为进程到期了,没有时间片的进程不会再投入运行。

     可执行队列:每个处理器对应一个可执行队列,cpu_rq(processor)宏用于返回给定处理器可执行队列的指针

     死锁和自旋(在以后的章节详细解释)

     优先级数组:struct prio_array{

                            int   nr_active;(保存该优先级数组内可执行进程的数目)

                            unsigned long bitmap[BitmapSize];(优先级位图)

                            struct list_head queue[Max_Prio];(优先级队列)

                                                    }

      unsigned long长32位,140个优先级需要5个长整型数(因为5*32=160)才能表示。一开始,所有的位都被置为0,当某一个拥有一定优先级的进程开始准备执行时,位图中相应的位就会被置为1,查找图中最高的优先级就是查找图中被设置的第一个位。其中优先级队列都是一个链表,每个链表与一个给定的优先级对应,对于给定的优先级,按轮转方式调度任务。


      重新计算时间片:每个处理器维护两个优先级数组,既有活动数组又有过期数组,活动数组内的可执行队列上的进程都还有时间片剩余,而过期数组内的可执行队列上的进程都耗尽了时间片。当一个进程的时间片耗尽时,它会被移至国旗数组,但在移动前,它的时间片已经重新计算好了。(这里不是很理解,交换数组就可以重新计算时间片了?


      schedule()选定下一个进程并切换到它去执行是通过schedule()函数实现的。该函数独立于处理器运行,每一个cpu都要对下一次该运行的哪个进程作出自己的判断。首先该函数找到第一个被设置的位,该位对应着优先级最高的可执行进程。然后调度程序选择这个级别链表里的头一个进程,这也就是马上要执行的进程


     


     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值