基本概念
抢占调度:当进程从运行状态切换到就绪状态/从等待状态切换到就绪状态 时发生调度
否则为非抢占调度
保护代码段不被多个进程访问:进入时禁用中断,退出时启用中断
调度算法
- FCFS(first come first serve)
优点:简单
缺点:平均等待时间长
护航效果:所有其它进程都等待一个大进程释放CPU
非抢占
- 最短作业优先调度
优点:平均等待时间最优
缺点:难以知道下次CPU执行长度
解决方式:预测下次CPU执行长度为以前CPU执行的测量长度的平均
非抢占(最短剩余时间优先)或抢占
- 优先级调度
每个进程都有一个优先级,最高的优先级的进程分配到CPU
CPU执行越长,优先级越小
抢占或非抢占
饥饿:某个低优先级进程无穷等待CPU
解决方式:老化(逐渐增加在系统中等待很长时间的进程的优先级)
- Round Robin
CPU为每个进程分配不超过一个时间片的CPU
如果当前运行进程的CPU大于1个时间片,则将进程加到就绪队列尾部,CPU执行下一个进程
- 多级队列调度
将就绪队列分成多个队列,每个队列有自己的调度算法
如前台进程(交互进程),后台进程(批处理进程)
队列之间调度:1.固定优先级抢占调度
当优先级高的队列为空时,优先级低的队列才会被分配到CPU
2.在队列之间划分时间片,每个队列都有一定比例的CPU时间
- 多级反馈队列调度:允许进程在队列间前移
线程调度
进程竞争范围(PCS):同一进程内的线程竞争,决定哪个线程在可用LWP上运行
系统竞争范围(SCS):系统内所有线程竞争CPU,决定哪个内核级线程调度到一个CPU上
采取一对一模型,如Windows, Linux只采取SCS调度
多处理器调度
非对称多处理器:一个处理器处理所有调度决定,I/O处理以及其它系统活动
其它处理器执行用户代码
对称多处理(SMP):每个处理器自我调度
Windows、Linux、Mac支持SMP
处理器亲和性:避免将进程从一个处理器移到另一个处理器(缓存)
软亲和性:保持进程运行在同一处理器
硬亲和性:保持进程运行在某个处理器子集
多线程的处理器核:每个核分配多个硬件线程,当一个线程访问内存停顿时,切换到另一个线程
实时CPU调度
事件延迟:中断处理 + 调度延迟
中断处理:CPU收到中断,完成正在执行的指令,确定中断类型,保存当前进程状态,采用特定中断服务程序
调度延迟:停止一个进程,释放资源,启动另一个进程
冲突阶段:抢占内核中运行的任何进程,释放高优先级进程需要的、低优先级进程占有的资源
单调速率调度:高优先级进程抢占低优先级进程
最早截止期限优先调度
比例分享调度:调度程序在所有应用之间分配T股,如果一个应用程序接受N股的时间,那么确保它将有N/T的处理器时间
准入控制策略:只有当任务请求的股数小于可用股数,才能允许它进入
操作系统例子
Linux的调度算法:完全公平调度程序(CFS)
每个任务有一个友好值,友好值低的任务优先级高。
维护进程的虚拟运行时间(红黑树),记录进程运行了多久,优先级低的任务比优先级高的任务具有更高衰减速率,调度程序选择最小虚拟运行时间的程序。
可重入函数
定义:进程正在执行的指令序列被信号中断后,如果从信号处理程序返回,继续执行进程断点处的指令序列。此时如果函数所依赖的环境没有发生改变,就说这个函数是可重入的
进程中断期间,OS保存进程上下文包含返回地址、寄存器等,而函数内部的全局变量、静态变量、堆中分配的空间不会被保护,如果这些值在中断期间被修改了,则函数恢复执行的结果不可预料。
- 不可重入函数特征:
1.使用静态数据结构
2.使用malloc/free
3.调用标准I/O函数
4.进行浮点运算
- 保护函数的可重入方式:
1.采取局部变量
2.堆全局变量要加以保护(关中断等