计算机是如何工作的?
取址执行
内存取址
CPU执行
一个程序在执行时,程序有进程睡眠时就会把该进程交换到磁盘中,那么如何记录程序的地址呢?
程序会在运行时重定位,也就是采用相对地址(汇编中学过)。
那么就需要一个基址,PCB会对基址进行记录(从创建进程开始就开始记录)。
基址 :相对基址=物理地址
程序是一整个载入内存中吗?
程序都是分段的。
程序分为 程序段(只读),数据段,代码段,堆/栈
然后PCB中的LDT表(段表)来记录每个段的基址,然后
基址:相对地址=物理地址
内存分区管理
先来先服务
最佳适配
哪个空闲分区容量最接近(大于)需要分配的内存容量,就分配,空闲分区越来越来小,会产生内存碎片
最差适配
与最佳适配相反
计算机如解决内存碎片问题
操作系统将内存分为若干页,我的电脑一页大小为4K(4096字节)
对于每个段内存请求,操作系统一页一页的分配给这个段,一个进程最多浪费一页(4K),浪费很少。
会采用页表(cr3)来进行记录,依然是逻辑地址,格式为page#|OFFSET(页面尺寸4096),PCB中会有页表指针。
由MMU(硬件)进行匹配。
32为地址有2^20个页表,那么为了避免浪费,实际情况中该怎么保存呢?
多级页表
和在新华字典中查找汉字一样,先从目录中找在具体的位置,在在具体的章节查找具体的内容
但是多级页表会增加了访问内存的次数(时间上慢),聪明的科学家是如何解决的呢
TLB(记录最近使用的逻辑页):相连快速存储,是寄存器(硬件,运行超快)
直接根据电路一次比对得到物理地址。
如何TLB没有查找到,则进行多级页表 的查询
内存换入
当mmu没有找到对应页时,会产生中断,会将页从磁盘读入,找一块空白空间放置
实际情况中采用请求调页
内存换出
FIFO
MIN:选最远使用的淘汰
LRU:选最近最少使用的淘汰
(页码栈)(耗费高,一般不使用)
(时间戳)(不能记录太多东西)
SRC(Clock算法)(目前使用的)
每访问一个页,将位置1
定时未使用直接置位为0
swap分区就是执行换入换出,为实现虚拟内存
需要根据实际情况进行调整.