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

计算机是如何工作的?

取址执行
  内存取址
  CPU执行

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

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

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

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

内存分区管理

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

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

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

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

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

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

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

内存换入

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

内存换出

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

swap分区就是执行换入换出,为实现虚拟内存

给内存分配多少帧(frame)也是一个难题:
trashing

需要根据实际情况进行调整.

你可能感兴趣的:(操作系统是如何管理内存的)