前面介绍的多道批处理系统、分时系统和实时系统这三种基本操作系统都具有各自不同的特征,如批处理系统有着较高的资源利用率和系统吞吐量;分时系统能获得及时响应;实时系统具有实时特征。除此之外,它们还共同具有并发、共享、虚拟和异步四个基本特征。
1.3.1并发(Concurrence)
并发是操作系统的核心特征之一,它允许多个程序同时存在于内存中,并通过快速切换的方式共享CPU资源。这种机制显著提高了资源利用率和系统吞吐量。
1. 并行与并发
定义与区别:
-
并行(Parallelism)
- 同一时刻多个任务同时执行(需多核/多处理器支持)。
- 微观视角:物理上的同时执行。
- 举例:4核CPU同时处理4个线程。
-
并发(Concurrency)
- 同一时间段内多个任务交替执行(单核即可实现)。
- 宏观视角:逻辑上的同时执行,实际通过时间片轮转实现。
- 举例:单核CPU通过快速切换处理多任务。
经典对比(咖啡机模型):
- 并行:两个队列使用两台咖啡机(物理上同时冲泡)。
- 并发:两个队列交替使用一台咖啡机(逻辑上同时进行)。
2. 引入进程
需求背景:
- 早期系统问题:顺序执行程序时,CPU等待I/O导致利用率低(如等待磁盘读取数据时CPU空闲)。
- 多道程序设计:将多个程序载入内存并发执行,但需解决以下问题:
- 独立性:各程序应隔离运行,避免相互干扰。
- 可控性:系统需管理程序的启动、暂停和终止。
- 资源共享:合理分配CPU、内存等资源。
进程的提出
- 定义:进程是程序的一次执行过程,是OS进行资源分配和调度的基本单位。
- 关键作用:
- 为每个程序提供独立的内存空间和运行环境。
- 通过进程控制块(PCB) 记录运行状态(如程序计数器、寄存器值)。
进程状态转换:
为何用进程实现并发?
- 封装性:每个进程有自己的地址空间,避免数据冲突。
- 可控性:OS通过PCB精确管理每个进程的状态(如挂起、恢复)。
- 协作性:进程间可通过IPC(管道、共享内存等)安全通信。
3.总结
并发通过时间片轮转实现逻辑上的“同步”,进程则为并发提供了资源隔离和管理的机制。理解并行与并发的区别,以及进程如何支撑并发执行,是掌握操作系统多任务设计的核心基础。
1.3.2共享(Sharing)
1. 互斥共享方式
核心概念
互斥共享指某一时间段内,资源仅允许一个线程/进程独占访问。常见于需要保持数据一致性的场景。
关键特性
- 临界资源(Critical Resource):不能被多个进程同时访问的资源,如打印机、共享变量、数据库写操作。
- 原子操作(Atomicity):对资源的操作必须是不可分割的整体,如经典的
read-modify-write
过程。 - 锁机制:通过锁(如互斥锁、信号量)确保同一时间只有一个进程持有资源。
实现方式
- 硬件支持:如 Test-and-Set(TSL 指令)、Compare-and-Swap(CAS)实现原子操作。
- 软件同步:信号量(Semaphore)的 P/V 操作、互斥量(Mutex)的锁机制。
流程图(互斥锁的竞争)
经典问题
- 哲学家就餐问题:用互斥锁解决叉子(资源)竞争问题。
- 生产者-消费者问题:通过互斥锁和信号量协调生产与消费。
2. 同时访问方式
核心概念
多个进程/线程在宏观上同时访问资源,但可能在微观上交替执行。适用于资源可分割或只读的场景。
关键特性
- 共享读:多个进程可同时读取资源(如内存页、文件只读访问)。
- 限制写:若有修改操作,仍需互斥(例如:写时复制,COW)。
- 高并发优化:通过减少临界区、读写锁等提升性能。
实现方式
- 读写锁(ReadWrite Lock):
- 读锁:多线程共享访问读操作。
- 写锁:单线程独占写操作。
- 无锁编程(Lock-Free):通过原子操作(如 CAS)实现线程安全的共享访问。
流程图(读写锁的工作机制)
应用场景
- 数据库连接池:多个线程共享连接资源,写操作互斥。
- 文件系统:多用户同时读取同一文件,但只能单用户修改。
3.互斥共享 vs 同时访问的区别
对比维度 | 互斥共享 | 同时访问 |
---|---|---|
资源访问模式 | 独占式访问 | 共享读(写仍可能互斥) |
性能影响 | 高(频繁锁竞争、线程切换) | 低(读操作可并行化) |
典型应用 | 打印操作、数据写入 | 文件读取、数据库查询 |
实现复杂度 | 高(需严格同步机制) | 低(读操作无锁竞争) |
4.常见问题解答
Q1:互斥共享可能导致哪些问题?
- 死锁:进程相互等待对方释放锁(如哲学家问题的循环等待)。
- 优先级反转:低优先级进程持有高优先级进程需要的锁。
Q2:如何优化共享资源性能?
- 减少锁粒度(如分段锁)。
- 乐观锁(如版本号机制,CAS)。
1.3.3虚拟(Virtual)
用于实现“虚拟”的技术最早出现在通信系统中。在早期,每一条物理信道只能供一对用户通话,为了提高通信信道的利用率而引入了“虚拟”技术。该技术是通过“空分复用”或“时分复用”技术,将一条物理信道变为若干条逻辑信道,使原来只能供一对用户通话的物理信道,变为能供多个用户同时通话的逻辑信道。
在OS中,把通过某种技术将一个物理实体变为若干个逻辑上对应物的功能称为“虚拟”。前者是实的,即实际存在的,而后者是虚的,是用户感觉上的东西。相应地,把用于实现虚拟的技术称为虚拟技术。OS利用 时分复用(Time-Division Multiplexing, TDM) 和 空分复用(Space-Division Multiplexing, SDM) 实现虚拟化。
1.基本概念
虚拟技术的本质是将物理实体通过某种技术手段分割或组合成多个逻辑实体。
- 物理实体:实际存在的资源(如CPU、内存、磁盘、通信信道)。
- 逻辑实体:用户感知的资源(如虚拟CPU、虚拟内存、虚拟设备)。
- 核心目标:通过复用资源提高利用率,提供用户透明的资源抽象。
2. 时分复用技术
将一段连续的物理资源(如CPU时间、I/O设备访问时间)以时间片为单位进行分割,供多个用户或进程轮流使用。
(1) 虚拟处理机技术
- 多道程序设计:通过分时复用CPU,实现多个进程并发执行。
- 进程调度:
- 每个进程获得一个时间片(如10ms),轮流占用CPU。
- 用户产生“独占CPU”的假象(宏观上并行,微观上串行)。
- 流程图表示:
(2) 虚拟设备技术
- 共享设备:物理设备(如打印机、磁盘)通过时分复用支持多个用户同时“独占设备”。
- 示例:
- 多个用户同时提交打印任务,任务被缓存在虚拟打印队列中,物理打印机依次处理。
- SPOOLing技术(假脱机技术)是实现虚拟设备的核心方法。
特点与局限性
- 优点:资源利用率高,适合突发性任务。
- 缺点:时间片分配可能导致响应延迟,长期需同步的任务可能不适用。
3. 空分复用技术
将物理资源按空间维度划分为多个逻辑资源,分给不同用户/进程独立使用。
(1) 存储器管理
- 物理内存分区:将内存划分为多个区域供多道程序共享。
- 虚拟内存技术:
- 通过页表映射,将物理内存与磁盘空间结合,为进程提供“虚拟内存”抽象。
- 允许进程在较小的物理内存中运行更大的程序。
(2) 文件系统与磁盘管理
- 文件存储:物理磁盘通过分区或逻辑卷分割成多个文件系统。
- 示例:
- 单个物理磁盘可被划分为C盘、D盘等逻辑分区,用户感知为独立存储设备。
虚拟存储实现原理
特点与局限性
- 优点:物理空间独立分配,避免进程间干扰。
- 缺点:存储碎片问题需动态管理算法(如分页、分段)。
4.时分复用 vs 空分复用
特性 | 时分复用 | 空分复用 |
---|---|---|
资源划分维度 | 时间片轮转 | 空间分区 |
适用场景 | CPU调度、通信信道复用 | 内存管理、磁盘分区 |
资源管理 | 动态分配时间片长度 | 静态/动态分配内存或存储空间 |
主要目标 | 提高动态共享资源利用率 | 提供独立逻辑资源环境 |
5.总结
- 虚拟技术核心:通过 时间分割(TDM) 或 空间分割(SDM) 实现资源的逻辑抽象。
- 应用场景:
- 时分复用:CPU调度、网络数据传输(TCP连接复用)。
- 空分复用:虚拟内存、文件系统、云计算资源池(如虚拟机隔离)。
- 现代系统结合:实际系统中往往结合两种技术(如虚拟内存的时间分片访问+空间分页)。
1.3.4异步(Asynchronism)
1.核心定义与特点
-
异步的本质
进程的执行速度不可预知,各进程以“停停走走”的方式推进。例如:- 资源竞争:当一个进程需要打印但打印机被占用时,它会释放 CPU 进入阻塞状态,等待资源就绪。
- 不可预测性:进程何时获取 CPU、何时暂停,取决于调度策略和资源状态。
-
异步性与同步机制的关系
- 进程虽然是异步的,但通过 同步机制(如信号量、锁)能保证多个进程运行时结果的一致性。
- 示例:多个用户运行相同的程序,若同步机制完善,无论进程如何切换,结果始终一致。
2.异步的底层原理
-
进程调度与中断处理
- 阻塞与非阻塞:进程因资源请求阻塞时,会主动让出 CPU。
- 中断唤醒:当等待的事件完成(如 I/O 完成),由中断机制触发唤醒操作(如
wakeup
),将进程从阻塞队列移至就绪队列。
-
I/O 模型的异步性
- 同步阻塞:进程调用后等待操作完成(如一直等待外卖送达)。
- 异步非阻塞:进程在调用后继续其他任务,通过回调或信号接收结果(如外卖通过电话通知送达)。
3.异步的典型应用场景
-
消息队列与解耦
-
生产者-消费者模型:生产者向缓冲池异步投放产品,消费者从缓冲池异步取走产品。
-
优势:通过解耦生产者和消费者,减少资源冲突。
-
-
异步 I/O 与性能优化
- 对比同步与异步:
模式 | 数据准备阶段 | 数据拷贝阶段 | 流程 |
---|---|---|---|
同步阻塞 | 等待 | 等待 | 用户全程等待数据 |
异步非阻塞 | 不等待 | 内核自动完成 | 用户做其他事情,内核完成时通知 |
**示例**:外卖由智能设备自动配送(异步 I/O),用户无需等待。
4.异步与同步机制的协调
-
阻塞原语与唤醒原语
-
block
与wakeup
:必须成对使用。如生产者投放数据后,若缓冲池已满则block
,消费者取出数据后调用wakeup
。 -
伪代码示例:
void producer() {while (buffer_full) block();add_data_to_buffer();wakeup(consumer); // 唤醒消费者 }
-
-
死锁处理
- 若唤醒机制失效(如忘记调用
wakeup
),进程可能永久阻塞。
- 若唤醒机制失效(如忘记调用
5.异步在分布式系统中的应用
- 任务分片与消息驱动
- 微内核架构:将核心功能(如同步机制)放入内核,减少用户态/内核态切换次数。
- 示例:使用消息队列(MQ)实现订单系统解耦,订单生成后异步通知库存、物流系统。
6.总结对比
特性 | 同步 | 异步 |
---|---|---|
执行过程 | 顺序执行,可预知 | 各步骤独立,不可预知 |
CPU 利用率 | 低(等待时间长) | 高(不阻塞等待) |
典型场景 | 批处理、串行计算 | I/O 密集、消息队列 |
实现复杂性 | 简单 | 需要同步机制保证一致性 |
通过以上内容,可以系统理解异步在操作系统中的核心作用、实现细节及应用场景。