diff --git a/notes/计算机操作系统.md b/notes/计算机操作系统.md index 8e156599..e7a540da 100644 --- a/notes/计算机操作系统.md +++ b/notes/计算机操作系统.md @@ -46,7 +46,7 @@ * [1. 读者-写者问题](#1-读者-写者问题) * [2. 哲学家进餐问题](#2-哲学家进餐问题) * [第三章 死锁](#第三章-死锁) - * [死锁的条件](#死锁的条件) + * [死锁的必要条件](#死锁的必要条件) * [死锁的处理方法](#死锁的处理方法) * [1. 鸵鸟策略](#1-鸵鸟策略) * [2. 死锁预防](#2-死锁预防) @@ -344,12 +344,12 @@ monitor ProducerConsumer procedure insert(); begin - + // ... end; procedure remove(); begin - + // ... end; end monitor; ``` @@ -371,7 +371,7 @@ monitor ProducerConsumer if count = N then wait(full); insert_item(item); count := count + 1; - if count = 1 ten signal(empty); + if count = 1 then signal(empty); end; function remove: integer; @@ -416,13 +416,13 @@ Linux 中管道是通过空文件来实现。 管道有三种: -1. 普通管道:有两个限制:一是只支持半双工通信方式,即只能单向传输;二是只能在父子进程之间使用; +1. 普通管道:有两个限制,一是只能单向传输;二是只能在父子进程之间使用; 2. 流管道:去除第一个限制,支持双向传输; 3. 命名管道:去除第二个限制,可以在不相关进程之间进行通信。 ### 2. 信号量 -信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其它进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 +信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其它进程也访问该资源。主要作为进程间以及同一进程内不同线程之间的同步手段。 ### 3. 消息队列 @@ -434,7 +434,9 @@ Linux 中管道是通过空文件来实现。 ### 5. 共享内存 -共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其它 IPC 运行效率低而专门设计的。它往往与其它通信机制(如信号量)配合使用,来实现进程间的同步和通信。 +共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。 + +共享内存是最快的 IPC 方式,它是针对其它 IPC 运行效率低而专门设计的。它往往与其它通信机制(如信号量)配合使用,来实现进程间的同步和通信。 ### 6. 套接字 @@ -442,7 +444,7 @@ Linux 中管道是通过空文件来实现。 ## 经典同步问题 -生产者和消费者问题前面已经讨论过。 +生产者和消费者问题前面已经讨论过了。 ### 1. 读者-写者问题 @@ -506,7 +508,7 @@ void philosopher(int i) { } ``` -为了防止死锁的发生,可以加一点限制,只允许同时拿起左右两边的筷子,方法是引入一个互斥量,对拿起两个筷子的那段代码加锁。 +为了防止死锁的发生,可以加一点限制,只允许同时拿起左右两边的筷子。方法是引入一个互斥量,对拿起两个筷子的那段代码加锁。 ```c semaphore mutex = 1; @@ -529,16 +531,15 @@ void philosopher(int i) { # 第三章 死锁 -## 死锁的条件 +## 死锁的必要条件

-1. 互斥 -2. 请求与保持 -3. 不可抢占 -4. 环路等待 +1. 互斥:每个资源要么已经分配给了一个进程,要么就是可用的。 +2. 占有和等待:已经得到了某个资源的进程可以再请求新的资源。 +3. 不可抢占:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显示地释放。 +4. 环路等待:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。 -其中,请求与保持是指一个进程因请求资源而阻塞时,对已获得的资源保持不放。 ## 死锁的处理方法