Linux——程序地址空间

程序地址空间

地址:内存地址—对内存以字节为存储单元的一个编号,通过地址就能找到具体对应的内存单元

我们所说的地址是一个虚拟的地址空间,只是一堆地址编号的描述,非物理内存地址;虚拟地址不具备存储能力,数据存储依然放到物理内存中

进程中访问的地址都是虚拟地址,非物理内存地址

程序地址空间也是一个虚拟地址空间,是操作系统为进程通过一个 mm_struct 结构体所描述的一个假的地址空间

mm_struct (task_size, start_codde, end_code)  通过大小及区域的编号描述

问:进程直接访问物理内存有什么不好?

答:(1)进程在编译时,编译器会给指令和数据进行地址编号,但如果某个地址内存被占用,程序就运行不起来了。(编译器地址管理麻烦)

(2)进程直接访问物理内存,如果有一个野指针,在操作时可能把其他进程中的数据改变了。(无法进行内存访问控制)

(3)程序运行加载通常要使用一块连续的内存空间。(对内存利用率较低)

通过虚拟地址空间映射到物理内存上进行数据存储,可实现数据在物理内存上离散式存储,提高内存利用率 

在CPU和物理内存之间进行地址转换时,MMU将地址从虚拟地址空间映射到物理内存空间

MMU:内存管理单元,一种负责处理中央处理器(CPU)的内存访问请求,功能包括虚拟地址到物理地址的转换、内存保护、中央处理器高速缓存的控制。

问:程序地址空间如何存储数据?

答:通过页表进行映射,通过虚拟地址找到物理地址,进而访问物理内存

问:为什么?

答:(1)进程可以拥有一个完整的连续的线性空间

(2)通过页表映射获取物理地址,实现数据在内存上的离散式存储,提高内存利用率

(3)通过页表进行映射访问,可以实现更强的内存访问控制

分页式的内存管理:

页表:页号,物理地址,缺页中断....

虚拟地址的组成:页号+页内偏移

映射逻辑:拿到虚拟地址,解析出页号,通过页号在页表中找到对应的页表项,取出页表项中的物理地址,与页内偏移进行相加

分段式的内存管理:将内存分为各个段(编译编译器进行地址管理)

段表:段号+段内偏移

地址的组成:段号+物理内存段起始地址;

映射逻辑:拿到虚拟地址,解析出段号,通过段号在段表中找到对应的段表项,取出段表项中的物理地址,与段内偏移进行相加

段页式的内存管理:将内存进行分段,在每个段内采用分页管理

缺页中断:通过虚拟地址,找到页表项之后,如果当前地址本来存放的数据不在内存中,就会触发缺页中断

问:为什么一个数据没在内存中?

答:当物理内存不够用的时候,操作系统会根据一定的算法, 找出一块物理内存,将其中的数据放到磁盘的交换分区中进行存储,腾出这块内存进行使用。当触发缺页中断的的时候,这块内存中的原有数据重新被置换回来。(内存置换法:最久未使用)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值