计算机操作系统知识--关于同步互斥的思考1
最近碰到各种关于同步互斥的讨论。所以想写个专题,谈谈个人对同步互斥里面几个问题的看法。
操作系统里面实现互斥的方法是采用信号量和自旋锁的机制。那么在操作系统中信号量、自旋锁是如何实现的了?一般有两种思路:其一,用软件的方法来实现。其二,采用硬件的方法。所谓软件的方法无非是各种做标志的算法,那么通过硬件有哪些解决方案了?通过采用的方案为,屏蔽中断、修改CPU。
修改CPU这一说法是我个人的提法,未必准确。通过修改CPU然后使CPU获取了某些功能,这些功能的体现则是通过CPU指令集表现出来的。那么有哪些指令是用来实现互斥功能的了?Test-and-Set、Decrement和Increment、Compare-and-Swap、指令对,包括一条特殊Load指令,称为链接Load指令(load link,简写为ll),或者称为加锁Load指令(Load Locked),另外还包括一条特殊Store指令称为Store指令(store conditional,简写为sc)。
下面以Test-and-Set指令为例,谈谈该指令是如何实现进程的对临界资源的互斥访问的。
while(S) do;
Test-and-Set(S,temp);
while(temp) do Test-and-Set(S,temp); /完成lock(S)操作/
if balance[X] > 100 then /临界段/
begin
balance[X] :=balance[X] -100;
balance[Z] :=balance[Z] +100;
end
S:=False; /完成unlock(S)操作/
对比看看软件的算法,在进程级的角度实现互斥对临界资源的互斥访问的算法:
硬件的方法和软件的方法相比,软件的方法在进程P0实现进入临界区后,如果产生中断,修改标志使得进程P1也可以进入临界区,如果系统调度P1在P0执行了一部分临界区的代码后也执行他的临界区的代码。那么该软件的方法是不能保证对临界资源的互斥访问。而硬件的方法则不存在这样的问题。
/**************************************************************************************************
一个相关的思考!
**************************************************************************************************/
我的疑问是,如果硬件在执行临界区的代码时,系统产生中断。中断服务程序是否是破坏临界资源??我个人的观点是,在中断中如果进程想访问临界资源,也必须获得信号量。实际系统中是否也是这么做的?这个就要请各位大牛回答。另外,如果中断中获得不到信号量那会怎么办?等在那儿?貌似中断服务程序如果完成不了的话,系统不是崩溃了?