auto commit
This commit is contained in:
parent
4154ec2cd6
commit
2344b6dd04
|
@ -1199,7 +1199,7 @@ select 和 poll 方式中,进程只有在调用一定的方法后,内核才
|
|||
|
||||
- select 会修改 fd_set 参数,而 poll 不会;
|
||||
- select 默认只能监听 1024 个描述符,如果要监听更多的话,需要修改 FD_SETSIZE 之后重新编译;
|
||||
- poll 提供了跟多的事件类型。
|
||||
- poll 提供了更多的事件类型。
|
||||
|
||||
### 2. 速度
|
||||
|
||||
|
|
|
@ -23,6 +23,10 @@
|
|||
* [五、设备管理](#五设备管理)
|
||||
* [磁盘调度算法](#磁盘调度算法)
|
||||
* [六、链接](#六链接)
|
||||
* [编译系统](#编译系统)
|
||||
* [目标文件](#目标文件)
|
||||
* [静态链接](#静态链接)
|
||||
* [动态链接](#动态链接)
|
||||
* [参考资料](#参考资料)
|
||||
<!-- GFM-TOC -->
|
||||
|
||||
|
@ -815,6 +819,64 @@ CSCAN 对 SCAN 进行了改动,要求磁头始终沿着一个方向移动。
|
|||
|
||||
# 六、链接
|
||||
|
||||
## 编译系统
|
||||
|
||||
以下是一个 hello.c 程序:
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
printf("hello, world\n");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
在 Unix 系统上,由编译器把源文件转换为目标文件。
|
||||
|
||||
```bash
|
||||
gcc -o hello hello.c
|
||||
```
|
||||
|
||||
这个过程大致如下:
|
||||
|
||||
<div align="center"> <img src="../pics//b396d726-b75f-4a32-89a2-03a7b6e19f6f.jpg" width="800"/> </div><br>
|
||||
|
||||
1. 预处理阶段:处理以 # 开头的预处理命令;
|
||||
2. 编译阶段:翻译成汇编程序;
|
||||
3. 汇编阶段:将汇编程序翻译可重定向目标程序,它是二进制的;
|
||||
4. 链接阶段:将可重定向目标程序和 printf.o 等单独预编译好的目标文件进行合并,得到最终的可执行目标程序。
|
||||
|
||||
## 目标文件
|
||||
|
||||
1. 可执行目标文件:可以直接在内存中执行;
|
||||
2. 可重定向目标文件:可与其他可重定向目标文件在链接阶段合并,创建一个可执行目标文件;
|
||||
3. 共享目标文件:可以在运行时被动态加载进内存并链接;
|
||||
|
||||
## 静态链接
|
||||
|
||||
静态连接器一一组可重定向目标文件为输入,生成一个完全链接的可执行目标文件作为输出。链接器主要完成以下两个任务:
|
||||
|
||||
1. 符号解析:每个符号对应于一个函数、一个全局变量或一个静态变量,符号解析的目的是将每个符号引用于一个符号定义关联起来。
|
||||
2. 重定位:编译器和汇编器生成从地址 0 开始的代码和数据节,链接器通过把每个符号定义与一个内存位置关联起来,从而重定位这些节,然后修改所有对这些符号的引用,使得它们指向这个内存位置。
|
||||
|
||||
<div align="center"> <img src="../pics//47d98583-8bb0-45cc-812d-47eefa0a4a40.jpg"/> </div><br>
|
||||
|
||||
## 动态链接
|
||||
|
||||
静态库有以下两个问题:
|
||||
|
||||
- 当静态库更新时那么整个程序都要重新进行链接;
|
||||
- 对于 printf 这种标准函数库,如果每个程序都要有代码,这会极大浪费资源。
|
||||
|
||||
共享库是为了解决静态库的这两个问题而设计的,在 Linux 系统中通常用 .so 后缀来表示,Windows 系统上它们被称为 DLL。它具有以下特点:
|
||||
|
||||
1. 在给定的文件系统中一个库只有一个 .so 文件,所有引用该库的可执行目标文件都共享这个文件,它不会被复制到引用它的可执行文件中;
|
||||
2. 在内存中,一个共享库的 .text 节的一个副本可以被不同的正在运行的进程共享。
|
||||
|
||||
<div align="center"> <img src="../pics//76dc7769-1aac-4888-9bea-064f1caa8e77.jpg"/> </div><br>
|
||||
|
||||
# 参考资料
|
||||
|
||||
- Tanenbaum A S, Bos H. Modern operating systems[M]. Prentice Hall Press, 2014.
|
||||
|
|
BIN
pics/47d98583-8bb0-45cc-812d-47eefa0a4a40.jpg
Normal file
BIN
pics/47d98583-8bb0-45cc-812d-47eefa0a4a40.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
BIN
pics/76dc7769-1aac-4888-9bea-064f1caa8e77.jpg
Normal file
BIN
pics/76dc7769-1aac-4888-9bea-064f1caa8e77.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 41 KiB |
BIN
pics/b396d726-b75f-4a32-89a2-03a7b6e19f6f.jpg
Normal file
BIN
pics/b396d726-b75f-4a32-89a2-03a7b6e19f6f.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 50 KiB |
Loading…
Reference in New Issue
Block a user