内存的基本概念
什么是内存,有何作用
内存是用于存放数据的硬件。程序执行前需要先放入内存中才能被CPU处理
存储单元
内存中也有一个一个的小房间,每个小房间就是一个存储单元。
如果计算机按照 字节编址,则每个存储单元的大小为1个字节,即1B,即8个二进制位。
如果字长为16位的计算机按字编址,则每个存储单元的大小为一个字;每个字的大小是一个16位的二进制,也就是俩字节。
内存地址
内存地址就是对存储单元编号,每个内存地址对应一个存储单元。
进程运行的基本原理
其实我们使用高级语言写的代码需要翻译成CPU能识别的指令才能执行。这些指令会告诉CPU应该去内存的那个位置存取数据。但是实际上生成指令的时候并不知道该进程的数据会被放在哪个位置。所以编译生成的指令一般是使用逻辑地址(也就是相对地址)
逻辑地址(相对地址);物理地址(绝对地址)
逻辑地址并不是数据存储的真实地址,它通常是我们写代码中操作的地址,真实的地址就是物理地址,物理地址才是将变量或其他数据放在存储单元的具体位置。逻辑地址在编译或装入、运行阶段编译成物理地址
从写程序到程序运行
- 编辑源代码文件
- 编译:由源代码文件生成目标文件(高级语言翻译成机器语言)
- 链接:由目标模块生成装入模块,链接后形成完整的逻辑地址
- 装入:由装入模块装入内存,装入形成物理地址
三种链接方式:
- 静态链接:装入前链接成一个完整的物理地址
- 装入时动态链接:运行前一边装入一边链接
- 运行时动态链接:运行时需要目标模块才装入并链接
三种装入方式:
- 绝对装入:编译时产生绝对地址(适用于单道批处理阶段,无操作系统)
- 可重定位装入:装入时将逻辑地址转换为物理地址(多道批处理阶段)
- 动态运行时装入:运行时将逻辑地址转换为物理地址,需设置重定位寄存器(现代操作系统)
内存管理的概念
操作系统是系统资源的管理者当然也要对内存进行相对应的管理 ,但是具体的话,需要管理哪些方面呢?
首先关于内存,肯定是有些内存已经分配的有资源还有一些是空闲的,操作系统需要管理内存空间的分配与回收;
当我们再电脑上玩游戏的时候,明明电脑运行时的内存很大,有些是远大于我们电脑的内存的,但是仍然可以运行,这个就是操作系统的虚拟技术,它从逻辑上对内存空间进行扩充;
操作系统需要提供地址转换功能负责将程序的逻辑地址与物理地址进行转换。
内存空间的分配与回收
连续分配管理方式
连续分配是指为用户进程分配的内存空间一定是连续的
单一连续分配:
内存被分为系统区和用户区。系统通常位于内存的低地址部分,用于存放和操作系统相关的数据;用户区一般在高地址部分存放用户进程相关的数据。内存中只能有一道用户程序,用户程序独占整个用户区空间。
优点:实现简单;没有外部碎片;可以采用覆盖技术扩充内存;不一定需要内存保护。
缺点:只能用于单用户、单任务的操作系统中;有内部碎片(其实就是给用户进程分配的内存有些没用上就是内部碎片);存储器利用率低。
固定分区分配:
为了能在内存中装入多个程序,并且程序之间不会互相影响,于是将整个用户分空间划分为若干个固定大小的分区,每个分区中放一个作业,这样就形成了早期的运行多道程序的内存管理方式。
固定内存分配又分为两种:一个是分区大小相等,另一个就是分区大小不等。
分区大小相等:
取法灵活性,但是很适用于相同作业同时运行
分区大小不等:
增加了灵活性,可以满足不同大小的进程需求。根据句在胸膛中运行作业的大小进行划分(比如划分多个小分区,少量大分区,适量中分区)
操作系统需要加上一个分区说明表,用来分配分区和回收分区,其实这个分区说明表就是一个数据结构,里面一般含有以下属性:分区大小,起始地址,分区状态,分区编号。
当一个用户进程要装入内存中时,由操作系统内核程根据用户程序大小检索该表,从中找到一个能满足条件大小并且未分配状态的分区分配给该程序,然后修改转态为已分配。
优点:实现简单,无外部碎片
缺点当用户程序太大时,可能所有的分区都不能满足需求,此时不得不才用覆盖技来解决,但这个会降低性能;同样这种内存分配方式也会产生内存碎片,内存利用率降低。(好比一个程序需要10M内存但是扫面所有分区后没有10M内存的分区只有15M的分区,所以就分配到15M分区里面,但是这里面有5M的空间是空余的就造成了内部碎片)
动态分区分配
动态分区分配又称为可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的进入顺序动态地建立分区,并使分区大小刚好合适。俗称来一个分配一个;因此动态分区的分区数量和大小都是可变的。
动态分区是没有内部碎片的但是有外部碎片。
外部碎片
就是内存的一些分区大小太小难以利用;
如果出现空闲分区的大小总和满足程序所需要的内存空间, 但是他们空闲的内存分区每一个都不能独立满足程序所需的大小。这时可以通过拼凑技术解决外部碎片。修改空闲分区的起始地址让他们联合在一起满足程序所需内存大小。
回收内存碎片的时候可能遇到的四种情况
- 回收之后有相邻的空闲分区
- 回收之前有相邻的空闲分区
- 回收前后都有相邻空闲分区
- 回收前后都没有相邻空闲分区
非连续分配管理方式
也即是给用户进程分配内存空间的时候分配的内存是不连续的
内存空间的扩充
覆盖技术
思想:一个程序运行起来太大内存不够,那就将程序分为多个段(模块)常用的段调入内存,不常用的段需要的时候才调入。
一个固定区,存放最活跃(常用的)的程序段。固定区中的程序段在运行过程中不会调入与调出。
若干覆盖区,覆盖区不能同时访问程序段可共享的一个覆盖区,覆盖区中的程序段在运行过程中会根据需要调入调出。
缺点:必须由程序员实现覆盖结构,操作系统完成自动覆盖,对用户不透明,增加了程序员的编程负担。
交换技术
设计思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存。(进程其实是在内存和磁盘之间动态调度)
应该在磁盘的哪个位置保存被换出的进程?
磁盘分为文件去和对换区,换出的进程放在对换区
什么时候进行交换?
交换通常在许多进程运行且内存吃紧时才进行,而系统负荷降低就暂停。
应该换出哪些进程?
可以优先交换出阻塞进程;也可换出优先极低的进程;为了防止优先级低的进程饿死,有的系统会考虑进程在内存的驻留时间。
覆盖于交换的区别:
覆盖实在同一个进程中的