目录
1. 进程及其实现
2. 没有进程概念之前的系统
3. 进程的属性
4. 进程的内存映像
5. 进程状态及其转换
6. 进程描述与操作控制结构
操作控制结构: 操作系统使用数据结构来记录进程和系统资源的状态:
进程控制块(PCB): 是操作系统用来管理进程的关键数据结构,包含了进程标识信息、状态信息和控制信息,是操作系统实现多任务处理的核心。
7. 进程管理
8. 上下文切换
上下文切换的步骤:
9. 系统调用(System Call)
1. 进程及其实现
- **进程(Process)**是一个正在运行的程序实例,具有自己的内存空间、资源和执行状态。它是操作系统资源管理的基本单位。
- 与**程序(Program)**不同,程序是存储在磁盘上的静态代码,而进程是程序在运行时的动态实体,包括可执行代码、输入、输出以及分配的资源。
2. 没有进程概念之前的系统
- 串行处理(Serial Processing):
- 没有操作系统的早期计算机通过物理开关或穿孔卡输入程序,并由人工调度。程序顺序执行,缺乏自动化和内存保护。
- 批处理(Batch Processing):
- 将一组作业收集在一起按顺序执行。早期的批处理系统使用**作业控制语言(JCL)**来指定作业的执行指令。整个系统在任何时候只能运行一个程序,不存在多任务并发。
3. 进程的属性
- 进程属性: 包括程序代码、输入数据、输出结果以及进程控制结构(如进程控制块PCB)。
- 示例: 一个未运行的程序(如磁盘上的notepad.exe)只是一个静态实体;当用户打开它时,操作系统将它加载到内存,分配资源,形成一个活跃的进程,可以与系统进行交互。
4. 进程的内存映像
- 运行中的进程在内存中占用特定空间,由以下几个主要段组成:
- 文本段(Text Segment): 存储程序的可执行代码,是只读的。
- 数据段(Data Segment): 存储全局变量、常量和静态变量。
- 堆段(Heap Segment): 用于动态内存分配,存储通过malloc或new分配的内存。
- 栈段(Stack Segment): 用于管理函数调用、局部变量、参数和返回地址。
5. 进程状态及其转换
- 进程的状态包括:新建(New)、就绪(Ready)、运行(Running)、等待(Waiting)和终止(Terminated)。
- 状态转换: 进程在执行过程中会根据不同的事件(如 I/O 完成、系统调用、中断等)在这些状态之间进行转换。例如,从“就绪”到“运行”是由调度程序分配 CPU 导致的,从“运行”到“等待”是因为等待 I/O 操作。
- 操作系统使用状态转换图来管理和调度多任务环境中的进程。
-
进程在执行过程中会在不同的状态之间进行转换。常见的转换包括:
- New → Ready(新建到就绪):
当一个进程被创建后,操作系统将它加入到就绪队列,等待执行。这是进程从“新建”状态进入“就绪”状态的转换。 - Ready → Running(就绪到运行):
当调度程序选择某个就绪进程并将其分配到CPU上时,进程进入“运行”状态,开始执行指令。 - Running → Waiting(运行到等待):
如果进程需要等待某个事件(如等待I/O操作完成或进行系统调用),它会从“运行”状态切换到“等待”状态。此时,CPU将被释放给其他就绪进程。 - Waiting → Ready(等待到就绪):
当等待的事件(如I/O操作)完成时,进程会从“等待”状态转换到“就绪”状态,准备再次被调度执行。 - Running → Ready(运行到就绪):
进程被抢占(preempted)时发生,例如当一个定时器中断触发,操作系统决定暂停当前进程,将CPU分配给其他更高优先级的进程。此时,进程从“运行”状态返回到“就绪”状态,等待下一次被调度。 - Running → Terminated(运行到终止):
当进程完成任务或遇到异常时,会从“运行”状态进入“终止”状态。此时,操作系统会进行资源回收和清理。
- New → Ready(新建到就绪):
6. 进程描述与操作控制结构
-
操作控制结构: 操作系统使用数据结构来记录进程和系统资源的状态:
- 进程表(Process Tables): 是一组**进程控制块(PCB)**的集合,记录每个进程的详细信息。
- 内存表、I/O 表、文件表: 跟踪系统内存、输入/输出设备和文件的状态。
-
进程控制块(PCB): 是操作系统用来管理进程的关键数据结构,包含了进程标识信息、状态信息和控制信息,是操作系统实现多任务处理的核心。
- PCB包含的三类属性:
- 进程标识信息(Process Identification):
- 进程ID(PID): 系统为每个进程分配的唯一标识符,用于区分不同的进程。
- 用户ID(UID): 表示拥有该进程的用户,有助于确定进程的权限和操作范围。
- 父进程ID(PPID): 指示创建该进程的父进程,用于管理进程间的关系和层次结构。
- 进程状态信息(Process State Information):
- 进程状态: 当前进程的状态,如就绪、运行、等待、阻塞或终止。
- 程序计数器(PC): 保存进程下一条将要执行的指令的地址,
- 进程标识信息(Process Identification):
便于在上下文切换后继续执行。
- CPU寄存器: 包括累加器、索引寄存器、堆栈指针和通用寄存器的当前值,
用于保存进程暂停时的执行状态,以便在切换回来时恢复。
- 进程控制信息(Process Control Information):
- 调度信息(Scheduling Information): 包括优先级、调度队列指针和其他调度算法
所需的信息(如轮转调度、优先级调度)。
- 内存管理信息(Memory Management Information): 包括进程的内存分配信息,
例如:
- 基址寄存器和限长寄存器: 定义进程可使用的地址空间范围。
- 页表(Page Tables): 如果系统使用虚拟内存,则用页表映射逻辑地址到物理地址。
- 段表(Segment Tables): 在分段内存系统中,定义进程的各个内存段。
- I/O状态信息: 包含进程打开的文件列表、分配的I/O设备以及指向I/O缓冲区的指针。
- 计费信息(Accounting Information): 跟踪进程的资源使用情况,如CPU时间、内存占用、I/O操作,用于性能评估和系统计费。
- 进程权限(Process Privileges): 定义进程的权限,例如可以访问哪些系统资源,允许执行哪些操作(如读取文件、访问I/O设备)。
- 信号和标志(Signals and Flags): 表示进程收到的信号或标志,如中断信号、终止信号或系统警报。
7. 进程管理
- 操作系统在进程管理中的职责:
- 管理 PCB:创建、维护和更新每个进程的状态、资源和执行信息。
- 进程的创建与终止:根据需要创建新进程,或在执行完成后终止进程。
- 进程切换:在不同进程之间切换,以实现多任务处理。
- 提供用于进程管理的系统调用:包括fork()、exec()、wait()和exit()等。
8. 上下文切换
- 上下文切换(Context Switching): 是操作系统在多个进程之间共享 CPU 的机制。涉及保存当前进程状态(如程序计数器、寄存器)到 PCB 中,然后加载另一个进程的状态,实现多任务处理。
上下文切换的步骤:
- 图中显示了两个进程:进程 P₀ 和 进程 P₁,以及操作系统在两者之间进行上下文切换的过程。
- 执行状态(executing): 竖线上的黑色部分表示当前进程正在运行,CPU 正在执行该进程的指令。
- 空闲状态(idle): 竖线上的白色部分表示当前进程处于空闲状态(idle),等待 CPU 资源。
- 触发上下文切换(interrupt or system call):
- 上下文切换通常由中断(如定时器中断)或系统调用(如 I/O 请求)触发。当触发事件发生时,当前正在执行的进程(如 P₀)会被中断,操作系统开始进行上下文切换。
- 保存当前进程状态(save state into PCB₀):
- 操作系统保存当前进程(P₀)的状态,包括程序计数器(Program Counter)和 CPU 寄存器的值。这个状态信息会被存储到进程的**进程控制块(PCB₀)**中,以便稍后可以恢复该进程的执行。
- 更新 PCB 状态:
- 当前进程的 PCB 状态更新为 "ready"(就绪),并被移动到相应的队列中(如就绪队列或阻塞队列)。
- 运行调度程序(Run scheduler, select new process):
- 操作系统中的调度程序运行,选择下一个要执行的进程(如 P₁)。
- 加载新进程状态(reload state from PCB₁):
- 操作系统从新选中的进程(P₁)的 PCB 中恢复其状态,将其程序计数器和寄存器等信息重新加载到 CPU 中。
- 更新 PCB 和内存结构:
- 新进程的 PCB 状态被更新为 "running"(运行中),并更新相关的内存结构,以便新进程在下一个时间片内正常执行。
- 恢复进程(restore process):
- 新进程(P₁)开始执行,进入运行状态。
- 触发条件: 上下文切换通常由中断或系统调用触发,如 I/O 请求、定时器中断等。
9. 系统调用(System Call)
- 系统调用是用户程序与操作系统交互的接口,用户通过系统调用请求操作系统提供的服务(如进程管理、文件操作、内存分配等)。
- 本节介绍了用于进程管理的关键系统调用:
- fork(): 创建一个新的子进程,子进程是当前进程的副本。
- exec(): 用于替换当前进程的内存映像,执行一个新的程序。
- exit(): 用于进程正常退出。
- wait(): 父进程使用它等待子进程完成。