操作系统什么时候需要进程调度?
进程调度的层次中,有一个低级调度,就是按照某种算法从就绪队列中选择一个进程为其分配 CPU。 那操作系统会在什么时候触发进程调度呢?
在这里一共可以分为两大类:
当前运行的进程主动放弃
我们先来看看在进程主动放弃
CPU 会有哪几种情况:
1、当一个进程正常的执行完了,进程主动终止结束,在这个时候会触发进程调用,因为需要从就绪队列中再选择一个进程分配给 CPU 去执行。
2、当程序在运行过程当中,程序发生了异常,从而导致终止。虽然这里是程序发生了异常,但还是属于程序主动放弃。
3、当进程主动请求了某些资源,但是资源被其他进程占用了,所以进程会进入阻塞状态等待资源释放,在这个阻塞期间是需要释放 CPU 资源的,不能一直占用 CPU 不干活。
当前运行的进程被动放弃
有主动就会有被动的情况:
1、当前执行的进程的时间片用完了,被迫放弃 CPU 执行权,进程调度重新选择进程分配 CPU 。
2、当前进程在执行的过程中,检测到了中断信息,在这个时候有优先处理中断信息的,所以也是被迫下 CPU。
3、有更高优先级的进程进入就绪队列,调度器会优先让优先级更高的进程优先执行。
以上的情况,操作系统会进行低级的进程调度,那肯定在操作系统某些时刻,是不允许进程调度的,我们接着往下看。
操作系统什么时候不能进行进程调度?
1、在处理中断信号的过程当中,中断处理的过程比较复杂,与硬件密切相关,很难做到在中断处理的过程中进行进程切换。
2、进程在操作系统内核临界区中,不能进行进程调度,在这个小伙伴可能都不太理解,什么是操作系统内核临界区,
临界资源:一个时间段内,只允许一个进程使用的资源,各个进程需要互斥的访问临界资源。
临界区:访问临界资源的那段代码。
内核程序临界区
:一般是用来访问某种内核数据结构
的,比如一个进程,它要去访问就绪队列
,但是就绪队列的数据是放在内核的,在这种情况下就称之为进程在操作系统内核临界区中。
3、在原子操作过程中(原语),原子操作是不可被中断的,要一气呵成。比如说进程状态的修改,就是原子操作,先要把进程中的 PCB 中的状态标识进行修改,并且把 PCB 放到相对应的队列当中。这个就是用原语来实现,不可被中断。
了解完在什么情况下会进行低级的进程调度,那进度调度有哪些方式?
进程调度的方式
非剥夺调度方式(非抢占式)
非剥夺时调用,又称之为非抢占方式,只允许进程主动放弃 CPU ,在运行过程中即便有紧急的任务,当前进程依旧会继续使用 CPU,一直到进程终止或主动要求进入阻塞状态。
这种方式实现比较简单,系统开销小,但是无法及时处理紧急任务,适合于早期的处理器系统。
剥夺调度方式(抢占式)
剥夺式调度又称之为抢占方式,当一个进程在 CPU 上执行的时候,如果有一个更重要的进程需要使用 CPU,则立即暂停正在执行的进程,将 CPU 分配给比较重要的进程执行。
这种方式可以优先处理更紧急的进程,也可以实现让各个进程按照时间片轮流执行的功能。适用于分时操作系统、实时操作系统。
进程的调度和切换有什么区别?
进程调度,指的是从就绪队列中,选中一个要运行的进程,分配给 CPU 执行,而进程切换是指一个进程先让出 CPU,然后由另一个进程占用 CPU 的过程。
进程的切换的过程需要做什么?
1、对原来运行的进程各种数据的保存。
2、对新的进程各个数据的恢复。
注意:进程切换是有代价的,因此如果过于频繁的进程调度、切换,必然会使整个系统的效率降低,是系统大部分时间都花在了进程切换上,而真正执行的进程时间减少。
由谁来控制进程调度?
在操作系统中,会有一个调度器
,由调度器通过调度算法来决定让哪个进程上 CPU 执行,并且根据时间片大小来决定该进程执行多长时间。
调度算法在后面我们会详细的来讲解,在这里我们只需要知道就行。
那 调度器
在什么情况下会进行工作呢?
在操作系统:创建新的进程、退出进程、运行进程阻塞、I/O中断等情况,会触发调度器。
什么是闲逛进程?
当 CPU 没有任何进程任务需要处理的时候,CPU 它也不会闲着,操作系统会运行闲逛进程,让 CUP 去执行。
闲逛进程的特性一般是优先级最低,然后执行能耗低。