虚拟内存、分段分页
什么是虚拟内存?
虚拟内存是一种内存管理技术,它让每个进程(运行中的程序)拥有自己的独立地址空间。虚拟内存的主要目的是通过在物理内存和硬盘之间进行数据交换,提供一个比实际物理内存更大的可用内存空间。
虚拟内存的实现方式
- 虚拟地址空间:每个进程认为它有一大块连续的内存可用,这叫做虚拟地址空间。操作系统会将这些虚拟地址映射到实际的物理内存地址。
- 地址转换:这种映射由硬件组件(如MMU,内存管理单元)和操作系统共同管理。MMU将虚拟地址转换为物理地址。
- 页面调度:操作系统会将不常用的内存页面(固定大小的数据块)暂时存储到硬盘上(称为换出或分页出),而将需要用到的页面从硬盘加载到物理内存中(称为换入或分页入)。
为什么需要虚拟内存?
-
扩展内存容量:
- 虚拟内存允许程序使用比实际物理内存更大的地址空间。比如一个拥有4GB物理内存的计算机,可以支持程序使用数十GB的虚拟内存。
-
进程隔离:
- 每个进程都有独立的虚拟地址空间,这样一个进程的错误(比如访问非法地址)不会影响到其他进程,提高系统的稳定性和安全性。
-
内存保护:
- 操作系统可以设置不同内存区域的访问权限(读、写、执行),防止恶意或错误的访问。例如,代码段可以设置为只读,数据段可以设置为读写。
-
简化编程:
- 程序员不必关心实际的物理内存布局,只需关注程序的逻辑地址。操作系统负责将虚拟地址映射到物理地址,简化了内存管理的复杂性。
什么是内存分段和分页?
虚拟内存的实现依赖于内存分段和分页这两种技术。
内存分段(Segmentation)
内存分段是一种逻辑上的内存管理方式,将内存分成若干个段,每个段对应不同类型的数据,如代码段、数据段和堆栈段。
分段的技术细节
- 段描述符:每个段有一个段描述符,包含段基址(Base Address)和段限制(Limit)。
- 段表:操作系统维护一张段表(Segment Table),其中记录了所有段的段描述符。
- 段选择子:CPU中的寄存器保存段选择子,用于选择当前使用的段。
- 段保护:每个段可以有不同的权限和属性,如只读、可读写、可执行等。
分段的优点
- 逻辑结构清晰:将程序的不同部分分割成独立的段,方便管理。
- 灵活性:段的大小可以动态调整,适应不同的需求。
- 安全性:通过段描述符中的权限设置,防止非法访问。
内存分页(Paging)
内存分页是将虚拟内存和物理内存都划分为固定大小的块,虚拟内存的块称为页(Page),物理内存的块称为页框(Page Frame)。
分页的技术细节
- 页表:每个进程有一个页表(Page Table),记录虚拟页面到物理页框的映射关系。
- 页号和偏移量:虚拟地址由页号(Page Number)和页内偏移量(Offset)组成,页号用于索引页表,找到对应的页框。
- TLB(Translation Lookaside Buffer):一种高速缓存,用于加速虚拟地址到物理地址的转换。
分页的优点
- 内存利用率高:由于页的大小固定,减少了内存碎片,提高了内存利用率。
- 简化管理:操作系统通过页表管理内存映射,自动处理内存分配和回收。
- 支持虚拟内存:可以方便地将不常用的页换出到硬盘,需要时再换入到物理内存。
虚拟内存的工作流程
- 进程请求内存:当一个进程需要访问内存时,它会生成一个虚拟地址。
- 地址转换:MMU使用页表将虚拟地址转换为物理地址。如果所需的页在内存中,直接返回物理地址;如果不在,则发生缺页中断。
- 处理缺页:操作系统暂停进程,找到所需的页并将其从硬盘换入到物理内存。可能需要将一些不常用的页换出到硬盘。
- 更新页表:更新页表中的映射关系,恢复进程继续执行。