现代操作系统读书笔记

一. 进程线程篇

(1) 概念

  1. 进程
    • 运行中程序的实例
  2. 线程
    • 线程是进程中的实体

(2) 区别

  1. 进程是资源分配的基本单位,线程是CPU调度的基本单位
  2. 进程拥有独立的地址空间,线程位于地址空间内,共享地址空间内的全局变量和静态变量.
  3. 线程比起进程的创建,撤销和上下文切换速度更快(10-100倍)

(3) 其他

写时复制 (现代操作系统P128, 深入理解Linux内核P388):

Fork出一个进程后, 子进程拥有自己的进程表项,  但是子进程的进程表项内部页表刚开始只是复制了父进程的, 它们指向相同的物理页框,  但页表中标记该页框为只读, 父子进程的任何一方试图写时引发写保护措施, 陷入内核(TRAP), 然后内核会把对应进程想要写的页面映射并复制到新的页框中, 此时可以放心地写.

进程表 (深入理解计算机系统中文第3版P578, 深入理解Linux内核中文第3版P86):

为一个双向链表, 维护系统所有进程的基本信息. 进程表项为一个名为task_struct的结构体, task_struct大概包含以下信息:

  1. 进程的基本信息(PID, Stack Pointer, Program Counter)
  2. 页表地址, 进程地址空间各段的起始地址(记录此信息, 方便检测程序操作的地址是否合法)
  3. 描述符表(每个进程都有一张, 此为私有), 存储用户打开的文件描述符. 描述符表每一个表项指向全部进程共享的文件表, 文件表记录文件位置, 引用计数等. (深入理解计算机系统中文第3版P634)
  4. 相关文章: 虚拟内存如何翻译出物理地址

二. 内存管理

(1) 现有架构

每个进程都有一套相同的进程地址空间结构, 叫做虚拟地址.

虚拟地址大概可以分割出两部分, 一部分用于作为页表的索引, 用于找到页框(对应物理内存地址分出的页), 另一部分用于在对应页框中找到偏移地址, 得到最终物理内存地址.

完成从虚拟地址到物理地址转换的硬件叫做内存管理单元(MMU).

(2) 为什么形成了现有架构, 为了解决什么, 有什么优点?

  1. 每个进程使用同一套进程地址空间, 而不用关心它们映射到了哪些不同的物理地址, 从而实现了进程隔离
  2. 因为每个进程都使用同一套进程地址空间, 由此简化了程序链接, 装载和内存分配的过程
  3. 虚拟内存可以控制程序对物理内存的访问权限, 提高安全性

(3) 其他

页面调度

由于进程众多, 虚拟内存加起来的实际空间可能大于实际物理内存, 有些进程可能出现访问的页面没有实际对应的物理页框的情况, 此时会触发缺页异常, 陷入内核, 这需要内核通过某种算法选择一个进程的页面, 将其置换到磁盘的交换分区, 然后该页面对应的页框便闲置出来, 再将其放到引发缺页异常的进程的页表映射关系中, 对应的缺页异常在内核交还控制权限给程序后便不会再发生, 对应程序也能够正常访问刚刚无法访问的页面.

三. 文件系统

(1)