二值信号量如何保证互斥?
How does binary semaphore guarantee mutual exclusion?
我刚刚看到二进制信号量保证互斥并且信号量可以被抢占。
二进制信号量 wait/down 的代码(取自 https://www.javatpoint.com/os-binary-semaphore-or-mutex)
Down (semaphore S)
{
if (s.value == 1) // if a slot is available in the
//critical section then let the process enter in the queue.
{
S.value = 0; // initialize the value to 0 so that no other process can read it as 1.
}
else
{
put the process (PCB) in S.L; //if no slot is available
//then let the process wait in the blocked queue.
sleep();
}
}
那么如果进程 P1 是 运行 并且它检查 down 函数中的条件并准备将 s.value 的值更改为 0,但在此之前它被抢占并且其 PCB保存并启动新进程 P2 运行 它检查条件并将 s.value 更改为 0 及其临界区 starts.on 另一方面,如果 P2 进入等待状态 [= =19=] 所以两者都可能进入他们的关键 sections.So 如何保持互斥??
二进制信号量通过确保将信号量值更改为 0(以表明它在临界区中)的进程是唯一可以再次更改信号量值(为 1)的进程来提供互斥.所以在我的问题中,即使 P1 开始执行,它也不会被抢占。因此,如果他们使用共享资源,它确保 P1 将在启动 P2 之前完成。
只有计数信号量可以被抢占,它们不保证互斥。
我刚刚看到二进制信号量保证互斥并且信号量可以被抢占。
二进制信号量 wait/down 的代码(取自 https://www.javatpoint.com/os-binary-semaphore-or-mutex)
Down (semaphore S)
{
if (s.value == 1) // if a slot is available in the
//critical section then let the process enter in the queue.
{
S.value = 0; // initialize the value to 0 so that no other process can read it as 1.
}
else
{
put the process (PCB) in S.L; //if no slot is available
//then let the process wait in the blocked queue.
sleep();
}
}
那么如果进程 P1 是 运行 并且它检查 down 函数中的条件并准备将 s.value 的值更改为 0,但在此之前它被抢占并且其 PCB保存并启动新进程 P2 运行 它检查条件并将 s.value 更改为 0 及其临界区 starts.on 另一方面,如果 P2 进入等待状态 [= =19=] 所以两者都可能进入他们的关键 sections.So 如何保持互斥??
二进制信号量通过确保将信号量值更改为 0(以表明它在临界区中)的进程是唯一可以再次更改信号量值(为 1)的进程来提供互斥.所以在我的问题中,即使 P1 开始执行,它也不会被抢占。因此,如果他们使用共享资源,它确保 P1 将在启动 P2 之前完成。 只有计数信号量可以被抢占,它们不保证互斥。