现在的 2.6 kernel 只支持文件系统 aio,socket 的 aio 操作都是 libc 用额外的用户线程模拟的。问题是它模拟的也太次了,不说效率怎样,连行为都没模拟正确。
例如:在对一个 socket aio_read 以后进行 aio_write,除非 aio_read 成功,否则后续的 aio_write 都将被阻塞。真正由内核实现的 socket aio 机制(如 freebsd 或 windows)都没有这个问题。
aio 还带阻塞的,这实在太新鲜了,俺实在无语,过来发发牢骚~~
1. aio api 是 posix 标准,我至今在 posix 标准里还没发现没用的东西,相反 posix 里缺的东西倒是不少。posix 之于操作系统就像 libc 之于 C 程序设计语言一样,都是一个最小最起码的功能集合,好像只有嫌它不够的,没见过嫌太多的。
2. AIO 配合每活动连接一线程的模型是目前已知最高效的 IO 模型了。很多 server 都是使用这种模型完成高并发伺服的。Windows、freebsd、solaris、hp-ux 和 IBM AIX 等操作系统都能很好的支持 AIO,它有没有用应该很明显了吧?
3. 有需求才有产品这个概念当然是对的,但是一来基于前两条应该可以证明 AIO 机制有足够的需求,二来操作系统不同于普通的,面向应用的产品。它是人机交互的界面和所有其他产品的基础支撑平台。作为工作的基础,人们对一个现代通用操作系统最少应当提供哪些服务都是有明确标准的。
如果这样还没说清楚。可以回顾一下几年前的线程支持。在 linux 2.2 的年代,也有很多人说线程是没用的东西,需要的话多 fork 几个进程不就完了。但是今天绝大部分职业程序员都会使用线程了,linux 2.6 经过了从 kernel 2.4 的艰难过度(2.4 只支持轻量级进程的概念,而且不支持命名互斥量等同步机制),也终于比较好的支持了线程。
但是在 2.4 的年代,Windows、FreeBSD 等等各家操作系统也都先一步完成的对线程的良好支持。我感觉现在 AIO 就是当年线程的一个相似轮回。当年 linux 从 2.2 的不支持线程到 2.4 的支持轻量级进程还是因为 IBM 支援了大量商业 unix 代码给了 linux 做参考设计才完成的,为此 IBM 被 SCO 起诉,好像还赔了一大笔钱才了事。
今天随着 Solaris、FreeBSD 等越来越多开源 OS 的出现,以及 Linux 开发社区本身的实力增长,这个过度应该比当初要容易多了,没想到 linux 还是比其他 OS 慢了半拍,故有此一叹。
不错 epoll仅仅是通知机制, 异步机制是, 发起一个读或者写, 然后系统通知你读写的结果,读写了多少, ...
[url]
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |