《Linux内核设计与实现》读书笔记:进程调度

多任务系统可划分为:非抢占式多任务和抢占式多任务,区别在于能否发生抢占动作

2.5内核开始使用O(1)调度程序,使用了静态时间片算法和针对每一处理器的运行队列

该调度算法对于调度那些响应时间敏感(交互进程)的程序先天不足

2.6.23内核开始使用“反转楼梯最后期限算法”(RSDL)替代了O(1)算法,它被称为“完全公平调度算法”

策略

    IO消耗性和处理器消耗性进程

    前者指进程的大部分时间用来提交IO请求或是等待IO请求,它们经常处于运行状态但通常都只运行一会儿,大部分时候IO请求会阻塞,如GUI界面

    处理器消耗性进程把时间大多用在执行代码上,除非被抢占,否则它们通常都一直不停的运行没有IO需求,但是系统不应该让它们一直运行,调度策略是尽量降低它们的调度频率而延长其运行时间

    调度策略要在进程响应速度和最大系统利用率上找平衡

    Linux的优先级策略:使用nice优先级和实时优先级两个

    关于时间片:Linux的调度器并没有直接分配时间片到进程,它是将处理器的使用比划分给了进程,这样一来进程获取的处理器时间与处理器负载密切相关,这个比例进一步还会受到nice值的影响,nice值作为权重将调整进程所使用的处理器时间使用比

    新的CFS调度器,其抢占时机取决于新的可运行程序消耗了多少处理器使用比,如果小于当前进程,那么立即抢占,否则推迟运行

Linux调度算法

    Linux调度器以模块方式提供,允许不同类型有针对性地选择调度算法

    调度器类

        模块化结构,允许多种不同的可动态添加的调度算法并存,调度属于自己范畴的进程

    Unix系统调度器实质问题:分配绝对时间片引发的固定切换频率给公平性造成了很大的变数

    CFS的做法是允许每一个进程运行一段时间、循环轮转、选择运行最少的进程作为下一个运行进程,而不再采用分配给每个进程时间片的做法,CFS在所有可运行进程总数基础上计算出每一个进程应该运行多久而不是依靠nice值来计算时间片,nice值被用来获取处理器的使用权重

    任何进程所获得的处理器时间是由它自己和其他所有可运行进程nice值的相对差值决定的,nice值对时间片的影响不再是算数加权而是几何加权,任何nice值对应的绝对时间不再是一个绝对值,而是处理器的使用比

    CFS不是完美的公平,它只是近乎完美的多任务

    Linux调度的实现

        位于kernel/sched_fair.c

        时间记账

            对运行时间做记账确保进程只在公平分配给它的处理器时间内运行

            调度器实体结构为一个名叫se的成员变量,位于task_struct

            系统通过周期性调用update_curr(),无论是在进程可运行状态还是被堵塞状态,vruntime可以准确地测量给定进程的运行时间,而且可知道谁应该是下一个被运行的进程

        进程选择

            挑一个具有最小vruntime的进程

            使用红黑树来组织可运行进程队列,比利用其迅速找到最小vruntime值的进程

            rbtree,是一个自平衡二叉搜索树,寻找最小vruntime值的进程就是返回最左页子节点,但是一般都不会遍历,而是储存下当前时刻的最左叶子节点(再每新插入一个数据的时候进行缓存)

        调度器入口

            schedule()函数,定义在sched.c中

            其中有一个pick_next_task()函数,会以优先级为序,从高到低依次检查每一个调度类,选择最高优先级的进程

        睡眠和唤醒

            进程休眠时内核的操作都相同:进程把自己标记成休眠状态,从可执行红黑树中移除,放入等待队列,然后调用schedule()函数选择和执行一个其他进程。唤醒过程刚好相反,进程被设置为可执行状态,然后再从等待队列中移到可执行红黑树中

            等待队列:是有在等待的进程组成的链表

抢占和上下文切换

    上下文切换

        从一个可执行程序切换到另一个可执行程序

        context_switch()函数负责处理,每当新的进程被选出来准备投入运行的时候,schedule()函数会调用它,完成两项基本工作

        1、把虚拟内存从上一个进程映射切换到新进程中

        2、把处理器状态切换到新进程处理器状态,

    用户抢占

        发生在:从系统调用返回用户空间时、从中断处理程序返回用户空间时

    内核抢占

        2.6版本的内核中引入了内核抢占

        只要重新调度是安全的,内核就可以在任何时间抢占正在执行的任务

        只要没有持有所,内核就可以进行抢占,锁是非抢占区域的标志,如果没有锁,正在执行的代码就是可以重新导入的,也就是可以抢占的

        发生在:中断处理程序正在执行且返回内核空间之前、内核代码再一次具有可抢占性的时候、如果内核中的任务显式的调用schedule()、如果内核中的任务阻塞(同样会调用schedule())

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值