我试图了解下面的代码是如何工作的。这直接来自我的教授讲座幻灯片。这个 P() 和 V() 函数是我们在类 (OS161) 中使用的操作系统中信号量实现的一部分。我认为您可能需要了解 OS161 才能回答我的问题,因为它被广泛使用,希望有人可以回答这个问题。
我通过讲义对这段代码的理解:
X:P() 函数的流程
1. 当线程调用 P() 时,我们禁用中断
2. 检查 sem->count 上是否有可用资源
3.a) 如果count 为 0 然后我们进入睡眠
3.b) 如果 count != 0 然后我们递减 count 并允许调用线程继续到临界区
4. 启用 V() 函数的中断
Y:Flow
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;
}
谢谢你。