现在我做了很多关于并发性和并行性的研究。你能告诉我我是否理解正确(在操作级别上):
阻止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
答案 0 :(得分:2)
阻止io:
当我明确等待连接时(即在Ruby中):
conn = socket.accept
所以我的线程被阻塞,直到我得到套接字,对吧?
右。
(我知道我在接受数据的某个循环中汇集了套接字,对吗?)
错误。你被封锁了。期。当发生相关事件时,操作系统会将您叫醒。
非阻止:
我有线程不时询问所有注册的fd(文件描述符),如果他们有我需要的东西。但也有'不要打电话给我们,我们会打电话给你'规则,但它是如何在ios级别上工作的(在像eventmachine这样的库或节点上它是通过回调(?)完成的)
您刚刚描述的回调是'异步'I / O.
非阻塞I / O只是意味着呼叫不会阻塞,因此例如如果你打电话给read()
并且那里没有数据,则没有任何反应。何时调用呼叫取决于您,但它由select()/poll()/epoll()
辅助,阻塞直到套接字上发生了各种事件。