进程 = pcb块 + 各个段(堆 | 栈 | bss | data | text)
进程的实体:
栈和堆是动态数据,程序运行后才会出现;静态数据是随着a.out 从硬盘移到内存中,编译完就存在的
程序编译好后放在硬盘上(静态),运行时放在内存(进程,动态),一个程序可以对应n个进程,运行多次。程序 加载 到内存 运行起来 成为了 进程。
进程的状态:
----------------------------------------------------------------------------------------------------------
命令:top---------类似于任务管理器
pid号类似于人的身份证号 MEM:所占内存 TIME+:持续运行的时间
PR、NI:优先级 RES:使用的资源
后台进程通过终端控制不了了,即按键没用,只能通过发信号来结束进程
------------------------------------------------------------------------------------------------------------
fork();---------------------------------------
pid_t 实际上是int 型的
父进程和子进程都从赋值运算开始,子进程代码都拷贝过去了,只是执行时从fork后开始
①只执行一次,②⑤执行公共代码
父子进程都拥有独立的0-3G空间,数据互不影响
规律:有n个fork() ,就有 2^n 个进程
fork() && fork() || fork(); //总共几个进程
或运算,一真为真;与运算,一假为假(从左往右运算,先看符号优先级,|| 的优先级比 && 低)
进程的应用场景:
getpid();getppid();-------------------------------------------------
结束子进程:子进程呈僵尸态(进程已经结束,但是pcb块还在,占用内存)
收尸好处:(1)知道子进程什么原因结束的 (2)回收资源
如果后面也结束父进程,则僵尸态会被消除
结束父进程:子进程变后台进程