函数跳转和栈空间
在进程空间中,有一块名为程序段的区域。进程启动后,会把程序文件加载到进程空间的程序段中。加载到程序段后,每个指令占据一个存储单元,可以通过内存地址来访问。为了实现程序的复用,每个函数在程序段中只会存一次。
在进程开始前,每个函数就已经有确定的地址。当函数调用时,进程跳转到函数指令所在的位置即可。然而,函数返回的地址是不固定的,因为函数可能在不同地方调用,因此为了记录函数调用的可用信息,进程开辟了一块名为栈的内存空间。
栈的工作方式和函数调用方式类似。在main函数运行时,内存中就会有一个对应的内存单元出现,用来记录main函数的可变信息,比如main函数返回时应该跳转的地址。此后有新的函数调用发生时,栈就会向下增加一个帧,对应新的这个函数调用。
从init到进程树
计算机开机时,只启动一个名为init的进程。除了init进程之外的所有进程,都是通过fork机制创建的。fork机制就是从老进程中复制一个新进程。分化出新进程后,老进程继续运行,成为新进程的父进程,新进程成为老进程的子进程。