我(初学者)对阻塞和非阻塞io的理解是否正确?

时间:2013-07-22 20:22:31

标签: multithreading sockets operating-system blocking nonblocking

现在我做了很多关于并发性和并行性的研究。你能告诉我我是否理解正确(在操作级别上):

阻止io:

当我明确等待连接时(即在Ruby中):

conn = socket.accept

所以我的线程被阻塞,直到我得到套接字,对吧?

(我知道我在接受数据的某个循环中汇集了套接字,对吗?)

非阻止:

我有线程不时询问所有注册的fd(文件描述符),如果他们有我需要的东西。但也有'不要打电话给我们,我们会打电话给你'规则,但它是如何在ios级别上工作的(在像eventmachine这样的库或节点上它是通过回调(?)完成的)

PS。我欢迎阅读和演讲,如: http://www.paperplanes.de/2011/4/25/eventmachine-how-does-it-work.html http://www.kegel.com/c10k.html

1 个答案:

答案 0 :(得分:2)

  

阻止io:

     

当我明确等待连接时(即在Ruby中):

     

conn = socket.accept

     

所以我的线程被阻塞,直到我得到套接字,对吧?

右。

  

(我知道我在接受数据的某个循环中汇集了套接字,对吗?)

错误。你被封锁了。期。当发生相关事件时,操作系统会将您叫醒。

  

非阻止:

     

我有线程不时询问所有注册的fd(文件描述符),如果他们有我需要的东西。但也有'不要打电话给我们,我们会打电话给你'规则,但它是如何在ios级别上工作的(在像eventmachine这样的库或节点上它是通过回调(?)完成的)

您刚刚描述的回调是'异步'I / O.

非阻塞I / O只是意味着呼叫不会阻塞,因此例如如果你打电话给read()并且那里没有数据,则没有任何反应。何时调用呼叫取决于您,但它由select()/poll()/epoll()辅助,阻塞直到套接字上发生了各种事件。