为什么pause()"有效地使用CPU"?

Mel*_*own 2 c cpu operating-system cpu-architecture

参加操作系统课程,对于这个(和C)是新手,我真的不明白我的学习材料中陈述的事实.该程序假设暂停执行,直到发出kill-command(ctr + c或终端终止)从一开始该行是:

while (!done);
Run Code Online (Sandbox Code Playgroud)

但有人建议改变这个:

"使用while循环重复检查已完成的全局变量不是一种非常有效的CPU使用方法.更好的方法是将循环更改为:

while (pause()) {
  if (done) break;
};
Run Code Online (Sandbox Code Playgroud)

"

系统在暂停期间做了什么()?如果它必须检查一个全局变量每个循环它真的可以做一些有用的事情吗?我认为pause()可能允许CPU接收其他工作,但是不检查变量毁了吗?

完整的代码如果它有帮助:

#include <stdio.h>   // puts(), printf()
#include <signal.h>  // SIGFPE, SIGSEGV, SIGINT
#include <stdlib.h>  // exit(), EXIT_SUCCESS, EXIT_FAIURE
#include <unistd.h>  // getpid(), pause()
#include <stdbool.h> // true, false

sig_atomic_t volatile done = false;

int divide_by_zero() {
  int a = 1;
  int b = 0;
  return a / b;
}

void segfault() {
  int *ptr = NULL;
  *ptr = 42;
}

void signal_handler(int s) {
  switch(s) {
    case SIGFPE:
      fputs("Caught SIGFPE: arithmetic exception, such as division by zero.\n", stderr);
      exit(EXIT_FAILURE);
    case SIGSEGV:
      fputs("Caught SIGSEGV: segfault.\n", stderr);
      exit(EXIT_FAILURE);
      break;
    case SIGINT:
      done = true;
      fputs("Caught SIGINT: interactive attention signal, probably a ctrl+c.\n", stderr);
      break;
    case SIGUSR1:
      puts("Hello!");
      break;
  }
}

int main(void) {

  printf("My PID = %ld\n", (long) getpid());

  // Install signal handlers.
  signal(SIGSEGV, signal_handler);
  signal(SIGFPE,  signal_handler);
  signal(SIGINT, signal_handler);
  signal(SIGUSR1, signal_handler);

  //divide_by_zero();
  //segfault();

  // Wait until a signal is delivered.

  while(pause()) {
      if(done) break;
  };

  puts("I'm done!");

  exit(EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)

Ach*_*hal 7

为什么pause()有效率?因为在没有收到任何信号的情况下pause()阻止当前进程的执行,并且通过这样做,进程将转移到挂起状态并且当此进程处于挂起状态时,同时CPU可以执行其他一些进程并通过执行此CPU来执行有效率的.

来自Linux的手册页 pause(2)

pause()使调用进程(或线程)进入休眠状态,直到传递的信号终止进程或导致调用信号捕获函数.

POSIX pause(3p)手册页说的基本相同.