目录
内存的作用与特点
- 内存(RAM):
- 临时存储运行中的程序和数据,与CPU高速联系,速度远超过硬盘。内存的突出的性能特点使其成为计算机体系结构中至关重要的部分。
- 内存是易失性存储器,当电源关闭或故障时,存储在内存中的数据将丢失。
存储单元
- 地址与编码:
- 内存中的每个存储单元都用一个唯一的地址表示,地址从0开始递增。每个存储单元的大小通常为1字节,但可以根据需要配置为更大的单位。
- 按字节与按字编址:
- 按字节编址:适用于绝大多数现代计算机,每个地址指向一个字节。
- 按字编址:在某些特定的硬件架构中,若字长为16位,则每个存储单元大小为2字节。这种编址方式在高效处理特定数据类型时非常有用。
逻辑地址与物理地址
-
逻辑地址:在程序编译、链接时生成的地址。在程序执行期间,逻辑地址会被CPU用来访问内存中的数据,通常是相对地址。
-
物理地址:指在内存中实际存在的地址,用于定位数据的确切位置。操作系统负责将逻辑地址映射到物理地址。
从写程序到装入程序的流程
-
编译:
- 将用高层语言编写的源程序,通过编译器转换为低层次的机器代码(目标模块)。该模块包含了执行所需的指令和数据。
-
链接:
- 链接器将目标模块和所需的库函数进行链接,生成一个完整的装入模块,包含所有地址、符号等信息。
-
链接方式:
- 静态链接:
- 在程序运行之前完成链接。
- 优点:执行效率高,不需运行时依赖。
- 缺点:程序的修改要重新编译和链接,导致内存占用增加(库的重复存储)。
- 装入时动态链接:
- 在程序运行之前链接部分库函数,但不链接所有。
- 优点:提高效率,同时允许程序的动态更新。
- 运行时动态链接:
- 仅在需要时才装入和链接目标模块。
- 优点:提高了装入效率和内存利用率,便于模块的共享。
- 静态链接:
-
装入:
- 通过装入程序将目标模块加载到内存中,创建物理地址。
-
装入方式:
- 绝对装入:
- 编译时产生绝对地址。适用于简单的单道程序环境,但灵活性差。
- 可重定位装入(静态重定位):
- 装入时进行一次性地址转换,利用重定位信息将逻辑地址映射为物理地址。
- 固定长度,灵活性不足,不适用于现代复杂的操作系统。
- 动态运行时装入(动态重定位):
- 使用重定位寄存器在运行时动态转换逻辑地址为物理地址。
- 允许程序在内存中动态分配和移动,提高了程序的灵活性和有效管理。
- 绝对装入:
重定位
重定位是指在程序被装入内存执行的过程中,修改程序代码中指令和数据的地址,使其能够正确指向物理内存中的位置。重定位支持的类型包括:
-
静态重定位:
- 在程序加载时进行地址转换,一般使用在静态链接的程序中,操作系统需预先知道物理地址的空间。
-
动态重定位:
- 通过运行时重定位寄存器实现地址转换,允许程序在内存中的任意位置装入和执行,提高了内存的利用率。
内存分配策略
为了高效地使用内存,各种内存分配策略被引入,以管理可用内存资源:
-
分区分配:
- 将内存分成多个固定大小或动态大小的分区,适用于不同大小的进程。
-
动态分配:
- 进程在运行时动态请求所需内存。常用方法有分配连续空间(如堆)和链式分配。
-
分页管理:
- 将进程的逻辑地址空间划分为固定大小的页,物理内存相应划分为页框,允许不连续的内存分配,大大减少外部碎片。
-
段式管理:
- 将进程的内存分成段,每个段大小不固定,依据逻辑结构来划分,适应程序的逻辑划分,提高了内存利用率。
-
虚拟内存:
- 允许程序使用比物理内存更大的逻辑地址空间,通过页面置换算法,将不常用的内存页移动到辅助存储(如硬盘),进而实现高效内存管理。