Linux守护进程--进程、进程组、会话、终端
要弄明白守护进程,就必须先讲清楚进程、进程组、会话、终端
一、进程
当我们运行一个应用时,根据冯诺依曼体系结构,必须把这个应用的代码、数据以及PCB(进程控制块,process control block,也就是关于进程的描述结构体)加载到内存,由CPU调度执行
对于已经被加载到内存中等待CPU调度执行的应用,就叫做进程
进一步来讲,进程就是应用等待执行的状态,就是PCB + 程序本身的数据代码
注:PCB内部会有一个指针指向程序本身的数据代码,这里为了便于理解,把二者区分开来了
二、进程组
为了将多个进程统一管理,将它们放在一个统一的组里面,这个组,就叫做进程组
三、终端
首先我们要弄明白屏幕和终端的区别
简单来说,屏幕是呈现终端内容的载体,只要写在终端输出缓冲区的内容,都会被屏幕读取并展示
在Linux中,终端其实是一个设备,或者说是一个伪设备
它不负责"画"任何东西,只负责存储用户和进程输入输出的内容
当你在键盘上输入一个个字符时,你会很直观地看到你输入的字符在你的屏幕上显现,但是屏幕不是终端,事实上,这个流程如下:
1、你在键盘上输入字符后,键盘会向操作系统发送中断
2、操作系统收到中断后,将你输入的内容交给终端的输入缓冲区
3、正在读这个终端设备的进程(前台进程)从输入缓冲区取走这个字符,根据进程本身的需求决定是否写入终端的输出缓冲区
4、如果写入终端的输出缓冲区,终端会把内容交给屏幕显示,进而得到看到你刚刚输入的字符
举个例子:
当你登录Linux时,会叫你输入密码,但是你看不到密码回显,就是因为只把密码给了终端的输入缓冲区,但是读取终端输入缓冲区的进程没有把它写到终端的输出缓冲区,所以没有看到回显
事实上,可以试试以下两个指令
stty -echo关闭回显;stty echo开启回显
总结起来,终端的输入缓冲区的内容由键盘输入决定,进程(前台进程)读取;终端的输出缓冲区的内容由进程(任何进程)决定,屏幕设备读取(显示),终端只起到转发(有时还会加工)的作用
四、会话
所谓会话,就是一个或多个进程组的集合,该集合内的进程可以共享同一个终端,也可以没有终端
事实上,虽然所有的进程组共享同一个终端,但并非所有的进程都有资格访问终端的输入缓冲区
试想一下,你键盘输入一个数据"hello"
如果被A进程读走"he",B进程读走"llo",那双方得到的信息都不完整,这就可能会造成响应错误的结果
所以必须保证读取终端的输入缓冲区的进程是唯一的!
这个唯一的进程也就叫做前台进程
值得注意的一点是,前台进程可以有多个,多个前台进程构成的集合叫做前台进程组
但是在前台进程组中能访问终端输入缓冲区的只有一个前台进程,也就说前台进程有读取输入缓冲区的能力,但具体谁读,要看情况分析
其次,对于一个会话,我们需要有一个管理者,也就是首领进程
首领进程在大多数情况下都是唯一的前台进程,这也就意味着当运行一些程序时,首领进程必须有将该程序提到前台去的能力!
与前台进程相反的进程也就是后台进程
最后要补充的一点是,终端发出的信号(Ctrl+C Ctrl+Z Ctrl+\\)所有前台进程都可以收到,这要与读取终端区分开来
最后,说一个现象:
我们每次登录Linux终端版时,首先会看到:
根据前面所说,你看到的内容都是进程往终端的输出缓冲区里写的东西,这个进程是什么?他就是bash进程(shell)
大家如果有什么感兴趣的内容,欢迎私信或者评论区留言
