项目介绍一下从产生IO数据到程序员手中的复制过程
前景声明:
-
因为硬盘读写是物理机械动作(寻找扇区,磁盘转圈),不像cpu是电子动作,所以要围绕减少物理动作去优化io。
-
刷盘: 就是主动将pageCache中的数据写到硬件控制器中。
非异步IO. 即阻塞io或sendfile零拷贝都属于非异步IO
数据传递过程如下:
-
硬件控制器(是硬件芯片上的程序). 产生数据(比如网卡,磁盘)
-
pageCache,它是内核空间的内存段(承上启下硬件数据与用户空间数据). (内核内存指 地址小于n的内存)
-
用户空间. 程序员们写的业务代码用的内存段 (内存地址大于n的内存)
-
读会调用硬件控制器的api,把数据读到pageCache中,内核把pageCache中读到用户空间供开发者使用
-
写会把数据拷贝到pageCache中,直接返回,然后内核异步其将pageCache中的内存调用硬件控制器的api。
-
硬件控制器内部有时钟,独立的计算单元。专用于数据复制,可以与cpu并行。
-
pageCache本质是lru队列,
-
非异步io的缺点
处理大文件会把pageCache瞬间打满,导致其他程序用不上这块缓存。
而且非异步io的零拷贝不能对数据加工处理,只能发送文件。
异步IO. mysql等数据库系统用的就是异步io加b+树
数据传递过程如下:
1.硬件控制器(是硬件芯片上的程序)
2.直接内存(绕过了pageCache,不会复制到pageCache里)
3.用户空间(回调方法句柄,程序员们写的接受IO数据的回调方法)
异步io不用pagecache,它只能用直接内存(内核内存),而且硬件控制器复制完了后会主动告诉你。
硬件控制器会往传参进来的直接内存里读写数据,读或写完数据后产生中断事件,回调内核的方法句柄,然后内核方法通知用户态的方法句柄。