【Linux】进程地址空间

一、内存分布

程序的地址分布

在最初学习的时候,我们认为全局变量和只读字符存在于数据区中,普通变量在栈区,动态开辟的内存存放在堆区

这里讲一下堆和栈的数据存放:

关于堆区:是向上增长的,数据从低地址开始放到高地址

关于栈区:os会在高地址开辟一段空间,向里面存放数据 数据是从底往高放 ,如果栈数据要增长,则会在原先开辟空间下方又开辟一段空间,所以我们会认为栈是向下增长。

在堆和栈中,存在一块共享区,确保空间不会被过度浪费。

当我们的代码里面有一个数据 此时创建一个子进程并修改其父进程变量的值 同时我们获取它们俩个变量的地址  此时会发现奇怪的现象。

在linux下 父进程和子进程的g_val的值不同,可是g_val的地址指向同一个空间。

这里合理的解释是:

父进程和子进程具有相对独立性,进程是内核数据结构和代码数据组成,独立性体现在内核数据上。所以在父进程里修改数据,进程会进行写时拷贝,在原有的数据拷贝一份,并进行修改。因此我们可以理解g_val数据的不同

但是对于父进程和子进程的g_val的数据不同,而地址相同,又是怎么回事呢?同一块空间有俩种数值?显然说不通。

因为,可以发现,语言底层说的地址,并不是实实在在的物理地址,而是虚拟地址。

二、进程地址空间

1).mm_struct结构体

对于进程地址空间,其实是一种映射的关系

我们平常所说的地址,其实就是mm_struct结构体中的一个成员。是一个虚拟地址

虚拟地址通过页表MMU映射到物理空间。

进程就是pcb和代码数据,而mm_struct就存在于pcb结构体中。一个进程被创建,os就会创建pcb同时生成虚拟地址,虚拟地址通过页表,映射到物理内存。

2).什么是页表?

一个虚拟地址,对于一个物理地址。在页表中,左边是虚拟地址,右边是物理内存地址,同时os还会在页表的第三列标注权限。页表中还存在偏移量,确保访问多少字节。例如有这样的关系:
 

关于进程地址空间(虚拟地址)是从0x00000000 到0xffffffff 划分

地址空间就是线性的,每一个地址对应就是对应一个字节

我们会定义一个int变量,实际上 4字节的int每个字节都有一个地址,那么int的地址是首位还是末尾? 首位。具体是首位加上偏移量 就可以确定字节数。

3).地址空间的确定

32位的地址空间大小位4GB,设置进程地址空间的办法是标识begin 和 end

struct mm_struct

{
        long  code_start;

        long code_end;

        long  inint_start;

        long  inint_end;

}

确定空间的边界范围就是划分数据的大小 ;

要更改某个区域的大小,实际上就是调整begin 和 end ;

三、地址空间存在的意义

1.让进程以统一的视角看待内存,任意进程都可以通过地址空间和页表映射到杂乱无章的内存,变有序管理;

2.通过地址空间,可以有效安全的检查边界问题。

如果没有地址空间,pcb会被随机放在内存当中,如果某个程序有问题:如非法寻址,野指针,越界访问另一个进程的数据,因此某个进程会被修改。进程的独立性就无法保障。

四、缺页中断

os一般不答应任何浪费的、不高效的空间申请,会有一小段的时间闲置状态

当malloc申请空间时,虚表处只填写虚拟内存,当经常要对空间写入时,重现申请空间,把映射关系创建好,这样就算一个庞大的内存数据,只要切换够快,就无需大量的空间。

这个先填写虚拟内存,在写入时申请物理内存的机制叫做缺页中断。

描述地址相同的原因

修改前,父进程、子进程数据区的为同一块;

当要父进程发生修改时,子进程映射找到value,读到100

因为进程间的独立性,父进程不影响子进程就要在内存中重新申请空间,进行拷贝数据,然后修改value,最后改变页表中的物理地址,此时虚拟地址没有改变,就存在了不同数据对应同一块空间。

总结   


关于进程地址空间,其实就是一个大编号,通过页表映射到物理内存中,实现对无序内存的统一管理,并且保障了安全性,确保进程的独立性。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度搜索

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值