【Linux】Linux中的调度和切换
一、引入基本概念
在任何的分时操作系统中,其调度都是较为公平的调度。在来回顾一下关于优先级为什么会被限制的问题:
Linux为什么调整优先级是要受到限制的呢??
如果不加限制,将自己进程的优先级调整到非常高,别人的优先级调整的非常低,优先级高的进程优先得到资源,常规进程很难获得CPU资源,会造成进程饥饿问题。
基本概念:
进程在运行的时候,放在CPU中,直接必须要把代码跑完吗??不是,在现代的操作系统中,都是基于时间片进行轮转操作执行的。
- 竞争性:系统进程数目众多,但是CPU资源只有少量的,甚至只有一个,所以进程之间是具有竞争属性的。为了高效进行任务,更合理竞争相关资源,便具有了优先级。
- 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰
- 并行:多个进程在多个CPU下同时进行运行,这称之为并行
- 并发:多个进程在一个CPU下采用进程切换的方式,在一段时间内,让多个进程得以推进,称为并发
二、进程切换
在CPU中有很多寄存器,比如:eax/ebx/ecx/edx/fg/gs/eip/cr0~cr4,程序状态字,浮点数寄存器等,这些寄存器在PCB中也有相对应的变量。
进程在运行过程中,要产生大量的临时数据,需要将这些临时数据放在CPU的寄存器上!!CPU内部的所有的临时数据,我们叫做进程的硬件上下文。这些硬件上下文在我们的进程进行切换的时候,需要让我们的进程进行保存到PCB中,保护上下文。当进程被二次调度的时候,进行被放到CPU上开始运行,将曾经保存的硬件上下文进行恢复。
CPU内的寄存器只有一套,但是寄存器上保存的数据可以有多套!!虽然,寄存器数据放在了一个共享的CPU设备里面,但是所有的数据其实都是被进程私有的!!
三、进程调度队列
具体请看:进程的地址空间