📅  最后修改于: 2020-12-14 03:40:41             🧑  作者: Mango
我们必须确保必须通过我们的同步机制来提供进度。在转弯变量机制中,由于不想进入关键部分的过程也没有考虑其他感兴趣的过程,因此未提供进度。
无论关键部分内没有任何人,其他过程也都必须等待。如果操作系统可以将额外的变量与turn变量一起使用,则可以解决此问题,并且我们的问题可以在很大程度上解决问题。
感兴趣的变量机制利用额外的布尔变量来确保提供进度。
对于过程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 ;
在这种机制中,使用了一个感兴趣的额外变量。这是一个布尔变量,用于存储要在关键部分内输入的流程的兴趣。
想要进入关键部分的过程首先在进入部分中检查其他过程是否有兴趣进入。该过程将等待时间,直到另一个过程感兴趣为止。
在退出部分,该过程将其兴趣变量的值设置为false,以便其他过程可以进入关键部分。
该表显示了流程和在场景中获得机会的流程的兴趣变量的可能值。
Interest [Pi] | Interest [Pj] | Process which get the chance |
---|---|---|
True | True | The process which first shows interest. |
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'感兴趣的变量变为假。因此,这两个进程都在互相等待,并且没有一个进入关键部分。
这是死锁的条件,在死锁的情况下永远无法提供有限的等待。
因此,可以说感兴趣的变量机制不能保证死锁。
该机制是在用户模式下执行的完整软件机制,因此它保证了可移植性或体系结构中立性。