操作系统 感兴趣的变量机制
我们必须确保进度必须由我们的同步机制提供。在轮换变量机制中,进度没有得到保证,原因是不想进入临界区的进程并未考虑其他感兴趣的进程。
其他进程将不得不等待,即使临界区内没有人。如果操作系统可以利用额外的变量和轮换变量一起使用,那么这个问题可以得到解决,并且我们的问题可以在很大程度上保证进度。
感兴趣的变量机制使用额外的布尔变量来确保提供进度。
对于进程Pi
Non CS
Int[i] = T ;
while ( Int[j] == T ) ;
Critical Section
Int[i] = F ;
对于进程 Pj
Non CS
Int [1] = T ;
while ( Int[i] == T ) ;
Critical Section
Int[j]=F ;
在这个机制中,使用了一个额外的变量 interested 。它是一个布尔变量,用于存储进程进入临界区的兴趣。
想要进入临界区的进程首先在进入部分检查其他进程是否有兴趣进入。进程将在其他进程感兴趣之前等待一段时间。
在退出部分,进程将其兴趣变量的值设置为false,以便其他进程可以进入临界区。
表格显示了两个进程的兴趣变量的可能值以及在该场景中获得机会的进程。
Interest [Pi] | Interest [Pj] | Process which get the chance |
---|---|---|
True | True | 首先显示兴趣的进程。 |
True | False | Pi |
False | True | Pj |
False | False | X |
根据要求,让我们分析这个机制的原理。
互斥性
在兴趣变量机制中,如果一个进程对进入CPU感兴趣,那么另一个进程将等待,直到它不再感兴趣。因此,多个进程永远不能同时存在于关键部分,因此该机制保证了互斥性。
进展性
在这种机制中,如果一个进程对进入关键部分不感兴趣,它不会阻止其他进程进入关键部分。因此,进展一定会通过这种方法提供。
有界等待性
要分析有界等待性,让我们考虑两个进程Pi和Pj,它们是想在关键部分中执行的协作进程。进程执行的指令如下所示(以相对方式)。
Process Pi | Process Pj | Process Pi | Process Pj |
---|---|---|---|
1. Int [Pi] = True 2. while (Int [Pj] True); 3. Critical Section | 1. Int [Pj] = True 2. while (Int[Pi]True); | 1. Int [Pi] = False 2. Int [Pi] = True 3. while (Int [Pj] True); //waiting for Pj | 1. While (Int [Pi] True); //waiting for Pj |
最初,两个进程的兴趣变量均为 false 。进程Pi表现出对进入临界区的兴趣。
它将其兴趣变量设置为true,并检查Pj是否也有兴趣。由于另一个进程的兴趣变量为false,因此Pi将进入临界区。
同时,进程Pi被抢占,Pj被调度。Pj是一个合作进程,因此它也希望进入临界区。它通过将兴趣变量设置为true来表示其兴趣。
它还检查另一个进程是否也有兴趣。我们应该注意到,Pi被抢占,但它的兴趣变量为true,这意味着它需要继续在临界区执行。因此Pj不会获得机会,并且在while循环中被阻塞。
同时,CPU将Pi的状态从阻塞更改为运行。Pi还没有完成其临界区,因此它完成临界区并通过将兴趣变量设置为False来退出。
现在,当Pi再次想进入临界区并将其兴趣变量设置为true时,并检查Pj的兴趣变量是否为true。在这里,Pj的兴趣变量为True,因此Pi将在while循环中被阻塞,并等待Pj变得不感兴趣。
由于Pj仍然在while循环中等待Pi的兴趣变量为false。因此,两个进程都在等待对方,没有一个进程能进入临界区。
这是死锁的条件,死锁的情况下无法提供有界等待。
因此,我们可以说兴趣变量机制不能保证死锁。
体系结构中立性
该机制是一个完全在用户模式下执行的软件机制,因此它保证了可移植性或体系结构中立性。