🌷相关专栏:《c++学习》《Linux进阶之路》🌷
全片内容总览:
目录
1.进程基本概念
较为官方的说法:
- 课本概念: 程序的一个执行实例,正在执行的程序等。
- 内核观点: 担当分配系统资源(CPU时间,内存)的实体。
辅助理解:
对代码进行编译链接产生的文件我们称之为可执行程序(.exe),执行该程序,该程序会被加载到内存中,此时便称之为进程。
2.进程的本质?为什么要有进程控制块PCB?
1)为什么要有进程控制块PCB?
因为操作系统要利用进程控制块PCB,对进入内存的可执行程序进行管理。
对于我们常用的电脑来说,可以同时执行多个可执行程序。
他们都要进入内存,因此属于软硬件资源的一种,归属操作系统进行管理。
操作系统进行管理的原则就是:先描述,再组织。
因此,我们将进程的相关信息描述起来,描述得到的就是进程控制块PCB(process control block)。
每个进程都有着与之对应的进程控制块PCB,各不相同。
那么进程的本质:进程=PCB(内核数据结构)+可执行程序
那么对于进程的管理,就可以转换为对进程控制块PCB的管理。
我们将进程控制块PCB,组织起来,构成特定的数据结构。
操作系统的管理进程对象的转换:
对进程的直接管理 ---> 对PCB对象的管理 ---> 对PCB有关的某种数据结构的管理
2)进程的本质
进程 = 内核PCB对象 +可执行程序
=内核数据结构 +可执行程序
- 所有对进程的控制和操作,都只和进程的PCB有关,和进程的可执行程序没有关系。
- 一旦有需求,可以把PCB(Node节点)放到任意数据结构中去。
举例:
cpu如果想要执行a.exe、b.exe,只需要调用他们对应的PCB(pcb_a,pcb_b)。
即将被cpu执行的PCB会构成对应的数据结构,等待被cpu执行。
总结:
CPU在进行进程调度的时候, 本质进程排队,其实就是让进程的PCB去排队,而不是可执行程序去排队,CPU找到了对应CPB,就找到了可执行程序,包括它的属性信息。
3) Linux系统下的PCB:task_struct
概念
课本上是:进程控制块PCB(process control block),PCB是操作系统学科的总称。
Linux操作系统下的PCB具体名称是: task_struct
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
task_struct的内容
- 标示符(PID): 描述本进程的唯一标示符,用来区别其他进程(每次启动都会变化)。
- 状态: 任务状态,退出代码,退出信号等。
- 优先级: 相对于其他进程的优先级。
- 程序计数器(pc): 程序中即将被执行的下一条指令的地址。
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
- 上下文数据: 进程执行时处理器的寄存器中的数据。
- I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
- 记账信息: 可能包括处理器时间总和,使用的时钟总和,时间限制,记账号等。
- 其他信息。
3.怎么使用进程
1)查看进程
🔥利用系统目录查看
根目录下的proc目录,/proc 下存储着进程信息。
查看所有进行目录文件:
ls /proc
目录名是数字的,就是每个进程对应得目录,存储着所有进程信息。
数字是进程得标识符PID,每个进程得PID是唯一的。
让我们尝试查看一个进程的信息,
ls 84350
🔥利用“用户级”工具获取进程信息
以下两个指令都可以。
ps ajx //查看所有系统进程的基本信息
ps aux //查看所有系统进程的基本信息
可以结合head、grep 来查找具体的某个进程。
head 显示进程的属性行,方便确定进程的PID,以及父进程的PID。ps ajx | head -1
greap 查找具体某个进程
ps ajx | head -1 && ps ajx | grep a.out
⁉️grep引发的问题
在前文,我们利用 ps ajx | head -1 && ps ajx | grep a.out ,查找到了a.out 这个进程,
但是还出现一个特殊的grep进程??
这是因为,我们利用grep 查找a.out的时候,grep指令因此也在执行,grep也属于进程,并且包含了a.out的信息。
可以看出,所有独立的指令,背后都是写好的程序,一旦运行起来,它们也是进程。
想要去除grep这个进程的办法:
使用 -v选项,反向搜索的意思,即过滤掉包含有grep内容的信息。
ps ajx | head -1 && ps ajx | grep test | grep -v grep
⁉️进程是有生命周期的
进程的创建和销毁
我们可以看到,一开始并没有PID为84647的进程,直到程序被执行,才查询到对应的进程信息。
一旦结束可执行程序,对应PID为84647的进程也被销毁。
while :; do ps ajx | head -1 && ps ajx | grep a.out | grep -v grep; sleep 1;done
随着进程的销毁,它对应的PID也会消失。
因为进程是有生命的。
所以每次启动同一个可执行程序,但是产生的进程的PID也会变化。
每次都是一个新进程!
如下图:
2)杀掉进程
ctrl+c终止进程
使用的效果,如下图: