这边对ostep整个第一部分做一个总结。
第一部分主要讲了CPU和内存。总结只记一些核心知识点用于回忆
CPU
CPU有限制执行模式,部分指令只有在限制执行模式才可以执行,这也是为什么用户进程必须从用户态切换到内核态,才可以执行I/O等操作。操作系统在boot后从指定位置加载自己进内存时,作为第一个执行的程序,会先获得执行权限,然后再执行用户级别代码。
操作系统执行调度的基本单位是进程,操作系统基于进程进行调度。执行过程按照时间片来分配,可以简单理解为每个进程执行Xms。每个进程挨个执行。
操作系统进行线程调度时,需要进行线程的切换,主要的开销就在于需要保留现场,即需要保存当前正在执行的进程的寄存器,程序计数器等信息,将这些信息保存到内存中去,再切换回该线程时,需要还原现场。
CPU调度算法主要有2类,多级反馈队列MLFQ和CFS。
MLFQ多级反馈队列一般多应用在带UI的交互界面中,保证用户的使用体验。见ostep-8。
CFS公平调度,一般在计算型服务器使用,主要保障CPU进程调度的公平性,保证每个进程得到合理的调度。见ostep-9。
多进程多CPU调度,见ostep-10,主要讨论亲和度和一致性问题。
内存
虚拟化
Ostep11-13
内存对用户进程时虚拟化的,本质上,用户进程看到的地址空间,如0x000001地址,是通过某种方式映射到了物理内存的某个位置。
用户进程只能看到自己虚拟内存的地址,实际转换由os来做,并且每个用户进程在虚拟内存地址上都可以认为自己拥有整个内存空间。
用户的内存空间,主要分为3部分,code,heap,stack,其中heap向下增长,堆向上增长
地址转换
Ostep14-20
虚拟地址到物理地址的转换,主要有2种虚拟地址的表达方式和一个转换工具TLB。
表达方式
虚拟地址主要的表达方式有2种
- 段:段通过一个物理地址的开头+偏移来表示物理地址,对于虚拟地址0xffff001,我们把他分为2部分,其中ffff表示了物理地址的位置,001表示从这个物理地址开始的偏移,经过计算后对应的物理地址所保存的那个字节,就是虚拟地址想要的字节。
- 页表:页表通过一种数据结构上的页表来表示
- 首先它将整个物理内存与虚拟内存划分为页,然后就只需要处理虚拟页与物理页之间的映射了
- 虚拟页与物理页的映射通过页表来实现,页表(多级)可以认为是一个树,树上保存的节点可以认为是索引
- 通过在页表上找到最终的叶子节点以后,叶子结点保存的就是虚拟页所对应的物理页的信息
- 得到物理页地址以后,通过在物理页上再计算偏移量,
TLB(地址翻译缓存)
可以认为是地址转换的缓存,是一种硬件机制,在CPU上。
处理的是最直接的转换,比如
- 给定一个虚拟地址,直接对应一个物理地址
- 给定一个虚拟页码,直接对应一个物理页码
虚拟内存
虚拟内存是把内存页交换到硬盘的技术。
所以本质上来说,用户进程获取一个内存数据,需要经过一下步骤:
- 要访问的虚拟地址
- 虚拟地址通过TLB,或者页表查找,找到对应的物理页
- 物理页是否在内存中?如果不在,需要交换回内存(可能已经被交换到了硬盘上)
- 在物理页上根据偏移量找到对应数据
页的汰换
ostep23有提到
主要是物理页如何汰换到硬盘上,一般我们知道的朴素算法就是LRU最近最少使用,维护一个列表,每次有被使用了就移动到列表头部,淘汰时从列表尾部去淘汰就可以了。
实际操作系统为了性能,会考虑使用全局的脏页列表或者空闲列表做辅助,最终性能会接近LRU。