免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 15035 | 回复: 37
打印 上一主题 下一主题

关于linux下的异步io,有几个疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-25 14:58 |只看该作者 |倒序浏览
n年前还是windows程序员的时候,觉得那本《windows核心编程》是神书,看了一遍一遍的。
特别是后面的多线程部分,异步io,完成端口,觉得很强大。
后来转linux了,也习惯了linux的异步模式。但是心里总是有个疙瘩,那就是没有 完成端口 这样好用的异步调用。
由于两个系统的架构问题,这个确实是linux的一个软肋。
知道 aio 这东西,这里有很不错的文章
http://www.ibm.com/developerworks/cn/linux/l-async/
心想总算linux有补上这个缺憾了。
查了查网上的资料(实在是少)
有几个疑问:

1:aio 对 socket 的支持是不是不完善,或者说有bug?
网上有这样的问题: http://goo.gl/AeZTc

2. 异步线程是内核线程吗?内核自己维护一个线程池?

有没有哪位兄台,有这方面的经验?

论坛徽章:
0
2 [报告]
发表于 2011-01-25 15:21 |只看该作者
晕,论坛里的aio问题还那么多,google上都没有这里多

第二个问题,这里有答案 :http://bbs.chinaunix.net/thread-1705934-1-1.html

是普通的pthread_create线程。

问题真是多啊aio,还是不用了

论坛徽章:
0
3 [报告]
发表于 2011-01-25 15:27 |只看该作者
对于linux来说,一切皆为进程
linux下的socket IO复用可以说比windows强多了
{:3_185:}

论坛徽章:
0
4 [报告]
发表于 2011-01-25 16:29 |只看该作者
第一个问题:这里有精彩的回答
现在的 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 慢了半拍,故有此一叹。

论坛徽章:
0
5 [报告]
发表于 2011-01-25 16:57 |只看该作者
有点失望,这里有个网页:
http://davmac.org/davpage/linux/async-io.html
标题是:
Asynchronous I/O on linux
or: Welcome to hell.

相当醒目。
同时看到stackoverflow 对 aio的抱怨也不是一点半点

论坛徽章:
0
6 [报告]
发表于 2011-01-25 20:56 |只看该作者
epoll

论坛徽章:
0
7 [报告]
发表于 2011-08-05 14:17 |只看该作者
今天查异步io的资料想不到又找到自己以前发的帖子了,看来我没什么进步啊

论坛徽章:
0
8 [报告]
发表于 2011-08-05 14:56 |只看该作者
我用过用syscall导出的那几个接口,  用起来也很不爽
1. "好像"只支持特定的文件系统
2. 内存什么的还得对齐
3. 和epoll配合使用还要用个eventfd做桥梁, 不(过也好, 方便统一处理了)
4. 即便对于文件系统,有的时候也不是真正异步的,阻塞在io_submit()而不是io_getevents()

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
9 [报告]
发表于 2011-08-05 15:14 |只看该作者
I/O模型那么多呢,干嘛在一棵树上吊死,想不通

论坛徽章:
0
10 [报告]
发表于 2011-08-05 15:50 |只看该作者
回复 9# cjaizss


    还不是为了追求那么点效率,现在系统想用直接io代替buffer io,但是直接io又是阻塞的要等磁盘写完才返回,不能有效的减少用户的时间。所以想到了aio + 直接io。
但是libc的aio又是那么的蛋疼,查了下,有个libaio库不错,看看怎么去用
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP