异步IO实现和应用场景

本文探讨了异步IO与同步IO的优缺点,重点介绍了Linux的AIO实现,包括POSIX AIO、kernel native AIO和libeio。文章指出,异步IO在多核和大量数据处理中可能具有更高的QPS,但同步IO在单核场景下更高效。同时,文章提出了对异步IO应用的猜想,并列举了其潜在的挑战和适用场景。
摘要由CSDN通过智能技术生成

前言

学习自用,还有很多不足的地方

异步IO和同步IO

当网卡有了数据,DMA会把数据拷贝到内核缓冲区(内核缓冲区的哪里呢);而从内核缓冲区拷贝到用户态需要用户调用read,同步地进行

异步则是注册个读完成事件,等其他用户态线程/内核进程拷贝到用户态后再提醒

aio最核心的需求就是解偶submit和wait for completion, 简单地说就是在submit的时候不要阻塞, 这样用户在submit之后可以做其它事情或者继续submit新的io, 从而获得更高的cpu利用率和磁盘带宽.

异步IO的好处

  1. 同步read从内核区拷贝到用户态需要等待短暂的时间,全异步的aio_read不存在这个短暂时间(同步read的系统调用和从内核拷贝到用户的时间),效率更高;异步IO一个例子就是nginx的读文件的操作(?)
  2. 那在内核上处理的真正异步io的优势在于:和同步非阻塞io相比,优势主要在于不用维护数据读不齐时的逻辑处理(可能是等到读齐了再通知吧)

异步IO的坏处

  1. 要提前规定好缓冲区大小以在数据到来时自动拷贝,如果设置太大会浪费,太小又有问题,而同步IO可以在读取时适时增加和释放空间,比如muduo就在read的同时用writev增加栈上buffer大小
  2. 另外异步IO的编程会麻烦一点,调用aio_read后还要有等待完成读取的逻辑,看看nginx里面文件操作就知道用起来多痛苦了(不过应该可以优化,用promise/future或await来优化?..那实现得更麻烦了)

Linux的AIO

  1. POSIX的AIO(应该就是glic的aio),是用pthread实现的用回调或signal通知的,没有connect,accept等网络IO的API
  2.  kernel 的 aio,即kernel native AIO,被用在了nginx上,有一个封
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值