theKingOfNight's Blog

浅谈操作系统是如何管理内存的

字数统计: 719阅读时长: 2 min
2019/01/19 Share

计算机是如何工作的?

1
2
3
取址执行
内存取址
CPU执行

一个程序在执行时,程序有进程睡眠时就会把该进程交换到磁盘中,那么如何记录程序的地址呢?

1
2
3
程序会在运行时重定位,也就是采用相对地址(汇编中学过)。
那么就需要一个基址,PCB会对基址进行记录(从创建进程开始就开始记录)。
基址 :相对基址=物理地址

程序是一整个载入内存中吗?

1
2
3
4
程序都是分段的。
程序分为 程序段(只读),数据段,代码段,堆/栈
然后PCB中的LDT表(段表)来记录每个段的基址,然后
基址:相对地址=物理地址

内存分区管理

1
先来先服务

1
2
最佳适配
哪个空闲分区容量最接近(大于)需要分配的内存容量,就分配,空闲分区越来越来小,会产生内存碎片
1
2
最差适配
与最佳适配相反

计算机如解决内存碎片问题

1
2
3
4
操作系统将内存分为若干页,我的电脑一页大小为4K(4096字节)
对于每个段内存请求,操作系统一页一页的分配给这个段,一个进程最多浪费一页(4K),浪费很少。
会采用页表(cr3)来进行记录,依然是逻辑地址,格式为page#|OFFSET(页面尺寸4096),PCB中会有页表指针。
由MMU(硬件)进行匹配。

image.png
32为地址有2^20个页表,那么为了避免浪费,实际情况中该怎么保存呢?

1
2
多级页表
和在新华字典中查找汉字一样,先从目录中找在具体的位置,在在具体的章节查找具体的内容

页表格式
但是多级页表会增加了访问内存的次数(时间上慢),聪明的科学家是如何解决的呢

1
2
3
TLB(记录最近使用的逻辑页):相连快速存储,是寄存器(硬件,运行超快)
直接根据电路一次比对得到物理地址。
如何TLB没有查找到,则进行多级页表 的查询

整体情况
内存换入

1
2
当mmu没有找到对应页时,会产生中断,会将页从磁盘读入,找一块空白空间放置
实际情况中采用请求调页

内存换出

1
FIFO

1
MIN:选最远使用的淘汰
1
2
3
LRU:选最近最少使用的淘汰
(页码栈)(耗费高,一般不使用)
(时间戳)(不能记录太多东西)
1
2
3
SRC(Clock算法)(目前使用的)
每访问一个页,将位置1
定时未使用直接置位为0

Clock
swap分区就是执行换入换出,为实现虚拟内存
给内存分配多少帧(frame)也是一个难题:trashing
需要根据实际情况进行调整.

CATALOG