和光同尘,与时舒卷
在多道程序系统中,进程的数量往往多于处理机的个数,因此进程争用处理机的情况在所难兔。处理机调度是对处理机进行分配,即从就绪队列中按照一定的算法(公平、高效的原则)选择一个进程并将处理机分配给它运行,以实现进程并发地执行。
处理机调度是多道程序操作系统的基础,是操作系统设计的核心问题。
注意这里高级调度只进行一次!一个是创建的时候,一个是消亡的时候,多道批处理系统中多配有作业调度,而其他系统中通常不需要作业调度
中级调度实际上就是存储器管理中的对换功能,而进程调度就是我们下面要学的调度算法要研究的问题
创建进程也就是创建PCB,
作业调度从外存的后备队列中选择一批作业进入内存,为它们建立进程,这些进程被送入就绪队列,进程调度从就绪队列中选出一个进程,并把其状态改为运行态,把CPU分配给它。中级调度同样的是将外存中的进程调入内存,不过不需要创建PCB了,因为PCB在作业调度的时候已经创建过。
1)作业调度为进程活动做准备,进程调度使进程正常活动起来。
2)中级调度处于作业调度和进程调度之间。
3)作业调度次数少,中级调度次数略多,进程调度频率最高。
4)进程调度是最基本的,不可或缺。
若处于就绪态的较多,就需要将其放入外存也就是就绪挂起
进程映像是操作系统中正在运行的进程在内存中的镜像,它包含了进程的代码、数据、堆栈等关键信息,操作系统通过管理进程控制块来对进程映像进行管理和操作
若是抢占式的调度策略也就意味着只要就绪队列一改变,就需要检查新进入的进程是否会抢占正在运行的进程,每个时钟中断或者K个时钟中断就会检查一下是否就绪队列发生了改变
时钟中断是一种计算机硬件中断,它发生在计算机的时钟芯片定时器触发时。时钟中断用于定期触发操作系统内核的调度程序,以确保系统中的任务能够按时执行。当时钟中断发生时,处理器会暂停当前任务的执行,保存当前的上下文,并跳转到中断处理程序进行处理。在处理完中断后,处理器会恢复之前的上下文,继续执行被中断的任务。时钟中断还可以用于更新系统时间、计算程序运行时间等功能。
调度程序是操作系统内核程序。请求调度的事件发生后,才可能运行调度程序,调度了新的就绪进程后,才会进行进程切换。理论上这三件事情应该顺序执行,但在实际的操作系统内核程序运行中,若某时刻发生了引起进程调度的因素,则不一定能马上进行调度与切换。
现代操作系统中,不能进行进程的调度与切换的情况有以下几种:
1)在处理中断的过程中。中断处理过程复杂,在实现上很难做到进程切换,而且中断处理是系统工作的一部分,逻辑上不属于某一进程,不应被剥夺处理机资源。
2)进程在操作系统内核临界区中。进入临界区后,需要独占式地访问,理论上必须加锁,以防止其他并行进程进入,在解锁前不应切换到其他进程,以加快临界区的释放。
3)其他需要完全屏蔽中断的原子操作过程中。如加锁、解锁、中断现场保护、恢复等原子操作。在原子过程中,连中断都要屏蔽,更不应该进行进程调度与切换。
若在上述过程中发生了引起调度的条件,则不能马上进行调度和切换,应置系统的请求调度标志,直到上述过程结束后才进行相应的调度与切换。
应该进行进程调度与切换的情况如下:
系统只在这种情况下进行进程调度,则是非剥夺调度。
1)发生引起调度条件且当前进程无法继续运行下去时,可以马上进行调度与切换。若操作系统只在这种情况下进行进程调度,则是非剥夺调度。
2)中断处理结束或自陷处理结束后,返回被中断进程的用户态程序执行现场前,若置上请求调度标志,即可马上进行进程调度与切换。若操作系统支持这种情况下的运行调度程序,则实现了剥夺方式的调度。
进程切换往往在调度完成后立刻发生,它要求保存原进程当前断点的现场信息,恢复被调度进程的现场信息。现场切换时,操作系统内核将原进程的现场信息推入当前进程的内核堆栈来保存它们,并更新堆栈指针。内核完成从新进程的内核栈中装入新进程的现场信息、更新当前运行进程空间指针、重设PC寄存器等相关工作之后,开始运行新的进程。
所谓进程调度方式,是指当某个进程正在处理机上执行时,若有某个更为重要或紧迫的进程需要处理,即有优先权更高的进程进入就绪队列,此时应如何分配处理机。
1)非抢占调度方式,又称非剥夺方式。是指当一个进程正在处理机上执行时,即使有某个更为重要或紧迫的进程进入就绪队列,仍然让正在执行的进程继续执行,直到该进程运行完成或发生某种事件而进入阻塞态时,才把处理机分配给其他进程。非抢占调度方式的优点是实现简单、系统开销小,适用于大多数的批处理系统,但它不能用于分时系统和大多数的实时系统。
2)抢占调度方式,又称剥夺方式。是指当一个进程正在处理机上执行时,若有某个更为重要或紧迫的进程需要使用处理机,则允许调度程序根据某种原则去暂停正在执行的进程,将处理机分配给这个更为重要或紧迫的进程。抢占调度方式对提高系统吞吐率和响应效率都有明显的好处。但“抢占”不是一种任意性行为,必须遵循一定的原则,主要有优先权、短进程优先和时间片原则等。
实际的系统中CPU是永远不可能闲着的,若是没有程序需要运行就运行这个闲逛进程,闲逛程序不需要CPU之外的资源,它不会被阻塞
1)用户级线程调度。由于内核并不知道线程的存在,所以内核还是和以前一样,选择一个进程,并给予时间控制。由进程中的调度程序决定哪个线程运行。
2)内核级线程调度。内核选择一个特定线程运行,通常不用考虑该线程属于哪个进程。对被选择的线程赋予一个时间片,如果超过了时间片,就会强制挂起该线程。
用户级线程的线程切换在同一进程中进行,仅需少量的机器指令;内核级线程的线程切换需,要完整的上下文切换、修改内存映像、使高速缓存失效,这就导致了若干数量级的延迟。
有人买一杯 有人买一桶,因此它不能作为分时系统和实时系统的主要调度策略,但它常被结合在其他调度策略中使用,例如,在使用优先级作为调度策略的系统中,往往对多个具有相同优先级的进程按FCFS原则处理
FCFS 调度算法的特点是算法简单,但效率低;对长作业比较有利,但对短作业不利(相对SJF 和高响应比);有利于CPU 繁忙型作业,而不利于FO繁忙型作业。
该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业会被及时处理。
由于作业的长短是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度。
注意,SJF调度算法的平均等待时间、平均周转时间最少。
并且注意区分“死锁和饥饿”,死锁是循环等待,饥饿是调度策略问题
时间片轮转调度算法主要适用于分时系统,会增大进程响应时间:系统中有10个进行进程在并发执行,如果时间片为1秒,则一个进程被响应的可能需要9秒,也就是说,如果用户在自己进程的时间片外通过键盘发出调试命令,可能需要等待9秒才能被系统响应
响应时间:从发起进度到进程得到响应时间,
优先级调度算法既可用于作业调度,又可用于进程调度。该算法中的优先级用于描述作业的紧迫程度。在作业调度中,优先级调度算法每次从后备作业队列中选择优先级最高的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列。在进程调度中,优先级调度算法每次从就绪队列中选择优先级最高的进程,将处理机分配给它,使之投入运行。
多级反馈队列调度算法是时间片轮转调度算法和优先级调度算法的综合与发展,通过动态调整进程优先级和时间片大小,多级反馈队列调度算法可以兼顾多方面的系统目标。例如,为提高系统吞吐量和缩短平均周转时间而照顾短进程;为获得较好的IO设备利用率和缩短响应时间而照顾IO型进程;同时,也不必事先估计进程的执行时间。
前述的各种调度算法,由于系统中仅设置一个进程的就绪队列,即调度算法是固定且单一的,无法满足系统中不同用户对进程调度策略的不同要求。在多处理机系统中,这种单一调度策略实现机制的缺点更为突出,多级队列调度算法能在一定程度上弥补这一缺点。
对于通常的进程而言,其创建、撤销及要求由系统设备完成的IO操作,都是利用系统调用而进入内核,再由内核中的相应处理程序予以完成的。进程切换同样是在内核的支持下实现的,因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。
(1)上下文切换
切换CPU 到另一个进程需要保存当前进程状态并恢复另一个进程的状态,这个任务称为上下文切换。上下文是指某一时刻CPU寄存器和程序计数器的内容。进行上下文切换时,内核会将旧进程状态保存在其PCB中,然后加载经调度而要执行的新进程的上下文。
上下文切换实质上是指处理机从一个进程的运行转到另一个进程上运行,在这个过程中,进程的运行环境产生了实质性的变化。上下文切换的流程如下:
1)挂起一个进程,保存CPU上下文,包括程序计数器和其他寄存器。
2)更新 PCB信息。
3)把进程的PCB移入相应的队列,如就绪、在某事件阻塞等.
4)选择另一个进程执行,并更新其PCB。
5)跳转到新进程PCB中的程序计数器所指向的位置执行。
6)恢复处理机上下文。
(2)上下文切换的消耗
上下文切换通常是计算密集型的,即它需要相当可观的CPU时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间,所以上下文切换对系统来说意味着消耗大量的CPU时间。有些处理器提供多个寄存器组,这样,上下文切换就只需要简单改变当前寄存器组的指针。
(3)上下文切换与模式切换
模式切换与上下文切换是不同的,模式切换时,CPU逻辑上可能还在执行同一进程。用户进程最开始都运行在用户态,若进程因中断或异常进入核心态运行,执行完后又回到用户态刚被中断的进程运行。用户态和内核态之间的切换称为模式切换,而不是上下文切换,因为没有改变当前的进程。上下文切换只能发生在内核态,它是多任务操作系统中的一个必需的特性。
注意:调度和切换的区别。调度是指决定资源分配给哪个进程的行为,是一种决策行为;切换是指实际分配的行为,是执行行为。一般来说,先有资源的调度,然后才有进程的切换。