一 进程存储布局:
代码区:存放CPU指令
数据区:已经初始化的全局变量,已经初始化局部静态变量,常量数据,如字符串常量。
BSS区:未初始化的全局变量,未初始化静态变量。
堆区:malloc函数分配内存的空间。由程序员控制
栈区:函数空间。
以上几个区域地址由低到高排列。栈的内存分配是由高往低分配的,因为栈顶的地址是确定的。
二 fork与vfork的区别:
早期fork会复制父亲进程的所有资源包括,代码段,数据段,BSS,以及堆栈。这样的话,就有可能造成资源浪费,因为人家子进程里面不一定是要执行你父亲进程的程序,例如调用exec。因此后来fork实现了写时复制,节省了系统开销。这样的话,vfork失去了它的价值。
vfork与fork的区别在于,父子进程是是共享资源的。这样设计是针对子进程里面调用exec系列函数的。
用vfork函数创建子进程有以下注意事项:
A:首先,子进程一定是先于父亲进程执行的。
B:子进程在没有调用exec系列函数或者_exit()函数之前,子进程一直不退出并且是一直霸占着父亲进程的资源。这个时候如果父亲进程里面执行任何代码,都会出现段错误(应该是此时访问了受保护的内存)。
C:在子进程中调用了exec成功调用系列函数之后,exec之后的程序不会执行!
D:vfork创建的子进程并非必须调用_exit()函数才退出。
三 父子进程里面对打开的文件是共享的!
四 孤儿进程是指退出后被init进程收养的进程。僵死进程是已经退出但是没有回收资源的进程!