内存分段-内存分页-虚拟内存

程序如何执行

程序通过链接器,多个文件合并成一个最终可执行文件。可执行程序加载后占用的内存空间应该是连续的,因为执行指令的时候,程序计数器是顺序地一条一条指令执行下去。这也就意味着,这一条条指令需要连续地存储在一起。

内存分段和内存碎片

我们电脑肯定是要执行好多个程序的,在内存里面肯定占用多个连续的分段,但是假如其中一个程序退出,假如又来了一个程序小于剩余的空间,但是又没有连续的空间可以放下,显然这个程序无法执行。

举个列子:假如内存100K,我已经运行了4个20K的程序,内存分配这样:程序1(20K)、2(20K)、3(20K)、4(20K)、剩余20K,程序3退出后,剩余40K,但是剩余2个20K连续的分段,如程序5是30K,显然无法运行了,这就是内存碎片。

内存交换

上面的问题是如何解决的?假如我们把程序4向前移动20K内存的距离,将会剩下一段40K的连续内存,程序5就可以运行了。 哈哈,这就是内存交换。
他是如何做的?先把程序4写到硬盘上,然后硬盘上再写到移动位置的内存上,我们都知道LINUX系统上有一个SWAP内存交换区吧,它就干这个的。
但是由于IO性能的问题,比内存的读写慢好多倍,导致了机器的卡顿。

内存分页

由于内存交换导致了机器的卡顿,如果我们把每次交换的容量减少呐,这样性能将会有极大的提升,于是我们把连续的内存进行分页,分成许多个几K的页,提出交换速度。
我们把程序分成好多页,并把分页信息,存放在虚拟内存中(硬盘上),通常分页大小和物理内存分页大小一样,如果程序需要执行的代码页在内存中便会执行,如果不在会触发缺页,回到虚拟内存中找到缺页,加载到内存去执行。设计一个好的页面置换算法至关重要。

在Linux下,我们通常只设置成4KB。
由于内存空间都是预先划分好的,也就没有了不能使用的碎片,而只有被释放出来的很多4KB的页。
理论上计算机可以执行无数的程序,并不受限于内存大小。通过内存分页+虚拟内存+内存交换组合,我们最终得到了一个让程序不需要考虑实际的物理内存地址、大小和当前分配空间的解决方案。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值