操作系统中的同步与互斥机制
字数 1126 2025-11-03 08:33:37
操作系统中的同步与互斥机制
描述
同步与互斥是多线程或多进程环境中保证数据一致性与执行顺序的核心机制。互斥指同一时间仅允许一个线程访问共享资源,避免数据竞争;同步则控制线程间的执行顺序,确保协作任务按预期推进。例如,多个线程同时写文件需互斥,而生产者线程先生产数据后消费者线程才能消费则需同步。
核心问题分析
- 竞态条件:多个线程并发操作共享数据时,结果依赖执行顺序。
- 临界区:访问共享资源的代码段,需保证互斥进入。
- 同步需求:如生产者-消费者问题中,缓冲区空时消费者必须等待。
解决方案的演进
1. 软件方法:Peterson算法(互斥示例)
- 原理:适用于两个线程,通过共享变量
turn(指示当前可进入的线程)和布尔数组flag(表示线程是否想进入临界区)实现。 - 步骤:
- 线程
i设置flag[i] = true,并置turn = j(主动让出权限)。 - 检查条件:若
flag[j] == true 且 turn == j,则等待;否则进入临界区。
- 线程
- 缺陷:仅限两个线程,且忙等待(占用CPU空转)。
2. 硬件方法:中断禁用与原子指令
- 中断禁用:进入临界区前关闭中断,避免线程切换。但仅适用于单核系统,不适用于多核且影响系统响应。
- 原子指令:如
TestAndSet指令,其伪代码如下:bool TestAndSet(bool *lock) { bool old = *lock; *lock = true; return old; }- 线程循环调用
TestAndSet(&lock),返回false(表示锁空闲)时退出循环并进入临界区。 - 优点:简单高效;缺点:仍忙等待。
- 线程循环调用
3. 操作系统提供的机制:信号量与互斥锁
- 信号量:整型变量,支持
wait()(P操作)和signal()(V操作),均为原子操作。- 互斥信号量:初值为1,
wait()减1,若值<0则阻塞线程(非忙等待)。 - 同步信号量:初值为0,用于线程顺序控制(如消费者
wait()等待生产者signal())。
- 互斥信号量:初值为1,
- 互斥锁:简化版的二值信号量,常用
pthread_mutex_lock等接口。与信号量区别在于所有权(仅锁持有者能解锁)。
实际应用示例
以生产者-消费者问题为例,需三个信号量:
mutex(初值1):保护缓冲区互斥访问。empty(初值N):表示空闲缓冲区数量。full(初值0):表示已占用缓冲区数量。
生产者逻辑:
wait(empty); // 等待空闲缓冲区
wait(mutex); // 申请互斥访问
写入缓冲区;
signal(mutex);
signal(full); // 增加已使用缓冲区
消费者逻辑对称。通过empty与full实现同步,mutex实现互斥。
总结
同步互斥机制从软件算法到硬件指令,最终由操作系统封装为信号量/锁等易用工具。关键设计原则:减少忙等待、避免死锁(如顺序申请锁)、保证原子性。现代系统常结合自旋锁(短时忙等待)与睡眠锁(长时阻塞)以平衡效率与资源消耗。