系统线进行进程分配CPU,然后才是其线程分配CPU
基础知识
进程周期:进程执行包括周期性执行的io调度和cpu执行。
1.cpu调度(就是短期调度):从内存中选择进程。
2.抢占调度
是一种操作系统的进程调度策略,其中操作系统拥有中断进程,切换为其他进程的权力。
在非抢占调度下,一个进程被分配到cpu上,就会一直使用cpu,直到它终止或主动切换到等待状态。
当多个进程共享数据时,抢占可能导致竞争情况,一个进程修改数据到一半,执行权被抢了,就出问题了。
3.调度程序
调度程序的功能:
(1)切换上下文,卸载寄存器状态,填充新状态
(2)切换到用户模式
(3)跳转到用户程序合适位置,以便重新启动程序
调度程序停止一个程序而启动另一个程序所需的时间称为调度延迟。
4.调度效率评判准则
有不同的调度准则,通过cpu使用率,吞吐量和进程的等待时间,响应时间来衡量。
上下文切换:中断式系统调用
- 时钟中断,进入ready状态。
- IO中断,接收到waiting事件,进入waiting状态。
- 缺页
- 异常中断
- 应用程序对操作系统进行服务请求,释放cpu,进入waiting状态。
操作系统通过队列管理进程(都是PCB的链表)
job queue
ready queue
device queue
调度分类
长期调度:new a process 从disk加载到内存
中期调度:PCB还在内存中,堆栈等从内存中临时swap out到磁盘,然后再swap in
短期调度:switch process
调度算法
(1)先到先服务调度
使用PCB的FILFO队列,是非抢占的。
如果长的先执行,那么等待时间会很长。
(2)最短作业优先调度
拥有抢占和非抢占两种:
- 非抢占的:等运行完了后,从就绪队列中选出最短作业的任务。
- 抢占:等一个任务进入后,进行对比,然后抢占。
分段完成作业,有上下文切换。
当完成后,也会进行抢占。
困难是如何知道下次CPU执行的长度,通过预测来实现的。
(3)优先级调度
拥有内部优先级和外部优先级。
内部优先级是操作系统根据进程的内存,时限,io执行时间和cpu执行时间来分配的。
可以是抢占的和非抢占的。
抢占就是,当一个优先级高的进程进入就绪队列(队列发生改变),就会抢走cpu,非抢占会将其加入队列头。
问题:低优先级的进程拿不到cpu;
解决方法是:老化,运行会降低进程的优先度。
(4)时间片轮转调度
无法完整执行一个进程,是抢占的。
将就绪队列作为循环队列。
较小的执行时间切片为10-100ms,PCB循环执行。
上下文切换也会花费时间。
(5)多级队列
每个队列执行的算法不同,根据前台进程,后台进程,系统进程,交互进程。
(6)多级反馈队列调度
允许进程在多个队列中迁移
线程调度
用户线程使用内核线程(io和硬件)实现执行。
用户线程因为没有全局视野,只能看到进程内部,所以不适合进行线程调度,所以使用映射到内核线程进行实现线程调度。
多处理器调度
多个cpu,实现负载分配的调度。
(1)非对称多处理
一个处理器处理所有调度决定,io处理以及其他系统活动。
其他处理器执行代码。
(2)对称处理器
所有进程处于一个就绪队列或者每个处理器都有自己的就绪队列,处理器自己决定调度哪个进程。
(3)cpu亲和性
进程运行在一个cpu上,会将数据打入cpu的缓存,如果更换cpu会造成损失,这个就是cpu的亲和性。
(4)负载均衡的实现
负载满了的cpu会将进程推给其他cpu,这个是推迁移。
负载空的cpu会从其他cpu拉进程,这个是拉迁移。
多核处理器
将数据从内存中取出到缓存中,需要花费很多时间,当发生时,就会运行其他线程,因为处理器做了两个硬件线程。
双核处理器,每个核有两个硬件线程。
亲和性和亲缘性:多处理器调度也需要考虑任务之间的亲和性和亲缘性。亲和性指的是将相关的任务调度到同一CPU核心,以减少缓存不命中。亲缘性是指在任务之间保持关联,以最大程度地减少通信开销。
轻量级进程(lwp)
进程的本质就是pcb,虚拟地址空间,页表和代码数据。
也即是:内核数据+代码数据。
轻量级进程:在linux下,进程一样,所以进程pcb更小,主要是因为共享内存地址和其他资源(比如文件)。
使用pthread_create创建的就是lwp。
中断延迟和事件延迟
事件延迟:从事件发生到事件得到服务的时延,
中断延迟:从cpu收到中断指令后,保存当前状态,到采用特定的中断程序,的时间。
调度延迟:从停止一个程序到启动另一个的时延。
优先权调度
进程越重要,优先权越高。
如果支持抢占,会抢走cpu执行。
优先权调度有周期,周期结束进程去抢cpu。
单调速率调度
执行时间越短的进程,优先级越高。
抢占式的。平均等待时间较少。
最早截至期限优先调度
越紧迫的优先级越高。
Windows调度算法:
- 多级反馈队列调度(Multilevel Feedback Queue Scheduling)
:Windows操作系统通常使用多级反馈队列调度算法。该算法将进程分为多个队列,每个队列有不同的优先级,而且每个队列都具有自己的时间片大小。具有高优先级的队列会获得更多的CPU时间。如果进程在时间片内没有完成,它将被移动到较低优先级队列,以避免饥饿情况。
- 实时调度(Real-Time Scheduling)
:Windows支持实时任务,其中任务必须在特定的时间限制内完成。这包括周期性任务和高优先级任务。Windows具有针对实时任务的专用调度机制,以确保它们按时执行。
Linux调度算法:
- 完全公平调度(Completely Fair Scheduler,CFS)
:Linux采用CFS调度算法,默认用于Linux内核。CFS旨在分配CPU时间以实现公平性,确保每个进程在同等条件下获得相等的CPU时间份额。CFS使用红黑树数据结构来跟踪进程的虚拟运行时间,以决定下一个运行的进程。
- 实时调度(Real-Time Scheduling)
:Linux也支持实时调度,包括FIFO(先进先出)和Round Robin(轮转)等调度策略。这些策略用于实时任务,以确保它们能够满足特定的时间限制。
- 调度策略可定制性
:Linux允许用户或管理员通过设置不同的调度策略和优先级来调整进程的行为。这允许更好地满足不同应用程序和系统的需求。
银行家算法
安全状态:存在执行完所有进程的安全序列。
- 一个进程请求资源,假定分配
- 如果处于安全状态,分配
- 不在安全状态,不分配