mirror of
https://github.com/Didnelpsun/CS408.git
synced 2026-02-12 23:26:04 +08:00
Update 2-memory-management.md
This commit is contained in:
@@ -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$,段号并不占内存空间。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user