主存储器,简称主存,又称内存储器(内存),用来存放计算机运行期间所需的程序和数据,CPU可以直接随机地对其进行访问,程序执行前需要先放到内存中才能被CPU处理,主要作用是 缓和CPU与硬盘之间的速度矛盾。
内存中有一个个的小房间,每个小房间就是一个存储单元,内存地址从 0 开始,每个地址对应一个存储单元。如果计算机按字节编制,每个存储单元大小为 1 字节,即 8 个二进制;如果计算机按字编址,每个存储单元大小为 1 个字。若字长为 16 位,则每个存储单元大小为 16 个二进制。若字长为 32 位,则每个存储单元大小为 32 个二进制。
补充:几个常用的数量单位
111 B = 888 bit 2102^{10}210 = 111 K (千) 2202^{20}220 = 111 M (兆,百万) 2302^{30}230 = 111 G (千兆,十亿)
111 GB = 2102^{10}210 MB = 2202^{20}220 KB = 2302^{30}230 B = 888*2302^{30}230 bit
例:一台手机/电脑 有 444GB 内存
是指该内存中可以存放 444*2302^{30}230 个字节。如果是按字节编址的话,也就是有 444*2302^{30}230 = 2322^{32}232 个小房间。这么多小房间,需要 2322^{32}232 个地址才能标识,所以地址需要用 323232 个二进制位来表示(000 ~2322^{32}232-111)
虽然计算机技术飞速发展,内存容量也在不断扩大,但仍然不可能将所有用户进程和系统所需的全部程序与数据放入内存,因此操作系统对内存空间进行合理的划分和有效的动态分配。操作系统对内存的划分和动态分配,就是内存管理的概念。
操作系统作为系统资源的管理者,主要负责:
① 内存空间的分配与回收:OS 要怎么记录哪些内存区域已经被分配出去了,哪些又还空闲;当进程运行结束之后,如何将进程占用的内存空间回收。
② 内存空间的扩充:OS 利用虚拟内存技术或自动覆盖技术使得系统运行很大的程序,从逻辑上扩充内存。
③ 地址转换:为了使编程更方便,程序员写程序时应该只需要关注指令、数据的逻辑地址。而 逻辑地址到物理地址的转换(这个过程称为地址重定位)应该由操作系统负责,其中 地址重定位有三种方式。
④ 内存保护:保证各进程在各自存储空间内运行,互不干扰。
创建进程首先要将程序和数据装入内存。将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤:
① 编译: 由编译程序将用户源代码编译成若干个目标模块,编译就是把高级语言翻译为机器语言。
② 链接: 由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块。
③ 装入(装载): 由装入程序将装入模块装入内存运行。
编译后,每个目标模块都是从 0 号单元开始编址,这称为该目标模块的 逻辑地址 (或相对地址)。当链接程序将各个模块连接成一个完整的可执行目标程序时,链接程序顺序依次按各个模块的相对地址构成统一的从 0 号单元开始编制的 逻辑地址空间。用户程序和程序员只需知道逻辑地址,而内存管理的具体机制则是完全透明的,只有系统编程人员才会涉及内存管理的具体机制。不同进程可以有相同的逻辑地址,因为这些相同的逻辑地址可以映射到内存的不同位置。
物理地址空间 是指内存中物理单元的集合,它是地址转换的最终地址。进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换成物理地址(动态重定位是地址转换推迟到程序真正要执行时才进行),这个过程称为 地址重定位。
注:以上两段,重点在于理解
静态链接
在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
装入时动态链接
将各 目标模块装入内存时,边装入边链接的链接方式。
运行时动态链接
在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。
绝对装入
在编译与链接后,得到的装入模块指定 直接使用了绝对地址。
静态重定位(可重定位装入)
装入时对地址进行重定位,即将逻辑地址变换为物理地址,地址变换是在装入时一次完成的。
静态重定位的特点: 在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。
动态重定位(动态运行时装入)
装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址(装入时依然保持使用逻辑地址),而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。
动态重定位特点: 可以将程序分配到不连续的存储区中;在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间;采用动态重定位时允许程序在内存中发生移动。
注:链接的作用是形成了完整的装入模块与逻辑地址,但逻辑地址到物理地址的转换过程是重定位,而不是装入。
内存分配前,需要保护 OS 不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。用户进程可采取以下两种方法:
设置一对上下限寄存器
利用重定位寄存器 和 界地址寄存器
在多道程序环境下用来扩充内存的两种方法:
基本思想:将程序分为多个段(多个模块)。常用的段常驻内存,不常用的段在需要时调入内存。
内存中分为一个 固定区 和若干个 覆盖区。需要常驻内存的段放在 固定区 中,调入后就不再调出(除非运行结束)。不常用的段放在 覆盖区,需要用到时调入内存,用不到时调出内存。并且 必须由程序员声明覆盖结构,操作系统完成自动覆盖。
缺点: 对用户不透明,增加了用户编程负担;覆盖技术 只用于早期的操作系统中,现在已成为历史。
基本思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)。
中级调度(内存调度),采用的就是交换技术;暂时换出外存等待的进程状态为挂起状态(挂起态)挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态。
注:PCB 会常驻内存,不会被换出外存。因为进程被换出外存后,系统需要通过PCB对进程进行管理。
下列措施中,能加快虚实地址转换的是( C )。
Ⅰ.增大快表(TLB)容量 Ⅱ.让页表常驻内存 Ⅲ.增大交换区(swap)
A.仅Ⅰ B.仅Ⅱ c.仅Ⅰ Ⅱ D.仅Ⅱ Ⅲ
(来源:2014年408真题)
解析: 虚实地址转换,即逻辑地址与物理地址的转换。
增大快表容量:可增加查询快表命中的概率。
让页表常驻内存:在采用多级页表的请求分页存储管理系统中,页表常驻内存可保证在查询页表时不会发生缺页、调页的情况,从而加快地址转换。
因此,增加交换区对地址转换的速度无影响.