轻松理解操作系统 - Linux内存管理第一话:从用户的角度讲讲为什么要用虚拟内存管理用户空间

在上一个系列里,我们介绍和了解了 Linux系统 的五大模块之一的文件系统模块。

上个系列的传送门:Linux文件系统模块大完结!

这个系列,我们就来介绍 Linux系统 的五大模块之一的内存管理模块。

首先,我们还是从离用户最近的角度开始思考一下

1、用户在使用软件的时候在软件的内存方面,有什么最基本、最通用的需要呢

第一、肯定是我的数据不能随便泄露、软件不能随便崩溃

第二、需要软件的运行越流畅越好

2、我们在内存角度能怎么满足这些需要呢?

图片

1 - 内存隔离: 确保每个进程都拥有独立的地址空间,防止进程之间的非法访问。

2 - 内存保护: 通过权限设置防止进程访问未授权的内存区域。

3 - 内存扩展:利用磁盘空间作为虚拟内存,当物理内存不足时,可以将部分不常用的数据交换到磁盘上。

4 - 资源共享:允许多个进程共享同一块物理内存,如共享库。

5 - 缓存优化:利用内存作为高速缓存,提高I/O效率。

其中,1 和 2 满足了用户的第一个需求3、4、5 满足了用户的第二个需求

用户空间虚拟内存管理分别用什么方法满足需求的呢?

1、将不同的程序分隔开不就隔离了吗 - 进程地址空间 和 页表机制 实现内存隔离

要了解内存隔离的实现,我们先要来了解一下进程地址空间内存分页

图片

内存分页:

首先我们来看下左边的内存分页对应着右边的内存条内存的划分。

它把完整的内存条划分为一大堆 4KB 大小物理内存页。每个虚拟内存页又对应了一个物理内存页。

图片

进程地址空间:

它以虚拟内存为基础,它是系统为每个运行中的进程所分配的一段连续的虚拟的内存区域。

这个区域包含了进程可以访问的所有内存地址,通常被划分为多个部分,以支持不同的内存使用需求,如代码段、数据段、堆段和栈段等。

图片

页表机制

它记录了虚拟内存页物理内存页之间的映射关系

由于每个进程都有自己的页表,因此它们的地址空间是相互隔离的。

通过这三个方法,系统实现了不同进程间的内存隔离

2、如果有“坏进程”要搞事看其他进程的内存怎么办?- 权限位异常处理来制服它

制服搞事的“坏进程”需要权限位异常处理两大保障。

图片

权限位:

每个虚拟内存的页表的页表项都包含了访问权限位,用于指定该页是否可以读、写或执行。

当进程试图访问某个内存页时,操作系统会检查页表项中的权限位,以确保访问是合法的。

异常处理:

如果进程试图访问一个未映射或权限不足虚拟内存页,会引发缺页异常

操作系统会捕获这个异常,并根据情况进行处理,如分配新的物理内存页、加载磁盘上的数据或终止进程等。

3、那用户电脑的内存条就这么大了,有没有办法让程序能正常运行?- 内存扩展

如果内存条不够用了,我们怎么扩展内存呢?

这时有个最简便的方法就是:让他们少用点内存啊!

但是如果还不够怎么办?

我们可以想到一种办法来“扩展”物理内存 - 那就是拿一部分外存(硬盘)当内存来用呀!

图片

少用点内存 - 让程序自己节约点

Linux 提供了动态内存分配机制,如 malloc 和 free 函数,允许进程在运行时根据需要请求和释放内存。

图片

“扩展”物理内存 - 用外存当内存用

当物理内存不足时,Linux 会将部分不常用的内存页交换到磁盘上的交换空间中,以释放物理内存供其他进程使用。

这样就像是魔术一样“凭空”增加了物理内存容量

图片

4、那前面的优化措施做完了,能不能用户做 PPT 的时候再快一点?- 资源共享

当然可以,这就要用到资源共享了。可以共享内存也可以共享文件映射

图片

几个程序一起用一块内存 - 共享内存

需要注意的是,我们在编程的时候注册的共享内存块使用的是虚拟内存地址。

这样方便我们在不同的程序中读取同一块内存。

图片

像访问内存一样读写文件 - 内存映射文件

Linux 允许将文件映射到进程的地址空间中,这样进程就可以像访问内存一样访问文件数据。

这种机制使得文件读写操作更加高效,并且支持多个进程共享同一个文件映射区域。

5、那用户还是想再快一点,还有没有什么方法了?

当然是有的,这个方法就是常见的“加缓存”啦。

图片

把要用的文件缓存在内存中 - 页缓存

Linux内核 维护了一个页缓存,用于缓存磁盘上的文件数据。

当进程访问文件时,如果数据已经在页缓存中,就可以直接从缓存中读取,而无需访问磁盘。

这样可以显著提高文件读写性能

读时共享,写时复制

当多个进程共享同一块内存时,只有在某个进程尝试写入这块内存时才会复制这个内存页。

这样可以减少不必要的内存复制操作,提高内存利用率。

既然讲完了用户空间虚拟内存管理,那肯定也有内核的虚拟空间管理,咱们下次就来聊聊内核怎么管理自己的虚拟内存空间的

图片

一个从生化环材专业转行的字节研发工程师,日常分享干货和有趣的科普。欢迎围观

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值