本文共 2829 字,大约阅读时间需要 9 分钟。
进程与调度
1. 进程的基本概念
程序是静态的,存在磁盘中的可执行文件,是一系列指令的集合。而进程是动态的,是程序的一次执行过程。进程可以看作是程序在运行时的具体实例,随着时间的推移,进程会不断改变它的状态。
进程的组成
进程由几个部分组成:
- PCB(进程控制块):操作系统使用的部分,记录进程的状态、任务等信息。
- 数据段:进程使用的内存区域,包含进程的全局变量等。
- 程序段:进程执行的指令集合,通常存储在可执行文件中。
PCB是操作系统内部使用的,而数据段和程序段则与进程的运行逻辑密切相关。
进程的特征
进程具有以下几个显著特征:
- 动态性:进程的状态会随着时间不断变化。
- 并发性:多个进程可以在同一时间段内并发执行。
- 独立性:进程之间具有资源隔离性,互不影响。
- 异步性:进程的执行具有不确定性,无法保证各进程按照预期顺序完成任务。
- 结构性:进程是执行某个程序的基本单元,具有明确的结构。
2. 进程的状态
2.1 进程状态的变化
进程在运行过程中会经历多个状态。这些状态的变化通常由操作系统的调度机制决定。以下是常见的进程状态变化:
初始状态(无状态):进程被创建,但尚未分配资源。 创建态:进程被成功创建,资源被初始化。 就绪态:进程获得CPU资源,准备执行。 阻塞态:进程因等待某一事件(如I/O操作完成)而暂时停止执行。 终止态:进程正常结束或因错误无法继续执行。 2.2 进程的组织
进程的组织方式主要有两种:
- 链接方式:将PCB按照进程状态分为多个队列,操作系统通过队列指针来管理进程。
- 索引方式:根据进程状态的不同,建立多个索引表,操作系统通过索引表快速定位进程。
2.3 进程控制
进程状态的转换需要通过原语实现。原语是一种特殊的内核程序,执行时不会被中断。进程状态的转换通常包括以下步骤:
更新PCB中的相关信息。 将PCB插入适当的队列中。 分配或回收资源(如果有的话)。 3. 进程通信
3.1 共享存储
进程间的通信可以通过共享存储实现,主要有两种方式:
- 基于数据结构的共享存储:速度较慢,适用于简单的交换机制。
- 基于存储区的共享存储:速度较快,资源分配较灵活。
在使用共享存储时,各进程必须通过互斥机制确保访问一致性。
3.2 管道通信
管道是一种半双工通信机制,特点是:
- 同时只能单向传输。
- 管道访问必须是互斥的。
- 写满时会阻塞等待读,读空时会阻塞等待写。
管道通信可以分为直接通讯和间接通讯两种方式,通过发送原语和接收原语实现。
3.3 消息传递
消息传递是进程间通信的一种高效方式,主要方式包括:
- 直接通讯:消息直接挂到接收进程的消息缓冲队列上。
- 间接通讯:消息通过信箱(信道)传递,由操作系统完成分发。
4. 线程
4.1 线程的基本概念
线程是进程内部并发执行的基本单元,主要用于同时执行多个任务。线程具有以下特点:
- 线程是CPU执行的基本单元。
- 同一进程内的不同线程共享进程资源。
- 线程间的通信不需要操作系统的干预。
4.2 线程的实现方式
线程的实现方式主要有两种:
- 用户级线程:由用户级线程库实现,操作系统不可见。
- 内核级线程:由操作系统内核实现,需要进行用户态和内核态的切换。
4.3 多线程模型
多线程模型主要包括以下几种:
- 一对一模型:一个用户级线程映射到一个内核级线程。
- 多对一模型:多个用户级线程映射到一个内核级线程。
- 多对多模型:多个用户级线程映射到多个内核级线程。
5. 调度
5.1 三层调度
调度是操作系统对进程的资源分配和调度,主要分为以下三层:
高级调度(作业调度):决定哪些作业进入内存,创建进程。 中级调度(内存调度):将进程的数据调回内存。 低级调度(进程调度):为进程分配CPU资源。 5.2 进程调度
进程调度的时机包括:
- 进程正常终止。
- 进程运行过程中发生异常。
- 进程主动请求阻塞(如I/O请求)。
- 时间片用完。
- 发生中断。
- 有优先级更高的进程进入就绪队列。
进程调度的方式主要有两种:
- 非剥夺调度:当前运行的进程完成CPU资源后,立即调度下一个进程。
- 剥夺调度:当前运行的进程被更高优先级的进程抢占CPU。
5.3 调度算法评价指标
调度算法的评价通常基于以下指标:
- CPU利用率。
- 系统吞吐量。
- 平均周转时间。
- 带权周转时间。
- 平均等待时间。
5.4 调度算法
常见的调度算法包括:
- 先来先服务算法(FCFS):非抢占式,公平。
- 短作业优先算法(SJF):针对短作业优先调度。
- 高响应比优先算法(HRRN):综合考虑等待时间和运行时间。
- 时间片轮转算法(RR):每个进程轮流执行固定时间。
- 优先级调度算法:根据进程优先级进行调度。
- 多级反馈队列调度算法:通过多级队列和时间片轮转来优化调度。
6. 进程的同步与互斥
6.1 进程同步
进程同步是确保多个进程能够按照预定顺序执行的机制。常见的同步机制包括信号量和管程。
6.2 进程互斥
进程互斥是保证多个进程对共享资源的访问互不干扰。临界资源的访问需要遵循以下原则:
- 空闲让进:空闲的进程优先访问临界资源。
- 忙则等待:忙的进程不能中断当前的操作。
- 有限等待:进程在有限时间内获取临界资源。
- 让权等待:进程主动让出CPU资源,等待其他进程访问。
6.3 进程互斥的实现方法
进程互斥的实现方法主要有以下几种:
- 单标志法:通过一个标志变量来控制临界区的访问权限。
- 双标志法:通过两个标志变量来协调进程的进入和退出。
- Peterson算法:结合了单标志法和双标志法,提高了互斥的效率。
- 硬件实现:通过TestAndSet指令和swap指令实现互斥。
6.4 信号量机制
信号量是一种用于表示系统资源剩余数量的变量。通过wait和signal原语对信号量进行操作,wait表示等待信号量,signal表示释放信号量。信号量可以分为整型信号量和记录型信号量两种。
7. 管程
管程是一种高级同步机制,主要用于共享数据结构的访问和操作。管程的特点是:
- 每次只允许一个进程在管程内执行一个过程。
- 只能通过过程访问共享数据结构。
8. 死锁
死锁是并发环境下由于资源竞争导致的相互等待状态。四个必要条件:
互斥条件:只有一个进程能同时持有资源。 不剥夺条件:进程在持有资源时不能被剥夺。 请求和保持条件:进程在请求资源时必须持有所有需要的资源。 循环等待条件:进程在等待资源时,进入一个无限循环。 防止死锁的方法包括:
- 安全序列:按照特定顺序分配资源,确保进程能顺利执行。
- 资源剥夺法:挂起当前进程,抢占其资源。
- 进程回退法:让进程退回之前的状态。
9. 死锁的检测与解除
死锁的检测和解除需要采取以下措施:
- 检测:通过数据结构记录资源的请求和分配信息,检测是否进入死锁状态。
- 解除:通过资源剥夺法、终止进程法或进程回退法来打破死锁。
通过以上内容可以看出,进程与调度是操作系统的核心内容之一。理解这些概念对于掌握操作系统的整体架构至关重要。
转载地址:http://aztg.baihongyu.com/