silverlining

操作系统笔记

Posted at — 5月 8, 2018

《Think os》

第一章:编译

第二章:进程

第三章:虚拟内存

  #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);
  }

第四章:文件与文件系统

第五章:字和字节

第六章:内存管理

第七章:缓存

第八章:多任务

第九章:线程


《现代操作系统》

进程

进程:正在运行的一个程序的实例,由一个内核对象和一个地址空间构成。

程序与进程区别

进程状态: 就绪,阻塞,运行。

进程的组成: 程序、数据集合和PCB

需要线程的原因:

线程组成:堆栈,寄存器,程序计数器和状态。共享进程的地址空间,打开的文件和其他资源。

两种线程模型

进程间通信(IPC)

忙等待的互斥方案

进程调度

调度算法

经典IPC问题

哲学家就餐

死锁

原因:

必要条件:

处理死锁基本方法:

程序编译与链接

Bulid过程可以分解为4个步骤:预处理(Prepressing), 编译(Compilation)、汇编(Assembly)、链接(Linking)

以c语言为例:

1 预处理

预编译过程主要处理那些源文件中的以“#”开始的预编译指令,主要处理规则有:

将所有的“#define”删除,并展开所用的宏定义 处理所有条件预编译指令,比如“#if”、“#ifdef”、 “#elif”、“#endif” 处理“#include”预编译指令,将被包含的文件插入到该编译指令的位置,注:此过程是递归进行的 删除所有注释 添加行号和文件名标识,以便于编译时编译器产生调试用的行号信息以及用于编译时产生编译错误或警告时可显示行号 保留所有的#pragma编译器指令。 2 编译

编译过程就是把预处理完的文件进行一系列的词法分析、语法分析、语义分析及优化后生成相应的汇编代码文件。这个过程是整个程序构建的核心部分。

3 汇编

汇编器是将汇编代码转化成机器可以执行的指令,每一条汇编语句几乎都是一条机器指令。经过编译、链接、汇编输出的文件成为目标文件(Object File)

4 链接

链接的主要内容就是把各个模块之间相互引用的部分处理好,使各个模块可以正确的拼接。 链接的主要过程包块 地址和空间的分配(Address and Storage Allocation)、符号决议(Symbol Resolution)和重定位(Relocation)等步骤。

存储管理

分层存储体系

存储管理的任务

内存管理的五点需求

  1. 重定位
  2. 保护
  3. 共享
  4. 逻辑组织
  5. 物理组织

六种内存管理技术

虚拟存储技术就是利用实际内存空间和相对大的多的外部储存器存储空间相结合构成一个远远大于实际内存空间的虚拟存储空间,程序就运行在这个虚拟存储空间中,能够实现虚拟存储的依据是程序的局部性原理,即程序在运行过程中经常体现出运行在某个局部范围之内的特点。

技术说明优势弱点
固定分区在系统生成阶段,主存被划分成许多静态分区 进程可以装入到大于或等于自身大小的分区中实现简单,只需要极少的操作 系统开销由于有内部碎片,对内存的使 用不充分;活动进程的最数目 是固定的。
动态分区分区是动态创建的,因而使得每个进程可以装 入到与自身大小正好相等的分区中。没有内部碎片;可以更充分地 使用主存。由于需要压缩外部碎片,对内 存的使用不充分。
简单分页主存被划分成许多大小相等的帧;每个进程被 划分成许多大小与帧相等的页;要装入一个进 程,需要把进程包含的所有页都装入到主存内 不一定连续的某些帧中。没有外部碎片有很少数量的内部碎片
简单分段每个进程被划分成许多段;要装入一个进程, 需要把进程包含的所有段都装入到主存内不一 定连续的某些动态分区中。没有内部碎片;相对于动态分 区,提高了内存利用率,减少 了开销。存在外部碎片。
虚拟内存分页除了不需要装入一个进程的所有页之外,与简 单分页一样;非驻留页在以后需要时自动调入 空间。没有外部碎片;更高程序的多 道程序设计;巨大的虚拟地址 空间。复杂的内存管理开销。
虚拟内存分段除了不需要装入一个进程的所有段之外,与简 单分页一样;非驻留段在以后需要时自动调入 空间。没有内部碎片;更高程序的多 道程序设计;巨大的虚拟地址 空间;支持保护和共享复杂的内存管理开销。

动态分区放置算法

分页式地址重定位

计算公式

流程

  1. 将相对地址转换成数对(页号,页内位移)
  2. 建立一张作业的页与块对应表
  3. 按页号去查页、块对应表
  4. 由块的起始地址与页内位移形成绝对地址

页表是一种特殊的数据结构,放在系统空间的页表区,存放逻辑页与物理页帧的对应关系。 每一个进程都拥有一个自己的页表,PCB表中有指针指向页表。

实现虚拟分页需要考虑的问题

TLB(Translation Lookaside Buffer),简称快表,加速虚拟地址到物理地址的映射。通常在MMU中。

依据

总是对少量的页面进行多次的 访问。因此,只有很少的页表 项会被反复读取,而其他的页 表项很少被访问。

页面淘汰算法

缺页中断

在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。