综述:内存管理在计算机组成原理和操作系统都是重点。计算机的核心部件就是cpu和主存,其他的都是配件。所以操作系统需要进一步管理主存资源,这里涉及更加具体的页式管理,段页式管理,以及虚拟内存。
内存管理概念
什么是内存管理?为什么要内存管理?
操作系统的内存管理就是对内存合理的使用,动态的规划,通过管理也可以叫做控制,可以让内存达到最高的利用率。是一种智慧干预的方式,提高了内存使用率。为什么要内存管理那?因为内存还是不够用。
内存管理的主要功能:
1)内存空间的分配与回收
2)地址转换(逻辑地址与物理地址)
3)内存空间的扩充(利用虚拟技术)
4)内存保护(保证作业互不干扰)
进程运行的原理
创建进程首先要将程序和数据装入内存,才能将源程序变成可以在内存中运行的程序。首先要编译(由编译程序将用户源代码转换为若干目标模块),然后要链接(由链接程序将编译后形成的一组目标模块以及所需要库函数链接到一起),最后装入,将整个装入模块装入内存。接下来详细介绍这三个步骤。
编译:编译就是把用户使用的高级语言代码转化为汇编程序,转化成为更底层的程序。
链接:程序链接就是将编译好的目标模块链接上必要的库函数。有三种链接方式:
1、静态链接:在装入内存之前把所有需要的库函数链接成一个完整的可执行程序,以后将不再打开。
2、装入时动态链接:将用户编译好的模块直接装入内存,采用边装入边链接的方式。
3、运行时动态装入(最佳):对某些大型的软件,所需要的库函数比较多,但是并不是每个模块都用得到。所以采用,在用这个模块的时候再链接上库函数。
装入:装入内存也有三种不同的方法
1、绝对装入,实际地址是代码中直接给出的,是固定的,也是静态的。所有很简单直接按照地址装入就行。只适合单道程序的环境。
2、可重定位装入,在多道程序环境下,多个目标模块的起始地址通常都是从0开始的,所以我们把0开始的地址叫作逻辑地址,这就需要重新定位转换成物理地址,才能把程序放到合适的内存空间中。此种方法也称为静态重定位,一次必须分配足够程序运行的内存空间。并且在整个运行过程中,不能移动地址。
3、动态运行时装入(动态重定位),相比于静态重定位,在装入后,并不转换逻辑地址为物理地址,而是在需要执行的时候,才转换。因此装入内存后的地址依旧是逻辑地址。这种方式需要一个重定位寄存器来记录如何转换成物理地址。通过这种方法,程序可以分配到不连续的存储区间,可以使用逻辑上更大地址空间。程序在初次创建的时候只申请一部分内存空间,根据需要动态申请分配内存。
逻辑地址和物理地址
逻辑地址是操作系统上层的程序使用的地址,物理地址是计算机中内存的地址。而中间就是操作系统,操作系统负责转换地址。这样不仅可以方便用户和应用程序猿,并且可以通过虚拟技术使用更大的逻辑地址空间。而对于操作系统,就负责转换这些地址,从逻辑地址转换到物理地址的过程就是重定位。
内存保护
内存保护有两层意思1、操作系统不能被用户进程影响(保护操作系统)2、用户进程之间不能互相影响。
有两种办法:
1)简单办法:设置一对上下限寄存器,默认作业使用的地址是连续,上下限寄存器中保存着上限地址和下限地址,每次运行前要判断有没有越界。(虽然简单,但是地址必须是连续的)
2)使用重定位寄存器和界地址寄存器来实现这种内存保护。重定位地址的功能是用来转换逻辑地址的,因为地址在物理上可能不连续,所以我们在逻辑地址上来判断有无越界。如果判断通过,则通过界地址寄存器转换为物理地址。
覆盖与交换(用来扩充内存的技术)
覆盖已经过时是交换技术的过渡版本。
交换(对换):交换的基本思想就是把内存中的暂时在等待状态的进程从内存中调到辅存中去。把内存空间腾出来叫换出,再把准备好竞争cpu资源的进程放进内存,这叫换入。
交换需要注意以下几个问题:
1、交换需要备份存储。
2、为了有效使用cpu,运行时间要比交换时间长的多
3、如果换出进程,必须保证进程是空闲的。
4、交换所用的空间是磁盘的一块,是独立于文件系统的。
5、交换通常用于在有许多进程运行且内存空间不够的时候使用。
6、普通的交换使用并不多,但是此种方法的变种很多。、
ps:现代操作系统主要是使用虚拟内存的方式来解决内存不足的问题。