普通人

《Operating Systems: Three Easy Pieces》学习笔记(十五) 分页:快速地址转换(TLB)

对每次内存访问,硬件先检查 TLB,看看其中是否有期望的转换映射,如果有,就完成转换(很快),不用访问页表 (其中有全部的转换映射)。因此,更好的名称应该是地址转换缓存(address-translation cache)。 TLB 的基本算法 TLB 命中(TLB hit),直接取 TLB 未命中,硬件访问页表来寻找转换映射,并用该转换映射更新 TLB,当 TLB 更新成功后,系统会...

《Operating Systems: Three Easy Pieces》学习笔记(十四) 分页:介绍

一个简单例子 在这个例子中,有 8 个页帧(由 128 字节物理内存构成,也是极小的) 为了记录地址空间的每个虚拟页放在物理内存中的位置,操作系统通常为每个进程保存一个数据结构,称为页表(page table)。页表的主要作用是为地址空间的每个虚拟页面保存地址转换(address translation) 为了转换(translate)该过程生成的虚拟地址,我们必须首先将它分成两个...

《Operating Systems: Three Easy Pieces》学习笔记(十三) 空闲空间管理

要满足变长的分配请求,应该如何管理空闲空间?什么策略可以让碎片最小化?不同方法的时间和空间开销如何? 假设 通过 malloc()和 free()分配释放内存 只有外部碎片 分配后不能移动,大小固定 底层机制 空闲链表 分割: 合并: 追踪已分配空间的大小 为每块分配的空间添加头块,实际占用空间是头块大小加上分配大小。 头块包括分配大...

《Operating Systems: Three Easy Pieces》学习笔记(十二) 分段

结合上一篇文章,堆和栈之间有一大块“空闲”空间,如果没被使用,也占用了物理内存。如果虚拟内存地址空间很大,对物理内存也是极大的浪费,回想一下,进程确实有权力拥有这么大的空间,最大可以拥有最大段大小的地址空间,进程完全可以声明自己需要这么大空间,但可能不会使用,操作系统总得给它预留这么多。 分段:泛化的基址/界限 为了降低物理内存浪费,我们对段做细分,原来每个进程对应一个段,现在让每个进程...

《Operating Systems: Three Easy Pieces》学习笔记(十一) 机制:地址转换

高效、灵活地虚拟化内存。需要一种基于硬件的地址转换(hardware-based address translation),简称为地址转换(address translation)。将指令中的虚拟(virtual)地址转换为数据实际存储的物理(physical)地址。 虚拟地址映射 用户进程在物理内存中并不是从 0 地址开始的 动态(基于硬件)重定位(dynamic relocat...

《Operating Systems: Three Easy Pieces》学习笔记(十) 插叙:内存操作 API

在本章中,我们将介绍 UNIX 操作系统的内存分配接口 内存类型 栈内存 它的申请和释放操作是编译器来隐式管理的,所以有时也称为自动(automatic)内存。比如,一个函数的局部变量,在进入函数时分配,退出时释放。 堆内存 申请和释放都是显式的,比如 C 语言的malloc。 malloc()调用 malloc 的用法...

《Operating Systems: Three Easy Pieces》学习笔记(九) 抽象:地址空间

早期系统 操作系统曾经是一组函数(实际上是一个库),在内存中(在本例中,从物理地址 0 开始),然后有一个正在运行的程序(进 程),目前在物理内存中(在本例中,从物理地址 64KB 开始), 并使用剩余的内存。这里几乎没有抽象。 多道程序和时分共享 3 个进程(A、B、C),每个进程拥有从 512KB 物理内存中切出来给它们的一小部分内存。假定只有一 个 CPU,操作系统选择运...

《Operating Systems: Three Easy Pieces》学习笔记(七) 调度:比例份额

本章将介绍一种不同的调度方法–比例份额(proportional-share)调度,有时也称为公平份额(fair-share)调度程序。比例份额算法基于一个简单的想法:调 度程序的最终目标,是确保每个工作获得一定比例的 CPU 时间,而不是优化周转时间和响 应时间。 比例份额调度程序有一个非常优秀的现代例子,由 Waldspurger 和 Weihl 发现,名为彩票调度(lottery s...

© Kai. 保留部分权利。

浙ICP备20006745号-2,本站由 Jekyll 生成,采用 Chirpy 主题。