2011-11-14 378 views
3

在Linux编程接口书,(p.1367)文件描述符饥饿和阻断文件描述符

饥饿的考虑也可使用信号驱动的I/O时适用, 因为它也提出了一个边沿触发通知机制。相比之下,饥饿考虑不一定适用于采用级别触发通知机制的应用程序 。这 是因为我们可以利用阻止文件描述符与 电平触发的通知,并使用一个循环,不断地检查 描述符的准备,然后准备文件描述符一次检查之前的准备 描述执行一些I/O 。

我不明白这个'阻塞'部分是什么意思。我认为这与我们使用阻塞I/O还是非阻塞I/O无关。 (作者在本章的早期还说,通常使用无阻塞I/O而不管电平触发或边沿触发通知)

+0

我认为这意味着“可以使用带有级别触发通知的阻塞文件描述符”vs“不能可靠地使用具有边缘触发通知的阻塞文件描述符”。无论如何,我不认为阻塞文件描述符总是保证不会阻塞级别触发的通知。所以如果你不想阻止永久性的话,请使用非阻塞套接字。 – ninjalj

回答

1

SO,IO eh?那么,IO就是“处理事物”,所以我们可以用人类的隐喻去做。想象一下,你是一个系统为你的老板完成任务的过程。

然后阻止IO就像去看牙医或面对面与客户见面。在这两种情况下,当你去参加这个活动的时候,你会离开你的办公桌,所以完全无法做任何事情,直到你回到办公桌前。有机会,你会在等候室浪费一些时间,或者在会议中闲聊,等待人们出现。

阻塞IO就像这样 - 阻塞IO“牺牲”(我这样说是因为你失去了线程,有效地)线程到有问题的任务。当它被阻塞时,您不能将其用于任何其他目的 - 它正在等待该IO发生。

相反,非阻塞IO就像在电话上一样。当你在电话中时,你可以在Stack Overflow上写一个答案的同时参与IO。这样的IO被认为是异步的 - 因为您接受IO请求并开始处理它,但可以在完成时处理其他请求。

现在,我最喜欢这种东西的资源是这里的c10k problem页面。我会说你是对的 - 99%的时间你会使用非阻塞IO(实际上,你的操作系统一直在为你进行非阻塞IO),主要是因为每个线程都使用一个完整的线程即使在线程和进程是相同的东西(任务)并且相当轻量级的Linux中,传入的IO任务的效率也非常低。

边缘触发和电平触发的通知类型之间的区别可能更多地适用于非阻塞连接,因为无论如何,它对于阻塞情况都是无关紧要的。据我所知,边缘触发的通知只会在上次询问状态更新时出现新数据时将标记描述符标记为准备好,而级别触发则标记描述符,只要有可用数据就可以处理该描述符。这意味着边缘触发接口是considered a bit more tricky,因为您必须handle the incoming data when you see it,因为您不会再通知。理论上,这应该更有效率(更少的通知)。

因此,tl; dr - 边缘VS级别准备就阻塞vs非阻塞设计而言略有不同的考虑因素,也就是说,有几种方法可以执行非阻塞IO并且只有一种方法可以阻塞IO。