内存学习笔记

内存条/总线/DMA

  • 内存和CPU之间有数据总线和地址总线直接相连,交互。
    在这里插入图片描述

  • PCIE总线也是和CPU直接相连,比如可以插显卡。

  • 南桥:接一些USB,硬盘,网卡,声卡

  • DMA控制器:(DMAC, 直接内存访问控制器)

CPU会把一些机械的重复工作,比如读文件交给DMAC。

CPU交给DMAC,DMAC将磁盘内容读取到内存, 以中断的形式通知CPU文件读取完毕。

DMAC为什么可以直接访问内存?

因为在CPU将IO任务交给控制器时,会把总线控制权完全交给DMAC, CPU这时候不能控制总线。

在读取过程中,并不是连续掌握总线的控制权,而是和CPU有个交接,可能按照时间片轮换掌握控制权。

OS内存管理和内存分类

视频地址:

  1. 为什么要有逻辑地址?

逻辑地址就是程序看到的地址,对应物理地址。

程序无法知道可用的物理地址,所以需要作出映射。

  1. 逻辑地址和物理地址如何映射

①一种简单的思路:使用固定偏移量映射。

存在缺陷:程序使用的内存并不固定,可能是动态变化的,使用的内存大小在变化,不能确定一个最大值分配,即使可以确定一个最大值假设为200,也会有很多内存长时间不被使用,这叫做内碎片。

假设程序释放内存,大小为200的内存区域被释放,如果下一个程序需求是201,那么不能使用这块内存,如果长时间得不到使用,这块被闲置的内存就叫做外碎片。

②分页:下一小节

分页

逻辑内存和物理内存都进行切分,分成固定大小,每一个都叫做页。

为了区分,逻辑内存每一片叫做页,物理内存叫做帧。

从页到帧需要page table页表维护映射关系。例如页编号,帧编号。

小知识:

  • 内存的一个地址里面住的是一个字节的数据
  • 32位OS的物理地址有2^32个=4G,每个地址一个字节,所以内存大小4GB。
  • 任何一个32位程序可以操作的逻辑地址为2^32个
  • 上面会导致多个程序使用的内存和大于物理内存,此时会借助磁盘,将并不着急使用的内存放到磁盘中,所以一些页直接映射到磁盘中,而不是帧中。

一次内存映射的过程:

条件: 机器32位系统,256MB内存,页大小4KB,程序32位程序

4kb=12位

  • 逻辑地址:32位= 20bit 页号+12bit偏移
  • 物理地址(256MB):28bit = 16bit帧号+12bit偏移

在这里插入图片描述

如果帧号是磁盘,会发生什么?

如果帧号这一栏没有对应帧号,会发生一个缺页中断,触发程序进入内核态,内核会找到磁盘数据,加载到物理内存的帧中,将加载成功的帧号填写到页表中。重新进行寻址过程。

如果所有的帧都满了,应该加载到哪里呢

会有很多页的替换算法,可以进行选择。

分页小结:

分页让每个程序都有很大的逻辑地址空间,通过映射和置换算法,使内存“无限大。

不同进程的内存各自维系一个页表,只要帧号不相同,让不同进程的内存互相隔离,保证安全。

分页降低了内存碎片问题。

页表是保存在内存中,我们需要读取两次内存,先读取页表,在进行查找帧。

而且页表占用内存空间。 

分页的时间和空间优化

时间优化:

快表TLB,将最长访问的页表项存储到一个更快的硬件中,一般是MMU(集成在CPU中,空间很小,一般是8-128个页表项),寻址先查TLB,再查PT。快表命中率很高,因为程序最常访问的页没几个。

空间优化:

多级页表

分段

程序内部的内存管理.
最早的分段,就是将程序分成几个大的内存区域,每个段在分成几个页,每个段都有页表。需要使用段号+页号得到帧。

这种方式已经被淘汰了。

但C语言中经常还有段错误,堆栈等。

段保留了逻辑意义,并不在内存管理中起到作用,对虚拟内存可以分成多个段,TEXT, D

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值