# 进程的概念与特征

# 程序的顺序执行与并发执行

# 程序的顺序执行

  • 定义: 系统中只有一个程序在运行,该程序独占所有系统资源。
  • 特点:
    • 顺序性: 程序必须在前一个程序执行完成后才能开始执行。
    • 封闭性: 程序独占资源,计算机状态完全由其控制逻辑决定。
    • 可再现性: 初始条件相同,执行结果也相同。

# 程序的并发执行

  • 定义: 在一定时间内,系统中有两个或两个以上程序都处于开始运行但尚未结束的状态,并且它们的执行次序不是事先确定的。
  • 目的: 提高资源利用率,是目前主流操作系统的执行方式。
  • 特点:
    • 间断性(异步性): 程序“走走停停”,执行时序关系不再固定。
    • 失去封闭性: 程序共享资源,受其他程序控制逻辑的影响。
    • 失去可再现性: 由于共享资源和外界环境变化,两次执行的推进时序可能不同,导致结果无法重复。
  • 并发执行引发的问题:
    • 同步: 需要协调程序的执行顺序。
    • 互斥: 多个程序共享资源,可能相互影响。
    • 调度: 包括作业调度(选择进入内存的程序)和进程调度(选择哪个程序占用 CPU)。
    • 内存管理: 如何高效分配内存。

# 进程的定义与特征

  • 定义: 进程是具有独立功能的程序在某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。有时也称为任务(Task)

  • 引入目的: 跟踪与描述程序的并发执行。

  • 特征:

    • 动态性: 进程是动态产生和消亡的,在其生命周期内不断转换状态。
    • 独立性: 进程是独立的资源分配单位,拥有独立的地址空间。
    • 并发性: 任何进程都可以与其他进程一起向前推进。
    • 异步性: 每个进程以相对独立、不可预知的速度推进。
    • 交互性: 进程在执行过程中可能与其他进程产生直接或间接关系。
    • 结构化: 进程由程序、数据和**进程控制块(PCB)**三部分组成。
  • 进程与程序的区别:

    • 动静: 进程是动态的,程序是静态的代码集合。
    • 时效: 进程是暂时的生命周期,程序是长久的文件。
    • 组成: 进程由程序、数据和 PCB 构成,程序仅是代码。
    • 对应关系: 一个程序可对应多个进程;一个进程可包括多个程序。

# 进程映像与上下文

# 进程映像

  • 定义: 描述一个正在运行的程序在内存中的整体布局和内容。
  • 组成:
    • 用户程序(代码)
    • 用户数据
    • 堆(Heap): 用于动态内存分配。
    • 栈(Stack): 用于过程调用和参数传递。
    • 进程控制块(PCB): 用户程序不能直接访问和修改。

# 进程上下文

  • 定义: 描述进程执行过程,由用户地址空间内容、硬件寄存器内容及相关核心数据结构组成。
  • 组成:
    • 用户级上下文: 进程的用户地址空间,包括正文段、数据段和用户栈。
    • 寄存器级上下文: 程序计数器、状态寄存器、栈指针和通用寄存器等的值。
    • 系统级上下文: PCB 和资源表格,以及核心栈。

# 进程控制块(PCB)

  • 定义: 操作系统用于管理进程的专用数据结构,记录进程的外部特征,描述其运动变化过程。

  • 作用: PCB 是系统感知进程存在的唯一标志,进程与 PCB 是一一对应的。

  • 内容:

    • 进程描述信息: 进程标识符(ID)、进程名、用户标识符(ID)、进程组等。
    • 进程控制信息: 当前状态、优先级、代码执行入口地址、运行统计信息、进程间同步与通信信息、阻塞原因等。
    • 资源占用信息: 虚拟地址空间的现状、打开文件列表等。
    • CPU 现场信息: 寄存器值(通用、PC、PSW)、指向段/页表的指针等。
  • PCB 表的组织形式:

    • 定义: 系统将所有 PCB 组织在一起,构成 PCB 表或进程表。其大小决定了系统最多可同时存在的进程数(并发度)。
    • 链接结构: 将同一状态的 PCB 组织成链表,不同状态对应不同的链表(如就绪链表、阻塞链表)。

    • 索引结构: 将同一状态的进程归入一个索引表,由索引指向 PCB,不同状态对应不同的索引表。

# 操作系统内核与进程的关系

  • OS 内核: 不是一个进程,其执行不受调度。
  • OS 与进程的关系:
    • 传统方法: OS 不作为进程地址空间的一部分。
    • 早期 UNIX: OS 作为进程地址空间的一部分。
    • Windows、Linux: OS 功能分为核心和系统服务进程,只有 OS 核心作为进程地址空间的一部分。

# 进程的状态与转换

# 进程的三种基本状态

  • 运行态(Running): 进程占有 CPU 并在其上运行。
  • 就绪态(Ready): 进程已具备运行条件但暂时无 CPU 可用,一旦获得 CPU 即可运行。
  • 阻塞态(Blocked): 进程等待某种事件发生而不能运行,即使 CPU 空闲也无法运行。

# 进程状态转换

  • 转换图:

  • 转换条件:
    • 运行 → 阻塞: 等待资源、I/O 操作、其他进程的输入等。
    • 运行 → 就绪: 时间片用完或被高优先级进程抢占。
    • 就绪 → 运行: 调度程序选择该进程运行。
    • 阻塞 → 就绪: 等待的事件发生。

# 五状态进程模型

  • 新增状态:

    • 新建状态(New): 已完成创建进程的必要工作,但尚未获得执行许可(资源有限)。
    • 终止状态(Terminated): 进程撤销后进入此状态,不再有执行资格,但其信息(如资源使用情况)暂时保留。
  • 转换图:

# 七状态进程模型

  • 新增状态:

    • 挂起状态(Suspended): 进程暂时被淘汰出内存的状态(换出状态)。
    • 阻塞挂起状态(Suspended and Blocked): 进程在外存并等待某事件。
    • 就绪挂起状态(Suspended and Ready): 进程在外存,但一旦进入内存即可运行。
  • 引入原因:

    • 用户请求: 暂停进程以进行调试。
    • 负载调节: 为高优先级实时任务腾出内存。
    • 定时任务: 周期性任务执行完毕后挂起以节省内存。
  • 转换过程:

    • 挂起(Suspend): 将进程从内存转到外存。
      • 阻塞 → 阻塞挂起: 内存不足以运行新进程或就绪进程。
      • 就绪 → 就绪挂起: 存在高优先级阻塞进程,需挂起低优先级就绪进程。
      • 运行 → 就绪挂起: 高优先级阻塞挂起进程因事件发生进入就绪挂起,系统抢占运行进程。
    • 激活(Activate): 将进程从外存转到内存。
      • 就绪挂起 → 就绪: 没有就绪进程,或挂起就绪进程优先级更高。
      • 阻塞挂起 → 阻塞: 内存充足后,系统将高优先级阻塞挂起进程激活。
  • 转换图:


# 进程控制

# 进程控制的功能与原语

  • 功能: 操作系统通过具有特定功能的程序段(原语)来创建、撤销进程以及完成进程状态转换,从而实现进程的高效并发执行和资源共享。
  • 原语(Primitive): 由若干条指令构成的原子操作过程,不可分割。许多系统调用是原语。

# 常用进程控制原语

# 创建原语

  • 原因: 系统初始化、执行创建进程的系统调用、用户请求、批处理作业初始化等。
  • 过程: 主要任务是为新进程建立 PCB,并填入相关信息。

# 撤销原语

  • 原因: 正常退出、出错退出、严重错误、被其他进程杀死等。
  • 过程: 进程终止后,系统及时回收其占用的资源。

# 阻塞原语

  • 作用: 实现进程从运行状态到阻塞状态的转换。

# 唤醒原语

  • 作用: 实现进程从阻塞状态到就绪状态的转换。

# 挂起原语

  • 作用: 实现进程从就绪/阻塞状态到就绪挂起/阻塞挂起状态的转换。

# 激活原语

  • 作用: 实现进程从就绪挂起/阻塞挂起状态到就绪/阻塞状态的转换。