auto commit
This commit is contained in:
parent
793840a9d4
commit
5f84c9585a
|
@ -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) {
|
|||
|
||||
# 第三章 死锁
|
||||
|
||||
## 死锁的条件
|
||||
## 死锁的必要条件
|
||||
|
||||
<div align="center"> <img src="../pics//c037c901-7eae-4e31-a1e4-9d41329e5c3e.png"/> </div><br>
|
||||
|
||||
1. 互斥
|
||||
2. 请求与保持
|
||||
3. 不可抢占
|
||||
4. 环路等待
|
||||
1. 互斥:每个资源要么已经分配给了一个进程,要么就是可用的。
|
||||
2. 占有和等待:已经得到了某个资源的进程可以再请求新的资源。
|
||||
3. 不可抢占:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显示地释放。
|
||||
4. 环路等待:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。
|
||||
|
||||
其中,请求与保持是指一个进程因请求资源而阻塞时,对已获得的资源保持不放。
|
||||
|
||||
## 死锁的处理方法
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user