操作系统 -- 存储管理


  内存存放着程序和数据,是冯·诺依曼结构的重要组成部分。内存容量在不断增长,但是其作用是没有发生变化的。但是由于人们对计算机的使用要求不断发生变化,从只是运行单道程序(独占全机资源),到多道程序设计技术(多道程序共享全机资源),操作系统对存储的管理还是发生了很大的变化。下面就详细说说!

内存的发展史

内存 容量/指标 时期 出现原因
SIMM内存 30pin、256KB 1982年至今 软件程序和新一代80286硬件平台的出现
SIMM内存 72pin、512KB-2MB 1988-1990 PC迎来386和486时代,CPU向16bit发展
EDO DRAM 4-16MB 电压:5V 带宽:32bit 速度:40ns 1991-1995
SDRAM 带宽64bit Inter Celeron系列以及AMD K6处理器相关主板芯片推出
Rambus DRAM 带宽4.2G Byte/sec Intel已经开始着手最新的Pentium 4计划
DDR 266MHZ带宽 06年 Rambus RDRAM因成本过高
DDR2内存 400、533、667、800、1000MHz时钟频率 CPU对内存性能要求的提高
DDR3 AMD在06年第二季度发布全新的AM2接口

内存管理发展简史

  虽然很想写清楚,但是内存的管理的发展跟cpu访问内存的规则相关,而源代码到可执行的二进制代码要经过编译,编译器肯定要根据CPU访问内存的规则将代码编译成机器指令,这样编译出来的程序才能在该CPU上运行无误。有很多东西在相互促进发展。但是如果紧紧抓住一条主线,就是如何提高cpu的利用率、速度?这样可以弄清楚内存管理发展历程。

单一连续分区分配方式

  早期的计算机是没有存储器抽象的,直接将物理内存暴露给程序。要运行一个程序,会把这些程序全部装入到内存,程序都是直接运行在内存上的。通常称为单一连续分区分配方式。
  整个内存里面只有两个程序:一个是用户程序,另外一个是操作系统。由于只有一个用户程序,而操作系统所占用的内存空间是恒定的,我们可以将用户程序总是加载到同一个内存地址上。即用户程序永远从同一个地方开始执行。
   在这种管理方式下,操作系统永远跳转到同一个地方来启动用户程序,这样用户程序里面的地址都可以事先计算出来,即在程序运行前就计算出所有的物理地址,这种在运行前即将物理地址计算好的方式叫静态地址翻译。

分段的出现和固定分区

  分段是从CPU 8086开始的,限于技术和经济,那时候电脑还是非常昂贵的东西,所以CPU和寄存器等宽度都是16位的,并不是像今天这样寄存器已经扩展到64位,当然编译器用的最多的还是32位。16位寄存器意味着其可存储的数字范围是2的16次方,即65536字节,64KB。那时的计算机没有虚拟地址之说,只有物理地址,访问任何存储单元都直接给出物理地址。

  编译器在编译程序时,肯定要根据CPU访问内存的规则将代码编译成机器指令,这样编译出来的程序才能在该CPU上运行无误,所以说,在直接以绝对物理地址访问内存的CPU上运行程序,该程序中指令的地址也必须得是绝对物理地址。总之,要想在该硬件上运行,就要遵从该硬件的规则,操作系统和编译器也无一例外。

  若加载程序运行,不管其是内核程序,还是用户程序,程序中的地址若都是绝对物理地址,那该程序必须放在内存中固定的地方,于是,两个编译出来地址相同的用户程序还真没法同时运行,只能运行一个。于是伟大的计算机前辈们用分段的方式解决了这一问题,让CPU采用“段基址+段内偏移地址”的方式来访问任意内存。这样的好处是程序可以重定位了,尽管程序指令中给的是绝对物理地址,但终究可以同时运行多个程序了。
  固定式分区分配是能满足多道程序设计的最简单的存储管理技术,允许几个作业共享主存空间,这几个作业被装入不同的分区中,每个分区可用来装入一个作业。因此,分区式存储管理可以在内存中同时放几道作业,适用于多道程序系统。

动态分区分配

  动态分区分配又称为可变分区分配,是一种动态划分内存的分区方法。这种分区方法不预先将内存划分,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统中分区的大小和数目是可变的。

上述的几种分配方法都是将一块连续的内存分配给程序。但是不足很多,过多的内存资源会被浪费。因此,人们为了压榨硬件资源,又不断改进内存分配的方法。

非连续内存分配

提出了非连续分配,允许一个程序分散地装入到不相邻的内存分区中。根据内存分区是否固定分为分页存储管理方式和分段存储管理方式。两者结合一起又是段页式存储管理。

内存管理实例 – linux的内存管理

  内存管理的功能有:
  物理内存空间的分配与回收:由操作系统完成主存储器空间的分配和管理。
  地址转换:在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。
  内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。
  存储保护:保证各道作业在各自的存储空间内运行,.互不干扰。

  
  
  Linux内核管理物理内存是通过分页机制实现的。
  https://www.cnblogs.com/ygj0930/p/6539590.html
  https://blog.csdn.net/qq_19525389/article/details/81430701
  http://c.biancheng.net/view/1284.html
  https://www.cnblogs.com/xudong-bupt/archive/2013/03/22/2976289.htm

参考

https://blog.csdn.net/XD_hebuters/article/details/79098006

发布了87 篇原创文章 · 获赞 28 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/shuzishij/article/details/99206422