一. 进程线程篇
(1) 概念
- 进程
- 运行中程序的实例
- 线程
- 线程是进程中的实体
(2) 区别
- 进程是资源分配的基本单位,线程是CPU调度的基本单位
- 进程拥有独立的地址空间,线程位于地址空间内,共享地址空间内的全局变量和静态变量.
- 线程比起进程的创建,撤销和上下文切换速度更快(10-100倍)
(3) 其他
写时复制 (现代操作系统P128, 深入理解Linux内核P388):
Fork出一个进程后, 子进程拥有自己的进程表项, 但是子进程的进程表项内部页表刚开始只是复制了父进程的, 它们指向相同的物理页框, 但页表中标记该页框为只读, 父子进程的任何一方试图写时引发写保护措施, 陷入内核(TRAP), 然后内核会把对应进程想要写的页面映射并复制到新的页框中, 此时可以放心地写.
进程表 (深入理解计算机系统中文第3版P578, 深入理解Linux内核中文第3版P86):
为一个双向链表, 维护系统所有进程的基本信息. 进程表项为一个名为task_struct的结构体, task_struct大概包含以下信息:
- 进程的基本信息(PID, Stack Pointer, Program Counter)
- 页表地址, 进程地址空间各段的起始地址(记录此信息, 方便检测程序操作的地址是否合法)
- 描述符表(每个进程都有一张, 此为私有), 存储用户打开的文件描述符. 描述符表每一个表项指向全部进程共享的文件表, 文件表记录文件位置, 引用计数等. (深入理解计算机系统中文第3版P634)
- 相关文章: 虚拟内存如何翻译出物理地址
二. 内存管理
(1) 现有架构
每个进程都有一套相同的进程地址空间结构, 叫做虚拟地址.
虚拟地址大概可以分割出两部分, 一部分用于作为页表的索引, 用于找到页框(对应物理内存地址分出的页), 另一部分用于在对应页框中找到偏移地址, 得到最终物理内存地址.
完成从虚拟地址到物理地址转换的硬件叫做内存管理单元(MMU).
(2) 为什么形成了现有架构, 为了解决什么, 有什么优点?
- 每个进程使用同一套进程地址空间, 而不用关心它们映射到了哪些不同的物理地址, 从而实现了进程隔离
- 因为每个进程都使用同一套进程地址空间, 由此简化了程序链接, 装载和内存分配的过程
- 虚拟内存可以控制程序对物理内存的访问权限, 提高安全性
(3) 其他
页面调度
由于进程众多, 虚拟内存加起来的实际空间可能大于实际物理内存, 有些进程可能出现访问的页面没有实际对应的物理页框的情况, 此时会触发缺页异常, 陷入内核, 这需要内核通过某种算法选择一个进程的页面, 将其置换到磁盘的交换分区, 然后该页面对应的页框便闲置出来, 再将其放到引发缺页异常的进程的页表映射关系中, 对应的缺页异常在内核交还控制权限给程序后便不会再发生, 对应程序也能够正常访问刚刚无法访问的页面.
三. 文件系统
(1)