目录
一、进程的基本概念
1.1 什么是进程
1.2 PCB的概念
1.3 进程的查看
1.3.1 查看进程方式一
1.3.2 查看进程的方式二
1.4 父进程与子进程
一、进程的基本概念
1.1 什么是进程
进程是什么?
课本概念:程序的一个执行实例,正在执行的程序等。内核观点:担当分配系统资源( CPU 时间,内存)的实体。
这个概念比较的官方,等会我可以给大家讲一讲我是怎么去理解进程这个概念的。
1.2 PCB的概念
在说PCB这个概念之前,我们首先来认识一下,一个程序是如何被我们的CPU所执行的。
想必大家都有听说过一句话,叫做 “程序被加载到内存上了”。这是什么意思呢,为什么程序要被加载到内存上呢?根据我们的冯诺依曼结构,一个程序原本是被保存在磁盘上的,当要执行这个程序时,其就会被操作系统拷贝到内存上,程序在被拷贝过来之前,操作系统就已经在其上运行了,一个操作系统上一定会存在很多的“进程”,那操作系统要不要管理这些进程呢,肯定是要的,那怎么去管理呢,"先描述,在组织"(上节所说),那又因为操作系统是由c写的,那我们用什么去描述这个进程呢?用一个包含进程各种属性的结构体。
而这个结构体我们就叫做PCB,process control block(进程控制块)
Tips:在Linux中,PCB又可以叫做 struct_task。
这里用一张图给大家描述一下这个过程。
那么这些结构体里面会有些什么内容呢,我们可以大概猜测一下:
struct PCB
{
//标识符
//状态
//优先级
//内存指针,指向代码
//上下文数据
struct PCB* next;
}
这些内容我们之后会逐渐学习到,这里先不过多赘述。
再有了PCB之后,那么操作系统对我们进程的管理,就变成了对我们PCB链表的管理(增删查改)。
那这里我们可以就可以这样去理解我们的进程。
进程=可执行程序 + 内核数据结构(PCB)
1.3 进程的查看
首先我们的进程有其自己的标识符,叫做 PID,我们可以通过这个可以去查看我们想要查看的进程。
这里主要介绍两种查看方式。
1.3.1 查看进程方式一
通过指令进行查看。
指令:
ps ajx
那我们要是想要查看我们想看的进程该怎么做呢?
这里我们先写一个死循环的代码。
然后让其跑起来,这里要是只想看我们运行代码的进程,可以加个过滤指令:
ps ajx | grep mybin
然后再将我们的标签头部也给加上:
ps ajx | head -1 && ps ajx | grep mybin
然后把我们的指令跑起来,重新创建一个ssh渠道去观测。
可以很清楚的看到我们的mybin程序的PID是19387,那为什么还有一个带mybin的进程呢,那是因为我们再查询的时候,grep带了mybin,他也是一个进程所以一起展示出来了。那在当我们停止程序时,再查询,还能不能看到我们的mybin进程呢。
很明显没有了。
1.3.2 查看进程的方式二
我们通过刚刚那种方式来查看进程的PID太不方便了,那我们能不能让程序自己显示其PID呢?
答案是可以的,我们可以通过unistd库中的一个函数进行查看。
getpid()
我们可以通过man指令看一下这个函数。
话不多说,就让我们来使用一下这个函数吧,修改一下刚刚的代码。
我们同时开一个窗口用指令来看看ID是否一致。
很明显,两边的id是一致的。
那我们开始正式的介绍第二种查看进程的方式。
在Linux中有一个动态文件夹叫/proc,这里面会动态地存储进程的信息,我们可以用指令去查看里头的信息。
ls /proc
在 ls /proc 后加上具体的PID值就可以详细的去查看我们进程的信息了。
1.4 父进程与子进程
在刚刚的演示当中,我们可以看到PID的左边还有一个叫PPID的值,这个值代表parent PID
即该进程的父进程的PID。
在unistd.h这个库中也有能查看父进程PID的函数:
查看父进程的PID:getppid()
这里修改代码,给大家演示一下。
试验如下:
通过我们几次的试验,你会发现,我们的PID一直在变化,而我们父进程的PID却没有变化,
这是为什么呢?
这是因为在我们Linux中,父进程一般是我们的命令行解释器即我们的bash,其PID是不会变化的。