【操作系统】3.1 内存管理基础
1.内存管理的介绍
问题:操作系统的内存管理主要是做什么?
操作系统的内存管理主要负责①内存的分配与回收(malloc 函数:申请内存,free 函数:释放内存),②地址转换:将逻辑地址转换成相应的物理地址。
2.常见的内存管理方式
内存管理方式为连续分配管理方式和非连续分配管理方式这两种。连续分配管理方式是指为一个用户程序分配一个连续的内存空间,例如块式管理 。非连续分配管理方式允许一个程序使用的内存分布在离散或者说不相邻的内存中,例如页式管理、段式管理。
2.1 连续分配管理方式
块式管理
远古时代的计算机操系统的内存管理方式。将内存分为几个固定大小的块,每个块中只包含一个进程。如果程序运行需要内存的话,操作系统就分配给它一块。如果程序运行只需要很小的空间的话,分配的这块内存很大一部分几乎被浪费了。这些在每个块中未被利用的空间,我们称之为碎片。
2.2 非连续分配管理方式
(1)页式管理机制
把主存分为大小相等且固定的一页一页的形式,页较小,对比块式管理的划分力度更大,提高了内存利用率,减少了碎片。页式管理通过页表对应虚拟地址和物理地址。
(2)段式管理机制
页式管理虽然提高了内存利用率,但是页式管理其中的页实际并无任何实际意义。 段式管理把主存分为一段段的,每一段的空间又要比一页的空间小很多 。段是有实际意义的,每个段定义了一组逻辑信息,例如,主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。 段式管理通过段表对应虚拟地址和物理地址。
(3)段页式管理机制
段式管理和页式管理的共同点和不同点
共同点 :A.分页机制和分段机制都是为了提高内存利用率,较少内存碎片。
B.页和段都是离散存储的,所以两者都是离散分配内存的方式。但是,每个页和段 中的内存是连续的。
区别 :A.页的大小是固定的,由操作系统决定;而段的大小不固定,取决于我们当前运行的 程序。
B.分页仅仅是为了满足操作系统内存管理的需求,而段是逻辑信息的单位,在程序中 可以体现为代码段,数据段,能够更好满足用户的需要。
段页式管理机制:将进程按逻辑模块分段,每个段都有自己的段号,再将段分成若干大小固定的页。对内存空间的管理仍然和分页存储管理一样,将其分成若干个和页面大小相同的存储块,最后将进程的各个页分别装入各个内存块中。
例子:如下图所示,进程A大小为16KB,按逻辑进行分段,各个段大小分别为7KB,3KB和6KB。然后对各个段进行分页,假设页面大小为4KB,那么各个段都有各自对应的页面,即0号段分为两个页面0号页和1号页,1号段和2号段同理。在运行时将各个页放入内存块中,各个页之间同样不需要相邻。
段页式管理机制段页式管理机制中由于每个段又进行了分页,所以虚拟地址结构由段号、页号、页内地址(页内偏移量)组成。
段页式管理机制的虚拟机制结构① 段号的位数决定了每个进程最多可以分为几个段。
② 页号的位数决定了每个段最大有多少页。
③ 页内偏移量决定了页面的大小、内存块的大小是多少。
3.段表和页表
3.1 段表和页表
① 段表:每个段表项由段号、页表长度、页号(页表的起始地址)组成。每个段表项长度相等,段号是隐含的。
② 页表:每个页表由页号、内存块号组成。每个页表项长度相等,页号是隐含的。
例子:查找0号段对应的页表,0号段对应的页表存放在1号块,所以就可以得到0号段页表的起始地址。如果要查找0号段页表的页,根据页表也就可以找到相对应的内存块号,最后访问目标单元。
段页内存管理的段表和页表的关系3.2 快表和多级页表
分页内存管理的问题:
① 虚拟地址到物理地址的快速转换。—— 快表
② 虚拟地址空间大导致页表也很大的问题。—— 多级页表
(1)快表
操作系统在页表的基础上,引入了快表来加速虚拟地址到物理地址的转换。快表实质是使用CPU 高速缓冲存储器缓存的页表,其内容是页表的一部分或者全部内容。快表作为页表的缓存,其作用与页表相似,同时提高了访问速率。(采用页表关联虚拟地址和物理地址时,用户程序通过快表,只需要访问一次 CPU 高速缓存就可以通过虚拟地址找到物理地址。)
采用快表的进行地址转换的流程:
① 根据虚拟地址中的页号查快表;
② 如果该页在快表中,直接从快表中读取相应的物理地址;
③ 如果该页不在快表中,就访问内存中的页表,再从页表中得到物理地址,同时将页表中的该映射表项添加到快表中;
④ 当快表填满后,又要登记新页时,就按照一定的淘汰策略淘汰掉快表中的一个页。
(2)多级页表
① 单级页表
单级页表② 2级页表
将页表分为分为1024个表,每个表中包含1024个页表项,形成二级页表。二级页表结构的虚拟地址结构如下图。
2级页表4.虚拟地址和物理地址
(1)虚拟地址的概念
虚拟地址:虚拟地址并不真实存在于计算机中。每个进程都分配有自己的虚拟空间,而且只能访问自己被分配使用的空间。理论上,虚拟空间受物理内存大小的限制,如给有4GB内存,那么虚拟地址空间的地址范围就应该是0x00000000~0xFFFFFFFF。每个进程都有自己独立的虚拟地址空间。这样每个进程都能访问自己的地址空间,这样做到了有效的隔离。
(2)物理地址的概念
物理地址指的是真实物理内存中地址,即内存地址寄存器中的地址。