Linux知识读书笔记

Linux IO 子系统 【Linux知识读书笔记】传统IO(读/写)

  1. CPU copy:用户buffer => 内核buffer ----------------------------------------> 拷贝* 1
  2. DMA copy:内核buffer => 硬件 ------------------------------------------------>拷贝 * 1
  3. 上下文切换:用户态 => 内核态 => 用户态 ------------------------------------->上下文切换 * 2
PageCache技术
Linux IO 栈
  1. 文件系统层:管理pagecache
  2. 块层:管理块设备的IO队列,对IO请求进行合并、排序
  3. 设备层:通过DMA和内存进行交互,负责数据传输
IO方式:
  1. 传统 Buffer IO:磁盘 => pagecache => 用户空间 -------------------------------------------------------------------------> 拷贝 * 2
  2. mmaped- IO:磁盘 => pagecache =>映射到用户空间,把pagecache映射到用户的地址空间里面 -----------> 拷贝 * 1
  3. Direct IO:用户态和块IO层做对接,放弃了pagecache,从磁盘直接向用户态拷贝数据;好处:快,DMA拷贝,自己负责cache ----> 拷贝 * 1
  1. Buffer IO:偏移 + 长度
  2. mmaped IO:数据按页对齐
  3. Direct IO:读写是底层存储块设备大小的整数倍
Linux内存
  1. 地址空间
    1. 分段机制:逻辑地址 => 线性地址 GDT(段描述符)
    2. 分页机制:线性地址 => 物理地址
  2. 碎片
    1. 伙伴系统:将空闲页分为11个链表,每个链表中页块中连续页的大小分别是1、2、4 .. 1024
      1. 申请:申请 4 ,看4
        1. 有:分配
        2. 没有:看8,分成两个4,将另一半挂到块大小为4的链表下
      2. 释放:看伙伴是否空闲,是则合并
      3. 优势:合并时地址只有一位不同,非常快速定位
    2. slab系统:
      1. slab 层有三个slab链表,slab-full、slab-partial、slab-empty
      2. 每个链表有多个page,每个page都分为若干个object
      3. 优势:
        1. 将频繁使用的对象缓存起来,减少分配、初始化和释放对象的时间开销,如PCB、inode、lock
        2. 减少伙伴系统分配小块内存造成的内部碎片
Linux 进程与线程
  1. fork() + exec() = spawn()
  2. COW => 创建开销只有复制页表和PCB块
  3. fork() => clone(系统调用) => do_fork()
  4. do_fork() => copy_process()
    1. 拷贝 task_struct、内核栈
    2. 清零
    3. 共享打开的文件描述符、信号处理函数
  5. 线程创建指定额外参数:CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND

    推荐阅读