unix / linux套接字中的阻塞模式是如何工作的?

阻塞模式是否将该特定任务置于“进程等待”状态,因为我认为非阻塞套接字需要来自用户的“忙等待”或“自旋locking”实现。 或者阻塞模式套接字只是内核的繁忙等待的隐式实现。

在信号量/互斥/监视器之类的locking机制中,通常通过将任务推入阻塞状态来实现locking。 我认为,如果这样的事情是可能的locking,然后套接字locking也可能以同样的方式实现。

我不知道,我认为轮询不是一个有效的方法,尤其是内核,因为内核总是有他的双手充满了这么多的任务。

谢谢。

不,阻塞套接字在内核中实现。 该进程处于非执行状态,不消耗任何CPU时间。

内核可以自由运行其他任务,直到一些外部活动将导致它唤醒任务。 例如,网卡的硬件中断让它知道有数据要被读取。 内核读取并通过网络堆栈,最终唤醒应用程序来处理数据。

定时器将以相同的方式工作,但带有定时器中断。

内核实际上可能是硬件投票硬件,但它不一定是…这都是如何设计硬件的问题。

请看我对这个问题的回答: C ++ – Sleep()和cin是如何工作的?

根据我从网络/书/学到的东西,并提供答案。 我会努力做到这一点。

默认情况下,所有套接字都被阻塞。 这意味着,当我们发出一个无法立即完成的套接字调用时,我们的进程就进入休眠状态,等待条件成立。 unp – p435

睡眠是通过将进程置于等待/阻塞状态来实现的。 调度程序检查是否阻塞进程的条件,当被阻塞的进程转向时,即当调度程序给他CPU时。 在这种情况下的响应性取决于调度程序的时间分辨率。

所以,阻塞调用并不是隐式地从内核实现“忙等待”或“旋转锁定”。

对于大多数实现来说,锁定的基本机制是相同的。 把进程阻塞/等待状态。

当然,轮询效率不高,也就是说为什么不使用轮询来实现阻塞。