mirror of
https://github.com/Didnelpsun/CS408.git
synced 2026-06-17 15:37:31 +08:00
更新进程管理
This commit is contained in:
@@ -140,4 +140,191 @@ $C.$键盘驱动程序为每个正在运行的应用配备一个线程,用以
|
||||
|
||||
$D.$基于$GUI$的调试程序用不同的线程分别处理用户输入、计算和跟踪等操作
|
||||
|
||||
解:$C$。对于题目所提的不算多线程系统的特长,即找出下面情形可以用一个线程就可以完成的情况。整个系统只有一个键盘,而且键盘输入是人的操作,速度比较慢,完全可以使用一个线程来处理整个系统的键盘输入。
|
||||
解:$C$。对于题目所提的不算多线程系统的特长,即找出下面情形可以用一个线程就可以完成的情况。整个系统只有一个键盘,而且键盘输入是人的操作,速度比较慢,完全可以使用一个线程来处理整个系统的键盘输入。
|
||||
|
||||
## 处理机调度
|
||||
|
||||
### 调度算法
|
||||
|
||||
#### 先来先服务
|
||||
|
||||
**例题** 各进程到达就绪队列的时间、需要的运行时间如下表所示。使用先来先服务调度算法,计算各进程的等待时间、平均等待时间、周转时间、平均周转时间、带权周转时间、平均带权周转时间。
|
||||
|
||||
进程|到达时间|运行时间
|
||||
:--:|:-----:|:------:
|
||||
P1|0|7
|
||||
P2|2|4
|
||||
P3|4|1
|
||||
P4|5|4
|
||||
|
||||
解:
|
||||
|
||||
根据先来先服务的思想,根据到达的顺序,得到调度顺序为:$P1$、$P2$、$P3$、$P4$。
|
||||
|
||||
所以$P1$在$0$到达,$0+7=7$完成。$P2$在$2$到达,而$7$时$P1$完成。所以$P2$要等待$7-2=5$,所以$P2$从$7$开始,在$7+4=11$完成。$P3$在$4$到达,所以需要等待$11-4=7$,从$11$开始,在$11+1=12$结束。$P4$在$5$到达,需要等待$12-5-7$,从$12$开始,在$12+4=16$结束。
|
||||
|
||||
进程|到达时间|运行时间|等待时间|开始时间|完成时间
|
||||
:--:|:-----:|:------:|:-----:|:-----:|:------:
|
||||
P1|0|7|0|0|7
|
||||
P2|2|4|5|7|11
|
||||
P3|4|1|7|11|12
|
||||
P4|5|4|7|12|16
|
||||
|
||||
因为周转时间=完成时间-到达时间。所以$P1=7-0=7$,$P2=11-2=9$,$P3=12-4=8$,$P4=16-5=11$。
|
||||
|
||||
带权周转时间=周转时间÷运行时间。所以$P1=7\div7=1$,$P2=9\div4=2.25$,$P3=8\div1=8$,$P4=11\div4=2.75$。
|
||||
|
||||
等待时间=周转时间-运行时间。根据表格可得。
|
||||
|
||||
所以平均周转时间$=(7+9+8+11)\div4=8.75$。平均带权周转时间$=(1+2.25+8+2.75)\div4=3.5$。平均等待时间$=(0+5+7+7)\div4=4.75$。
|
||||
|
||||
#### 短作业优先
|
||||
|
||||
**例题** 各进程到达就绪队列的时间、需要的运行时间如下表所示。使用非抢占式短进程优先调度算法和抢占式短进程优先调度算法,分别计算各进程的等待时间、平均等待时间、周转时间、平均周转时间、带权周转时间、平均带权周转时间。
|
||||
|
||||
进程|到达时间|运行时间
|
||||
:--:|:-----:|:------:
|
||||
P1|0|7
|
||||
P2|2|4
|
||||
P3|4|1
|
||||
P4|5|4
|
||||
|
||||
解:
|
||||
|
||||
如果使用非抢占式的,因为每次选择当前已经到达且运行时间最短的作业/进程,因为$P1$第一个到达,所以第一个开始,$P1$完成时是$7$,$P2$、$P3$、$P4$都到达了,所以依次选最短运行时间的开始。$7$时$P3$开始,$7+1=8$时结束,$P2$开始(用了$FCFS$思想),$8+4=12$时结束,$P4$开始,$12+4=16$结束。所以调度顺序为$P1$、$P3$、$P2$、$P4$。
|
||||
|
||||
所以$P1$、$P3$、$P2$、$P4$周转时间为$7-0=7$、$8-4=4$、$12-2=10$、$16-5=11$。带权周转时间为$7\div7=1$、$4\div1=4$、$10\div4=2.5$、$11\div4=2.75$。等待时间为$0-0=0$、$7-4=3$、$8-2=6$、$12-5=7$。平均周转时间为$(4+7+10+11)\div4=32\div4=8$。平均带权周转时间为$(1+4+2.5+2.75)\div4=10.25\div4=2.5625$。平均等待时间为$(0+3+6+7)\div4=16\div4=4$。
|
||||
|
||||
如果使用抢占式的,若新到达进程剩余时间要比当前运行的进程剩余时间更短,则由新进程抢占处理机。
|
||||
|
||||
$0$时$P1$到达,$P1$剩余时间为$7$,所以$P1$开始运行。$2$时$P2$到达,此时$P1$剩余时间为$7-2=5$,而$P2$剩余时间为$4-0=4$,$4<5$,所以$P2$抢占$P1$处理机。$4$时$P3$到达,此时$P2$剩余时间为$4-2=2$,而$P3$剩余时间为$1-0=1$,所以$P3$又抢占$P2$处理机。到$5$时$P4$到达,此时$P3$正好运行完,所以要考虑$P1$、$P2$、$P4$三个的剩余时间,分别为$5$、$2$、$4$,所以$P2$抢占处理机运行。$5+2=7$时$P2$运行完,$P4$剩余时间更少抢占处理机。$7+4=11$时$P4$运行完,$P1$抢占处理机。最后$11+5=16$时$P1$运行完,作业全部结束。
|
||||
|
||||
所以$P1$、$P2$、$P3$、$P4$周转时间为$16-0=16$、$7-2=5$、$5-4=1$、$11-5=6$。带权周转时间为$16\div7=2.28$、$5\div4=1.25$、$1\div1=1$、$6\div4=1.5$。等待时间分别为$0-0+11-2=9$、$2-2+5-4=1$、$4-4=0$、$7-5=2$。平均周转时间为$(16+5+1+6)\div4=28\div4=7$。平均带权周转时间为$(2.28+1.25+1+1.5)\div4=1.5$。平均等待时间为$(9+1+0+2)\div4=12\div4=3$。
|
||||
|
||||
#### 高响应比优先
|
||||
|
||||
**例题** 各进程到达就绪队列的时间、需要的运行时间如下表所示。使用高响应比优先调度算法,计算各进程的等待时间、平均等待时间、周转时间、平均周转时间、带权周转时间、平均带权周转时间。
|
||||
|
||||
进程|到达时间|运行时间
|
||||
:--:|:-----:|:------:
|
||||
P1|0|7
|
||||
P2|2|4
|
||||
P3|4|1
|
||||
P4|5|4
|
||||
|
||||
解:
|
||||
|
||||
需要利用公式计算响应比,最重要的是等待时间和运行时间。当$0$时$P1$到达,$P1$运行。$7$时$P1$完成,此时$P2$、$P3$、$P4$全部到达了,而响应比分别为$(7-2+4)\div4=9\div4=2.25$、$(7-4+1)\div1=4\div1=4$、$(7-5+4)\div4=6\div4=1.5$,所以选择$P3$上处理机运行。$7+1=8$时,$P3$完成,此时响应比分别为$P2:(8-2+4)\div4=10\div4=2.5$、$P4:(8-5+4)\div4=7\div4=1.75$,$P2$运行。$8+4=12$时$P2$完成,$P4$运行,最后$12+4=16$时全部完成。
|
||||
|
||||
所以$P1$、$P2$、$P3$、$P4$等待时间为$0-0=0$、$8-2=6$、$7-4=3$、$12-5=7$,平均等待时间为$(0+6+3+7)\div4=16\div4=4$。周转时间为$7-0=7$、$12-2=10$、$8-4=4$、$16-5=11$,平均周转时间为$(7+10+4+11)\div4=32\div4=8$。带权周转时间为$7\div7=1$、$10\div4=2.5$、$4\div1=4$、$11\div4=2.75$,平均带权周转时间为$(1+2.5+4+2.75)\div4=2.5625$。
|
||||
|
||||
#### 时间片轮转
|
||||
|
||||
**例题** 各进程到达就绪队列的时间、需要的运行时间如下表所示。使用时间片轮转调度算法,分析时间片大小为$2$时的进程运行状态。
|
||||
|
||||
进程|到达时间|运行时间
|
||||
:--:|:-----:|:------:
|
||||
P1|0|7
|
||||
P2|2|4
|
||||
P3|4|1
|
||||
P4|5|4
|
||||
|
||||
<span style="color:orange">注意:</span>当同一时刻既有时间片用完也有新进程到达时,默认新到达进程先进入队列,时间片用完的进程后进入。
|
||||
|
||||
解:
|
||||
|
||||
若时间片为$2$:
|
||||
|
||||
当$0$时,因为只有$P1$到达就绪队列,所以$P1$运行一个时间片。
|
||||
|
||||
当$2$时,$P1$时间片运行完,余下$7-2=5$个时间。正好$P2$到达就绪队列,所以$P1$处理机被剥夺,重新放到就绪队列尾,让$P2$运行一个时间片。
|
||||
|
||||
当$4$时,$P2$时间片运行完,余下$4-2=2$个时间。正好$P3$到达就绪队列加入队尾,此时$P1$到达队头,所以$P2$处理机被剥夺,重新放到就绪队列尾,让$P1$运行一个时间片。
|
||||
|
||||
当$5$时,$P4$到达加入就绪队列。此时就绪队列上有$P3$、$P2$、$P4$。
|
||||
|
||||
当$6$时,$P1$时间片运行完,余下$5-2=3$个时间。此时$P3$到达队头,所以$P1$处理机被剥夺,重新放到就绪队尾,让$P3$运行。此时就绪队列上有$P2$、$P4$、$P1$。
|
||||
|
||||
当$7$时,虽然$P3$时间片没有用完,但是由于$P3$只需一个单位的时间,所以主动放弃处理机,发生调度,让$P2$运行一个时间片。
|
||||
|
||||
当$9$时,$P2$正好运行完也用完时间片,$P4$上处理机。此时就绪队列上有$P1$。
|
||||
|
||||
当$11$时,$P4$时间片用完,余下$4-2=2$个时间,此时$P1$到达队头,所以$P4$处理机被剥夺,重新放到就绪队尾,让$P1$运行。
|
||||
|
||||
当$13$时,$P1$时间片用完,余下$3-2=1$个时间,此时$P4$到达队头,所以$P1$处理机被剥夺,重新放到就绪队尾,让$P4$运行。
|
||||
|
||||
当$15$时,$P4$正好运行完也用完时间片,$P1$上处理机。
|
||||
|
||||
当$16$时,$P1$运行完,主动放弃处理机。
|
||||
|
||||
#### 优先级
|
||||
|
||||
**例题** 各进程到达就绪队列的时间、需要的运行时间、进程优先数如下表所示。使用非抢占式与抢占式优先级调度算法,分析进程运行状态。(优先数越大,优先级越高)
|
||||
|
||||
进程|到达时间|运行时间|优先数
|
||||
:--:|:-----:|:------:|:---:
|
||||
P1|0|7|1
|
||||
P2|2|4|2
|
||||
P3|4|1|3
|
||||
P4|5|4|2
|
||||
|
||||
解:
|
||||
|
||||
非抢占式:$0$时只有$P1$到达,所以$P1$开始处理。$2$时$P2$到达,$4$时$P3$到达,$5$时$P4$到达。$7$时$P1$运行完,因为$P3$优先级更高,所以运行$P3$。$8$时$P3$运行完,$P2$、$P4$优先级相同,但是由于$P2$先到,所以$P2$上处理机。$12$时$P2$运行完,$P4$上处理机。$16$时$P4$运行完。
|
||||
|
||||
抢占式:$0$时$P1$到达,$P1$上处理机。$2$时$P2$到达,且$P2$优先级$2$大于$P1$优先级$1$,所以$P2$上处理机,$P1$余下$7-2=5$。$4$时$P3$到达,且$P3$优先级$3$大于$P2$优先级$2$,所以$P3$上处理机,$P2$余下$4-2=2$。$4+1=5$时$P3$运行结束,且$P4$到达,插入就绪队列队尾,$P4$与$P2$优先数都是$2$,而$P2$进入队列时间更早,所以$P2$上处理机。$5+2=7$时$P2$运行结束,且$P4$优先级$4$大于$P1$优先级$1$,所以$P4$上处理机。$7+4=11$时$P4$运行结束,$P1$上处理机。$11+5=16$时$P1$运行结束。
|
||||
|
||||
#### 多级反馈队列
|
||||
|
||||
**例题** 各进程到达就绪队列的时间、需要的运行时间如下表所示。使用多级反馈队列调度算法,分析进程运行状态。
|
||||
|
||||
进程|到达时间|运行时间
|
||||
:--:|:-----:|:------:
|
||||
P1|0|7
|
||||
P2|2|4
|
||||
P3|4|1
|
||||
P4|5|4
|
||||
|
||||
设置多级就绪队列,各级队列优先级从高到低,时间片从小到大。
|
||||
|
||||
新进程到达时先进入第1级队列,按$FCFS$原则排队等待被分配时间片。
|
||||
|
||||
若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经在最下级的队列,则重新放回最下级队列队尾。
|
||||
|
||||
只有第k级队列为空时,才会为k+1级队头的进程分配时间片。
|
||||
|
||||
被抢占处理机的进程重新放回原队列队尾。
|
||||
|
||||
定义多级就绪队列如下(优先级与优先数成正比):
|
||||
|
||||
队列序号|优先级|时间片大小
|
||||
:-----:|:----:|:-------:
|
||||
1|3|1
|
||||
2|2|2
|
||||
3|1|4
|
||||
|
||||
$0$时首先$P1$进入第一级队列,此时$P1$优先级为$4$,时间片为$1$,所以$P1$会运行$1$个时间片。
|
||||
|
||||
$1$时$P1$余下$6$,没有运行完,进入第二级队列的队尾。
|
||||
|
||||
$2$时$P2$进入第一级队列,优先级更高,所以$P1$被剥夺处理机,此时$P1$还余下$5$,回退第二级队列,$P2$开始运行。
|
||||
|
||||
$3$时$P2$运行一个时间片后余下$3$,加入第二级队列队尾。此时第二级队列头部为$P1$,所以$P1$开始运行。
|
||||
|
||||
$4$时$P3$进入第一级队列,优先级更高,所以$P1$被剥夺处理机,此时$P1$还余下$4$,回退第二级队列。
|
||||
|
||||
$5$时$P4$进入第一级队列,此时$P3$也正好运行完,处理机交给$P4$。
|
||||
|
||||
$6$时$P4$运行一个时间片后余下$3$,加入到第二级队列尾部。第二级队列此时顺序为$P2$(余$3$)、$P1$(余$4$)、$P4$(余$3$),所以$P2$开始运行。
|
||||
|
||||
$8$时$P2$运行一个时间片后余下$1$,加入到第三级队列中。$P1$开始占有处理机。
|
||||
|
||||
$10$时$P1$运行一个时间后余下$2$,加入到第三级队列中。$P4$开始占有处理机。
|
||||
|
||||
$12$时$P4$运行一个时间后余下$1$,加入到第三级队列中。第二级队列为空,开始运行第三级队列,$P2$开始占有处理机。
|
||||
|
||||
$13$时$P2$处理完,$P1$占有处理机。
|
||||
|
||||
$15$时$P1$处理完,$P4$占有处理机。
|
||||
|
||||
$16$时$P4$处理完,全部结束。
|
||||
|
||||
@@ -62,6 +62,10 @@
|
||||
+ 根据进程状态的不同建立索引表。如执行指针、就绪表指针、阻塞表指针。
|
||||
+ 操作系统持有指向各个索引表的指针。
|
||||
|
||||
#### 进程与程序
|
||||
|
||||
执行一条命令或运行一个应用程序时,进程和程序之间形成一对一的关系。进程在执行过程中可以加载执行不同的应用程序,从而形成一对多的关系;以不同的参数或数据多次执行同一个应用程序时,形成多对一的关系;并发地执行不同的应用程序时,形成多对多的关系。
|
||||
|
||||
### 进程状态
|
||||
|
||||
#### 基本进程状态
|
||||
@@ -109,11 +113,17 @@
|
||||
+ 原语采取“关中断指令”(不监听外部中断信息)和“开中断指令”(开始监听外部中断信息)实现。
|
||||
+ 关/开中断指令的权限很大,所以必然是核心态下执行的特权指令。从而原语必然运行在核心态。
|
||||
|
||||
#### 进程控制原语
|
||||
#### 父子进程
|
||||
|
||||
允许一个进程创建另一个进程。此时创建者称为父进程,被创建的进程称为子进程。子进程可以继承父进程所拥有的资源。当子进程被撤销时,应将其从父进程那里获得的资源归还给父进程。此外,在撤销父进程时,必须同时撤销其所有的子进程。
|
||||
|
||||
+ 过程的创建:
|
||||
父进程创建子进程后,父进程与子进程同时执行(并发)。主程序调用子程序后,主程序暂停在调用点,子程序开始执行,直到子程序返回,主程序才开始执行。
|
||||
|
||||
#### 进程控制原语
|
||||
|
||||
前四种是必要的。
|
||||
|
||||
+ 过程创建:
|
||||
+ 创建原语:
|
||||
+ 分配一个唯一的进程标识号$PID$,申请空白$PCB$,若申请失败,则创建失败。
|
||||
+ 为新进程分配所需资源,若资源不足,则进入阻塞态。
|
||||
@@ -184,6 +194,7 @@
|
||||
+ 数据以字符流的形式写入管道,当满时,写进程的$write()$系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的$read()$系统调用将被阻塞。
|
||||
+ 如果没有写满则不允许读,如果没有读空则不允许写。
|
||||
+ 数据一旦被读出就被管道抛弃,所以读进程只能至多有一个,否则可能会读错。
|
||||
+ 共享文件:利用操作系统提供的文件共享功能实现进程之间的通信。也需要信号量来解决文件共享操作中的同步和互斥问题。
|
||||
|
||||
### 线程
|
||||
|
||||
@@ -271,16 +282,19 @@
|
||||
### 处理机调度的层次
|
||||
|
||||
+ 高级调度(作业调度):
|
||||
+ 由于内存空间有限,有时无法将用户提交的作业全部放入内存,因此就需要确定某种规则来决定将作业调入内存的顺序。一般一个作业包含多个进程。
|
||||
+ 由于内存空间有限,有时无法将用户提交的作业全部放入内存,因此就需要确定某种规则来决定将作业从外存调入内存的顺序。一般一个作业包含多个进程。
|
||||
+ 高级调度按一定的原则从外存上处于后备队列的作业中挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立$PCB$),以使它(们)获得竞争处理机的权利。
|
||||
+ 高级调度是辅存(外存)与内存之间的调度。每个作业只调入一次,调出一次。作业调入时会建立相应的$PCB$,作业调出时才撤销$PCB$。
|
||||
+ 多道批处理系统多具备,其他系统一般不需要。
|
||||
+ 高级调度主要是指调入的问题,因为只有调入的时机需要操作系统来确定,但调出的时机必然是作业运行结束才调出。
|
||||
+ 调动执行频率低。
|
||||
+ 中级调度(内存调度):
|
||||
+ 引入了虚拟存储技术之后,可将暂时不能运行的进程调至外存等待。等它重新具备了运行条件且内存又稍有空闲时,再重新调入内存。这么做的目的是为了提高内存利用率和系统吞吐量。
|
||||
+ 暂时调到外存等待的进程状态为挂起状态。值得注意的是,$PCB$并不会一起调到外存,而是会常驻内存。$PCB$中会记录进程数据在外存中的存放位置,进程状态等信息,操作系统通过内存中的$PCB$来保持对各个进程的监控、管理。被挂起的进程$PCB$会被放到的挂起队列中。
|
||||
+ 引入了虚拟存储技术之后,可将暂时不能运行的进程调至外存等待。等它重新具备了运行条件且内存又稍有空闲时,再重新调入内存。
|
||||
+ 目的是为了提高内存利用率和系统吞吐量。
|
||||
+ 暂时调到外存等待的进程状态为挂起状态。值得注意的是,$PCB$并不会一起调到外存,而是会常驻内存。$PCB$中会记录进程数据在外存中的存放位置,进程状态等信息,操作系统通过内存中的$PCB$来保持对各个进程的监控、管理。被挂起的进程$PCB$会被放到内存里的挂起队列中,当条件具备转为就绪态。
|
||||
+ 中级调度就是要决定将哪个处于挂起状态的进程重新调入内存。
|
||||
+ 一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。
|
||||
+ 低级调度(进程调度):
|
||||
+ 低级调度(进程调度):
|
||||
+ 其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。
|
||||
+ 进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。
|
||||
+ 进程调度的频率很高,一般几十毫秒一次。
|
||||
@@ -293,32 +307,40 @@
|
||||
|
||||
### 进程调度
|
||||
|
||||
进程调度是最低级的调度也是其他调度的基础。
|
||||
进程调度是最低级的调度也是其他调度的基础,是内核程序。
|
||||
|
||||
#### 进程调度的时机
|
||||
|
||||
需要进行进程调度和切换:
|
||||
|
||||
+ 当前运行程序主动放弃处理机:
|
||||
+ 当前运行程序主动放弃处理机(非剥夺调度):
|
||||
+ 进程正常终止。
|
||||
+ 出现异常终止。
|
||||
+ 进程主动请求阻塞(如等待IO)。
|
||||
+ 当前运行程序被动放弃处理机:
|
||||
+ 进程主动请求阻塞(如等待$I/O$)。
|
||||
+ 当前运行程序被动放弃处理机(剥夺式调度):
|
||||
+ 分配时间片用完。
|
||||
+ 有更紧急的事件需要处理(如IO中断)。
|
||||
+ 有更紧急的事件需要处理(如$I/O$中断)。
|
||||
+ 优先级更高进程进入就绪队列。
|
||||
+ 中断处理结束。
|
||||
+ 自陷处理结束。
|
||||
|
||||
不能进行进程调度和切换:
|
||||
|
||||
+ 在处理中断的过程中。中断处理过程复杂,与硬件密切相关,很难做到在中断处理过程中进行进程切换。
|
||||
+ 在处理中断的过程中。中断处理过程复杂,很难做到在中断处理过程中进行进程切换;与硬件密切相关,不属于某一进程。
|
||||
+ 进程在操作系统**内核程序临界区**中。
|
||||
+ 临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。
|
||||
+ 临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。
|
||||
+ 临界区:访问临界资源的那段代码。
|
||||
+ 内核程序临界区一般是用来访问某种内核数据结构的,比如进程的就绪队列(由各就绪进程的$PCB$组成)。
|
||||
+ 进程访问时会上锁,而如果还没退出临界区(还没解锁)就进行进程调度但是进程调度相关的程序也需要访问就绪队列,但此时就绪队列被锁住了,因此无法顺利进行进程调度。
|
||||
+ 内核程序临界区访问的临界资源如果不尽快释放的话,极有可能影响到操作系统内核的其他管理工作。因此在访问内核程序临界区期间不能进行调度与切换。
|
||||
+ 而如果是普通程序临界区时,如在打印机打印完成之前,进程一直处于临界区内,临界资源不会解锁。但打印机又是慢速设备,此时如果一直不允许进程调度的话就会导致$CPU$一直空闲,所以为了保证效率进程在操作系统普通程序临界区时运行进程调度。
|
||||
+ 在原子操作过程中(原语)。原子操作不可中断,要一气呵成(如修改$PCB$中进程状态标志,并把$PCB$放到相应队列)。
|
||||
+ 在原子操作过程中(原语)。原子操作不可中断,更不能切换进程,要一气呵成(如修改$PCB$中进程状态标志,并把$PCB$放到相应队列)。
|
||||
|
||||
进程切换往往在调度完成后立刻发生,它要求保存原进程当前切换点的现场信息,恢复被调度进程的现场信息。
|
||||
|
||||
现场切换时,操作系统内核将原进程的现场信息推入当前进程的内核堆栈来保存它们,并更新堆栈指针。
|
||||
|
||||
内核完成从新进程的内核栈中装入新进程的现场信息、更新当前运行进程空间指针、重设$PC$寄存器等相关工作之后,开始运行新的进程。
|
||||
|
||||
#### 进程调度的方式
|
||||
|
||||
@@ -345,7 +367,7 @@
|
||||
|
||||
1. 对原来运行进程各种数据的保存
|
||||
2. 对新的进程各种数据的恢复。
|
||||
(如:程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块)。
|
||||
(如程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块)。
|
||||
|
||||
<span style="color:orange">注意:</span>进程切换是有代价的,因此如果过于频繁的进行进程调度、切换,必然会使整个系统的效率降低,使系统大部分时间都花在了进程切换上,而真正用于执行进程的时间减少。
|
||||
|
||||
@@ -354,145 +376,94 @@
|
||||
指作业与进程的调度算法。
|
||||
|
||||
+ 批处理系统算法:
|
||||
+ FCFS。
|
||||
+ SJF/SPF/SRTN。
|
||||
+ HRRN。
|
||||
+ $FCFS$。
|
||||
+ $SJF/SPF/SRTN$。
|
||||
+ $HRRN$。
|
||||
+ 交互式系统算法:
|
||||
+ RR。
|
||||
+ PS。
|
||||
+ MFQ。
|
||||
+ $RR$。
|
||||
+ $PS$。
|
||||
+ $MFQ$。
|
||||
|
||||
#### 算法评价指标
|
||||
|
||||
+ $CPU$利用率:$CPU$忙碌时间占总时间的比例。其中利用率=忙碌时间÷总时间。
|
||||
+ $CPU$利用率:$CPU$忙碌时间占总时间的比例。其中利用率=$CPU$忙碌(运行)时间÷进程运行总时间。
|
||||
+ 系统吞吐量:单位时间内完成作业的数量。系统吞吐量=总共完成多少道作业÷总时间。
|
||||
+ 周转时间:从作业被提交到系统开始到作业完成为止的时间间隔。
|
||||
+ 它包括四个部分:作业在外存后备队列上等待作业调度(高级调度)的时间、进程在就绪队列上等待进程调度(低级调度)的时间、进程在$CPU$上执行的时间、进程等待I/O操作完成的时间。后三项在一个作业的整个处理过程中,可能发生多次。
|
||||
+ 它包括四个部分:作业在外存后备队列上等待作业调度(高级调度)的时间、进程在就绪队列上等待进程调度(低级调度)的时间、进程在$CPU$上执行的时间、进程等待$I/O$操作完成的时间。后三项在一个作业的整个处理过程中,可能发生多次。
|
||||
+ (作业)周转时间=作业完成时间-作业提交时间。
|
||||
+ 平均周转时间=各作业周转时间之和÷作业数。
|
||||
+ 带权周转时间=作业周转时间÷作业实际运行的时间=(作业完成时间-作业提交时间)÷作业实际运行的时间(≥1)。
|
||||
+ 带权周转时间=作业周转时间÷作业实际运行的时间=(作业完成时间-作业提交时间)÷作业实际运行的时间($\geqslant1$)。是一个比值,越靠近$1$越合理。
|
||||
+ 平均带权周转时间=各作业带权周转时间之和÷作业数。
|
||||
+ 等待时间:指进程或作业处于等待处理机状态时间之和。
|
||||
+ 对于进程来说,等待时间就是指进程建立后等待被服务的时间之和,在等待I/O完成的期间其实进程也是在被服务的,所以不计入等待时间。
|
||||
+ 对于进程来说,等待时间就是指进程建立后等待被服务的时间之和,在等待$I/O$完成的期间其实进程也是在被服务的,所以不计入等待时间。
|
||||
+ 对于作业来说,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间。
|
||||
+ 一个作业总共需要被$CPU$服务多久,被I/O设备服务多久一般是确定不变的,因此调度算法其实只会影响作业或进程的等待时间。当然,与前面指标类似,也有“平均等待时间”来评价整体性能。
|
||||
+ 一个作业总共需要被$CPU$服务多久,被$I/O$设备服务多久一般是确定不变的,因此调度算法其实只会影响作业或进程的等待时间。当然,与前面指标类似,也有“平均等待时间”来评价整体性能。
|
||||
+ 如果一个进程到达后要么等待要么运行,则等待时间=周转时间-运行时间。
|
||||
+ 如果一个进程又有计算又有I/O操作,则等待时间=周转时间-运行时间-I/O操作时间。
|
||||
+ 响应时间:从用户提交请求到首次产生响应所用的时间。
|
||||
+ 如果一个进程又有计算又有$I/O$操作,则等待时间=周转时间-运行时间-$I/O$操作时间。
|
||||
+ 响应时间:从用户提交请求到首次产生响应所用的时间。主要用于交互式系统。
|
||||
|
||||
#### 先来先服务
|
||||
|
||||
即FCFS算法。
|
||||
即$FCFS$算法。
|
||||
|
||||
+ 算法思想:主要从“公平”的角度考虑。
|
||||
+ 算法规则:按照作业/进程到达的先后顺序进行服务。
|
||||
+ 用于作业/进程调度:用于作业调度时,考虑的是哪个作业先到达后备队列;用于进程调度时,考虑的是哪个进程先到达就绪队列。
|
||||
+ 是否可抢占:非抢占式的算法。
|
||||
+ 优缺点:
|
||||
+ 优点:公平、算法实现简单。
|
||||
+ 缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好。即FCFS算法对长作业有利,对短作业不利。
|
||||
+ 特点:
|
||||
+ 优点:公平、算法实现简单。
|
||||
+ 缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好。
|
||||
+ 即$FCFS$算法对长作业有利,对短作业不利。
|
||||
+ 不能作为分时系统和实时系统的主要调度策略。
|
||||
+ 利于$CPU$繁忙型作业,不利于$I/O$繁忙型作业。
|
||||
+ 是否会导致饥饿:不会。
|
||||
|
||||
**例题** 各进程到达就绪队列的时间、需要的运行时间如下表所示。使用先来先服务调度算法,计算各进程的等待时间、平均等待时间、周转时间、平均周转时间、带权周转时间、平均带权周转时间。
|
||||
|
||||
进程|到达时间|运行时间
|
||||
:--:|:-----:|:------:
|
||||
P1|0|7
|
||||
P2|2|4
|
||||
P3|4|1
|
||||
P4|5|4
|
||||
|
||||
根据先来先服务的思想,根据到达的顺序,得到调度顺序为:P1、P2、P3、P4。
|
||||
|
||||
所以P1在0到达,0+7=7完成。P2在2到达,而7时P1完成。所以P2要等待7-2=5,所以P2从7开始,在7+4=11完成。P3在4到达,所以需要等待11-4=7,从11开始,在11+1=12结束。P4在5到达,需要等待12-5-7,从12开始,在12+4=16结束。
|
||||
|
||||
进程|到达时间|运行时间|等待时间|开始时间|完成时间
|
||||
:--:|:-----:|:------:|:-----:|:-----:|:------:
|
||||
P1|0|7|0|0|7
|
||||
P2|2|4|5|7|11
|
||||
P3|4|1|7|11|12
|
||||
P4|5|4|7|12|16
|
||||
|
||||
因为周转时间=完成时间-到达时间。所以P1=7-0=7,P2=11-2=9,P3=12-4=8,P4=16-5=11。
|
||||
|
||||
带权周转时间=周转时间÷运行时间。所以P1=7÷7=1,P2=9÷4=2.25,P3=8÷1=8,PR=11÷4=2.75。
|
||||
|
||||
等待时间=周转时间-运行时间。根据表格可得。
|
||||
|
||||
所以平均周转时间=(7+9+8+11)÷4=8.75。平均带权周转时间=(1+2.25+8+2.75)÷4=3.5。平均等待时间=(0+5+7+7)÷4=4.75。
|
||||
|
||||
#### 短作业优先
|
||||
|
||||
即SJF算法。
|
||||
即$SJF$算法。
|
||||
|
||||
+ 算法思想:追求最少的平均等待时间,最少的平均周转时间、最少的平均平均带权周转时间。
|
||||
+ 算法规则:最短的作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短)。
|
||||
+ 用于作业/进程调度:即可用于作业调度,也可用于进程调度。用于进程调度时称为“短进程优先(SPF, Shortest Process First)算法”。
|
||||
+ 优缺点:
|
||||
+ 用于作业/进程调度:即可用于作业调度,也可用于进程调度。用于进程调度时称为“短进程优先($SPF$,$Shortest\,Process\,First$)算法”。
|
||||
+ 特点:
|
||||
+ 优点:“最短的”平均等待时间、平均周转时间。
|
||||
+ 缺点:不公平。对短作业有利,对长作业不利。可能产生饥饿现象。另外,作业/进程的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先。
|
||||
+ 是否可抢占:SJF和SPF是非抢占式的算法。但是也有抢占式的版本―——最短剩余时间优先算法(SRTN, Shortest Remaining Time Next)。
|
||||
+ 是否会导致饥饿:会。如果源源不断地有短作业/进程到来,可能使长作业/进程长时间得不到服务,产生“饥饿”现象
|
||||
。如果一直得不到服务,则称为“饿死”
|
||||
+ 缺点:
|
||||
+ 不公平。对短作业有利,对长作业不利。
|
||||
+ 可能产生饥饿现象。
|
||||
+ 未考虑作业紧迫性。
|
||||
+ 另外,作业/进程的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先。
|
||||
+ 是否可抢占:$SJF$和$SPF$是非抢占式的算法。但是也有抢占式的版本―——最短剩余时间优先算法($SRTN$, $Shortest\,Remaining\,Time\,Next$)。
|
||||
+ 是否会导致饥饿:会。如果源源不断地有短作业/进程到来,可能使长作业/进程长时间得不到服务,产生“饥饿”现象。如果一直得不到服务,则称为“饿死”。
|
||||
|
||||
1.如果题目中未特别说明,所提到的“短作业/进程优先算法”默认是非抢占式的。2.很多书上都会说“SJF调度算法的平均等待时间、平均周转时间最少”,严格来说,这个表述是错误的,不严谨的。最短剩余时间优先算法得到的平均等待时间、平均周转时间还要更少。应该加上一个条件“在所有进程同时可运行时,采用SJF调度算法的平均等待时间、平均周转时间最少”,或者说“在所有进程都几乎同时到达时,采用SJF调度算法的平均等待时间、平均周转时间最少”。如果不加上述前提条件,则应该说“抢占式的短作业/进程优先调度算法(最短剩余时间优先, SRNT算法)的平均等待时间、平均周转时间最少”。
|
||||
3.虽然严格来说,SJF的平均等待时间、平均周转时间并不一定最少,但相比于其他算法(如FCFS),SJF依然可以获得较少的平均等待时间、平均周转时间。
|
||||
4.如果选择题中遇到“SJF算法的平均等待时间、平均周转时间最少”的选项,那最好判断其他选项是不是有很明显的错误,如果没有更合适的选项,那也应该选择该选项。
|
||||
|
||||
**例题** 各进程到达就绪队列的时间、需要的运行时间如下表所示。使用非抢占式短进程优先调度算法和抢占式短进程优先调度算法,分别计算各进程的等待时间、平均等待时间、周转时间、平均周转时间、带权周转时间、平均带权周转时间。
|
||||
|
||||
进程|到达时间|运行时间
|
||||
:--:|:-----:|:------:
|
||||
P1|0|7
|
||||
P2|2|4
|
||||
P3|4|1
|
||||
P4|5|4
|
||||
|
||||
如果使用非抢占式的,因为每次选择当前已经到达且运行时间最短的作业/进程,因为P1第一个到达,所以第一个开始,P1完成时是7,P2P3P4都到达了,所以依次选最短运行时间的开始,所以调度顺序为P1、P3、P2、P4。
|
||||
|
||||
所以周转时间为7、4、10、11。带权周转时间为1、4、2.5、2.75。等待时间为0、3、6、7。平均周转时间为8。平均带权周转时间为2.56。平均等待时间为4。
|
||||
|
||||
如果使用抢占式的,若新到达进程剩余时间要比当前运行的进程剩余时间更短,则由新进程抢占处理机。
|
||||
|
||||
0时P1到达,P1剩余时间为7,所以P1开始运行。2时P2到达,此时P1剩余时间为7-2=5,而P2剩余时间为4-0=4,4<5,所以P2抢占P1处理机。4时P3到达,此时P2剩余时间为4-2=2,而P3剩余时间为1-0=1,所以P3又抢占P2处理机。到5时P4到达,此时P3正好运行完,所以要考虑P1P2P4三个的剩余时间,分别为5、2、4,所以P2抢占处理机运行。7时P2运行完,P4抢占处理机。11时P4运行完,P1抢占处理机。最后16时P1运行完,作业全部结束。
|
||||
|
||||
所以周转时间为16、5、1、6。带权周转时间为2.28、1.25、1、1.5。等待时间分别为9、1、0、2。平均周转时间为7。平均带权周转时间为1.5。平均等待时间为3。
|
||||
1. 如果题目中未特别说明,所提到的“短作业/进程优先算法”默认是非抢占式的。
|
||||
2. 很多书上都会说“$SJF$调度算法的平均等待时间、平均周转时间最少”,严格来说,这个表述是错误的,不严谨的。最短剩余时间优先算法得到的平均等待时间、平均周转时间还要更少。应该加上一个条件“在所有进程同时可运行时,采用$SJF$调度算法的平均等待时间、平均周转时间最少”,或者说“在所有进程都几乎同时到达时,采用$SJF$调度算法的平均等待时间、平均周转时间最少”。如果不加上述前提条件,则应该说“抢占式的短作业/进程优先调度算法(最短剩余时间优先,$SRNT$算法)的平均等待时间、平均周转时间最少”。
|
||||
3. 虽然严格来说,$SJF$的平均等待时间、平均周转时间并不一定最少,但相比于其他算法(如$FCFS$),$SJF$依然可以获得较少的平均等待时间、平均周转时间。
|
||||
4. 如果选择题中遇到“$SJF$算法的平均等待时间、平均周转时间最少”的选项,那最好判断其他选项是不是有很明显的错误,如果没有更合适的选项,那也应该选择该选项。
|
||||
|
||||
#### 高响应比优先
|
||||
|
||||
即HRRN算法。
|
||||
即$HRRN$算法。
|
||||
|
||||
+ 算法思想:要综合考虑作业/进程的等待时间和要求服务的时间。
|
||||
+ 算法规则:在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务。响应比=(等待时间+要求服务时间)/要求服务时间(响应比≥1)。
|
||||
+ 用于作业/进程调度:即可用于作业调度,也可用于进程调度。
|
||||
+ 算法思想:要综合考虑作业/进程的等待时间和要求服务的时间,是$FCFS$和$SJF$的综合。
|
||||
+ 算法规则:在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务。响应比=(等待时间+要求服务时间)/要求服务时间(响应比$\geqslant1$)。
|
||||
+ 用于作业/进程调度:即可用于作业调度,也可用于进程调度,但是主要用于作业调度。
|
||||
+ 是否可抢占:非抢占式的算法。因此只有当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比。
|
||||
+ 优缺点:
|
||||
+ 特点:
|
||||
+ 综合考虑了等待时间和运行时间(要求服务时间)。
|
||||
+ 等待时间相同时,要求服务时间短的优先(SJF的优点)。
|
||||
+ 要求服务时间相同时,等待时间长的优先(FCFS的优点)。
|
||||
+ 等待时间相同时,要求服务时间短的优先($SJF$的优点)。
|
||||
+ 要求服务时间相同时,等待时间长的优先($FCFS$的优点)。
|
||||
+ 对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题。
|
||||
+ 是否会导致饥饿:不会。
|
||||
|
||||
**例题** 各进程到达就绪队列的时间、需要的运行时间如下表所示。使用高响应比优先调度算法,计算各进程的等待时间、平均等待时间、周转时间、平均周转时间、带权周转时间、平均带权周转时间。
|
||||
|
||||
进程|到达时间|运行时间
|
||||
:--:|:-----:|:------:
|
||||
P1|0|7
|
||||
P2|2|4
|
||||
P3|4|1
|
||||
P4|5|4
|
||||
|
||||
需要利用公式计算响应比,最重要的是等待时间和运行时间。当0时P1到达,P1运行。7时P1完成主动放弃处理机,此时P2P3P4全部到达了,而响应比分别为(5+4)÷4=2.25、(3+1)÷1=3、(2+4)÷4=1.5,所以选择P3上处理机运行。8时,响应比分别为2.5、1.75,P2运行。12时P4运行。
|
||||
|
||||
#### 时间片轮转
|
||||
|
||||
即RR算法。
|
||||
即$RR$算法。
|
||||
|
||||
+ 算法思想:公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应。
|
||||
+ 算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片(如100ms)。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。
|
||||
+ 算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片(如$100ms$)。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。
|
||||
+ 用于作业/进程调度:用于进程调度(只有作业放入内存建立了相应的进程后,才能被分配处理机时间片)。
|
||||
+ 是否可抢占:若进程未能在时间片内运行完,将被强行剥夺处理机使用权,因此时间片轮转调度算法属于抢占式的算法。由时钟装置发出时钟中断来通知$CPU$时间片已到。
|
||||
+ 优缺点:
|
||||
+ 特点:
|
||||
+ 优点:
|
||||
+ 公平。
|
||||
+ 响应快,适用于分时操作系统。
|
||||
@@ -504,184 +475,58 @@ P4|5|4
|
||||
+ 常用于分时操作系统,更注重响应时间,所以不怎么关系周转时间。
|
||||
+ 如果时间片太大,每个进程在一个时间片内就可以完完成,则时间片轮转算法会退化为先来先服务算法,增大进程响应时间,所以时间片不能太大。
|
||||
+ 如果时间片太小,进程切换会频繁发生,需要保存现场恢复环境,增加时间开销。
|
||||
+ 一般设计时间片段时要让切换进程的开销不超过1%。
|
||||
|
||||
**例题** 各进程到达就绪队列的时间、需要的运行时间如下表所示。使用时间片轮转调度算法,分析时间片大小为2时的进程运行状态。
|
||||
|
||||
进程|到达时间|运行时间
|
||||
:--:|:-----:|:------:
|
||||
P1|0|7
|
||||
P2|2|4
|
||||
P3|4|1
|
||||
P4|5|4
|
||||
|
||||
<span style="color:orange">注意:</span>当同一时刻既有时间片用完也有新进程到达时,默认新到达进程先进入队列,时间片用完的进程后进入。
|
||||
|
||||
若时间片为2:
|
||||
|
||||
当0时,因为只有P1到达就绪队列,所以P1运行一个时间片。
|
||||
|
||||
当2时,P1时间片运行完,余下5个时间。正好P2到达就绪队列,所以P1处理机被剥夺,重新放到就绪队列尾,让P2运行一个时间片。
|
||||
|
||||
当4时,P2时间片运行完,余下2个时间。正好P3到达就绪队列加入队尾,此时P1到达队头,所以P2处理机被剥夺,重新放到就绪队列尾,让P1运行一个时间片。
|
||||
|
||||
当5时,P4到达加入就绪队列。此时就绪队列上有P3、P2、P4。
|
||||
|
||||
当6时,P1时间片运行完,余下3个时间。此时P3到达队头,所以P1处理机被剥夺,重新放到就绪队尾,让P3运行。
|
||||
|
||||
当7时,虽然P3时间片没有用完,但是由于P3只需一个单位的时间,所以主动放弃处理机,发生调度,让P2运行一个时间片。
|
||||
|
||||
当9时,P2正好运行完也用完时间片,P4上处理机。
|
||||
|
||||
当11时,P4时间片用完,余下2个时间,此时P1到达队头,所以P4处理机被剥夺,重新放到就绪队尾,让P1运行。
|
||||
|
||||
当13时,P1时间片用完,余下1个时间,此时P4到达队头,所以P1处理机被剥夺,重新放到就绪队尾,让P4运行。
|
||||
|
||||
当15时,P4正好运行完也用完时间片,P4上处理机。
|
||||
|
||||
当16时,P1运行完,主动放弃处理机。
|
||||
+ 时间片分片因素:系统响应时间、就绪队列中的进程数目、系统处理能力。
|
||||
+ 一般设计时间片段时要让切换进程的开销不超过$1\%$。
|
||||
|
||||
#### 优先级
|
||||
|
||||
即PS算法。
|
||||
也称为优先权调度算法,即$PS$算法。
|
||||
|
||||
+ 算法思想:随着计算机的发展,特别是实时操作系统的出现,越来越多的应用场景需要根据任务的紧急程度来决定处理顺序。
|
||||
+ 算法规则:调度时选择优先级最高的作业/进程。
|
||||
+ 用于作业/进程调度:既可用于作业调度,也可用于进程调度。甚至,还会用于在之后会学习的I/O调度中。
|
||||
+ 用于作业/进程调度:既可用于作业调度,也可用于进程调度。甚至,还会用于在之后会学习的$I/O$调度中。
|
||||
+ 是否可抢占:抢占式、非抢占式都有。做题时的区别在于:
|
||||
+ 非抢占式只需在进程主动放弃处理机时进行调度即可。
|
||||
+ 抢占式还需在就绪队列变化时,检查是否会发生抢占。
|
||||
+ 优缺点:
|
||||
+ 抢占式还需在就绪队列变化时,检查是否会发生抢占,若优先级更高的进程进入就绪队列,则立刻暂停正在运行的进行。
|
||||
+ 特点:
|
||||
+ 优点:用优先级区分紧急程度、重要程度,适用于实时操作系统。可灵活地调整对各种作业/进程的偏好程度。
|
||||
+ 缺点:若源源不断地有高优先级进程到来,则可能导致饥饿。
|
||||
+ 是否会导致饥饿:会。
|
||||
|
||||
+ 优先数与优先级的关系要看具体情况,如Windows优先级与优先数成正比,UNIX中成反比。
|
||||
+ 优先数与优先级的关系要看具体情况,如$Windows$优先级与优先数成正比,$UNIX$中成反比。
|
||||
+ 优先级调度算法中就绪队列未必只有一个,可以按照不同优先级来组织。
|
||||
+ 可以把优先级更高的进程排在队头位置。
|
||||
+ 根据优先级是否可以动态改变,分为:
|
||||
+ 静态优先级:创建进程时确定,一直保持不变
|
||||
+ 动态优先级:创建进程时有初始值,之后根据情况动态调整优先级。
|
||||
+ 静态优先级:创建进程时确定,一直保持不变。依据:进程类型、进程对资源的要求、用户要求。
|
||||
+ 动态优先级:创建进程时有初始值,之后根据情况动态调整优先级。依据有进程占用$CPU$时间的长短、就绪进程等待$CPU$时间的长短。
|
||||
+ 设置进程优先级:
|
||||
+ 系统进程高于用户进程。
|
||||
+ 前台进程高于后台进程。
|
||||
+ 操作系统更偏好I/O型进程(I/O繁忙型进程)而不是计算型进程($CPU$繁忙型进程),I/O设备和$CPU$可以并行工作。如果优先让I/O繁忙型进程优先运行的话,则越有可能让I/O设备尽早地投入工作,则资源利用率、系统吞吐量都会得到提升。
|
||||
+ 前台进程高于后台进程。即交互性进程高于非交互性进程。
|
||||
+ 操作系统更偏好$I/O$型进程($I/O$繁忙型进程)而不是计算型进程($CPU$繁忙型进程),$I/O$设备和$CPU$可以并行工作。如果优先让$I/O$繁忙型进程优先运行的话,则越有可能让$I/O$设备尽早地投入工作,则资源利用率、系统吞吐量都会得到提升。
|
||||
+ 调整动态优先级:
|
||||
+ 若进程在就绪队列中等待了很长时间,则提升其优先级。
|
||||
+ 若进程占用处理机很长时间,则降低其优先级。
|
||||
+ 若进程频繁进行I/O操作,则提升其优先级。
|
||||
|
||||
**例题** 各进程到达就绪队列的时间、需要的运行时间、进程优先数如下表所示。使用非抢占式与抢占式优先级调度算法,分析进程运行状态。(优先级越大,优先级越高)
|
||||
|
||||
进程|到达时间|运行时间|优先数
|
||||
:--:|:-----:|:------:|:---:
|
||||
P1|0|7|1
|
||||
P2|2|4|2
|
||||
P3|4|1|3
|
||||
P4|5|4|2
|
||||
|
||||
非抢占式:
|
||||
|
||||
0时只有P1到达,所以P1开始处理。
|
||||
|
||||
2时P2到达,4时P3到达,5时P4到达。
|
||||
|
||||
7时P1运行完,因为P3优先级更高,所以运行P3。
|
||||
|
||||
8时P3运行完,P2P4优先级相同,但是由于P2先到,所以P2上处理机。
|
||||
|
||||
12时P2运行完,P4上处理机。
|
||||
|
||||
16时P4运行完。
|
||||
|
||||
抢占式:
|
||||
|
||||
0时P1到达,P1上处理机。
|
||||
|
||||
2时P2到达,且P2优先级2大于P1优先级1,所以P2上处理机,P1余下5。
|
||||
|
||||
4时P3到达,且P3优先级3大于P2优先级2,所以P3上处理机,P2余下2。
|
||||
|
||||
5时P3运行结束,且P4到达,插入就绪队列队尾,P2进入队列时间更早,所以P2上处理机。
|
||||
|
||||
7时P2运行结束,且P4优先级4大于P1优先级1,所以P4上处理机。
|
||||
|
||||
11时P4运行结束,P1上处理机。
|
||||
|
||||
16时P1运行结束。
|
||||
+ 若进程频繁进行$I/O$操作,则提升其优先级。
|
||||
|
||||
#### 多级反馈队列
|
||||
|
||||
即MFQ算法。
|
||||
即$MFQ$算法。
|
||||
|
||||
+ 算法思想:对其他调度算法的折中权衡。
|
||||
+ 算法思想:对时间片轮转调度算法和优先级调度算法的折中权衡,动态调整进程优先级和时间片大小。
|
||||
+ 算法规则:
|
||||
1. 设置多级就绪队列,各级队列优先级从高到低,时间片从小到大。
|
||||
2. 新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾如果此时已经是在最下级的队列,则重新放回该队列队尾。
|
||||
3. 只有第k级队列为空时,才会为k+1级队头的进程分配时间片
|
||||
1. 设置多级就绪队列,各级队列优先级从$1$到$k$依次递减,时间片从小到大依次变大一倍。
|
||||
2. 新进程到达时先进入第$1$级队列队尾,按$FCFS$原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾如果此时已经是在最下级的队列,则重新放回该队列队尾。
|
||||
3. 只有第$k$级队列为空时,才会为$k+1$级队头的进程分配时间片,当又有新进程进入优先级较高的队列则立刻抢占给更够优先级的进程。
|
||||
+ 用于作业/进程调度:用于进程调度。
|
||||
+ 是否可抢占:抢占式的算法。在k级队列的进程运行过程中,若更上级的队列(1~k-1级)中进入了一个新进程,则由于新进程处于优先级更高的队列中,因此新进程会抢占处理机,原来运行的进程放回k级队列队尾。
|
||||
+ 是否可抢占:抢占式的算法。在$k$级队列的进程运行过程中,若更上级的队列($1\sim k-1$级)中进入了一个新进程,则由于新进程处于优先级更高的队列中,因此新进程会抢占处理机,原来运行的进程放回$k$级队列队尾。
|
||||
+ 优缺点:
|
||||
+ 对各类型进程相对公平(FCFS的优点)。
|
||||
+ 每个新到达的进程都可以很快就得到响应(RR的优点)。
|
||||
+ 短进程只用较少的时间就可完成(SPF的优点)。
|
||||
+ 对各类型进程相对公平($FCFS$的优点)。
|
||||
+ 每个新到达的进程都可以很快就得到响应($RR$的优点)。
|
||||
+ 短进程只用较少的时间就可完成($SPF$的优点)。
|
||||
+ 不必实现估计进程的运行时间(避免用户作假)。
|
||||
+ 可灵活地调整对各类进程的偏好程度,比如$CPU$密集型进程、I/O密集型进程(拓展:可以将因I/O而阻塞的进程重新放回原队列,这样I/O型进程就可以保持较高优先级)
|
||||
+ 可灵活地调整对各类进程的偏好程度,比如$CPU$密集型进程、$I/O$密集型进程(拓展:可以将因$I/O$而阻塞的进程重新放回原队列,这样$I/O$型进程就可以保持较高优先级)
|
||||
+ 是否会导致饥饿:会。
|
||||
|
||||
**例题** 各进程到达就绪队列的时间、需要的运行时间如下表所示。使用多级反馈队列调度算法,分析进程运行状态。
|
||||
|
||||
进程|到达时间|运行时间
|
||||
:--:|:-----:|:------:
|
||||
P1|0|7
|
||||
P2|2|4
|
||||
P3|4|1
|
||||
P4|5|4
|
||||
|
||||
设置多级就绪队列,各级队列优先级从高到低,时间片从小到大。
|
||||
|
||||
新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片。
|
||||
|
||||
若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经在最下级的队列,则重新放回最下级队列队尾。
|
||||
|
||||
只有第k级队列为空时,才会为k+1级队头的进程分配时间片。
|
||||
|
||||
被抢占处理机的进程重新放回原队列队尾。
|
||||
|
||||
定义多级就绪队列如下(优先级与优先数成正比):
|
||||
|
||||
队列序号|优先级|时间片大小
|
||||
:-----:|:----:|:-------:
|
||||
1|3|1
|
||||
2|2|2
|
||||
3|1|4
|
||||
|
||||
0时首先P1进入第一级队列,此时P1优先级为4,时间片为1,所以P1会运行1。
|
||||
|
||||
1时P1余下6,没有运行完,进入第二级队列的队尾。
|
||||
|
||||
2时P2进入第一级队列,优先级更高,所以P1被剥夺处理机,此时P1还余下5,回退第二级队列,P2开始运行。
|
||||
|
||||
3时P2运行一个时间片后余下3,加入第二级队列队尾。此时第二级队列头部为P1,所以P1开始运行。
|
||||
|
||||
4时P3进入第一级队列,优先级更高,所以P1被剥夺处理机,此时P1还余下4,回退第二级队列。
|
||||
|
||||
5时P4进入第一级队列,此时P3也正好运行完,处理机交给P4。
|
||||
|
||||
6时P4运行一个时间片后余下3,加入到第二级队列尾部。第二级队列此时顺序为P2(余3)、P1(余4)、P4(余3),所以P2开始运行。
|
||||
|
||||
8时P2运行一个时间片后余下1,加入到第三级队列中。P1开始占有处理机。
|
||||
|
||||
10时P1运行一个时间后余下2,加入到第三级队列中。P4开始占有处理机。
|
||||
|
||||
12时P4运行一个时间后余下1,加入到第三级队列中。第二级队列为空,开始运行第三级队列,P2开始占有处理机。
|
||||
|
||||
13时P2处理完,P1占有处理机。
|
||||
|
||||
15时P1处理完,P4占有处理机。
|
||||
|
||||
16时P4处理完,全部结束。
|
||||
|
||||
## 进程同步与互斥
|
||||
|
||||
### 进程同步与互斥的基本概念
|
||||
@@ -923,11 +768,11 @@ lock = false;
|
||||
+ 适用于多处理机环境
|
||||
+ 缺点:
|
||||
+ 不满足“让权等待”原则。
|
||||
+ 暂时无法进入临界区的进程会占用$CPU$并循环执行TSL指令,从而导致“忙等”。
|
||||
+ 暂时无法进入临界区的进程会占用$CPU$并循环执行$TSL$指令,从而导致“忙等”。
|
||||
|
||||
### 信号量机制
|
||||
|
||||
之前软硬件实现的进程互斥都无法解决让权等待问题,所以Dijkstra提出实现进程互斥和同步的方法——信号量机制。
|
||||
之前软硬件实现的进程互斥都无法解决让权等待问题,所以$Dijkstra$提出实现进程互斥和同步的方法——信号量机制。
|
||||
|
||||
#### 信号量机制的基础概念
|
||||
|
||||
@@ -1525,7 +1370,7 @@ Pi() {
|
||||
|区别
|
||||
:----:|:--:
|
||||
死锁|死锁一定是“循环等待对方手里的资源”导致的,因此如果有死锁现象,那至少有两个或两个以上的进程同时发生死锁。另外,发生死锁的进程一定处于阻塞态
|
||||
饥饿|可能只有一个进程发生饥饿。发生饥饿的进程既可能是阻塞态(如长期得不到需要的I/O设备),也可能是就绪态(长期得不到处理机)
|
||||
饥饿|可能只有一个进程发生饥饿。发生饥饿的进程既可能是阻塞态(如长期得不到需要的$I/O$设备),也可能是就绪态(长期得不到处理机)
|
||||
死循环|可能只有一个进程发生死循环。死循环的进程可以上处理机运行(可以是运行态),只不过无法像期待的那样顺利推进。
|
||||
|
||||
死锁和饥饿问题是由于操作系统分配资源的策略不合理导致的,而死循环是由代码逻辑的错误导致的。
|
||||
|
||||
Reference in New Issue
Block a user