Operating system 测试和设置指令如何在下面的代码中提供有界等待?

Operating system 测试和设置指令如何在下面的代码中提供有界等待?,operating-system,synchronization,Operating System,Synchronization,在下面的代码中,如何满足有界等待条件,我无法得到这些语句的用法,为什么它们应用了条件j=i和j=(j+1)%n,然后if子句中提到的条件使用(j==i),请澄清这一点,根据我的说法,它应该只检查等待[j],以便确认是否有任何其他进程正在等待锁定,我无法理解该算法的工作原理,请解释它 while ((j != i) && !waiting[j]) j = (j + 1) % n; if (j == i) lock

在下面的代码中,如何满足有界等待条件,我无法得到这些语句的用法,为什么它们应用了条件j=i和j=(j+1)%n,然后if子句中提到的条件使用(j==i),请澄清这一点,根据我的说法,它应该只检查等待[j],以便确认是否有任何其他进程正在等待锁定,我无法理解该算法的工作原理,请解释它

while ((j != i) && !waiting[j]) 
            j = (j + 1) % n; 
        if (j == i) 
            lock = false; 

do {
    waiting[i] = true;
    while (waiting[i] && test_and_set(&lock)) ;
    waiting[i] = false;

    /* critical section */

    j = (i + 1) % n;
    while ((j != i) && !waiting[j]) 
        j = (j + 1) % n; 
    if (j == i) 
        lock = false; 
    else
        waiting[j] = false;

    /* remainder section */
} while (true);

有界等待意味着任何进程都不应该无限期地等待资源

您有n个进程,进程i当前正在执行,当它进入关键部分时,它将其等待设置为false

现在,当我完成这个过程时会发生什么? 进程i将查找一个索引j(进程j),该索引正在关键部分等待运行。换句话说,我们正在寻找一个等待进入临界区的进程,该进程与在临界区中运行的当前进程不同

如果(i==j)
,则不存在这样的进程,我们将lock设置为false。否则,我们将设置等待运行的进程并防止饥饿。这样你就满足了有限的等待

这是因为在执行循环搜索时,首先检查流程

i+1, i+2, .... n, 0, 1, ... ,(i-1)

我在陈述中仍然有困惑!等待[j],当我们进入另一个进程时,为什么我们要否定它,而它对进入临界区感兴趣,因此它会将其等待索引设置为true,那么为什么我们要否定它,并使用j=(j+1)%n进入下一个进程?设置lock=false和等待[j]之间的区别是什么=false?您否定它,所以一旦找到一个准备就绪的进程,就开始在关键部分运行该进程。Lock=false表示没有进程在关键部分。而waiting=false意味着一个进程并没有等待进入关键部分。请您再解释一下waiting[j]部分的否定,我无法得到它。如果一个过程准备就绪,那么它的等待[j]将为真,通过否定它,我们将阻止该过程进入关键部分,这不是我们想要的