3.3 操作系统进程的状态(基本控制块、进程的挂起)全解


3.3.1 进程的执行

在UNIX和类UNIX操作系统中,进程控制块(PCB)是操作系统中用于描述进程的基本信息和控制进程运行的数据结构。以下是PCB的几个主要部分的详细说明,包括代码、表格和流程图的描述:
在这里插入图片描述

1. 进程基本控制块(Process Control Block, PCB)

代码示例(Linux中的task_struct结构体部分字段):

struct task_struct {
    volatile long state; // 进程状态
    unsigned long flags; // 进程标志
    int pid; // 进程标识符
    struct task_struct *parent; // 父进程指针
    mm_segment_t addr_limit; // 地址空间限制
    struct mm_struct *mm; // 内存管理结构
    // ...
};

文字说明

  • state: 表示进程的状态,如运行、就绪、阻塞等。
  • flags: 进程的标志,包含多种状态信息。
  • pid: 进程的唯一标识符。
  • parent: 指向父进程的指针,用于描述进程的家族关系。
  • addr_limit: 限制进程地址空间,区分用户空间和内核空间。
  • mm: 指向进程的内存管理结构,包含虚拟内存、物理内存等信息。

2. 进程扩充控制块

代码示例(Linux中的task_struct结构体部分字段):

struct task_struct {
    struct list_head tasks; // 进程链表
    struct list_head children; // 子进程链表
    struct list_head sibling; // 兄弟进程链表
    // ...
};

文字说明

  • tasks: 将所有进程链接在一起的链表。
  • children: 子进程链表,用于维护父子关系。
  • sibling: 兄弟进程链表,用于维护同一父进程下的进程关系。

3. 共享正文和共享正文表(Text)

代码示例(概念性描述,非直接代码):

struct shared_text {
    void *text_start; // 代码段的起始地址
    size_t text_size; // 代码段的大小
    int text_permission; // 代码段的权限(读/执行)
    // ...
};

文字说明

  • 共享正文段允许多个进程共享同一份代码,例如,当多个进程运行同一个程序时,它们的代码段可以是共享的,这样可以节省内存空间。
  • 共享正文表用于管理共享代码段的信息,包括起始地址、大小和权限等。

表格说明

字段名描述
state进程的状态,如运行、就绪、阻塞等。
flags进程的标志,包含多种状态信息。
pid进程的唯一标识符。
parent指向父进程的指针,用于描述进程的家族关系。
addr_limit限制进程地址空间,区分用户空间和内核空间。
mm指向进程的内存管理结构,包含虚拟内存、物理内存等信息。
tasks将所有进程链接在一起的链表。
children子进程链表,用于维护父子关系。
sibling兄弟进程链表,用于维护同一父进程下的进程关系。
text_start代码段的起始地址。
text_size代码段的大小。
text_permission代码段的权限(读/执行)。

流程图说明

流程图通常用于描述进程状态的变化和进程创建、调度的过程。例如,一个进程从创建到运行、阻塞、唤醒、终止的状态变化可以通过流程图来表示。由于无法直接在这里展示流程图,可以使用流程图软件或在线工具来创建相应的图表。

请注意,上述代码和表格是基于Linux操作系统的task_struct结构体的简化描述,实际的task_struct结构体要复杂得多,包含了更多的字段和信息。

3.3.2 进程的基本状态

进程的基本状态通常描述了进程在生命周期中的不同阶段,这些状态在操作系统中被严格定义和管理。在大多数操作系统中,包括UNIX和类UNIX系统(如Linux),进程通常具有以下三种基本状态:

  1. 就绪(Ready)

    • 就绪状态是指进程已具备运行的所有条件,但正在等待CPU时间片。在这个阶段,进程被放入就绪队列,等待调度器分配CPU资源。
    • 就绪状态的进程可能会因为多种原因被调度器选中,获得CPU并开始执行。
  2. 运行(Running)

    • 运行状态是指进程正在获得CPU资源并执行指令。在单核CPU系统中,任一时刻只能有一个进程处于运行状态。
    • 处于运行状态的进程可能会因为时间片用完、等待某个事件(如I/O操作)或被更高优先级的进程抢占而放弃CPU。
  3. 阻塞(Blocked or Waiting)

    • 阻塞状态是指进程正在等待某个事件的发生,如等待输入/输出操作完成、等待信号量或消息等。在这个阶段,进程无法继续执行,因为它需要的资源或事件尚未发生。
    • 阻塞状态的进程不会被调度执行,直到它所等待的事件完成,进程状态可能会变为就绪。
  • 在操作系统中,进程的状态变化是进程管理的重要部分。进程在其生命周期中会经历几种基本状态,这些状态包括就绪态、执行态(运行态)、阻塞态(等待态)以及终止态。以下是这些状态之间转换的详细介绍:
  1. 就绪态到执行态

    • 就绪态(Ready):进程已具备运行的所有条件,包括所需的资源,如内存和I/O资源,但正在等待CPU时间。
    • 执行态(Running):进程正在CPU上执行。在单核CPU系统中,某一时刻只有一个进程处于执行态。
    • 状态转换:当进程调度器(scheduler)选择一个就绪态的进程,并分配CPU时间片时,该进程从就绪态变为执行态。
  2. 执行态到就绪态

    • 状态转换:当一个正在执行的进程完成其时间片或由于某种原因(如I/O请求或更高优先级进程的出现)需要让出CPU时,它会从执行态回到就绪态,等待下一次被调度。
  3. 执行态到阻塞态

    • 阻塞态(Blocked):进程由于等待某些事件(如I/O操作、获取资源或信号)而暂停执行。
    • 状态转换:当一个执行态的进程请求一个当前不可用的资源,或者需要等待某个事件(如磁盘I/O操作)时,它会从执行态变为阻塞态。
  4. 阻塞态到就绪态

    • 状态转换:当进程所等待的事件(如I/O操作完成)发生时,进程可以从阻塞态变为就绪态,等待再次被调度到CPU上执行。这种状态变化通常由事件的完成或中断处理程序触发。

以下是这些状态转换的流程图描述:

+--------+     +---------+     +----------+     +-----------+
| 就绪态 | --> | 执行态  | --> | 阻塞态   | --> | 就绪态     |
| (Ready)|     | (Running)|     | (Blocked)|     | (Ready)   |
+--------+     +---------+     +----------+     +-----------+
进程创建或唤醒
获得CPU
时间片用完或主动让出CPU
请求资源或等待I/O
等待的资源或I/O可用
进程终止或被杀死
进程终止或被杀死
进程终止或被杀死
READY
RUNNING
BLOCKED
就绪态
执行态
阻塞态

状态转换说明:

  1. [*] --> READY (就绪态)

    • 进程被创建或从阻塞态被唤醒时,进入就绪态。
    • 进程调度器可能会根据进程的优先级和其他调度算法选择进程进入就绪队列。
  2. READY --> RUNNING (执行态)

    • 当进程调度器选择一个就绪态的进程运行时,该进程获得CPU资源,进入执行态。
    • 进程现在可以开始执行其指令。
  3. RUNNING --> READY

    • 如果一个执行态的进程因为时间片用完或有更高优先级的进程需要运行,它会释放CPU并回到就绪态。
    • 进程可能稍后再次被调度器选中,重新进入执行态。
  4. RUNNING --> BLOCKED (阻塞态)

    • 当执行态的进程需要等待某些事件(如等待I/O操作完成、等待信号量或锁等),它会主动放弃CPU并进入阻塞态。
    • 进程在阻塞态期间不会占用CPU资源。
  5. BLOCKED --> READY

    • 当进程所等待的事件完成时(例如,I/O操作完成或信号量变为可用),进程从阻塞态变为就绪态。
    • 进程调度器随后可能会选择该进程再次运行。
  6. READY --> [*]

    • 如果进程完成其任务或被操作系统终止,它会从就绪态变为终止态。
  7. RUNNING --> [*]

    • 同样,如果一个执行态的进程完成其任务或被操作系统终止,它会直接进入终止态。
  8. BLOCKED --> [*]

    • 阻塞态的进程也可能因为任务完成或被操作系统终止而进入终止态。

在实际的操作系统中,这些状态转换是由复杂的调度算法和系统调用处理程序管理的。进程状态的转换对于操作系统的稳定性和性能至关重要。

3.3.3 进程的挂起

进程的挂起状态是指进程在某些情况下被暂时从内存中移出并保存到外存(如磁盘)中的状态。挂起状态可以进一步细分为就绪挂起和阻塞挂起两种状态。以下是挂起状态的四个关键点:

  1. 挂起的原因

    • 用户请求:用户可能需要暂停程序以便检查或修改。
    • 父进程请求:父进程可能需要挂起子进程以进行协调或修改。
    • 系统需要:操作系统可能因为需要检查资源使用情况或进行记账而挂起某些进程。
    • 负荷调节:为了确保实时任务的执行或系统的正常运行,可能会挂起一些不重要的进程。
    • 对换需要:当内存紧张时,可能会挂起阻塞状态的进程以腾出内存空间给其他进程。
  2. 挂起操作的目的

    • 挂起操作允许用户或系统管理员暂停进程的执行,以便进行调试或修改。
    • 挂起操作也用于系统负荷调节,通过挂起一些进程来释放内存空间,以供其他进程使用。
  3. 挂起状态的转换

    • 活动就绪态到静止就绪态:通过挂起操作,正在运行的进程可以被暂停并放入静止就绪队列。
    • 活动阻塞态到静止阻塞态:当进程因等待某种资源而无法继续执行时,也可能被挂起,进入静止阻塞状态。
    • 静止就绪态到活动就绪态:通过激活操作,静止就绪的进程可以被唤醒并重新放入活动就绪队列。
    • 静止阻塞态到活动阻塞态:当阻塞进程等待的资源变得可用时,它可能会从静止阻塞状态转换回活动阻塞状态。
  4. 挂起状态的特征

    • 挂起状态的进程不占用CPU资源,因此不会影响系统的调度。
    • 挂起状态的进程可能正在等待某个事件的发生,但这个事件的完成不会自动使进程恢复执行,需要显式的激活操作。
      在这里插入图片描述

挂起状态是操作系统中对进程进行管理的一种重要机制,它允许系统在资源紧张时对进程进行有效的调度和管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值