程序地址空间

Linux下看到的地址

先来看一段代码:
在这里插入图片描述

在这里插入图片描述
可以看到父子进程输出的内容一样,地址一样,这很好理解因为子进程是以父进程为模板的。

将代码修改一下后:

在这里插入图片描述在这里插入图片描述
可以看到,父子进程输出的内容不一样,这说明父子进程输出的不是一个变量,但是地址却是一样的。

这是什么原因呢?

首先要知道,我们通常所说的地址都是内存单元的编号,实际上硬件内存是不会有这些划分的。
实际上,在进程中程序访问的这些地址都是虚拟地址。是系统给进程描述的。


程序地址空间概念

程序地址空间: 进程的虚拟地址空间,系统给进程描述的虚拟地址空间。
在Linux中是mm_struct结构体,这个结构体包含了起始位置和大小等信息。

为什么需要虚拟地址?

让进程访问虚拟地址,使进程有一个完整的、线性的、连续的地址使用,并且系统为进程创建一个页表,用来映射虚拟地址和物理地址的关系,从而就能实现数据在物理内存上的离散式存储,提高内存利用率,并能够进行内存访问控制。

在这里插入图片描述

内存管理方式:

分段式:

  1. 优点:将地址空间分为多段,便于编译器管理。
  2. 分段式虚拟地址组成:段号+段内地址偏移量;段表段号+物理端地址

分页式

  1. 优点:堆内存进行分块进行数据离散式存储,提高利用率和访问控制。
  2. 分页式虚拟地址组成:页号+页内地址偏移量;页表段号+物理块地址

段页式

  1. 优点:综合分段和分页的优点。
  2. 分页式虚拟地址组成:对内存先分段,在每个段内分页。

缺页中断

概念:
通过虚拟地址进行页表映射访问物理内存时发现数据不再物理内存中。

产生原因:交换内存
磁盘分为文件系统分区和交换分区。
在这里插入图片描述

当物理内存不够使用的时候,将物理内存中不活跃的数据放到交换分区中,腾出的物理内存可以给新的程序数据使用。

什么样的不活跃数据会被放到交换分区中呢?

这里会用到一些算法:
LRU最近最久未使用页面淘汰算法,LFU最近最少使用页面淘汰算法……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值