进程的描述与组织

1.1.1进程的资源

进程需要一定资源才能运行,最重要的资源是内存地址空间,此外还可能需要使用文件、设备等。这些资源均由内核负责管理和分配。分配给进程的资源登记在进程的PCB中。

1.进程的地址空间

进程的一个重要构成成分是进程映像,即进程所执行的代码和数据在内存中的呈现。为了容纳进程的映像,那个进程都有一个自己的内存地址空间,这是进程运行的必备条件。在32位x86平台上,Linux系统的进程拥有4GB的地址空间。
进程由用户态和核心态两种运行模式,在不同的模式下可访问的地址空间也不相同。因此进程的地址空间被划分为用户空间和内核空间两部分,其中1GB是内核空间,3GB是用户空间。用户空间容纳进程自己的映像,内核空间容纳内核映像。当进程运行在用户态时执行的是用户空间中的进程映像,陷入核心态执行的是内核空间中的内核映像。
为便于管理,进程的映像被按类划分为多个区,包括代码区、数据区和堆栈区。代码区中包含的是可执行程序的代码;数据区中包含的是各种类型的数据;栈属于特殊的数据区,用于记录与运行相关的动态数据。在用户空间和内核空间中都包含有若干个代码区、数据区和一个栈。由于每个进程都可能会调用系统调用,因此内核空间的代码和数据区由所有进程所共享,但每个进程都单独拥有一个内核栈。所以,内核栈和用户空间是进程的私有财产,也是最重要的资源。
栈是代码运行时必须使用的内存区。内核代码使用内核栈,进程代码使用用户栈。因此在模式切换时,进程的栈也要跟着切换。内核栈的作用由为重要,除了要存放核心态下的运行数据外,还要存放进程模式切换以及进程切换时要保留的部分现场信息。更重要的是,内核栈中还嵌有有关进程运行的一些相关信息。

2.进程的文件与设备

文件是信息的永久保存形式,应用程序经常要使用或处理文件。此外,应用程序还需要使用设备来与外界传输数据。因此文件和设备都是进程的常用资源。在Linux系统中设备是被当作文件来处理,因此两者都由文件系统来管理。
在使用文件前,进程需要执行打开操作,让文件系统为其建立与文件的连接。所有被进程打开的文件都是进程可用的文件资源。文件使用完毕须执行关闭操作,释放文件资源。

3.进程的信号通信

进程并非孤立地在运行。它需要能够接收和处理系统或其他进程发来的信号,这些信号可能是通知它某个事件或控制命令,比如暂停运行、终止运行等。进程通过设定的信号处理程序来对信号作出响应。为实现信号通信,进程需要拥有信号队列以及信号处理程序。
在这里插入图片描述
以上这些资源的用途不同,因而分配策略也有所不同。文件和设备资源是按需分配,即用时分配,用完即回收;地址空间和信号是进程执行的必要资源,它们在进程创建时分配,在进程的整个运行期间都一直占有;内核栈属于进程的故有资源,它和PCB一样,在进程创建时分配,并保持在进程的整个存在期间。就是说即使是僵尸进程也会保有它的PCB和内核栈。

1.1.2进程的描述结构

在这里插入图片描述

1.1.3进程的组织

管理进程就是管理进程的PCB。一个系统中通常可能拥有数百乃至上千个进程,为了有效地管理如此多的PCB,系统需要采用适当的方式将它们组织在一起。通常采用的组织结构有数组、散列表和链表3种方式。

  • 数组方式是将所有的PCB顺序存放在一个一维数组中。这种方式比较简单,但操作起来效率低。
  • 链表方式是将PCB链成一个链表。链式结构的特点就是灵活,便于插入和删除PCB。
  • 散列表方式是通过在PCB数组或链表上设置散列表,以加快访问速度。

实际的系统中通常会综合采用这些方法,以达到最好的效率。
Linux系统采用了多种方式来组织进程PCB,主要有以下几种:

  1. 进程链表
    系统将所有的PCB链成一个双向循环链表,PCB通过它的tasks字段链入进程链表。表头指针在0号进程的PCB中。遍历该链表即可顺序地找到每个进程的PCB。
  2. PID散列表
    在许多情况下,内核需要根据进程的PID查找进程。顺序扫描进程链表并逐个检查其中的PID是相当低效的。为了加快查找速度,内核中设置了若干个散列(Hash)表,其中PID散列表用于将PID映射到进程的PCB。PID散列表是一个链式散列表,所有的PCB都通过pid_chain和pid_list字段链入到这个散列表中。用PID查找散列表就可快速找到它的PCB。
  3. 进程树链表
    Linux系统中,进程之间存在着父子和兄弟关系。每个进程都有一个父进程,即创建了此进程的进程。一个进程可以创建0至多个进程,称为它的子进程。具有相同父进程的进程称为兄弟进程。这样,系统中的所有进程形成了一棵进程树,每个进程都是书中的一个节点,树的根是int进程,它是所有进程的祖先进程。
  4. 可执行链表
    为了方便进程的调度,系统把所有处于可执行状态的PCB组成可执行队列,处于可执行状态的进程通过PCB中的run_list字段链入适当的队列中。在进程切换时,进程调度程序从可执行队列中选择一个让其运行。
  5. 等待链表
    进程因不同的原因而睡眠。系统将睡眠的进程分类管理,每类对应一个特定的事件,用一个等待队列链接。等待队列的节点并不是PCB本身,而是代表一个等待进程的节点,其中包含了指向进程PCB的指针。当某一事件发生时,内核会唤醒相应的等待队列中满足等待条件的进程,将唤醒的进程节点从队列中删除,将该进程的PCB加入到可执行队列中。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值