守护进程, 协同进程, 僵尸进程, 孤儿进程概念理解
守护进程
没有控制终端, 运行在后台的特殊进程, 用于执行特定的系统任务, 这样的进程称为守护进程.
守护进程长期生存, 常在系统引导时装入启动. 一般的网络服务, 都是以守护进程形式存在提供服务.
用户层守护进程的父进程是init进程(pid = 1).
守护进程查看方式:
基于BSD的系统, 执行shell命令
$ ps -axj
基于System V的系统, 执行命令 (只能查看当前用户的进程)
$ ps -efj
守护进程名称通常以d结尾.
协同进程
协同进程的概念
APUE 15.4的描述是
UNIX系统过滤程序从标准输入读取数据, 向标准输出写数据. 几个过滤程序通常在shell管道中连接. 当一个过滤程序既产生某个过滤的输入, 又读取该过滤程序的输出时, 它就变成了协同进程(coprocess).
这里注意到是"它就变成了协同进程", 也就是说协同进程是一个, 而非两个, 而且是从标准输入、标准输出的那个. 协同进程就好像帮助另一个进程接收标准输入并过滤, 处理输出数据并输出到标准输出设备一样.
然而, 协同进程仅仅指是过滤标准输入、输出的过滤器进程吗?
过滤程序
什么是过滤程序?
过滤程序是流(stream)处理程序,它们从标准输入读取流数据,对其进行适当处理后写到标准输出。标准输入默认来自键盘,不过可以重定向到一个文件或者来自其它程序的输出。标准输出默认是显示器,当然也可以重定向到一个文件,也可以是其它设备(例如打印机),或者重定向到管道作为其他程序的输入等。通常情况下,几个过滤程序在SHELL管道命令行(|)中线性地连接。
最常用的过滤程序有grep,cat,awk,head,sed,less,more等。
例子
下图是一个简单的协同进程的例子, 进程创建2个管道: 协同进程的标准输入, 协同进程的标准输出
僵尸进程
当一个子进程终止时(正常终止或异常终止), 停止活动, 但占用的存储资源尚未释放, 此时子进程称为僵尸进程.
父进程通过调用wait/waitpid阻塞等待子进程终止, 回收子进程其资源, 子进程才会完全消亡.
僵尸进程可以通过ps命令查看到, 但无法用kill命令杀死, 因为此时僵尸进程已经"死了".
top命令查看CPU实时进程情况
$ top
ps命令查看僵尸进程的相关信息
$ ps -e -o stat,ppid,pid,cmd|egrep '^[Zz]'
结束僵尸进程的方法: 使用kill命令终结父进程. 父进程终结时, 子进程会被init进程收养, 如果是僵尸进程会立即回收资源.
参考 top发现僵尸进程
孤儿进程
对于一个正常运行的子进程, 当其父进程终止时, 子进程就变成孤儿进程. 孤儿进程会被init进程收养, 运行终止时, init进程会立即回收其资源.