编译链接运行原理——(二)进程,虚拟地址空间,分段,分页机制

进程是执行中的可执行文件,与虚拟地址空间、内存和磁盘密切相关。虚拟地址空间解决了程序间的不安全性、内存利用率低和运行地址不确定等问题。分段提供独立的虚拟地址,防止程序间干扰;分页则通过按需加载和替换减少I/O操作。通常,页大小为4K,结合置换算法优化内存使用。

首先在说进程是如何运行之前,得先明白进程是个什么东西,它和可执行文件(程序),虚拟地址空间,内存,磁盘都是什么关系。

官话:进程就是在执行的可执行文件(程序)。

白话:菜谱是程序,人是CPU,炒菜的过程就是进程。

说到这,可能就有点疑问了,那这进程和这虚拟地址空间,内存,磁盘又有什么联系?别急听我慢慢道来,首先你炒菜光菜谱够吗?显然没菜在炒个锤子菜,你肯定得有菜,调料,锅对吧。那么同样的,程序只是指令的集合,没数据它又怎么跑。

紧接着就可以回答刚才的问题了,这些指令,数据可定得放个地吧?这不就是磁盘了么。有人肯定会有疑问为啥不放内存上,只要你家有钱当然也可以。开个玩笑明显是没法存放在内存上的,首先内存上的数据是非永久性的,不可能你废老半天劲写了几十行代码完事跑一遍没了,那还怎么玩对吧。再者你家内存多大,撑死8个G,讲道理要是放内存上LOL都玩不了了吧。

好了言归正传,说了这么多这虚拟地址空间是啥呢?这就得好好说道说道了。

首先呢,在很久以前程序在运行的时候,是直接从磁盘里读出来放内存上的。开始程序少还没啥感觉,不过这用着用着吧就有问题了。

  • 程序与程序之间不安全。因为都是直接放内存上的,一个程序不小心跑另一个程序里面改个东西又跑回来,是没啥感觉的。完事一看bug了还找不出是哪的问题,压根就不管自己事铁定找不到呀,这不崴泥了么。
  • 程序内存使用率太低,进进出出太耗时间。以前的时候内存小,放两程序就不够了,再来个的时候就得先把其他程序的数据先放回磁盘里,因为程序需要的内存还是连续的这家伙换出去一个也许还不够,你还得把另一个也换出去才行。大量的I/O,难顶。
  • 程序运行地址不确定。这个可要命了,应为程序每次加载地址都是不确定的,因为程序的很多指令跳转和目标地址都是确定的,跑上十次都不一定能成功一次,运行程序成了概率题。

那就在这个时候,分段,分页,虚拟地址空间就站出来了。

分段:就是给程序划分了一个虚拟地址空间,然后和根据偏移映射到物理内存上,虚拟地址空间是每个进程所独有的,因此如果某个程序想去串门就会被监测到,然后直接报错。上图理解下。

这是32位系统下4G的虚拟地址空间,为什么是4G因为32位机子下的寻址线是32根,2^32就是4G,64位的寻址空间就是2^64了。

至于为什么是这么分布的去看看书吧《程序员的自我修养》这里就不赘述了。

有人肯定会有疑问都是4G的空间在内存上咋大小不一样了呢?给你4G你也得就用了4G呀。A 10M B 5M 不就这样了么。如果还是不懂,宝贝翻书,《自我修养》。

即使分段这个操作已经很厉害了但是仍没解决第二个问题,内存不够了依然会有较大的I/O,这时候就上分页了。

分页:因为人们发现了个东西程序数据被经常用到的只有一部分,所以人们就采用了将程序数据再小化也就是按页去从磁盘往内存上去加载,这有点像啥呢,就像cpu使用高速缓存一样,用东西先从缓存上找,没找到再从内存上拿。当内存不够时,先把常用的数据和代码页装到内存里,之后用到谁了就拿不用的去换。这个就要结合置换算法了。

补充:一般页大小是4K,当时具体情况具体再看。

上图

其实除了这种映射方法还有一种装载方法叫做覆盖载入,有兴趣去了解一下,这里就不赘述了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值