> 文章列表 > 【Linux】PCB(进程控制块)

【Linux】PCB(进程控制块)

【Linux】PCB(进程控制块)

进程控制块

  • PBC-描述
  • 进程号
  • 进程状态
  • 内存指针

PBC-描述

我们知道,进程就是运行起来的代码,而操作系统就是通过对进程进行描述,然后将所有的进程使用双向链表串联到一起,实现对计算机软硬件资源的管理的。
那么,PCB到底是什么呢?

PCB也被称为进程控制块,实际上在内核中是一个庞大的结构体,这个结构体的外貌看起来是struct task_struct{…};
在这个PCB当中,包含许多描述进程的信息
例如:
1.进程号PID
2.进程状态
3.内存指针
等许多内容

进程号

进程号有一些特点:

每一个进程都会有一个进程ID,并且互不重复
通过进程ID,就能够标识当前操作系统中的某一个进程
当某个进程结束的时候,这个进程的资源会被释放,同时这个进程的进程ID也会被释放,那么这个进程ID就可以被其他进程所使用。

我们需要查看某个进程的进程ID,可以通过ps aux获取进程ID
【Linux】PCB(进程控制块)

USER指的是这个进程的所属用户,PID是进程号,%CPU为CPU占用率,TIME为占用CPU时间

还有一个问题,当使用ps aux时,展示了当前操作系统中所有的进程,数量非常多,不便于我们查看指定的进程,因此我们可以使用管道过滤,将我们想看到的进程信息过滤出来,ps aux | grep 自己想要的内容
【Linux】PCB(进程控制块)

我们会发现出现了两个进程,这不是有问题吗?

其实通过ps aux将当前运行的进程结果筛选出来,通过管道|将结果传输给grep,作为grep的输入,而grep也是一个程序,启动grep也会产生grep进程,就会将grep也展示出来。

进程状态

进程运行起来之后,其实是有它的状态的,就像人一天的生活,有工作状态,摸鱼状态,睡眠状态。
对于进程来说,也存在几种不同的状态
【Linux】PCB(进程控制块)

一个进程,正在被操作系统调度来实现自己的运算,那么它就是运行状态,(在时间片轮转策略中)而当这个进程的时间片用完之后,会被操作系统切出去,这时候它就处于阻塞状态(当需要进行运算的数据还没有到来时)。如果它的运算数据已经准备好了,等待操作系统进行调度,那么它就处于就绪状态。

我们还可以从命令行指令来看进程的不同状态

R为后台运行状态,R+为前台运行状态
【Linux】PCB(进程控制块)
S为后台可中断睡眠状态,S+为前台可中断睡眠状态
【Linux】PCB(进程控制块)
D为不可中断睡眠状态

T为暂停状态(ctrl+z)
【Linux】PCB(进程控制块)
t+为跟踪状态,在调试程序的时候可以看到
【Linux】PCB(进程控制块)

x为死亡状态,z为僵尸状态

内存指针

此外,PCB中还有一个内存指针,它指向的是程序地址空间
【Linux】PCB(进程控制块)
其中有一些概念性的东西,(在默认最上面是高地址,最下面是低地址)栈区是向下生长的,堆区是向上生长的,此外还有数据段和代码段。

注意:实际上这里的程序地址空间并不是真正物理意义上的内存空间,而是操作系统对每一个进程都分配了一个4g的进程虚拟地址空间,当进程有了实际的内存修改之后,才会将进程虚拟地址空间中修改的内存通过页表映射的方式映射到真实的物理内存中,而这样做的好处是可以精准分配内存,即进程需要多少内存,就分配多少内存