标签:
多任务系统可以划分为两类:
- 非抢占式多任务:
- 进程会一直执行直到自己主动停止运行(这一步骤称为让步)
- 抢占式多任务:
- Linux/Unix使用的是抢占式的方式;强制的挂起进程的动作就叫做抢占。进程在被抢占之前能够运行的时间是预先设置好的(也就是进程的时间片)
处理器消耗型
调度策略通常要在两个矛盾的目标中间寻找平衡:
Linux倾向于优先调度I/O消耗型进程
Unix使用的调度算法是分配绝对的时间片,这样就会引发固定的切换频率,不利于公平性。 而Linux采用的CFS完全摒弃了时间片,分配给进程一个处理器使用比重,保证恒定的公平性和变动的切换频率。
CFS的做法如下:
目标延迟:无限小调度周期的近似值
——即CFS调度算法的实现。
四个组成部分:
- 时间记账
- 进程选择
- 调度器入口
- 睡眠和唤醒
**Linux中,红黑树被称为rbtree,是一个自平衡二叉搜索树,是一种以树节点形式存储的数据,这些数据会对应一个键值,可以通过这些键值来快速检索节点上的数据,而且检索速度与整个树的节点规模成指数比关系。 **
挑选下一个任务:
节点键值是可运行进程的虚拟运行时间,进程选择算法是【运行rbtree树种最左边叶子节点所代表的那个进程】,函数是picknextentity()
从树中删除进程
删除动作发生在进程堵塞或终止时。
相关函数是dequeueentity()和dequeueentity():
3. 唤醒操作由函数wake_up()进行
- 它会调用函数try_to _wake_up()将进程设置为TASK_RUNNING状态,调用enqueue_task()将进程放入红黑树中
- 当然,也存在虚假唤醒进程的状态
上下文切换由定义在kernel/sched.c中的context_switch()函数负责,每当一个新的进程被选出来准备运行的时候,schedule()就会调用该函数:
linux内核设计与实现
20135239 益西拉姆 linux内核分析 读书笔记之第四章
标签:
原文地址:http://www.cnblogs.com/20135239-yxlm/p/5390582.html