在命令行中运行程序的过程,是命令行会对程序进行复制,然后创建一个进程运行这个程序。因此,程序的内存结构所涉及的操作系统术语应该是 Linux 内存管理。
这样,本文套论的内容就把操作系统中进程这个概念与程序内存的概念联系起来。
可以看到,从低地址到高地址,分别是代码段、全局数据段、未初始化数据段、堆、内存映射段(动态库映射)、栈(向低地址生长)以及内核空间,内核空间这段地址不能被用户代码读取,否则会触发段错误。
这里新发现的现象是,内核会将自己的代码和数据在每个进程虚拟空间都映射一份,方便进程调用内核功能。所有进程的页目录页表、GDT、LDT 等内核数据结构,也全都被保存在内核区段内。
程序的行为观察可以借助 ptrace、strace、gdb 断点、ltrace观察,甚至可以观测异常行为。而测内核的行为,可以借助 proc 文件系统。
创建100个线程,观察/proc/slabinfo,可以看到进程控制块 PCB 增加,进程共享空间没有增加。创建多个进程,二者都增加。
其它话题,例如进程状态、进程调度、文件系统也可以通过 /proc 获取信息。个人认为开发人员应该将这部分学习的重心放在了解系统的接口上面,就是与写程序直接相关的内容,熟悉系统接口的使用的优先级应该高于了解 Linux 系统的实现。