《think os》笔记

May 8, 2018 22:18 · 1912 words · 4 minute read 操作系统 读书笔记

第一章:编译

  • 编译型语言和解释型语言
  • 编译过程
    • 1.预处理
    • 2.解析
    • 3.静态检查
    • 4.生成机器/字节码
    • 5.链接
    • 6.优化

第二章:进程

  • 进程:正在运行的程序。
  • 进程包含的数据
    • 程序的执行代码。
    • 程序的数据,包括静态数据(编译期)和动态数据(栈,堆)。
    • IO状态。
    • 硬件状态,包括寄存器中的数据,进程状态码,程序计数器(标示正在执行的指令)。
  • 实现进程隔离
    • 多任务
    • 虚拟内存
    • 设备抽象

第三章:虚拟内存

  • 32位系统的虚拟地址:0~2^32-1,64位系统的虚拟地址:0~2^64-1
  • 进程的数据被组织为5个段(从低位到高位)

    • 代码段
    • static段
    • globals段
    • 堆(从低位到高位增长)
    • 栈(从高位到低位增长) 测试程序: c #include <stdio.h> #include <stdlib.h> int global; int main () { int local = 5; void *p = malloc(128); char *s = "Hello, World"; printf ("Address of main is %p\n", main); printf ("Address of global is %p\n", &global); printf ("Address of local is %p\n", &local); printf ("p points to %p\n", p); printf ("s points to %p\n", s); }
  • 虚拟地址和物理地址之间的转换通过MMU来进行。

    • 1.程序读取或写入一个变量时,CPU生成一个虚拟地址。
    • 2.MMU把虚拟地址分成两块,分别是页号(page number)和偏移量(offset),一个页对应内存中的一段,页的大小通常为1~4KB。
    • 3.MMU从TLB中查询页号,获取其对应的物理页号,通过物理页号和偏移量生成物理地址。
  • 假设操作系统是32位的,物理内存为1GB,分成1KB大小的页。

    • 因为1GB为2^30字节,一页大小为2^10字节,因此有2^20个物理页,也叫做帧。
    • 虚拟地址空间为2^30字节,一页大小为2^10字节,因此有2^22个虚拟页。
    • 偏移量的大小取决于页的大小,一页大小为2^10字节,因此需要10位来指定页中的一个字节。
    • 如果VA为32位,偏移量位10位,剩余的22位指定了虚拟页号。
    • 因为有2^20个物理页,每个物理页号由20位组成,加上10位的偏移量,最终的PA为30位。
  • 解决页表占用内存大:多级页表

第四章:文件与文件系统

  • 文件的抽象性
    • “文件系统”是一个文件名称到其内容的映射表。
    • “文件”是一串字节的序列。
  • 文件和底层持久存储的区别:文件是基于字节的,持久存储是基于“块”的(一个块大小为1-8KB),对文件读写实际上是在对底层的块进行读写。
  • 操作系统提供了一些特性,来弥补主存和硬盘之间的性能间隔:
    • 传输块:从硬盘读取一个字节耗费5~25ms,相比之下,读取一个8KB的块所多耗费的时间可以忽略不计,因此系统在读硬盘时通常倾向读取大的块。
    • 预读:当程序读取第一个块时,操作系统通常会同时读取更多的块。
    • 缓冲:在写文件时,数据会被写入到缓存区(内存),至少有一个块需要写入时才会持久化到硬盘。

第五章:字和字节

  • &运算:两个操作数都为1,结果为1,否则为0。
  • |运算:有一个操作数为1,结果为1,否则为0。
  • ^运算:只有一个操作数为1,结果为1,否则为0。

第六章:内存管理

  • 内存分配函数:malloc,calloc,free,realloc。
  • malloc在运行时通常不依赖块的大小,但是可能取决于空闲块的数量。free通常很快,与空闲块的数量无关。calloc会清空块的每个字节,执行时间取决于块的大小和空闲数量,realloc执行时间取决于是否需要执行新旧内存块之间的复制。

第七章:缓存

  • 程序数据的寄存器
    • 程序计数器(PC),包含下一条指令在内存中的地址。
    • 指令寄存器(IR),包含当前执行指令的机器码。
    • 栈指针(SP),包含当前函数栈帧的指针,包括函数参数和局部变量。
    • 状态寄存器。
  • 当CPU从内存读取数据时,它将一份副本存到缓冲中,缓存的命中率为h,缺失率为m,每次内存访问的平均时间为:h * Th + m * Tm
  • 局部性原理:CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。1.重复引用同一个变量具有良好的时间局部性。 2.对于步长位k的引用程序,步长越小,空间局部性越小。步长为1的引用具有良好的空间局部性。k越大,空间局部性越差。

第八章:多任务

  • 中断:中断是一个事件,它会停止通常的指令周期,并且使执行流跳到中断处理器的特殊代码区域内。
  • 硬件中断:硬件设备->CPU,软件中断:程序->内核。
  • 系统调用:执行特殊的指令触发中断,使程序流跳到内核中,内核读取系统调用的请求参数,执行操作,之后恢复中断进程的执行。
  • 进程的生命周期:运行,就绪,阻塞,终止。
    • 进程被启动或恢复:就绪->运行。
    • 进程被中断:运行->就绪。
    • 进程执行不能立即完成的系统调用:运行->阻塞。
    • 进程阻塞操作完成:阻塞->就绪。
    • 进程退出:终止。
  • 调度器运行时会优先调度优先级最高的进程。

第九章:线程

  • 同一进程中的所有线程共享相同的代码段,static段,堆,但每个线程拥有属于自己的栈,线程不能访问其它线程的局部变量。