auto commit
This commit is contained in:
parent
6a872e697a
commit
6e477c5524
|
@ -10,8 +10,8 @@
|
||||||
* [进程状态的切换](#进程状态的切换)
|
* [进程状态的切换](#进程状态的切换)
|
||||||
* [调度算法](#调度算法)
|
* [调度算法](#调度算法)
|
||||||
* [进程同步](#进程同步)
|
* [进程同步](#进程同步)
|
||||||
* [进程通信](#进程通信)
|
|
||||||
* [经典同步问题](#经典同步问题)
|
* [经典同步问题](#经典同步问题)
|
||||||
|
* [进程通信](#进程通信)
|
||||||
* [三、死锁](#三死锁)
|
* [三、死锁](#三死锁)
|
||||||
* [死锁的必要条件](#死锁的必要条件)
|
* [死锁的必要条件](#死锁的必要条件)
|
||||||
* [死锁的处理方法](#死锁的处理方法)
|
* [死锁的处理方法](#死锁的处理方法)
|
||||||
|
@ -160,14 +160,14 @@ Linux 系统的系统调用有以下这些:
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//ProcessState.png" width="500"/> </div><br>
|
<div align="center"> <img src="../pics//ProcessState.png" width="500"/> </div><br>
|
||||||
|
|
||||||
- 就绪状态(ready):等待 CPU 时间
|
- 就绪状态(ready):等待被调度
|
||||||
- 运行状态(running)
|
- 运行状态(running)
|
||||||
- 阻塞状态(waiting):等待资源
|
- 阻塞状态(waiting):等待资源
|
||||||
|
|
||||||
应该注意以下内容:
|
应该注意以下内容:
|
||||||
|
|
||||||
- 只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得 CPU 时间,转为运行状态;而运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度。
|
- 只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得 CPU 时间,转为运行状态;而运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度。
|
||||||
- 阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括 CPU 时间,缺少 CPU 事件会从运行态转换为就绪态。
|
- 阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括 CPU 时间,缺少 CPU 时间会从运行态转换为就绪态。
|
||||||
|
|
||||||
## 调度算法
|
## 调度算法
|
||||||
|
|
||||||
|
@ -385,44 +385,6 @@ begin
|
||||||
end;
|
end;
|
||||||
```
|
```
|
||||||
|
|
||||||
## 进程通信
|
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//aa202729-769d-4d2a-b103-f45b412ceaf4.jpg"/> </div><br>
|
|
||||||
|
|
||||||
### 1. 管道
|
|
||||||
|
|
||||||
写进程在管道的尾端写入数据,读进程在管道的首端读出数据。管道提供了简单的流控制机制,进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样地,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。
|
|
||||||
|
|
||||||
Linux 中管道通过空文件实现。
|
|
||||||
|
|
||||||
管道有三种:
|
|
||||||
|
|
||||||
1. 普通管道:有两个限制,一是只能单向传输;二是只能在父子进程之间使用;
|
|
||||||
2. 流管道:去除第一个限制,支持双向传输;
|
|
||||||
3. 命名管道:去除第二个限制,可以在不相关进程之间进行通信。
|
|
||||||
|
|
||||||
### 2. 信号量
|
|
||||||
|
|
||||||
信号量是一个计数器,可以用来控制多个进程对共享资源的互斥访问,主要作为进程间以及同一进程内不同线程之间的同步手段。
|
|
||||||
|
|
||||||
### 3. 消息队列
|
|
||||||
|
|
||||||
消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
|
|
||||||
|
|
||||||
### 4. 信号
|
|
||||||
|
|
||||||
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
|
|
||||||
|
|
||||||
### 5. 共享内存
|
|
||||||
|
|
||||||
共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。
|
|
||||||
|
|
||||||
共享内存是最快的 IPC 方式,它是针对其它 IPC 运行效率低而专门设计的。它往往与其它通信机制(如信号量)配合使用,来实现进程间的同步和通信。
|
|
||||||
|
|
||||||
### 6. 套接字
|
|
||||||
|
|
||||||
套接字也是一种进程间通信机制,与其它通信机制不同的是,它可用于不同机器间的进程通信。
|
|
||||||
|
|
||||||
## 经典同步问题
|
## 经典同步问题
|
||||||
|
|
||||||
生产者和消费者问题前面已经讨论过了。
|
生产者和消费者问题前面已经讨论过了。
|
||||||
|
@ -535,6 +497,59 @@ void test(i) { // 尝试拿起两把筷子
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 进程通信
|
||||||
|
|
||||||
|
### 1. 进程同步与进程通信的区别
|
||||||
|
|
||||||
|
- 进程同步:控制多个进程按一定顺序执行;
|
||||||
|
- 进程通信:进程间传输信息。
|
||||||
|
|
||||||
|
进程通信是一种手段,而进程同步是一种目的。也可以说,为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。
|
||||||
|
|
||||||
|
在进程同步中介绍的信号量也属于进程通信的一种方式,但是属于低级别的进程通信,因为它传输的信息非常小。
|
||||||
|
|
||||||
|
### 2. 进程通信方式
|
||||||
|
|
||||||
|
#### 2.1 消息传递
|
||||||
|
|
||||||
|
操作系统提供了用于通信的通道(Channel),进程可以通过读写这个通道进行通信。
|
||||||
|
|
||||||
|
<div align="center"> <img src="../pics//037c3a0b-332d-434d-a374-f343ef72c8e1.jpg" width="400"/> </div><br>
|
||||||
|
|
||||||
|
<font size=3> **(1)管道** </font></br>
|
||||||
|
|
||||||
|
写进程在管道的尾端写入数据,读进程在管道的首端读出数据。管道提供了简单的流控制机制,进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样地,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。
|
||||||
|
|
||||||
|
Linux 中管道通过空文件实现。
|
||||||
|
|
||||||
|
管道有三种:
|
||||||
|
|
||||||
|
1. 普通管道:有两个限制,一是只能单向传输;二是只能在父子进程之间使用;
|
||||||
|
2. 流管道:去除第一个限制,支持双向传输;
|
||||||
|
3. 命名管道:去除第二个限制,可以在不相关进程之间进行通信。
|
||||||
|
|
||||||
|
<div align="center"> <img src="../pics//7f642a65-b167-4c8f-b382-8322c6322b2c.jpg" width="400"/> </div><br>
|
||||||
|
|
||||||
|
<font size=3> **(2)消息队列** </font></br>
|
||||||
|
|
||||||
|
消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
|
||||||
|
|
||||||
|
<div align="center"> <img src="../pics//d49466db-fdd3-4d36-8a86-47dc45c07a1e.jpg" width="400"/> </div><br>
|
||||||
|
|
||||||
|
<font size=3> **(3)套接字** </font></br>
|
||||||
|
|
||||||
|
套接字也是一种进程间通信机制,与其它通信机制不同的是,它可用于不同机器间的进程通信。
|
||||||
|
|
||||||
|
<div align="center"> <img src="../pics//699b4f96-d63f-46ea-a581-2b3d95eceb6a.jpg" width="400"/> </div><br>
|
||||||
|
|
||||||
|
#### 2.2 共享内存
|
||||||
|
|
||||||
|
操作系统建立一块共享内存,并将其映射到每个进程的地址空间上,进程就可以直接对这块共享内存进行读写。
|
||||||
|
|
||||||
|
共享内存是最快的进程通信方式。
|
||||||
|
|
||||||
|
<div align="center"> <img src="../pics//7be0abf9-687c-4451-becd-626b0be7ec22.jpg" width="400"/> </div><br>
|
||||||
|
|
||||||
# 三、死锁
|
# 三、死锁
|
||||||
|
|
||||||
## 死锁的必要条件
|
## 死锁的必要条件
|
||||||
|
|
BIN
pics/037c3a0b-332d-434d-a374-f343ef72c8e1.jpg
Normal file
BIN
pics/037c3a0b-332d-434d-a374-f343ef72c8e1.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 37 KiB |
BIN
pics/699b4f96-d63f-46ea-a581-2b3d95eceb6a.jpg
Normal file
BIN
pics/699b4f96-d63f-46ea-a581-2b3d95eceb6a.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
BIN
pics/7be0abf9-687c-4451-becd-626b0be7ec22.jpg
Normal file
BIN
pics/7be0abf9-687c-4451-becd-626b0be7ec22.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 40 KiB |
BIN
pics/7f642a65-b167-4c8f-b382-8322c6322b2c.jpg
Normal file
BIN
pics/7f642a65-b167-4c8f-b382-8322c6322b2c.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
BIN
pics/d49466db-fdd3-4d36-8a86-47dc45c07a1e.jpg
Normal file
BIN
pics/d49466db-fdd3-4d36-8a86-47dc45c07a1e.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 36 KiB |
Loading…
Reference in New Issue
Block a user