前言
学习自用,还有很多不足的地方
异步IO和同步IO
当网卡有了数据,DMA会把数据拷贝到内核缓冲区(内核缓冲区的哪里呢);而从内核缓冲区拷贝到用户态需要用户调用read,同步地进行
异步则是注册个读完成事件,等其他用户态线程/内核进程拷贝到用户态后再提醒
aio最核心的需求就是解偶submit和wait for completion, 简单地说就是在submit的时候不要阻塞, 这样用户在submit之后可以做其它事情或者继续submit新的io, 从而获得更高的cpu利用率和磁盘带宽.
异步IO的好处
- 同步read从内核区拷贝到用户态需要等待短暂的时间,全异步的aio_read不存在这个短暂时间(同步read的系统调用和从内核拷贝到用户的时间),效率更高;异步IO一个例子就是nginx的读文件的操作(?)
- 那在内核上处理的真正异步io的优势在于:和同步非阻塞io相比,优势主要在于不用维护数据读不齐时的逻辑处理(可能是等到读齐了再通知吧)
异步IO的坏处
- 要提前规定好缓冲区大小以在数据到来时自动拷贝,如果设置太大会浪费,太小又有问题,而同步IO可以在读取时适时增加和释放空间,比如muduo就在read的同时用writev增加栈上buffer大小
- 另外异步IO的编程会麻烦一点,调用aio_read后还要有等待完成读取的逻辑,看看nginx里面文件操作就知道用起来多痛苦了(不过应该可以优化,用promise/future或await来优化?..那实现得更麻烦了)
Linux的AIO
- POSIX的AIO(应该就是glic的aio),是用pthread实现的用回调或signal通知的,没有connect,accept等网络IO的API
- kernel 的 aio,即kernel native AIO,被用在了nginx上,有一个封