程序地址空间
地址:内存地址—对内存以字节为存储单元的一个编号,通过地址就能找到具体对应的内存单元
我们所说的地址是一个虚拟的地址空间,只是一堆地址编号的描述,非物理内存地址;虚拟地址不具备存储能力,数据存储依然放到物理内存中
进程中访问的地址都是虚拟地址,非物理内存地址
程序地址空间也是一个虚拟地址空间,是操作系统为进程通过一个 mm_struct 结构体所描述的一个假的地址空间
mm_struct (task_size, start_codde, end_code) 通过大小及区域的编号描述
问:进程直接访问物理内存有什么不好?
答:(1)进程在编译时,编译器会给指令和数据进行地址编号,但如果某个地址内存被占用,程序就运行不起来了。(编译器地址管理麻烦)
(2)进程直接访问物理内存,如果有一个野指针,在操作时可能把其他进程中的数据改变了。(无法进行内存访问控制)
(3)程序运行加载通常要使用一块连续的内存空间。(对内存利用率较低)
通过虚拟地址空间映射到物理内存上进行数据存储,可实现数据在物理内存上离散式存储,提高内存利用率
在CPU和物理内存之间进行地址转换时,MMU将地址从虚拟地址空间映射到物理内存空间
MMU:内存管理单元,一种负责处理中央处理器(CPU)的内存访问请求,功能包括虚拟地址到物理地址的转换、内存保护、中央处理器高速缓存的控制。
问:程序地址空间如何存储数据?
答:通过页表进行映射,通过虚拟地址找到物理地址,进而访问物理内存
问:为什么?
答:(1)进程可以拥有一个完整的连续的线性空间
(2)通过页表映射获取物理地址,实现数据在内存上的离散式存储,提高内存利用率
(3)通过页表进行映射访问,可以实现更强的内存访问控制
分页式的内存管理:
页表:页号,物理地址,缺页中断....
虚拟地址的组成:页号+页内偏移
映射逻辑:拿到虚拟地址,解析出页号,通过页号在页表中找到对应的页表项,取出页表项中的物理地址,与页内偏移进行相加
分段式的内存管理:将内存分为各个段(编译编译器进行地址管理)
段表:段号+段内偏移
地址的组成:段号+物理内存段起始地址;
映射逻辑:拿到虚拟地址,解析出段号,通过段号在段表中找到对应的段表项,取出段表项中的物理地址,与段内偏移进行相加
段页式的内存管理:将内存进行分段,在每个段内采用分页管理
缺页中断:通过虚拟地址,找到页表项之后,如果当前地址本来存放的数据不在内存中,就会触发缺页中断
问:为什么一个数据没在内存中?
答:当物理内存不够用的时候,操作系统会根据一定的算法, 找出一块物理内存,将其中的数据放到磁盘的交换分区中进行存储,腾出这块内存进行使用。当触发缺页中断的的时候,这块内存中的原有数据重新被置换回来。(内存置换法:最久未使用)