操作系统分配内存

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

操作系统中内存的最小访问单位是 字节 ,也就是8bit。

通常我们所说的计算机系统是32位的总线,所谓的32位总线就是说一次读写可以从内存当中读或者写32位(也就是4字节)。

因为一次读写是32位,所以需要地址对齐,访问的时候不能从任意地方开始。

在CPU中可以看到高速缓存,由于指令执行和访问数据都需要从内存里读数据,如果此时有大量数据要读写而且会重复利用的话,那么在CPU中加高速缓存会使读写进行得更快。

有了这样一个大致了解,可以来看内存层次结构。

首先CPU在读写指令和数据的时候,如果缓存里已经有相应的内容,那么CPU直接从缓存中拿到数据,这时候速度是最快的。(写程序的时候完全感受不到L1缓存和L2缓存的存在,因为这部分是硬件控制的,不能显示使用它们。)

如果缓存不命中,那么就必须去内存中读。如果内存还是没找到,那就去外存中读。(访问速度又有很大差别)

虽然计算机硬件一直在飞速发展,内存容量也在不断增长,但是仍然不可能将所有用户进程和系统所需要的全部程序和数据放入主存中,所以操作系统就要对内存进行合理地划分和有效地动态分配。操作系统需要做到四个方面:抽象、保护、共享和虚拟化。

如图,四个进程在操作系统的划分和管理下,彼此之间在逻辑上既需要相互独立,又可以相互通信。

操作系统中采用的内存管理方式有:

  • 重定位(relocation)
  • 分段(segmentation)
  • 分页(paging)
  • 虚拟存储(virtual memory)

目前多数系统(如 Linux)采用按需页式虚拟存储。

地址空间和地址生成

物理地址空间——硬件支持的地址空间,起始地址从0直到MAXsys。这个编号在存储单元角度来讲是唯一的,但是这种唯一对于我们写程序来说是不大容易的,因为我们在写程序的时候对于到底要使用哪个地址可能是不知道的。

逻辑地址空间——在CPU运行的进程看到的地址,起始地址从0知道MAXprog。对应的是可执行文件的那段空间。

对于我们用高级语言编写的程序,经过如下过程生成它的逻辑地址:

此时的逻辑地址生成时机的不同会有不同的限制。

  • 编译时:已经假设起始地址已知,如果起始地址改变,必须重新编译。例如以前的手机,程序是写死的,不能自己安装应用,只能用手机里编译好的。
  • 加载时:如编译时起始位置未知,编译器需生成可重定位的代码。例如现在的智能手机,可以下载很多APP。
  • 执行时:执行时代码可移动,但需地址转换(映射)硬件支持。这种情况出现在使用虚拟存储的系统,

逻辑地址生成后,接着就是生成物理地址,过程如下:

因为内存有着诸多限制,所以也有着对应的检查机制。检查过程如图:

连续地址分配

生成地址后接着分配地址,连续内存分配是给进程分配一块不小于指定大小的连续的物理内存区域。地址分配从两个角度考虑:如何去找你要用的空间分区;如何处理不能利用的小的空闲分区。

这里不能利用的小的空闲分区我们统称为 内存碎片 ,内存碎片分为三类:

  • 内存碎片:有的还可以用,有的无论如何都用不起来了。
  • 外部碎片:分配单元之间的未被使用内存
  • 内部碎片:分配单元内部的未被使用内存(你只占500字节,但是不得不分配512字节)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值