我们必须确保必须通过我们的同步机制来提供进度。在转变量机制中, 由于不想进入关键部分的线程也没有考虑其他感兴趣的线程, 因此未提供进度。
无论关键部分内没有任何人, 其他线程也都必须等待。如果操作系统可以将额外的变量与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] | 获得机会的线程 |
---|---|---|
True | True | 首先显示出兴趣的线程。 |
True | False | Pi |
False | True | Pj |
False | False | X |
让我们根据需求分析机制。
互斥
在有兴趣的变量机制中, 如果一个进程有兴趣进入CPU, 则另一个进程将等待直到不再感兴趣。因此, 关键部分永远不会同时存在多个进程, 因此该机制保证了互斥。
进展
在这种机制中, 如果一个进程对进入关键部分不感兴趣, 那么它将不会阻止其他进程进入关键部分。因此, 这种方法肯定会提供进步。
有限的等待
为了分析有界等待, 让我们考虑两个进程Pi和Pj, 这两个协作进程是要在关键部分中执行的。这些线程执行的指令以相对方式显示在下面。
Process Pi | 线程Pj | Process Pi | 线程Pj |
---|---|---|---|
1. Int [Pi] = True 2. while(Int [Pj] == True); 3.关键部分 | 1. Int [Pj] = True 2. while(Int [Pi] == True); | 1. Int [Pi] = False 2. Int [Pi] = True 3. while(Int [Pj] == True); //等待Pj | 1. While(Int [Pi] == True); //等待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’感兴趣的变量变为假。因此, 这两个进程都在互相等待, 并且没有一个进入关键部分。
这是死锁的条件, 在死锁的情况下永远无法提供有限的等待。
因此, 可以说感兴趣的变量机制不能保证死锁。
建筑中立
该机制是在用户模式下执行的完整软件机制, 因此可以保证可移植性或体系结构中立性。
评论前必须登录!
注册