调度--操作系统的欺骗

来源:互联网 发布:桌面透明便签软件 编辑:程序博客网 时间:2024/05/02 04:59

假设有一个CPU体系

假设一、这个体系不存在Branch指令(分支或跳转的指令)
假设二、这个体系不响应任何异常和中断

那么根据这个体系编译得到的指令序列安排在内存中后,一定能得到执行的机会,因为CPU一直按照各条指令的宽度递增取指令的地址, 读取下一条指令执行

一.CPU指令和指令执行

1.顺序执行:

x86体系中MOV, ADD等都是顺序执行的指令

定义:顺序执行是指CPU下一次取指令的地址在逻辑上是按当前正在执行的指令宽度递增的

2.改变顺序执行(分支或跳转):

x86体系中JMP、LOOP、CALL、RET等都是使执行顺序改变的指令

定义:分支或跳转执行是指CPU下一次取指令的地址在逻辑上是根据当前指令的执行结果变化的
定义:根据指令结果而产生的分支或跳转我们称为软分支或软跳转。

任何现有的CPU体系,所有的指令都可以归为上述两类。
任何软件或程序包括操作系统都是上述两类指令的组合

二.程序指令序列空间IRAS(Instructs RunTime Address Space)程序使用到的地址空间RAS(RunTime Address Space)

定义:程序运行时指令序列所占有的内存地址我们称之为IRAS
定义:程序运行时指令序列所占有的内存地址和指令序列中的指令执行时访问到的内存地址的总和我们称之为RAS

IRAS是RAS的子集

程序例子:文章开头的假设二存在时,内存中存在一段程序,并且这段程序永远不会退出(死循环).
程序结果:假设CPU的取指令操作正好在这段程序的IRAS中,那CPU任何访问内存的操作(包括取指和取数据)都不会离开这段程序的RAS,因为所有的分支和跳转指令所到的内存地址都存在于这段程序的RAS中.

三.两段地址空间不重叠的程序

如果内存中存在两段程序task1和task2,他们的RAS不会重叠,并且条件符合上述二的程序例子
假设此时CPU的取指令操作正好在task1中的指令序列中,则task2将永远得不到CPU执行

在不改变task1和task2的程序代码的前提下如何让CPU运行时既可执行task1又可执行task2呢?
换句话说,假设此时CPU的取指令操作正好在task1的IRAS中,如何使CPU可以切到task2的IRAS中执行一小段,然后又可以切换回task1的IRAS中执行一小段,这样交替的执行呢?

四.硬分支或硬跳转

把最开头的假设二重新定义
新的假设二:可以响应外部的中断或CPU内部执行指令产生的异常,当中断和异常产生时,CPU在内部保存当前被中断的指令地址,并跳转到内存某个固定的地址处执行指令.

比方说,假设此时CPU的取指令操作正好在task1中的指令序列中,如果产生了中断或异常,CPU把当前正在task1中执行的指令的地址保存起来,并且从内存的另外一个固定地址执行指令.

定义:因为硬件的中断或异常而产生的分支或跳转我们称为硬分支或硬跳转
区分软跳转和硬跳转:软跳转是因为指令执行的结果导致的跳转,硬跳转是硬件中断或异常产生时的跳转

我们可以在硬跳转的固定的地址上安排一段程序,它保存当前CPU的所有寄存器的值和被中断的指令地址到内存的某处,又可以把内存某处的内容还原到CPU的寄存器并且把CPU取下一条指令的地址还原.

上述三,如果我们在内存中保存了task1和task2的执行时CPU所有的状态,当中断或异常发生时我们就可以让CPU取指的地址在task1和task2来回切换.这样就解决了上述三提出的问题.

定义:因为硬件的中断或异常产生的任务切换我们称为硬调度或被动调度

五.地址空间重叠的程序
上述四中我们已经在内存中安排了硬跳转所执行的代码
我们在内存的另外一处安排一段指令序列, 它保存进入这段指令序列之前的一条软跳转指令对应的内存地址的下一个地址,并且像上述四那样切换任务,这样如果我们在task1和task2的死循环中都调用了这段指令序列,那我们也可以实现task1和task2的来回切换.因为我们在task1和task2中都调用了这段代码,所以task1和task2的RAS重叠了.

定义:因为程序调用重叠的代码产生的任务切换我们称为软调度或主动调度

六.多任务操作系统的调度
在上述四和五中我们实现的额外的代码属于操作系统代码,所谓的多任务操作系统调度就是通过这两种方式的让CPU的取指地址不停的来回切换.这就是操作系统对你的任务的欺骗.

七.分时多任务调度
如果硬件上有一个定时器,每隔一段时间中断一下CPU,根据上述四,任务就按照固定的时间间隔来回切换了.

原创粉丝点击