在介绍这两个概念之前要先介绍一下操作系统内核中的“线程调度器”
这里就拿Linux内核来做举列
在Linux内核中有一个scheduler线程调度器,有特殊的算法来挑选线程,专门用来给运行在虚拟内存管理模式下的线程分配CPU控制权的
那么先来介绍一下介绍一下scheduler是如何调度线程的
在目前的Linux内核(包括以往的历史版本)中scheduler使用的是时间片轮转的方法来调度线程的。
时间片轮转:
假如我们内存中加载了三个进程且在单核CPU的情况下,分别是两个进程,四个线程
当进程被加载到内存中时会有一个PCB控制块里面这个进程控制块是一个结构体,存在与该进程空间下
进程控制块里有一个成员变量用来表示该进程的优先级,scheduler会根据优先级优先选择优先级较高的进程挑选进程下的线程获得CPU控制权,0为最高优先级,Upper limit(该值可在Linux内核的宏定义中修改)为最低,但是在时间片轮转调度机制下的Linux内核这个优先级是无效的,因为如果优先级过高那些优先级较低的程序永远也别想被执行到,这就不符合多任务的概念了。
所以在基于时间片轮转的调度机制下的Linux内核在进程被加载时会给PCB控制块的优先级成员变量分配一个值0,这样优先级就都平等了,基于算法根据进程运行状态挑选出合适的进程在通过进程控制块得到该进程下有多少个线程,并通过线程控制块(TCB)得出每个线程的运行状态,在通过特殊算法为线程分配时间,假如说进程A下的线程B获取到了CPU的控制权,那么scheduler会通过特殊算法给它分配一定的时间一般为10毫秒,这是linux为了确保不会影响其它线程的执行而分配的最合理的时间。
当该线程在执行的同时scheduler也不会闲它会去计算下需要调度的线程,当线程A的时间到了的时候scheduler会强行将该线程的控制权夺回来,假如说scheduler计算的下一个需要调度的线程是进程B下的线程B那么scheduler会把优先权给进程B下的线程B,以此循环,scheduler不会直接中断会记录一个数据知道该线程执行到那一步了,当又轮到该线程执行时scheduler会读取该线程上一次的执行状态并调整CPU代码寄存器的指向!
不仅Linux是这样包括Windows和Mac操作系统下的线程调度器均采用时间片轮转的方法,由于Linux内核是公开的,可以被修改发行,新墨西哥矿业及科技学院的V. Yodaiken对Linux进行修改使它关闭了为每个进程的优先级都分配0的方法,并且关闭了调度算法,直接根据优先级来选择CPU的控制权,这样会大大提升电脑运行速度,提升操作系统内核运行速度,因为线程调度需要大量的计算(如果很多个进程那么会更加繁琐)线程执行状态保存等等,会极其繁琐,这种基于优先级的叫做优先级调度。优先级调度没有时间限制,假如说A进程下的A线程的优先级高其它进程下的线程那么除非这个线程执行完毕否则会一直占用着CPU的控制权,等该线程结束之后在把CPU控制权分配给优先级较高的线程!
这样的操作系统内核一般只用在专用机上,曾经就有一个操作系统比较出名,VXWORKS该操作系统内核不大,几十个文件,实现了:
多任务调度(采用基于优先级抢占方式,同时支持同优先级任务间的分时间片调度)
任务间的同步
进程间通讯机制
中断处理
定时器和内存管理机制
适合一开始研究操作系统内核人员研究,因为这个文件不大结构比较简单,不像Linux内核动不动几十万个.h/.c文件根本没办法梳理思路。
还有一种是先来先服务的调度方式,那个线程先被加载就先执行那个,以此执行。也属于实时操作系统。
一般实时操作系统用于专业领域,医疗,军事,研究等领域。