乐趣区

关于c++:Linux知识读书笔记

Linux IO 子系统

传统 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
退出移动版