Linux进程(一):初识


前言

​   说到进程,我们都会说出进程时操作系统资源分配最小单位、每个进程有独立的代码和数据空间等类似的套话,所以说了那么多之后,进程在Linux系统中究竟是什么样的存在呢?提到这个问题,就不得不说PCB。

进程控制块 - PCB

​   进程,是操作系统的资源分配单位,我们需要弄懂进程,就需要弄懂这个进程的资源。而操作系统如何获取一个进程的相关信息呢?

​   在Linux系统中,进程控制块为一个结构体task_struct所定义的数据结构。task_struct位于/include/linux/sched.h中,其中包括了管理进程所需的各种信息。既然进程中主要是操作系统分配的资源,那么在PCB中理所当然应该有以下这些东西:

进程pid:用于区别进程

  有两个相关的参数:

  • pid_t pid;:进程的唯一标识
  • pid_t tgid;: 线程组的领头线程的pid成员的值

注:在Linux中pid的数量时有限的。

进程内存的资源

  struct mm_struct *mm:关于进程内存的描述,用来描述进程的内存资源。

文件系统资源

struct fs_struct *fs:关于进程的文件系统资源。

fs_struct中又有rootpwd信息,用来描述当前进程的根目录以及当前工作路径。

文件资源(打开的文件信息)

struct files_struct *files:进程在运行过程中打开的文件以及文件的fd

 所以理所应当,file_struct结构体中存在一个fd_array用来描述打开的fd的数组。

 除了上述的信息,还有以下东西也是一个进程必须的:

  1. 进程切换时需要保存和恢复的一些CPU寄存器
  2. 描述虚拟地址空间的信息(虚拟地址与物理地址的对应关系)
  3. 描述控制终端的信息
  4. 当前工作目录
  5. umask掩码(保护文件创建和修改的权限)
  6. 和信号相关的信息
  7. 用户id和组id
  8. 会话和进程组
  9. 进程可以使用的资源上限(例如使用ulimit -a查看)
  10. 用来恢复的一些CPU寄存器

task_struct的管理

​   Linux中定义了一个链表方便对进程的遍历,但是链表只能存储每个task_struct的数据,不能保存各个task_struct中间的关系,由于线程与线程直接会存在父子的关系,所以Linux中使用的是树来管理所有的task_struct结构体。树这种数据结构管理父子关系存在天然的优势。在Linux中使用pstree可以查看所有进程的关系树:

在这里插入图片描述

​   除了记录父子进程之间的管理,Linux操作系统对于进程来说还需要一项功能:通过进程的pid号快速查找到相应的进程(task_struct),以便对相应的进程执行特定的操作。此处Linux操作系统通过hash表实现通过pid号对相应task_struct的快速查找。

​   Linux里用三个不同的数据结构存储进程的结构体,使得关于进程的访问在各种场景下都能达到最优。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值