0

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

阻塞 io:

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

conn = socket.accept

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

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

非阻塞:

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

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

4

1 回答 1

2

阻塞 io:

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

conn = socket.accept

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

正确的。

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

错误的。你被封锁了。时期。当相关的事情发生时,操作系统会唤醒你。

非阻塞:

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

您刚刚描述的包括回调在内的是“异步”I/O。

非阻塞 I/O 只是意味着调用不会阻塞,因此,例如,如果您调用read()并且那里没有数据,则不会发生任何事情。何时调用呼叫由您决定,但由 协助select()/poll()/epoll(),直到套接字上发生各种事件。

于 2013-07-23T00:50:44.343 回答