程序加载: 你的内存真的够用吗?

简介:
看到标题你是否有些许的疑问?其实我也同你差不多。上篇博客讲了一个 .c 文件是如何变成可执行文件的,里面有链接器和装载器的作用。
你可以点击这个链接看看,了解一下程序是如何一步步被加载进内存的。
程序加载过程

通过装载器我们知道两条线索:
1 程序指令的执行是存放在一段连续的内存空间内。
2 我们不能指定指令在内存中存放的地址,因为你所指定的地址可能被别的程序所占用。

基于这两条线索,很容易想到一个办法,那就是我们可以在内存中找到一块连续的内存空间地址,和整个程序里指定的内存地址做一个映射。
我们把程序里用到的内存地址叫: 虚拟地址
内存里面的空间地址: 物理地址

内存分段:
找出一段连续物理地址与虚拟地址做映射的方法就叫做分段。(段:系统分配出来的那段连续物理地址)。 解决了不必关心物理地址,但存在内存碎片的问题。

举例:
我先运行三个程序,qq , qq音乐 , cs go 分被占用内存如下:
在这里插入图片描述
还剩下 256B 的 内存,那这个时候我想运行一个只有 200B 的程序能否成功运行呢?
想想这条原则,程序指令是存在内存一块连续的区域内的。而剩下的 256B 的内存地址并不是连续的,所以并不能成功运行。也可以看出存在内存碎片。

解决内存碎片:
1 内存交换
2 内存分页

内存交换:
不知道你有没有操作 Linux 系统的经验,如果没有你可以点击这个博客看一下 swap 的具体作用: 交换分区的查看与创建
简单说,就是将中间阻碍的地址先写入磁盘,然后关闭对应的程序,在重磁盘中读取写入的程序。使其两个 128B 能达到地址连续

内存分页:
简单说就是规定好 内存段,虚拟内存,物理内存的大小。 一个较大的程序需要好几页才能运行,但这里是将页的地址写入磁盘,当需要运行某个指令时,就会触发缺页错误,然后操作系统会根据映射表加载对应的页从磁盘到内存。这样就不存在什么内存碎片的问题了。 这里的页存储在磁盘可以不连续。

总结: 有了 内存分段 , 内存分页,交换分区 发现其实程序需要的内存是很少的,那几KB 的内存是否足够用呢? 如果允许一个程序的话是可以的,但同时并行运行好多个程序,就显得力不足了。 还有一个解决办法是不同程序共享一块连续内存地址,以后再介绍。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值