我读到互斥锁和信号量维护一个等待进程列表,并在当前线程完成关键部分时将其唤醒。互斥体和信号量如何做到这一点?它们不会干扰流程调度程序决策吗?
答案 0 :(得分:6)
等待和唤醒通常与调度程序合作完成。强制执行特定的一个等待线程的互斥实现通常被认为是一个糟糕的实现。
相反,互斥锁或信号量将通知调度程序线程正在等待,从而将其从“准备运行”列表中取出。然后,当互斥锁解锁或信号量发出信号时,实现将
要求调度程序根据调度程序自行决定唤醒其中一个等待线程,或者
通知调度程序所有等待的线程都准备好运行,然后在等待的线程上有逻辑,这样除了第一个被调度程序唤醒的线程再次进入休眠状态。
前者是首选的实施选择,但并不总是可用。第二种方法通常被称为“雷鸣般的群体”方法:如果有1000个线程在等待,那么所有1000个线程都被唤醒(一个大的雷鸣般的线程群),只有999才能重新入睡。这浪费了CPU资源,实现将尽可能避免使用它。
答案 1 :(得分:0)
这在很大程度上取决于实施。在谈到这些事情时,我们通常会引用可能具有操作系统支持的线程,或者可能完全使用该语言实现,因此甚至不与O / S交互以获得线程支持。
但是,它们也可以引用进程,但这些实现通常需要复杂的消息传递模式,此外还有一些O / S支持进程管理。
答案 2 :(得分:0)
是的,简单的解释是,任何等待进程(无论是信号量还是I / O)都会从调度程序的运行队列中取出,直到满足等待条件为止。