Linux IO 子系统
【Linux知识读书笔记】传统IO(读/写)
- CPU copy:用户buffer => 内核buffer ----------------------------------------> 拷贝* 1
- DMA copy:内核buffer => 硬件 ------------------------------------------------>拷贝 * 1
- 上下文切换:用户态 => 内核态 => 用户态 ------------------------------------->上下文切换 * 2
Linux IO 栈
- 文件系统层:管理pagecache
- 块层:管理块设备的IO队列,对IO请求进行合并、排序
- 设备层:通过DMA和内存进行交互,负责数据传输
- 传统 Buffer IO:磁盘 => pagecache => 用户空间 -------------------------------------------------------------------------> 拷贝 * 2
- mmaped- IO:磁盘 => pagecache =>映射到用户空间,把pagecache映射到用户的地址空间里面 -----------> 拷贝 * 1
- Direct IO:用户态和块IO层做对接,放弃了pagecache,从磁盘直接向用户态拷贝数据;好处:快,DMA拷贝,自己负责cache ----> 拷贝 * 1
- Buffer IO:偏移 + 长度
- mmaped IO:数据按页对齐
- Direct IO:读写是底层存储块设备大小的整数倍
- 地址空间
- 分段机制:逻辑地址 => 线性地址 GDT(段描述符)
- 分页机制:线性地址 => 物理地址
- 碎片
- 伙伴系统:将空闲页分为11个链表,每个链表中页块中连续页的大小分别是1、2、4 .. 1024
- 申请:申请 4 ,看4
- 有:分配
- 没有:看8,分成两个4,将另一半挂到块大小为4的链表下
- 释放:看伙伴是否空闲,是则合并
- 优势:合并时地址只有一位不同,非常快速定位
- 申请:申请 4 ,看4
- slab系统:
- slab 层有三个slab链表,slab-full、slab-partial、slab-empty
- 每个链表有多个page,每个page都分为若干个object
- 优势:
- 将频繁使用的对象缓存起来,减少分配、初始化和释放对象的时间开销,如PCB、inode、lock
- 减少伙伴系统分配小块内存造成的内部碎片
- 伙伴系统:将空闲页分为11个链表,每个链表中页块中连续页的大小分别是1、2、4 .. 1024
- fork() + exec() = spawn()
- COW => 创建开销只有复制页表和PCB块
- fork() => clone(系统调用) => do_fork()
- do_fork() => copy_process()
- 拷贝 task_struct、内核栈
- 清零
- 共享打开的文件描述符、信号处理函数
- 线程创建指定额外参数:
CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND
推荐阅读
- CMPUTC语言设计
- 蓝桥杯|[蓝桥杯]刷题日记——冲刺进国赛
- CCF-CSP|CCF-CSP认证201312-1(出现次数最多的数)
- c++|有未经处理的异常: Microsoft C++ 异常: cv::Exception
- c语言|十进制转换为二进制,二进制中1的个数
- C++|【C++】模板初阶
- C++|【C++】类和对象(上篇)
- C++|【C++】内存管理
- 引力计划|C++-万能引用模板与完美转发测试