Operating system 为什么忙等待从应用程序的入口部分转移到关键部分?

Operating system 为什么忙等待从应用程序的入口部分转移到关键部分?,operating-system,semaphore,critical-section,Operating System,Semaphore,Critical Section,我正在读“操作系统概念” 它给出了信号量的非忙等待定义: typedef struct { int value; struct process *list; } semaphore; wait(semaphore *S) { S->value--; if (S->value < 0) { add this process to S->list; sleep(); } } signal(semaphore *S) { S-&g

我正在读“操作系统概念”

它给出了信号量的非忙等待定义:

typedef struct {
  int value;
  struct process *list;
} semaphore;



wait(semaphore *S) {
  S->value--;
  if (S->value < 0) {
    add this process to S->list;
    sleep();
  }
}

signal(semaphore *S) {
  S->value++;
  if (S->value <= 0) {
    remove a process P from S->list;
    wakeup(P);
  }
}
typedef结构{
int值;
结构进程*列表;
}信号量;
等待(信号量*S){
S->值--;
如果(S->值<0){
将此流程添加到S->list中;
睡眠();
}
}
信号(信号量*S){
S->value++;
如果->值列表;
唤醒(P);
}
}
它说:

重要的是要承认,我们还没有完全消除忙碌 使用wait()和signal()操作的定义进行等待。相反,我们已经将忙碌的等待从入口部分转移到了关键部分 应用程序部分。此外,我们的繁忙时间有限 等待wait()和signal()操作的关键部分

我可以理解在这个定义中,我们还需要一些机制来保护wait()和signal()代码的关键部分

但“我们已经将繁忙的等待从应用程序的入门部分转移到关键部分”是什么意思呢


程序员为什么使用这个定义下的信号量?需要在其代码的关键部分中使用忙等待吗?

假设有10台打印机,并且这些打印机是使用信号量访问的。根据wait()和signal()的给定定义信号量只知道空闲打印机的数量,而不知道打印机忙的确切信息。因此,当进程获取信号量时,它还必须获取它所需的特定打印机。此获取发生在应用程序代码中(在wait()函数后出现)使用互斥锁或其他一些同步原语。这会导致应用程序代码中的忙等待