auto commit

This commit is contained in:
CyC2018
2018-02-27 14:14:59 +08:00
parent 5697ac7798
commit ae2477e7f9
+23 -25
View File
@@ -404,11 +404,9 @@ Linux
管道有三种:
① 普通管道:有两个限制:一是只支持半双工通信方式,即只能单向传输;二是只能在父子进程之间使用;
② 流管道:去除第一个限制,支持双向传输;
③ 命名管道:去除第二个限制,可以在不相关进程之间进行通信。
1. 普通管道:有两个限制:一是只支持半双工通信方式,即只能单向传输;二是只能在父子进程之间使用;
2. 流管道:去除第一个限制,支持双向传输;
3. 命名管道:去除第二个限制,可以在不相关进程之间进行通信。
### 2. 信号量
@@ -424,7 +422,7 @@ Linux
### 5. 共享内存
共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其它进程间通信方式运行效率低而专门设计的。它往往与其它通信机制(如信号量)配合使用,来实现进程间的同步和通信。
共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其它 IPC 运行效率低而专门设计的。它往往与其它通信机制(如信号量)配合使用,来实现进程间的同步和通信。
### 6. 套接字
@@ -524,10 +522,12 @@ void philosopher(int i) {
![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c037c901-7eae-4e31-a1e4-9d41329e5c3e.png)
1. 互斥
2. 请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
2. 请求与保持
3. 不可抢占
4. 环路等待
其中,请求与保持是指一个进程因请求资源而阻塞时,对已获得的资源保持不放。
## 死锁的处理方法
### 1. 鸵鸟策略
@@ -582,15 +582,13 @@ void philosopher(int i) {
检查一个状态是否安全的算法如下:
① 查找右边的矩阵是否存在一行小于等于向量 A。如果不存在这样的行,那么系统将会发生死锁,状态是不安全的。
② 假若找到这样一行,将该进程标记为终止,并将其已分配资源加到 A 中。
③ 重复以上两步,直到所有进程都标记为终止,则状态时安全的。
- 查找右边的矩阵是否存在一行小于等于向量 A。如果不存在这样的行,那么系统将会发生死锁,状态是不安全的。
- 假若找到这样一行,将该进程标记为终止,并将其已分配资源加到 A 中。
- 重复以上两步,直到所有进程都标记为终止,则状态时安全的。
### 4. 死锁检测与死锁恢复
不试图组织死锁,而是当检测到死锁发生时,采取措施进行恢复。
不试图阻止死锁,而是当检测到死锁发生时,采取措施进行恢复。
#### 4.1 死锁检测算法
@@ -600,33 +598,33 @@ void philosopher(int i) {
上图中,有三个进程四个资源,每个数据代表的含义如下:
E 向量:资源总量
A 向量:资源剩余量
C 矩阵:每个进程所拥有的资源数量,每一行都代表一个进程拥有资源的数量
R 矩阵:每个进程请求的资源数量
- E 向量:资源总量
- A 向量:资源剩余量
- C 矩阵:每个进程所拥有的资源数量,每一行都代表一个进程拥有资源的数量
- R 矩阵:每个进程请求的资源数量
进程 P<sub>1</sub> 和 P<sub>2</sub> 所请求的资源都得不到满足,只有进程 P<sub>3</sub> 可以,让 P<sub>3</sub> 执行,之后释放 P<sub>3</sub> 拥有的资源,此时 A = (2 2 2 0)。P<sub>1</sub> 可以执行,执行后释放 P<sub>1</sub> 拥有的资源, A = (4 2 2 2) ,P<sub>2</sub> 也可以执行。所有进程都可以顺利执行,没有死锁。
进程 P<sub>1</sub> 和 P<sub>2</sub> 所请求的资源都得不到满足,只有进程 P<sub>3</sub> 可以,让 P<sub>3</sub> 执行,之后释放 P<sub>3</sub> 拥有的资源,此时 A = (2 2 2 0)。P<sub>1</sub> 可以执行,执行后释放 P<sub>1</sub> 拥有的资源,A = (4 2 2 2) ,P<sub>2</sub> 也可以执行。所有进程都可以顺利执行,没有死锁。
算法总结如下:
每个进程最开始时都不被标记,执行过程有可能被标记。当算法结束时,任何没有被标记的进程都是死锁进程。
① 寻找一个没有标记的进程 P<sub>i</sub>,它所请求的资源小于等于 A。
② 如果找到了这样一个进程,那么将 C 矩阵的第 i 行向量加到 A 中,标记该进程,并转回 ①。
③ 如果有没有这样一个进程,算法终止。
1. 寻找一个没有标记的进程 P<sub>i</sub>,它所请求的资源小于等于 A。
2. 如果找到了这样一个进程,那么将 C 矩阵的第 i 行向量加到 A 中,标记该进程,并转回 1。
3. 如果有没有这样一个进程,算法终止。
#### 4.2 死锁恢复
① 利用抢占恢复
② 杀死进程
- 利用抢占恢复
- 杀死进程
# 第四章 存储器管理
## 虚拟内存
每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一 页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。
每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。
当程序引用到一部分在物理内存中的地址空间时,由硬件立即执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。
当程序引用到一部分在物理内存中的地址空间时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。
## 分页与分段