diff --git a/notes/计算机操作系统.md b/notes/计算机操作系统.md index 59584ad3..b3c8c685 100644 --- a/notes/计算机操作系统.md +++ b/notes/计算机操作系统.md @@ -26,8 +26,8 @@ * [磁盘调度算法](#磁盘调度算法) * [六、链接](#六链接) * [编译系统](#编译系统) - * [目标文件](#目标文件) * [静态链接](#静态链接) + * [目标文件](#目标文件) * [动态链接](#动态链接) * [参考资料](#参考资料) @@ -800,37 +800,43 @@ FIFO 算法可能会把经常使用的页面置换出去,为了避免这一问 ## 磁盘调度算法 -当多个进程同时请求访问磁盘时,需要进行磁盘调度来控制对磁盘的访问。 +读写一个磁盘块的时间的影响因素有: -磁盘调度的主要目标是使磁盘的平均寻道时间最少。 +- 旋转时间(主轴旋转磁盘,使得磁头移动到适当的扇区上) +- 寻道时间(制动手臂移动,使得磁头移动到适当的磁道上) +- 实际的数据传输时间 + +其中,寻道时间最长,因此磁盘调度的主要目标是使磁盘的平均寻道时间最短。 ### 1. 先来先服务 > FCFS, First Come First Served -根据进程请求访问磁盘的先后次序来进行调度。优点是公平和简单,缺点也很明显,因为未对寻道做任何优化,使平均寻道时间可能较长。 +按照磁盘请求的顺序进行调度。 + +优点是公平和简单。缺点也很明显,因为未对寻道做任何优化,使平均寻道时间可能较长。 ### 2. 最短寻道时间优先 > SSTF, Shortest Seek Time First -要求访问的磁道与当前磁头所在磁道距离最近的优先进行调度。这种算法并不能保证平均寻道时间最短,但是比 FCFS 好很多。 +优先调度与当前磁头所在磁道距离最近的磁道。 -### 3. 扫描算法 +虽然平均寻道时间比较低,但是不够公平。如果新到达的磁道请求比一个在等待的磁道请求近,那么在等待的磁道请求会一直等待下去,也就是出现饥饿现象。具体来说,两边的磁道请求更容易出现饥饿现象。 + +

+ +### 3. 电梯算法 > SCAN -SSTF 会出现饥饿现象。考虑以下情况,新进程请求访问的磁道与磁头所在磁道的距离总是比一个在等待的进程来的近,那么等待的进程会一直等待下去。 +电梯总是保持一个方向运行,直到该方向没有请求为止,然后改变运行方向。 -SCAN 算法在 SSTF 算法之上考虑了磁头的移动方向,要求所请求访问的磁道在磁头当前移动方向上才能够得到调度。因为考虑了移动方向,那么一个进程请求访问的磁道一定会得到调度。 +电梯算法(扫描算法)和电梯的运行过程类似,总是按一个方向来进行磁盘调度,直到该方向上没有未完成的磁盘请求,然后改变方向。 -当一个磁头自里向外移动时,移到最外侧会改变移动方向为自外向里,这种移动的规律类似于电梯的运行,因此又常称 SCAN 算法为电梯调度算法。 +因为考虑了移动方向,因此所有的磁盘请求都会被满足,解决了 SSTF 的饥饿问题。 -### 4. 循环扫描算法 - -> CSCAN - -CSCAN 对 SCAN 进行了改动,要求磁头始终沿着一个方向移动。 +

# 六、链接 @@ -860,24 +866,24 @@ gcc -o hello hello.c - 预处理阶段:处理以 # 开头的预处理命令; - 编译阶段:翻译成汇编文件; -- 汇编阶段:将汇编文件翻译成可重定向目标文件,它是二进制的; +- 汇编阶段:将汇编文件翻译成可重定向目标文件; - 链接阶段:将可重定向目标文件和 printf.o 等单独预编译好的目标文件进行合并,得到最终的可执行目标文件。 -## 目标文件 - -- 可执行目标文件:可以直接在内存中执行; -- 可重定向目标文件:可与其它可重定向目标文件在链接阶段合并,创建一个可执行目标文件; -- 共享目标文件:可以在运行时被动态加载进内存并链接; - ## 静态链接 静态连接器以一组可重定向目标文件为输入,生成一个完全链接的可执行目标文件作为输出。链接器主要完成以下两个任务: - 符号解析:每个符号对应于一个函数、一个全局变量或一个静态变量,符号解析的目的是将每个符号引用与一个符号定义关联起来。 -- 重定位:编译器和汇编器生成从地址 0 开始的代码和数据节,链接器通过把每个符号定义与一个内存位置关联起来,从而重定位这些节,然后修改所有对这些符号的引用,使得它们指向这个内存位置。 +- 重定位:链接器通过把每个符号定义与一个内存位置关联起来,然后修改所有对这些符号的引用,使得它们指向这个内存位置。

+## 目标文件 + +- 可执行目标文件:可以直接在内存中执行; +- 可重定向目标文件:可与其它可重定向目标文件在链接阶段合并,创建一个可执行目标文件; +- 共享目标文件:这是一种特殊的可重定向目标文件,可以在加载或者运行时被动态加载进内存并链接; + ## 动态链接 静态库有以下两个问题: @@ -887,8 +893,8 @@ gcc -o hello hello.c 共享库是为了解决静态库的这两个问题而设计的,在 Linux 系统中通常用 .so 后缀来表示,Windows 系统上它们被称为 DLL。它具有以下特点: -- 在给定的文件系统中一个库只有一个 .so 文件,所有引用该库的可执行目标文件都共享这个文件,它不会被复制到引用它的可执行文件中; -- 在内存中,一个共享库的 .text 节的一个副本可以被不同的正在运行的进程共享。 +- 在给定的文件系统中一个库只有一个文件,所有引用该库的可执行目标文件都共享这个文件,它不会被复制到引用它的可执行文件中; +- 在内存中,一个共享库的 .text 节(已编译程序的机器代码)的一个副本可以被不同的正在运行的进程共享。

diff --git a/pics/271ce08f-c124-475f-b490-be44fedc6d2e.png b/pics/271ce08f-c124-475f-b490-be44fedc6d2e.png new file mode 100644 index 00000000..8de6367b Binary files /dev/null and b/pics/271ce08f-c124-475f-b490-be44fedc6d2e.png differ diff --git a/pics/4e2485e4-34bd-4967-9f02-0c093b797aaa.png b/pics/4e2485e4-34bd-4967-9f02-0c093b797aaa.png new file mode 100644 index 00000000..a5643118 Binary files /dev/null and b/pics/4e2485e4-34bd-4967-9f02-0c093b797aaa.png differ