面试题答案
一键面试操作系统中常用的进程同步机制
- 互斥锁(Mutex):一种特殊的二元信号量,取值只能是 0 或 1。用于保证在同一时刻只有一个进程能够访问临界区,就像一把锁,获取锁(值为 1 变为 0)的进程可以进入临界区,释放锁(值从 0 变为 1)后其他进程才有机会获取。
- 信号量(Semaphore):一个整型变量加上一个等待队列,通过计数器的值来控制对共享资源的访问。计数器大于 0 时,进程可以获取信号量(计数器减 1)从而访问资源,计数器为 0 时,进程进入等待队列。适用于控制多个进程对多个共享资源的访问。
- 条件变量(Condition Variable):通常和互斥锁配合使用。互斥锁用于保护共享数据,而条件变量用于线程在某些条件满足时才进行特定操作。例如,当缓冲区有数据时,等待在条件变量上的线程被唤醒去处理数据。
- 管程(Monitor):是一种高级同步机制,它将共享变量和对这些变量的操作封装在一起,提供了一种更方便、更安全的方式来实现进程同步。管程中的操作是互斥执行的,外部进程只能通过管程提供的接口来访问共享变量。
信号量与互斥锁在实现进程同步时的异同点
- 相同点
- 目的相同:两者都是用于实现进程同步,保证多个进程在访问共享资源时不会产生竞争条件,确保数据的一致性和正确性。
- 都基于计数器:从原理上看,互斥锁可看作特殊的二元信号量,本质上都是通过一个计数器(二元信号量计数器取值 0 或 1,一般信号量计数器可以是任意非负整数)来控制对共享资源的访问。
- 不同点
- 取值范围:互斥锁的值只能是 0 或 1,而信号量的值可以是任意非负整数。这使得信号量可以控制多个进程对多个共享资源的访问,而互斥锁只能保证一个进程进入临界区,适用于单个共享资源的互斥访问。
- 功能特性:互斥锁主要用于实现进程间对临界区的互斥访问,强调同一时刻只有一个进程能进入临界区。信号量功能更丰富,除了实现互斥访问,还可用于实现进程间的同步,比如控制并发访问的进程数量等。
- 使用场景:如果只有一个共享资源且要求严格的互斥访问,使用互斥锁更简单直接。如果有多个共享资源,或者需要控制并发访问的数量等复杂场景,信号量更合适。