进程地址空间

首先引进一个c语言的代码

,这个代码,在c语言是可以编译通过的,但是你试试一旦运行呢,是不是直接系统就会崩溃,准确的是我们的进程崩溃了。为什么呢?

首先“abcde”这个字符串它的存储位置在哪里呢,字符串常量区,常量具有什么常性,const属性是不是,所以不可以通过地址修改。放在现在我们学习进程,权限来解释该怎么解释,对于一个进程来说,“abcef”,在什么区域,代码区———权限是只读的,所以并不可以修改

我们再看一个现象

你说这对吗,在子进程中,val的值是++的,父进程的val的值是不变的,然后就这样是一个地址?给谁谁都不信,这是怎么一回事呢?

结论是:这个地址绝对不是物理地址,这个地址是虚拟地址。

可以这么说,虚拟地址空间是Linux系统给进程绘制的一个大饼,什么意思呢?就是让每个进程都以为自己可以控制整个linux系统,其实不是,然后有一个叫做页表,它的作用是,存储虚拟地址和虚拟地址映射的物理地址,状态,权限等等。

所谓的虚拟地址空间,本质上就是一个内核数据结构对象(类似PCB)——为什么这么说呢?就是它吧进程的好多信息都存储在这个空间里,然后进行管理,这不就是先描述,再组织。

我们可以大概看一下各个区域的地址,堆区的地址是逐渐变高的,栈区的地址是逐渐变低的。

一:进程地址空间

什么是地址空间:32位机器下,32位的地址和数据总线,然后用高低电频区分0/1,利用高低电频,形成数据,可以传给CPU,所以地址空间,就是这些线形成的地址范围  0~2^32;

2.理解区域的划分

2.1小时候,我们坐同桌,有时候是不是存在一根三八线啊,然后你的桌子就被规定了范围,这个划分也和这个道理类似,再进程空间中,包含着一个结构体,里面存储着各个区域的划分,也就是开始和结束

2.2地址本身就是一个数字,可以被保存在unsigned long(4字节),空间范围内的地址,我们可以随便调用,暂时不需要记住它的地址

3 页表:

简单点说,页表就是前面是虚拟地址,后面是映射的物理内存地址,然后里面还要存储的权限,还有对于物理内存的真实状态。

这个状态标记着:是否在物理内存中开辟了区域。作用是:1.分批加载 2.挂起等操作。什么叫分批加载呢,通过进程的优先级,系统会选择优先调度,一些事加载过了,被切换出去了,另外还有没有加载的,未被加载的,先不在物理内存中开辟空间,等到轮到它的时候,在进行开辟,然后更新页表的映射的物理内存地址

4.父进程和子进程的代码和数据关系

1.首先 代码两者是共享一套代码,也就是父子通过虚拟地址,映射到同一个内存区域。虽然进程具有独立性,但是为什么代码不怕独立性误会而共用呢? 是因为代码的权限是只读的,没有修改和写入的权限,所以公用一套也不会影响

其次,如果不修改数据的话,其实父子进程数据也会共享。如果修改的话,因为进程具有独立性,所以会先申请内存空间,拷贝修改的数据内容,再进行修改,再更新子进程的页表--映射的物理地址。虚拟地址不变,只变映射的物理内存。这个拷贝机制,是os自己完成的写时拷贝。

补充:关于遍历和地址:在形成汇编之后,其实所有的变量就是地址

   进程: 内核数据结构(PCB+mm_struct +页表)+自己的代码和数据: mm_struct结构描述了一个进程的整个虚拟地址空间

  进程的独立性:内核数据每个各一份,代码和数据也是保持独立性。

5.mm_struct

,,因为它也是一个结构体,结构体就要初始化——各个区域的大小信息就有了,执行的程序:1分段 2包含属性。

三:综合理解

1.为什么要有虚拟地址要有页表

1.1虚拟地址空间+页表:可以做到保护内存:<1> 状态--开辟还是未开辟空间  <2> 虚拟地址和物理内存地址一一对应。如果没有页表和虚拟地址的话,加入一个不是一个真实的物理内存存在的地址,它不就是野指针了,不久出现大问题了。

1.2进程管理和内存管理在系统层面高度耦合了,进程可以先用虚拟地址骗进程继续使用,不用立马申请空间,但是在需要的时候,立马申请空间。

1.3让进程统一视角看待物理内存--没有权限之分,也就是进程都是同样对物理内存进行分配。

2怎么做到地址空间的管理 

地址空间本身就是一个mm_struct,所有内容都是os系统自动完成调用的,其实把进程管理好了就是把地址空间管理好了,每个进程分配好地址空间,地址空间充分利用,不就是管理好了

3 全局变量, 字符串常量都具有全局性,在程序运行期间一直有效

原因:地址空间是随着进程一直都存在的,而全局变量这类的数据的虚拟地址一直都在页表里,进程不就是由 页表+地址空间+PCB组成的吗,所有进程在,页表就在,虚拟地址一直都在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值