清华大学操作系统课程笔记:计算机体系结构和内存层次

本文已收录于 清华大学操作系统课程笔记 系列,共计 6 篇,本篇是第 1 篇

计算机体系结构和内存层次

存数据的地方:CPU里的寄存器、内存、外存。

32位机器也就是可以一次性从内存中读写32位(4字节)数据

详情查询:

内存层次

抽象:逻辑地址空间

保护:每个进程只能访问自己的地址空间。

共享:访问相同内存

虚拟化:获得更大的空间

操作系统内存管理方式

每个地址用一个段地址+偏移得到的。

我们希望一个进程占用的内存空间不一定非要连续。代码段、数据段、堆栈分离。至少分成三块

将内存分为基本单位。

基本单位是连续的。

方便后面的页调度,置换。

逻辑地址生成

首先是物理地址:

一个是内存的角度。一个是CPU的角度。

地址生成过程

https://www.bilibili.com/video/BV1xJ411W71v?p=23 11分

CPU硬件去做硬件转换——后面要讲的页表功能。

访问的时候不依赖软件,但转换的表示通过操作系统软件层面实现的。

地址检查

连续内存分配

外碎片:两块之间的情况。一个小的空闲块。

比如说程序需要510字节,但分配内存只能以2的整数幂的形式分配512字节。多出来的2字节就是内部碎片。

动态分区的分区策略(排序算法不同):

  • 最先匹配
  • 最佳匹配
  • 最差匹配(由大到小,第一个就是)

最先匹配(first fit)

first fit 内存分配算法:

最佳匹配(best fit)

最差匹配:找最大

碎片整理

碎片紧凑

但不是你想动就能动的。必须所有进程都支持动态重定位。不允许正在运行的时候搬动,绝对地址程序也不可以。

关于具体的做法再议。

分区对换(早期内存紧张的时候)

https://www.bilibili.com/video/BV1xJ411W71v?p=25 第4分钟

把处于等待状态的P1放在外存中:

在Linux中swap早期就是为了扩展内存用的。早期内存很紧张。

把处于等待状态的进程移动到外存中。

连续内存分配实例:伙伴系统

第一维是空闲块的大小,从小到大排成第一维。

参考信息:

我们在实现的时候,就实现这两个函数alloc 和 free就行了。

非连续内存分配

提高利用效率。

eg:例如共享函数库

Ps:简单来说段式存储分配的比较大,以段为基本单位。页则更小,分配的时候以页为单位

段式存储管理

页式存储管理

MMU:存储管理单元

TLB:页表

f左移s位,加上偏移o。

页表

负责逻辑页号到物理帧号之间的转换。

修改位:

引用位:在过去一段时间,是否对他有引用。

实例:

如何解决?

缓存:快表

间接访问:切分成子表(多级页表)

快表和多级页表

快表,CPU里面有个关联存储器(TLB)。可以同时的查询多个关联项。

多级页表:

通过间接引用将页号分为若干级。上图形成页表树。

查询方式:p1作为第一级页表的偏移找到二级页表的地址;p2作为二级页表项的偏移找到三级页表的地址;从三级页表找到物理内存地址。

可以有效减小页表长度。

可以类比查询算法,二叉查找树之类的。

页寄存器

反置页表

Ps:如果vpn不同就表示有冲突,那么就找next。Index就是页帧号。

段页式存储管理(重要!)

段式+页式

IMG_256

所以我们最好将段式和页式结合。

作者: 高志远

高志远,23岁,男生,毕业于上海杉达学院电子商务系。

发表评论

邮箱地址不会被公开。