阻塞、挂起和睡眠有什么区别

Yve*_*ves 2 multithreading sleep process suspend blocking

例如,一个进程正在以阻塞模式侦听某个端口,因此如果 I/O 未准备好,该进程将被阻塞。

while (true)
{
    msg = recv(port, BLOCKING_FLAG); // blocks here
    cout<<msg<<endl;
}
Run Code Online (Sandbox Code Playgroud)

我们也知道我们可以让一个进程休眠: sleep(1000)

我的问题是:如果这样的进程是阻塞的,我可以说该进程被挂起吗?该进程是否会从 CPU 中换出?相同的问题sleep

Sol*_*low 5

“休眠”——通常意味着线程处于显式sleep(...)调用中。

“暂停”——有时以通用方式使用,意味着线程正在等待......某事。其他时候,“挂起”意味着某个其他线程或进程显式挂起它(例如,出于调试目的),并且该进程/线程在显式恢复之前将无法再次运行。

“阻止”——是三者中最通用的。通常它仅仅意味着进程/线程正在等待某些东西。有时这意味着线程/进程正在等待的是 I/O 操作。

  • @Yves,如果我们谈论的是多任务操作系统中的用户模式线程,那么在大多数情况下,答案是“是的,阻塞/休眠/挂起的线程不使用 CPU”。一个可能的例外:高性能互斥体实现可能会检测到它正在多 CPU 平台上运行,如果是这样,它可能会在放弃 CPU 之前忙等待一些周期。 (2认同)