非阻塞(事件驱动的I / O)与阻塞I / O.

时间:2010-09-24 23:46:05

标签: events node.js io blocking nonblocking

最近我偶然发现了这个名为nodeJS的漂亮JS库,它就像服务器端JS一样。

该语言的主要特性是Evented I / O,它使I / O的固有容量完全无阻塞,使用回调!

我的问题是,如果过去存在这种完全无阻塞的I / O机制(给定事件驱动的I / O已经存在了很长时间),为什么它们在高级语言中不再流行像C#和Java(虽然Java有NIO实现支持非阻塞I / O)?

目前,简单的文件读/写操作会导致完整的I / O阻塞,而事件驱动的I / O则不然。

我希望更好地了解事件驱动的I / O以及它与Java中的不同。

4 个答案:

答案 0 :(得分:5)

Java:http://en.wikipedia.org/wiki/New_I/O

  

用于编写可伸缩服务器的多路复用,非阻塞I / O工具

.NET:http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx

public IAsyncResult BeginReceive(
    byte[] buffer,
    int offset,
    int size,
    SocketFlags socketFlags,
    AsyncCallback callback,
    Object state
)

答案 1 :(得分:3)

Tcl从1990年开始就有事件驱动的I / O(如果我没弄错的话)。当然在2000年之前,因为当tclhttpd在2000年某个时候在基准测试中击败Apache时,人们真的开始关注非阻塞I / O.当人们看到这一点时,他们开始重新编写Web服务器。其中一个早期结果是Lighttpd:用C语言编写的第一个非阻塞Web服务器之一。当时,通过fileevent命令在tcl中使用事件驱动的I / O已经被认为是标准做法tcl世界。

AOLserver已经(现在仍然)有一个tcl核心,它正在托管网络上最繁忙的网站之一(至少在早期):http://www.aol.com/。虽然服务器本身是用C语言编写的,但它使用tcl的C API来实现事件处理和I / O. AOLserver使用tcl的I / O子系统的原因是因为它使用tcl作为脚本语言而且开发人员认为,既然其他人已经编写了它,那么也可以使用它。

我相信AOLserver最初于1995年发布。这应该证实,事件驱动的I / O早在20世纪90年代中期就已经在tcl中出现了。

Tcl是最早的一种,如果不是 最早的语言,它有一个事件驱动引擎。事件子系统最初是为Tk库实现的,后来又合并到了tcl中。

答案 2 :(得分:1)

据我了解,有一种广泛的感知多线程比事件驱动更容易,因为在多线程编程中,每个线程都有一个简单的顺序执行流程,而事件驱动包含大量的代码的小片段。

当然,这在其他地方有更好的说明,例如参见state-threads FAQ的Q.2。

答案 3 :(得分:-4)

即使对于基本文件I / O,Java也支持不良。这些语言是为快速创建可移植GUI应用程序而创建的,而不是针对优化和操作系统相关的低级I / O操作而创建的。