面试题答案
一键面试进程同步机制
- 信号量(Semaphore)
- 定义:信号量是一个整型变量,通过一个计数器来控制对共享资源的访问。它可以允许多个进程同时访问共享资源,只要计数器的值大于0。
- 工作原理:当一个进程想要访问共享资源时,它会尝试获取信号量(将计数器减1)。如果计数器的值变为负数,说明资源已被占用,进程将被阻塞等待。当一个进程释放共享资源时,它会释放信号量(将计数器加1),如果有其他进程在等待,就会唤醒其中一个等待的进程。
- 应用场景:适用于控制多个进程对有限数量共享资源的访问,例如打印机、数据库连接池等。
- 互斥锁(Mutex)
- 定义:互斥锁是一种特殊的二元信号量(计数器值只能是0或1),它用于保证在同一时刻只有一个进程能够访问共享资源,即实现对共享资源的互斥访问。
- 工作原理:当一个进程想要访问共享资源时,它需要获取互斥锁(将计数器设为0)。如果互斥锁已经被其他进程获取(计数器为0),则该进程会被阻塞。当进程访问完共享资源后,释放互斥锁(将计数器设为1),此时如果有其他进程在等待,就会唤醒其中一个等待的进程。
- 应用场景:常用于保护临界区,确保同一时间只有一个进程进入临界区访问共享数据,如共享内存区域等。
死锁产生的四个必要条件
- 互斥条件:资源在某一时刻只能被一个进程所使用,即进程对所分配到的资源具有排他性。例如,打印机在打印文件时,不能同时被另一个进程使用。
- 占有并等待条件:一个进程已经持有了至少一个资源,但又请求新的资源,而新资源被其他进程占有,此时该进程会等待新资源,同时不释放已持有的资源。比如,进程A持有资源R1,又请求资源R2,而资源R2被进程B持有,进程A就会等待R2,同时不释放R1。
- 不可剥夺条件:进程所获得的资源在未使用完之前,不能被其他进程强行夺走,只能由该进程自己主动释放。例如,进程获得了一个文件的独占访问权,在它完成操作前,其他进程不能强行剥夺该访问权。
- 循环等待条件:存在一个进程集合{P1, P2, …, Pn},其中P1等待P2所占有的资源,P2等待P3所占有的资源,…,Pn等待P1所占有的资源,形成一个循环等待链。
避免死锁的策略
- 破坏占有并等待条件
- 策略:进程在申请资源时,一次性申请它所需要的所有资源。如果有任何一个资源无法获取,则不分配任何资源,该进程等待。
- 实际场景:在数据库事务处理中,如果一个事务需要访问多个表,它可以在开始时一次性申请对所有相关表的锁,而不是先获取部分锁再申请其他锁。这样就避免了进程占有部分资源又等待其他资源的情况。
- 破坏循环等待条件
- 策略:对资源进行排序,规定进程只能按照资源序号递增(或递减)的顺序申请资源。
- 实际场景:在一个操作系统中,假设有打印机(资源1)、扫描仪(资源2)和绘图仪(资源3)三种资源。进程必须先申请打印机,再申请扫描仪,最后申请绘图仪。如果进程需要使用绘图仪和打印机,它必须先申请打印机,再申请绘图仪,这样就不会形成循环等待。
死锁的检测和解除
- 死锁检测
- 资源分配图算法:系统维护一个资源分配图,图中节点表示进程和资源,边表示进程对资源的请求或占有关系。通过对资源分配图进行算法分析(如深度优先搜索),判断是否存在环路。如果存在环路,则可能存在死锁。例如,在一个简单的系统中,进程A请求资源R1,资源R1被进程B占有,进程B又请求资源R2,资源R2被进程A占有,通过资源分配图算法可以检测到这个环路,从而判断可能存在死锁。
- 死锁解除
- 资源剥夺法:从一个或多个死锁进程中剥夺足够数量的资源,分配给其他死锁进程,以打破死锁状态。例如,在一个多进程竞争打印机和文件资源的场景中,如果检测到死锁,可以剥夺某个进程对打印机的占有权,分配给另一个死锁进程,从而尝试解除死锁。
- 撤销进程法:强制撤销一个或多个死锁进程,释放它们占有的资源,以解除死锁。可以选择撤销那些优先级低、执行时间短或已经完成部分工作较少的进程。比如在一个作业调度系统中,撤销一个刚提交不久、占用资源较少的作业,以解除死锁状态。