auto commit
This commit is contained in:
parent
fad305ae09
commit
d8c27b97aa
|
@ -25,10 +25,9 @@
|
|||
* [1.2 短作业优先](#12-短作业优先)
|
||||
* [1.3 最短剩余时间优先](#13-最短剩余时间优先)
|
||||
* [2. 交互式系统中的调度](#2-交互式系统中的调度)
|
||||
* [2.1 优先权优先](#21-优先权优先)
|
||||
* [2.1 优先级调度](#21-优先级调度)
|
||||
* [2.2 时间片轮转](#22-时间片轮转)
|
||||
* [2.3 多级反馈队列](#23-多级反馈队列)
|
||||
* [2.4 短进程优先](#24-短进程优先)
|
||||
* [3. 实时系统中的调度](#3-实时系统中的调度)
|
||||
* [进程同步](#进程同步)
|
||||
* [1. 临界区](#1-临界区)
|
||||
|
@ -212,7 +211,7 @@ shortest remaining time next(SRTN)。
|
|||
|
||||
### 2. 交互式系统中的调度
|
||||
|
||||
#### 2.1 优先权优先
|
||||
#### 2.1 优先级调度
|
||||
|
||||
除了可以手动赋予优先权之外,还可以把响应比作为优先权,这种调度方式叫做高响应比优先调度算法。
|
||||
|
||||
|
@ -230,15 +229,9 @@ shortest remaining time next(SRTN)。
|
|||
|
||||
<div align="center"> <img src="../pics//042cf928-3c8e-4815-ae9c-f2780202c68f.png"/> </div><br>
|
||||
|
||||
1. 设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权越高的队列中,为每个进程所规定的执行时间片就越小。
|
||||
如果一个进程需要执行 100 个时间片,如果采用轮转调度算法,那么需要交换 100 次。多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,..。进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要 7 (包括最初的装入)的交换。
|
||||
|
||||
2. 当一个新进程进入内存后,首先将它放入第一队列的末尾,按 FCFS 原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入下一个队列的队尾。
|
||||
|
||||
3. 仅当前 i-1 个队列均空时,才会调度第 i 个队列中的进程。
|
||||
|
||||
优点:实时性好,同时适合运行短作业和长作业。
|
||||
|
||||
#### 2.4 短进程优先
|
||||
每个队列的优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。
|
||||
|
||||
### 3. 实时系统中的调度
|
||||
|
||||
|
@ -300,7 +293,7 @@ void P2() {
|
|||
|
||||
为了同步生产者和消费者的行为,需要记录缓冲区中物品的数量。数量可以使用信号量来进行统计,这里需要使用两个信号量:empty 记录空缓冲区的数量,full 记录满缓冲区的数量。其中,empty 信号量是在生产者进程中使用,当 empty 不为 0 时,生产者才可以放入物品;full 信号量是在消费者进行中使用,当 full 信号量不为 0 时,消费者才可以取走物品。
|
||||
|
||||
注意,不能先对缓冲区进行加锁,再测试信号量。也就是说,不能先执行 down(mutex) 再执行 down(empty)。如果这么做了,那么可能会出现这种情况:生产者对缓冲区加锁后,执行 down(empty) 操作,发现 empty = 0,此时生产者睡眠。消费者不能进入临界区,因为生产者对缓冲区加锁了,也就无法执行 up(empty) 操作,empty 永久都为 0,那么生产者和消费者就会一直等待下去,造成死锁。
|
||||
注意,不能先对缓冲区进行加锁,再测试信号量。也就是说,不能先执行 down(mutex) 再执行 down(empty)。如果这么做了,那么可能会出现这种情况:生产者对缓冲区加锁后,执行 down(empty) 操作,发现 empty = 0,此时生产者睡眠。消费者不能进入临界区,因为生产者对缓冲区加锁了,也就无法执行 up(empty) 操作,empty 永远都为 0,那么生产者和消费者就会一直等待下去,造成死锁。
|
||||
|
||||
```c
|
||||
#define N 100
|
||||
|
@ -486,7 +479,7 @@ void writer() {
|
|||
|
||||
<div align="center"> <img src="../pics//a9077f06-7584-4f2b-8c20-3a8e46928820.jpg"/> </div><br>
|
||||
|
||||
五个哲学家围着一张圆桌,每个哲学家面前放着食物。哲学家的生活有两种交替活动:吃饭以及思考。当一个哲学家吃饭时,需要先拿起筷子左右的两根筷子,并且只能一次只能拿起一根筷子。
|
||||
五个哲学家围着一张圆桌,每个哲学家面前放着食物。哲学家的生活有两种交替活动:吃饭以及思考。当一个哲学家吃饭时,需要先拿起筷子左右的两根筷子,并且一次只能拿起一根筷子。
|
||||
|
||||
下面是一种错误的解法,考虑到如果所有哲学家同时拿起左手边的筷子,那么就无法拿起右手边的筷子,造成死锁。
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user