前言
学习自用,文末的参考资料都是好文,这篇还得慢慢补充
正文
linux IO,首先应该看一下linux IO涉及到的层次图,
对于read系统调用在内核的处理,如上图所述(TODO),经过了VFS、具体文件系统,如ext2、页高速缓冲存层、通用块层、IO调度层、设备驱动层、和设备层
为了方便,我们暂时只讨论上面的三部分,应用层,内核的page cache,负责IO调度的block layer
加这些层是为了一个缓冲,用户空间的层是为了减少用户态写入读出跳转内核态太频繁,而内核的page cache也是因为缓冲磁盘寻道时间,而mmap+write就是直接把这个区域映射到用户空间从而可以直接写入
block layer则是负责整理IO请求,即我们操作系统里学到的IO调度算法,block layer可以看成是DMA和硬件组成;
然后讲下常用的API
最常见的read 和write,如果是默认打开文件open的方式,一次read/write都会用到全部缓存,如果是open的时候传入了其它flag就另当别论了
还可以采用mmap+write的方式,这样的话可以忽略应用层的buffer直接写进内存中(这个mmap的空间估计能和page cache合并),不过每次写入内存都会陷入内核态,如果是太频繁的读写也会导致内核切换的开销太大,这正是用用户层buffer的原因
还有个问题是mmap会有安全性的问题,其他进程可能会写到这个位置而引起SIGBUS(这个不是隔离的吗,mmap