auto commit

This commit is contained in:
CyC2018 2018-03-20 15:49:11 +08:00
parent 6a872e697a
commit 6e477c5524
6 changed files with 56 additions and 41 deletions

View File

@ -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>
# 三、死锁 # 三、死锁
## 死锁的必要条件 ## 死锁的必要条件

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB