Linux-进程的介绍和标示符

什么是进程

日常生活中,我们使用的是Windows多一点,而我们在使用Windows时,打开我们的任务管理器,就能看到各种进程在运行。

 那么,进程是否就等于我们的程序呢?

很多时候,我们看书,书上会这么写,进程是指在计算机内存中已运行的程序。

这种说法其实是不全面的。

操作系统如果要管理进程,那么首先就要收集程序运行的数据,然后再对它进行管理,所以,操作系统就需要拥有一个模块,可以很好的收集、查询所有在运行的数据,这个模块就叫做PCB(process contral block)进程控制模块。

有了PCB,所有的进程管理任务和进程对应的程序没有直接关系,操作系统对进程的管理对PCB强相关,只需要对PCB操作即可。

而进程,就是进程=PCB+你的程序数据和代码。

PCB是什么?它里面是什么东西?

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。

在Linux系统中,它的PCB叫做 struct task_struct{...},它本质其实可以理解为结构体,而结构体内部则存放着这个进程的数据和状态,不管你是想对一个进程进行查找还是删除,都必须先查看它的task_struct,然后才能对这个进程进行操作。

那么具体一点,这个结构体存放了什么信息呢?

它里面存放的东西很多,存放着各种信息和进程的当前状态,我们仅介绍一些比较重要的内容。

标示符

标示符:描述本进程的唯一标示符,用来区别其他进程。

而进程的标示符,称为PID,PID是进程的唯一标示符,它是进程的唯一代号。

为了方便观测进程的PID我们先随便写一个程序,让它跑起来。

上面的getpid()和getppid()函数,分别是获得它的PID和PPID,需要包含头文件unistd.h

左侧,我们的死循环程序一直在运行。

右侧,我们使用ps axj | head -1 && ps axj | grep myproc   指令查看我们的进程信息,PID就是我们这个进程的唯一标示符。

而每个进程PID也是存放于PCB中。

而PPID,则是它的父进程的PID。

这里我们就引入了一个新的东西,什么是父进程?  那是不是就有对应的子进程? 是的。

 我们可以使用fork()函数来创建一个子进程,fork如果创建子进程成功,会对父进程返回子进程的PID,会对子进程返回一个0,如果创建失败,则会返回一个<0的数。

使用fork函数创建另一个流,实现一份代码,两个进程,一个称为父进程,一个称为子进程,并且子进程和父进程可以拥有不同的运行结果。

运行代码

 使用ps命令

这时我们就能看到有两个同名进程,而我们可以仔细看看它们的PID和PPID

其中上面PID为23700的进程就是PID为23701的进程的父进程。

可是PID为23700进程的父进程15604又是谁呢?

我们用ps和grep指令搜索进程15604

 这里我们就可以看到是我们的bash(命令行解释器)。

如果继续向上溯源,会一直溯源到我们的操作系统,大家可以下来自己试一试。

总结

1.知道了进程是由PCB和进程的数据和代码构成的。(重点)

2.知道了使用fork函数创建另一个流,实现一份代码,两个进程,一个称为父进程,一个称为子进程,并且子进程和父进程可以拥有不同的运行结果。

3.学会了怎么使用 ps 命令来查看进程的相关信息。

猜你喜欢

转载自blog.csdn.net/fengjunziya/article/details/130478463