进程调度的理解

  1. 进程调度可看做在可运行态程序之间分配有限的处理器时间资源的内核子系统。

  2. Linux调度程序在2.5开始采用了一种O(1)调度程序(静态时间片算法和针对每一处理器的运行队列)(该调度算法不适合那些响应时间敏感的程序)

  3. 在2.6.23版本的调度程序中采用了“反转楼梯最后期限调度算法RSDL“,即“完全公平调度算法CFS”,

  4. 调度策略需要在I/O消耗型和处理器消耗型之间进程选择搭配,需要在进程响应速度(响应时间短)和最大系统利用率(高吞吐率)之间找到平衡。Linux倾向于缩短响应时间,即倾向于优先调度I/O消耗型进程。

  5. Linux采用两种不同的优先级范围,且两种互不相干。一种nice值(值(-20+19)越大,优先级越小,且与分配得到的处理器时间成正比)。还有一种就是实时优先级(值(099)越大,优先级越高,实时进程的优先级普遍高于普通的优先级)。

  6. 调度程序来分配处理器使用比,nice值作为权重比。当进程的实时优先级高于当前正在运行的进程时,如果新的可运行程序消耗的处理器使用比(分配和消耗的区别)比当前进程小,则新进程立即投入运行。

  7. Linux调度器采用一种称为调度器类的模块化结构(允许多种不同的可动态添加的调度算法并存,调度属于自己范畴的进程)。

  8. 调度算法的选择问题:
    (1)将nice值隐射到时间片,将nice单位值对应到处理器的绝对时间。因为给定高nice值(低优先级、分配更少的处理器时间比)的进程往往是后台进程,为计算密集型。 而给定低nice值(高、更多)往往是前台进程。所以与初衷背道而驰。
    (2)将nice值减少1所带来的效果极大地取决于其nice值的初始值。(解决:将nice值呈现几何增加)
    (3)实现映射时需要能分配一个绝对的时间片,而且这个时间片必须能在内核的测试 范围内(即时间片为定时器节拍的整数倍)。最小时间片必须为定时器节拍的整数 倍,系统定时器会限制两个时间片之间的差异,时间片还会随着定时器节拍的改变而改变。(采用一个新的度量机制将nice值的时间片和定时器分离)
    (4)基于优先级的调度器为了优化交换任务而唤醒相关进程的问题,在提升优先级的同时,会分配更多的时间片,最后导致公平原则被打破。
    CFS完全摒弃了时间片,而是分配了一个处理器使用比重(确保了进程调度具有恒定 的公平性)。

  9. CFS(公平调度)允许每个进程运行一段时间、循环轮转、选择运行最少的进程作为下一次运行进程,而不再采用分配给每个进程每个时间片,CFS在所有可运行进程总数基础上计算出一个进程需要运行多久,而不是依靠nice值来计算时间片。而nice作为处理器运行比的权重。CFS引入了最小粒度(即最小时间片)。目标延迟即调度周期。

  10. 对进程运行时间记账(每次系统时钟节拍发生时,时间片都会减少一个节拍周期),确保每个进程只在公平分配给他的处理器时间内运行。
    (1)采用调度实体结构(在task_struct结构体中有一个名为se的sched_entity结构体成员变量)来追踪进程运行进账。
    (2)vruntime变量存放进程的虚拟运行时间(即一个进程运行了多长时间以及还应该 运行多长时间)。

  11. CFS调度算法的核心是挑选一个具有最小vruntime的进程。CFS利用红黑树(rbtree)来组织可运行进程队列,并且迅速找到最小vruntime值的进程(即运行rbtree树中最左边叶子节点所代表的进程(采用pick_next_entity函数查找))。

  12. 进程调度的主要入口是schedule函数,会调用pick_next_task()函数从最高优先级的调度类中选择最高优先级的进程。

  13. 进程进入休眠状态后会从执行黑红树中移出,放入到等待队列(wake_queue_head_t)中,然后调用schedule()函数。

  14. 等待队列可以通过DECLARE_WAITQUEUE()函数静态创建,也可以通过init_waitqueue_head()动态创建。当需要的相关事件发生后需要避免产生竞争条件。

  15. Wake_up()函数会唤醒等待队列上的所有进程。

  16. 由context_switch()函数负责上下文切换,该函数调用switch_mm()负责把虚拟内存从上一个进程映射切换到新进程,调用switch_to()负责从上一个处理器状态切换到新进程的处理器状态。内核采用need_reached标志(被抢占时调用scheduler_tick()函数来设置这个标志,而有优先级高的进程进入时调用try_to_wake_up()设置)来表明是否需要重新执行一次调度。2.6版本中该标志存在于thread_info结构体中。

  17. 用户抢占在系统调用返回用户空间时,从中断处理程序中返回用户空间时。

  18. 在一个内核级的任务正在执行的时候支持重新调度,只要没有锁,内核就可以进行抢占。在thread_info结构体中引入preempt_count计数器(计数器初始值为0,当使用锁时加1,释放锁时减1),从中断返回内核空间时,会检查need_reached和preempt_count的值,若need_reached被设置,且preempt_count为0,则可以抢占。

  19. 内核抢占发生在:
    (1)在中断处理程序正在执行,且返回内核空间之前。
    (2)内核代码再一次具有可抢占性的时候。
    (3)如果内核中的任务显式地调用scheduler()。
    (4)如内核中的任务阻塞。

  20. SCHED_FIFO(静态优先级)的进程会比SCHED_NORMAL级的进程优先得到调度,SCHED_FIFO不可被强占且不基于时间片,可以一直执行下去,只有在自己愿意让出处理器的时候才会退出。

  21. SCHED_RR(静态优先级)是带有时间片的SCHED_FIFO,时间片只是用来调度同一优先级的进程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值