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

时间:2009-07-10 02:23:09

标签: c linux networking sockets kernel

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

在信号量/互斥锁/监视器等锁定机制中,通常通过在阻塞状态下推送任务来实现锁定。我认为如果锁定可以做到这一点,那么套接字锁定也可能以同样的方式实现。

我不确定,我认为轮询不是一种有效的方式,特别是对于内核而言,因为内核总是掌握着很多任务。

THX。

3 个答案:

答案 0 :(得分:9)

不,内核中实现了阻塞套接字。进程处于非执行状态,不占用任何CPU时间。

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

定时器的工作方式相同,但定时器中断。

内核可能实际上是在硬件下轮询硬件,但它不一定是......这完全取决于硬件的设计方式。

答案 1 :(得分:1)

请参阅我的answer此问题:C++ - how does Sleep() and cin work?

答案 2 :(得分:0)

基于我从net / book /中获得的答案。我会努力做到这一点。

  

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

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

因此,阻塞调用不是来自内核的“忙等待”或“自旋锁”的隐式实现。

是的,大多数实现的基本锁定机制都是一样的。将进程置于阻塞/等待状态。

当然轮询效率不高,即为什么使用轮询不会实现阻止。