lab1 进程
定义
进程的定义是操作系统中资源分配的基本单位,是程序的执行实体。具体地来分析这个定义的一体两面:
- 在资源分配方面,每个进程都有虚拟的进程空间,其中包括代码区,全局静态区,BSS区,堆区,文件映射区,栈区。
- 在执行方面,进程有多个状态,如运行态,阻塞态,就续态等,需要操作系统进行进程调度,来决定进程什么时候占用CPU执行。
特别进程
- 僵尸进程:子进程已结束,但父进程可能因为在死循环中,没有回收其资源
- 孤儿进程:父进程已结束,子进程还存在,此时子进程的父进程成为init的PID为1的init进程,在子进程结束后,由init进程进行资源回收。
- 守护进程:参考链接独立于其他进程,不受终端控制,在后台运行,如init、systemd等,需要fork2次并关闭fork的父进程才能创建1个守护进程,第1次是为了使进程摆脱原来进程组的控制,fork后关闭父进程,则子进程不是进程组长,此时可调用setsid()创建新会话,以自成进程组,自成会话,避免和其他进程组和会话产生联系;第二次fork并关闭父进程是因为子进程为进程组组长,可开启1个终端,将其关闭后,孙进程则不再是进程组组长,无法开启终端,保证此守护进程不受终端控制。
其他
资源回收表示将子进程的PCB给释放掉,不再占用内存,因为子进程已经无法被调度或使用。可使用wait来阻塞地回收子进程资源,或使用waitpid来等待特定子进程结束。使用WIFEXITED(&status)来判断进程是否正常退出,WEXITSTATUS(&status)来获取进程退出状态。
子进程
子进程和父进程的资源是独立的,如全局变量等,一旦子进程fork()出来之后,对变量的操作就不会再对父进程产生影响,同理,fork()出来之后,父进程对变量的操作也不会对子进程产生影响。
lab2 进程间通信
参考链接
PIPE 管道
PIPE是半双工通信,即数据只能向一个方向传输,一端读一端写,创建管道其实就是1个长度为2的数组fd[2],fd[0]表示读端(一般用0表示没贡献内容来记忆),fd[1]表示写端。
PIPE可用于父子进程通信,父进程创建管道后fork出1个子进程,然后父进程关闭写端,子进程关闭读端,则可以在此管道中进行父子进程的通信了。
PIPE的升级版是FIFO,即命名管道,可用于2个非继承关系的进程之间的通信。