进程控制块(PCB) —— task_struct

我们把正在执行的程序称为进程,这是一种广义的定义。更具体一点来说,进程是由正文端 (text) 、用户数据段 (usr segment) 以及系统数据段 (system segment)共同组成的一个程序执行环境。

进程和程序
  • 程序
    程序是一个包含及其代码指令和数据的可执行文件,这个文件一般储存在磁盘上(储存设备)上,所以,程序是一个静态的实体。比如,我们用 C 语言写了一个C源程序,这个程序要经过 “预处理-编译-汇编-链接”这一过程才能生成可执行文件,这个可执行文件在 Windows 下一般为 xxx.exe,该可执行文件才是我们所说的程序。

  • 进程
    我们可以认为上述所说的程序是:你期望完成某项任务的方法和步骤,它只浮现在纸面上,等待去实现。而这个实现过程就是由进程来完成的,进程可以认为是运行中的程序。它除了包含程序中的所有数据之外,还包含一些额外数据。
    当程序被装入内存中并且获取到所需资源后就可运行了:在程序计数器 (PC) 和其它一些寄存器的控制下,机器指令被取至 cpu 运行。
    下图是其大概情况:
    这里写图片描述

进程在运行过程中,还需要一些系统资源。其中最重要的就是 cpu 资源了,除此之外还包括但不限于物理内存(以容纳进程本身和其有关数据)、打印机、键盘等等。
由上可见进程是一个动态的实体,它每时每刻都在发生着变化。那么如何管理和描述这个动态的进程呢?请看下面详情。

进程控制块

在 Linux 中每个进程由一个 task_struct 结构体来描述,该结构体也被称为进程控制块(PCB)。它被定义于 include/linux/sched.hLinux源码github地址)。

task_struct 容纳了一个进程的所有信息,它是系统对进程进行控制的唯一手段,也是最有效的手段。

每当系统创建一个进程,就会给该进程动态的分配一个 task_struct 结构体对象。一个系统内所允许的最大进程个数一般由机器硬件 (物理内存) 决定。在一台 IA32 体系结构中,内存为 512M 的机器上所允许的最大进程数是 32k 。

总之包含进程所有信息的 task_struct 内容是比较庞大复杂的,我们将其部分内容罗列如下:

struct task_struct{
  ...
  // 进程标识符
  ...
  // 上下文信息
  ...
  // 进程状态
  ...
  // 进程优先级
  ...
  // 进程通信有关信息 
  ...
  // 时间和定时器有关信息
  ...
  // 文件系统信息
  ...
  // 虚拟内存信息
  ...
  // 其它
  ...
};
  • 进程标识符

操作系统中有很多进程,不管对于用户还是对于内核,如何用一种简单的方式以区分不同进程呢?这就引入了进程标识符 (PID:process identifier),每个进程都拥有一个唯一的进程标识符,内核以此来区分不同进程,同时,用户也可以通过此标识符来给具体进程发号施令。Linux 中我们可以通过以下几种方式获取 PID:

  • shell中:通过ps aux列出所有进程详细信息,在其中我们可以看到进程的 PID, 也可以通过 ps aux | grep '进程名' 查看指定进程信息,除此之外还有 top 命令也可以查看进程信息。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值