auto commit

This commit is contained in:
CyC2018
2018-08-03 00:12:55 +08:00
parent d0fa9aff51
commit 480a8070cd
7 changed files with 66 additions and 100 deletions

View File

@ -23,6 +23,7 @@
* [段页式](#段页式)
* [分页与分段的比较](#分页与分段的比较)
* [五、设备管理](#五设备管理)
* [磁盘结构](#磁盘结构)
* [磁盘调度算法](#磁盘调度算法)
* [六、链接](#六链接)
* [编译系统](#编译系统)
@ -304,7 +305,7 @@ void P2() {
为了同步生产者和消费者的行为需要记录缓冲区中物品的数量。数量可以使用信号量来进行统计这里需要使用两个信号量empty 记录空缓冲区的数量full 记录满缓冲区的数量。其中empty 信号量是在生产者进程中使用,当 empty 不为 0 时生产者才可以放入物品full 信号量是在消费者进程中使用,当 full 信号量不为 0 时,消费者才可以取走物品。
注意,不能先对缓冲区进行加锁,再测试信号量。也就是说,不能先执行 down(mutex) 再执行 down(empty)。如果这么做了,那么可能会出现这种情况:生产者对缓冲区加锁后,执行 down(empty) 操作,发现 empty = 0此时生产者睡眠。消费者不能进入临界区因为生产者对缓冲区加锁了就无法执行 up(empty) 操作empty 永远都为 0那么生产者和消费者就会一直等待下去,造成死锁
注意,不能先对缓冲区进行加锁,再测试信号量。也就是说,不能先执行 down(mutex) 再执行 down(empty)。如果这么做了,那么可能会出现这种情况:生产者对缓冲区加锁后,执行 down(empty) 操作,发现 empty = 0此时生产者睡眠。消费者不能进入临界区因为生产者对缓冲区加锁了消费者就无法执行 up(empty) 操作empty 永远都为 0导致生产者永远等待下,不会释放锁,消费者因此也会永远等待下去
```c
#define N 100
@ -314,7 +315,7 @@ semaphore empty = N;
semaphore full = 0;
void producer() {
while(TRUE){
while(TRUE) {
int item = produce_item();
down(&empty);
down(&mutex);
@ -325,7 +326,7 @@ void producer() {
}
void consumer() {
while(TRUE){
while(TRUE) {
down(&full);
down(&mutex);
int item = remove_item();
@ -542,7 +543,7 @@ int pipe(int fd[2]);
它具有以下限制:
- 只支持半双工通信(单向传输);
- 只支持半双工通信(单向交替传输);
- 只能在父子进程中使用。
<div align="center"> <img src="../pics//53cd9ade-b0a6-4399-b4de-7f1fbd06cdfb.png"/> </div><br>
@ -707,7 +708,7 @@ FIFO 常用于客户-服务器应用程序中FIFO 用作汇聚点,在客户
虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。
为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到一部分不在物理内存中的地址空间时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。
为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到不在物理内存中的时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。
从上面的描述中可以看出,虚拟内存允许程序不用将地址空间中的每一页都映射到物理内存,也就是说一个程序不需要全部调入内存就可以运行,这使得有限的内存运行大程序称为可能。例如有一台计算机可以产生 16 位地址,那么一个程序的地址空间范围是 0\~64K。该计算机只有 32KB 的物理内存,虚拟内存技术允许该计算机运行一个 64K 大小的程序。
@ -715,12 +716,11 @@ FIFO 常用于客户-服务器应用程序中FIFO 用作汇聚点,在客户
## 分页系统地址映射
- 内存管理单元MMU管理着地址空间和物理内存的转换。
- 页表Page table地址空间和页框物理内存空间的映射表。例如下图中页表的第 0 个表项为 010表示第 0 个页映射到第 2 个页框。页表项的最后一位用来标记页是否在内存中。
内存管理单元MMU管理着地址空间和物理内存的转换其中的页表Page table存储着页程序地址空间和页框物理内存空间的映射表
下图的页表存放着 16 个页,这 16 个页需要用 4 个比特位来进行索引定位。因此对于虚拟地址0010 000000000100前 4 位是用来存储页面号,而后 12 位存储在页中的偏移量。
下图的页表存放着 16 个页,这 16 个页需要用 4 个比特位来进行索引定位,也就是存储页面号,剩下 12 个比特位存储偏移量。
0010 000000000100根据前 4 位得到页号为 2读取表项内容为110 1,它的前 3 为为页框号,最后 1 位表示该页在内存中。最后映射得到物理内存地址为110 000000000100
例如对于虚拟地址0010 000000000100前 4 位是存储页面号 2读取表项内容为110 1。该页在内存中,并且页框的地址为 110 000000000100
<div align="center"> <img src="../pics//cf4386a1-58c9-4eca-a17f-e12b1e9770eb.png" width="500"/> </div><br>
@ -828,11 +828,22 @@ FIFO 算法可能会把经常使用的页面置换出去,为了避免这一问
# 五、设备管理
## 磁盘结构
- 盘面Platter一个磁盘有多个盘面
- 磁道Track盘面上的圆形带状区域一个盘面可以有多个磁道
- 扇区Track Sector磁道上的一个弧段一个磁道可以有多个扇区它是最小的物理储存单位目前主要有 512 bytes 与 4 K 两种大小;
- 磁头Head与盘面非常接近能够将盘面上的磁场转换为电信号或者将电信号转换为盘面的磁场
- 制动手臂Actuator arm用于在磁道之间移动磁头
- 主轴Spindle使整个盘面转动。
<div align="center"> <img src="../pics//014fbc4d-d873-4a12-b160-867ddaed9807.jpg"/> </div><br>
## 磁盘调度算法
读写一个磁盘块的时间的影响因素有:
- 旋转时间(主轴旋转磁盘,使得磁头移动到适当的扇区上)
- 旋转时间(主轴转动盘面,使得磁头移动到适当的扇区上)
- 寻道时间(制动手臂移动,使得磁头移动到适当的磁道上)
- 实际的数据传输时间
@ -933,8 +944,9 @@ gcc -o hello hello.c
- Tanenbaum A S, Bos H. Modern operating systems[M]. Prentice Hall Press, 2014.
- 汤子瀛, 哲凤屏, 汤小丹. 计算机操作系统[M]. 西安电子科技大学出版社, 2001.
- Bryant, R. E., & OHallaron, D. R. (2004). 深入理解计算机系统.
- 史蒂文斯. UNIX 环境高级编程 [M]. 人民邮电出版社, 2014.
- [Operating System Notes](https://applied-programming.github.io/Operating-Systems-Notes/)
- [进程间的几种通信方式](http://blog.csdn.net/yufaw/article/details/7409596)
- [Operating-System Structures](https://www.cs.uic.edu/\~jbell/CourseNotes/OperatingSystems/2_Structures.html)
- [Processes](http://cse.csusb.edu/tongyu/courses/cs460/notes/process.php)
- [Inter Process Communication Presentation[1]](https://www.slideshare.net/rkolahalam/inter-process-communication-presentation1)
- [Decoding UCS Invicta Part 1](https://blogs.cisco.com/datacenter/decoding-ucs-invicta-part-1)