diff --git a/Operate-System/2-memory-management.md b/Operate-System/2-memory-management.md index 09c1e4a..a86b0b3 100644 --- a/Operate-System/2-memory-management.md +++ b/Operate-System/2-memory-management.md @@ -58,14 +58,14 @@ 将逻辑地址转换为物理地址: -1. 绝对装入(单道程序阶段、未产生操作系统):在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。 +1. 绝对装入(单道程序阶段、未产生操作系统):在**编译**时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。 + 绝对装入只适用于单道程序环境。 + 程序中使用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。 + 通常情况下都是编译或汇编时再转换为绝对地址。 -2. 静态重定位(可重定位装入)(多道批处理操作系统):编译、链接后的装入模块的地址都是从$0$开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,使用单独的装入程序将装入模块装入到内存的适当位置。装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)。 +2. 静态重定位(可重定位装入)(多道批处理操作系统):编译、链接后的装入模块的地址都是从$0$开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,使用单独的装入程序将装入模块装入到内存的适当位置。**装入**时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)。 + 静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。 + 作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。 -3. 动态重定位(动态运行时装入)(现代操作系统):编译、链接后的装入模块的地址都是从$0$开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。 +3. 动态重定位(动态运行时装入)(现代操作系统):编译、链接后的装入模块的地址都是从$0$开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要**执行**时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。 + 采用动态重定位时允许程序在内存中发生移动。 + 可将程序分配到不连续的存储区中:在程序运行前只需裂入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存。 + 便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。 @@ -119,7 +119,7 @@ ### 动态分区分配 -+ 动态分区分配又称为可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数目是可变的。 ++ 动态分区分配又称为可变分区分配。这种分配方式不会预先划分内存分区,而是在进程**装入**内存时根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数目是可变的。 + 记录分区的方法: + 空闲分区表:每空闲分区对应表项。表项中包含分区号、分区大小、分区起始地址、分区状态等信息。 + 空闲分区链:每个分区的起始部分和末尾部分分别设置前向指针和后向指针。起始部分处还可记录分区大小等信息。 @@ -203,7 +203,7 @@ + 进程的每一页对应一个页表项。 + 每个页表项由“页号”和“块号”组成。完成从逻辑的页号向物理的块号的映射。 + 页表记录进程页面和实际存放的内存块之间的对应关系。 -+ 当进程未执行,则页表始址和页表长度在其$PCB$中,执行时将其装入$PTR$中从而进驻内存。 ++ 当进程未执行,则页表始址和页表长度在其$PCB$中,执行时将其装入$PTR$(页表始址寄存器)中从而进驻内存。 假设某系统物理内存大小为$4GB$,页面大小为$4KB$,则每个页表项至少应该为多少字节? @@ -280,6 +280,7 @@ + 程序分多个段,各段离散地装入内存,为了保证程序能正常运行,就必须能从物理内存中找到各个逻辑段的存放位置。为此,需为每个进程建立一张段映射表,简称“段表”: 1. 每个段对应一个段表项,其中记录了段号、该段在内存中的起始位置(又称“基址”)和段的长度。 2. 各个段表项的长度是相同的。 ++ 即使段是共享的,但是不同的程序中使用,其段号也是不同的。 某系统按字节寻址,采用分段存储管理,逻辑地址结构为(段号$16$位,段内地址$16$位),因此用$16$位即可表示最大段长。物理内存大小为$4GB$(可用$32$位表示整个物理内存地址空间)。因此,可以让每个段表项占$16+32=48$位,即$6B$。由于段表项长度相同,因此段号可以是隐含的,不占存储空间。若段表存放的起始地址为$R$,则$K$号段对应的段表项存放的地址为$R+K\times6$,段号并不占内存空间。