操作系统之内存管理

存储内存管理

   内存管理是操作系统的一大特点,是多线程并行的前提条件。不同于单片机只需要运行烧录的单一程序,电脑需要同时运行多个程序。因此,当不同程序操作数据时,不可避免地造成地址访问冲突。操作系统引入了虚拟内存的概念,使得每个程序都有独立的地址空间,从而解决地址访问冲突的问题。

虚拟内存

   程序访问虚拟地址,操作系统将虚拟地址转化为真实的物理地址(借由 CPU 芯片中的内存管理单元(MMU)),这样不同程序的地址就不会冲突了。

https://cdn.xiaolincoding.com/mysql/other/72ab76ba697e470b8ceb14d5fc5688d9.png

   每一个程度都有独立的内存空间,32/64位电脑的寻址能力不同,故虚拟内存的大小也不同,其中又被分为内核空间用户空间(32位电脑最多申请3G的用户空间)。

  

   以32位的电脑为例,程序的空间分配如下图,自下往上依次为代码段(二进制可执行文件),数据段(已初始化的静态常量和全局变量),BSS(未初始化的静态变量和全局变量),(动态分配的内存),文件映射区(包括动态库、共享内存等),(包括局部变量和函数调用的上下文等),内核空间

而操作系统有两种主要的方式管理虚拟内存与物理内存之间的关系,分别为内存分段内存分页

内存分段

   内存分段的原理是将程序的内存空间分为4个段,通过段表索引定位到相应的物理内存,接着使用偏移量就能够访问段内的数据。

https://cdn.xiaolincoding.com/mysql/other/c5e2ab63e6ee4c8db575f3c7c9c85962.png

   分段方式能够很好地解决虚拟内存和物理内存之间的映射关系,但是并不是十全十美的,其主要有两个问题:会产生外部内存碎片、内存交换的效率低。

   在讨论这两个问题之前,首先得了解内存碎片内存交换的概念。

   外部内存碎片:在物理内存中,程序所占据的大小不同,导致一些零散的小空间无法分配

  内部内存碎片:将物理内存分割为固定大小的小块空间,使得每一块空间都能被分配,但这块空间不一定能填满

   内存交换:将不常用的内存交换到硬盘中,记录到一个表中,等到需要时,再加载回内存。

   由于分段机制是需要多少空间就分配多少空间(按需分配),每个段的长度都不一样,段与段之间会存在大量的小块内存,从而导致了外部物理碎片,需要进行内存交换,才能清理掉这些碎片。然而,由于硬盘的读写速度实在实在是,一大段的内存数据又实在实在是,从而导致了内存交换的效率低。

   So,为了解决这两个问题,引进了内存分页

内存分页

   内存分页的特点是,将虚拟内存和物理内存都分为固定大小的空间,称之为页(linux下,大小为4KB)。页与页之间通过存储在内存中的页表进行索引,而当程序在页表中找不到对于的索引,就会产生一个缺页异常,系统再进行分配,更新页表(需进入内核态)。

https://cdn.xiaolincoding.com/mysql/other/08a8e315fedc4a858060db5cb4a654af.png

   由于内存的分配的紧密的,因此不会造成外部内存碎片,而每个页也足够的小,一次交换几个页,对于系统的开销只是小case,因此内存交换效率高。但是,也没有十全十美的事情,内存分页难免会引起内部内存碎片。

同时,页表所占据的内存也是不小的开销。在32位的操作系统下,最大的虚拟内存为232即4GB,一个页占4KB(212)大小,那么就被分为220(大概100万)个。那么,页表中的每条记录占4个字节的话,实现全部映射关系,就需要4MB的空间。那么电脑又不可能只运行一个程序,当程序一多,这对内存来说是一笔不小的开销。对于64位的电脑,那页表的消耗更大。

为解决这个问题,引入了多级页表。这样的做法有个好处,如果一级页表没用到,那就不会创建二级页表了。

        

https://cdn.xiaolincoding.com/mysql/other/19296e249b2240c29f9c52be70f611d5.png

        内容来源之小林coding的学习总结,更详细的内容可访问小林coding (xiaolincoding.com)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值