进程、程序与进程间通信详解
1. 共享文本段
在大多数系统中,链接编辑器负责构建共享文本段。它会对用户程序的代码和数据部分进行不同程度的重定位,以便为它们应用不同的访问权限。通常,文本段从虚拟地址 0 开始,而数据段则从以下位置开始:
(textsize + SEGSIZE - 1) / SEGSIZE这里的 SEGSIZE 是可应用单独访问权限的最小内存块大小。例如,在 PDP11 上是 BK,在 VAX 上是 512 字节。由于这种额外的重定位,文本段顶部和数据段底部之间通常会有一小段不存在的内存。
共享文本段虽无功能上的好处,但能在多方面提高效率:
- 只读段无需多次交换出去,因为交换区的原始副本始终是最新的,这对交互式程序尤其有利,这类程序在等待终端输入时往往会被交换出去。
- 在执行fork操作时,无需复制纯文本段,硬件只需将其映射到父进程和子进程的地址空间即可。
- 多个进程(可能属于不同用户)同时从同一段执行,可节省主内存,对于常见程序(如 shell、编辑器和编译器)的多个副本,能有效减少开销。
2. 链接共享文本程序
在 C 编译器或链接器命令行中指定-n选项,可将程序链接为共享文本。例如:
CC -0 fred main.o a.o b.o此命令会链接一个非共享文本版本的程序fred。而