mirror of
https://github.com/CyC2018/Interview-Notebook.git
synced 2026-10-16 21:43:54 +00:00
auto commit
This commit is contained in:
+23
-25
@@ -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) {
|
||||

|
||||
|
||||
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 死锁恢复
|
||||
|
||||
① 利用抢占恢复
|
||||
② 杀死进程
|
||||
- 利用抢占恢复
|
||||
- 杀死进程
|
||||
|
||||
# 第四章 存储器管理
|
||||
|
||||
## 虚拟内存
|
||||
|
||||
每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一 页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。
|
||||
每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。
|
||||
|
||||
当程序引用到一部分在物理内存中的地址空间时,由硬件立即执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。
|
||||
当程序引用到一部分在物理内存中的地址空间时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。
|
||||
|
||||
## 分页与分段
|
||||
|
||||
|
||||
Reference in New Issue
Block a user