我想了解下面的代码是如何工作的。这是我的讲座幻灯片中的直接内容。这个P()和V()函数是我们在类(OS161)中使用的操作系统中信号量实现的一部分。我想你可能需要了解OS161来回答我的问题,因为它被广泛使用,希望有人能回答这个问题。
我这个代码与讲义的理解:
X:在P()函数
1.当一个线程调用P(),我们禁止中断
2.检查,如果我们有流程如果count为0,那么我们去睡
3.b)如果count!= 0,那么我们递减计数并允许调用线程继续到临界区
4.启用中断
Y:在V()函数
1.当一个线程调用V(),我们禁止中断
2.增加计数器,这意味着现在有1个更多的可用资源,抢
3.现在的流量我们继续前进,唤醒所有我们发送的P()睡觉,因为没有足够的可用资源的时候线程试图抓住一个锁到了关键部分的螺纹
4.启用中断
线程如何在禁用中断的情况下进入睡眠状态?
我的问题:
1.是否“禁用中断”部分禁用特定的中断广告还是禁用所有的中断?
2.在V()函数唤醒所有线程时,线程睡在P()函数的while循环内,开始执行while循环。在讲座中说,一条线抓住锁,休息回去睡觉。我的问题是为什么“sem-> count == 0”条件不计算为其他线程,而只有一个。
我真的很想知道中断禁用部分是如何工作的。这是我的第一个问题。它会停止线程调度吗?它会停止系统中的上下文切换吗?
为什么线程在中断禁用状态下进入睡眠状态?是不是很危险,因为它可能会错过I/O完成的信号和其他东西?
P(sem) {
Disable interrupts;
while (sem->count == 0) {
thread_sleep(sem); /* current thread
will sleep on this sem */
}
sem->count--;
Enable interrupts;
}
V(sem) {
Disable interrupts;
sem->count++;
thread_wakeup (sem); /* this will wake
up all the threads waiting on this
sem. Why wake up all threads? */
Enable interrupts;
}
谢谢。