linux 切割后的日志没有释放内存_虚拟内存、物理内存、内存交换之间的关系

问题

虚拟内存地址、物理内存地址、内存分段、内存碎片、内存分页都是什么?

Windows系统中的虚拟内存,Linux中swap分区都是干什么用的?

程序装载

之前提到过指令是一条一条的顺序执行,这就需要可执行程序加载后占用的内存空间应该是连续的。

计算机通常会同时运行多个程序,也就是会同时加载多个程序,并不能让程序自己指定的在内存中加载的位置,因为你想要的内存地址有可能被其他加载的程序占用了。

为了解决上面的问题,通常是在内存中找一段连续的内存空间,分配给装载的程序,这段连续内存空间地址与程序指令中指定的内存地址做一个映射。

虚拟内存地址(Virtual Memory Address) : 程序指令中指定的内存地址。

物理内存地址(Physical Memory Address):在实际内存中那段连续的内存空间地址。

内存分段:通过维护一个虚拟内存到物理内存的映射表,然后程序指令执行的时候,通过虚拟内存地址,找到对应的物理内存地址,然后执行。

75a66e46c6403337d960234da3389d3e.png

内存交换(Memory Swapping):如下图所示,连续启动几个程序之后,关掉部分程序,剩下的内存空间并不是连续的,虽然剩下的内存空间很多,但是分布在多个不连续的内存空间中「内存碎片(Memory Fragmentation)」。这个时候装载新的程序,就需要将内存中部分程序写到硬盘中,然后再装载到内存中,再次装载的程序,会装载跟在内存中已连续占用的内存空间后面,这样原本分散的内存空间,会重新合并成一段连续的内存空间,以供装载新的程序使用。

16ac473cf31df0adac544bd18254dd10.png

内存分页(Paging)

​ 虽然通过内存分页可以很好解决计算机同时装载多个程序问题。但是我们都知道,硬盘的读写速度比内存慢很多,如果每次内存交换的都需要把一大段连续的内存数据写到硬盘上,而且还是一个内存空间占用很大的程序,这样会导致整个机器很卡。

内存分页会把整个物理内存空间切割成一段段固定尺寸的大小(通常是4KB),程序占用的虚拟内存也是进行一样的切割。这个固定尺寸且连续的内存空间就叫做,虚拟内存到物理内存的映射也变成按一个一个页来映射。这样装载程序和切换内存的时候都是页为单位,装载程序的时候也不是一次性装载全部指令和数据,只需要装载用到的那一页的指令和数据就可以了。

​ 由于内存空间都是预先划分好的,也就没有了不能使用的碎片,而只有被释放出来的很多 4KB 的页。即使内存空间不够,需要让现有的、正在运行的其他程序,通过内存交换释放出一些内存的页出来,一次性写入磁盘的也只有少数的一个页或者几个页,不会花太多时间,让整个机器被内存交换的过程给卡住。

39bbe82cbda50adce2fcda6575ed7ec0.png

回到问题

​ Windows中的虚拟内存和Linux中swap分区,都是用作与物理内存进行交换的空间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值