【操作系统】第五章:虚拟内存(Part2:虚拟内存管理技术)

简介: 【操作系统】第五章:虚拟内存(Part2:虚拟内存管理技术)

目录


  • 程序的局部性原理
  • 虚存技术的基本特征
  • 虚存技术的实现
  • 虚拟页式内存管理
  • 缺页中断处理
  • 后备存储(二级存储)
  • 虚拟内存性能


前言


虚拟内存管理技术-简称虚存技术

275137e2f95b8bfed4865daf138b7899_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

解决覆盖技术和交换技术弊端的技术

47d55e36a8d2dd20027febf3aba6c6dd_2020041616042326.png

区别:过程由OS完成,减轻程序猿负担。

ee243faf10cf82548d0ac696a6814edc_20200416160522820.png

根据当前执行情况可以动态的导出导入,但是粒度更小,不只是程序间,还可以以页或者段为粒度来进行导入导出。

b8fa2dd62c80d48576357213ad5a2f36_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

如图所示,OS和MMU支持下,以P3为例,P3只在内存中放了2个内存页,其他的全放入了硬盘中。因为此时只用到了这一小部分数据,这样就使得一个本来比较大的程序在有效时间段内仅使用一小部分内存资源。虚存技术,除了需要硬件支持外,还需要程序具有局部性。


正文


程序的局部性原理


70151bd7a0480be53af131d42644a025_20200416161142938.png

局部性原理分为了时间局部性和空间局部性。

时间局部性:一条指令和下次执行,一个数据的访问和下一次访问都集中在一个较短时期内。

空间局部性:当前指令和邻近几条指令、当前访问和邻近的几个数据都集中在一个较小区域内。

分支局部性:一条跳转指令的两次执行,很可能跳到相同的内存位置

访问速度快、空间大、使用方便(不需要程序猿过多构思数据结构)

例子:

89f9b4f8a8f6644de59e046ffc59f398_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

这个整数数组的空间大小是1024x1024,int型每一个是4byte,也就说这一个数组整体会占4M的内存空间。但是物理内存只有4K。此时,

程序1:A【0】【0】~ A【1023】【0】==>A【1023】【1023】


程序2:A【0】【0】~ A【0】【1023】==>A【1023】【1023】


区别:实际上A【1】【0】和A【0】【0】从空间上来看,中间差了1024个数据也就说是4K的数据大小,但是A【1】【0】和A【1】【1】之间的距离只有一个数据也就说4byte。

那么对于程序2而言,在数据A【0】【x】占据了一个页。当他第一次访问时,数组的数据还在硬盘上时,会产生缺页异常,此时OS会把仅有的4K空间使用上,并把A【0】【x】数组放入内存空间 ,然后就可以对A【0】【x】数组进行正常访问了。根据循环,第二次访问A【0】【1】时,因为已经有了对应的页,就不会发生页异常。内循环执行完后,进入下一个内循环,此时访问A【1】【0】发生一次中断,然后接下来的1023次访问不会再发生中断。具备很好的空间局部性和时间局部性。也就意味着一共发生了1024次缺页中断

对于程序1而言,在数据A【0】【x】占据了一个页。当他第一次访问时,数组的数据还在硬盘上时,会产生缺页异常,此时OS会把仅有的4K空间使用上,并把A【0】【x】数组放入内存空间 ,然后就可以对A【0】【x】数组进行正常访问了。根据循环,第二次访问时,会访问A【1】【0】,此时会再次产生缺页异常,因为对应A【1】【x】的页仍然不在内存,在硬盘中,需要再次把4K的物理内存用到A【1】【x】数组上,此后导入A【1】【x】的页。同理,在一个内循环中,每一次都会跳4K空间去访问一个数据,每一次访问都会发生缺页异常。也就意味着一共发生了1024x1024次缺页中断

可以看出程序的不同写法对开销的影响是相当大的。

缺页/段异常

上面讲到的,因为内存中只有部分数据,所以可能会发生程序进行到一定阶段后,接下来的数据访问不到的情况。因为另一部分数据不在内存中而在硬盘中,此时会发生一个缺页或者缺段异常。 此时OS会进行处理,如果内存还有空间,就会把数据或者指令从硬盘导入内存,这样程序就可以继续执行。如果内存空间不足,则OS需要考虑当前阶段不会立刻用到的数据导出到硬盘,然后把需要的数据换入内存。这个选择哪个程序导出也很重要。选择的好,访问读写的次数就会少,整体系统性能也会提高。


虚存技术的基本特征


1.空间大: 通过内存和外存结合,提供给用户的虚拟内存空间通常大于实际物理空间。 32位机器理论上可以访问4GB而且物理内存只有256M,但是硬盘容量很大。通过硬盘的补充,可以实现内存中跑多个程序,而且每个程序会认为自己占用了4GB的空间。kernel是常驻内存不能被换出。

2.部分交换:与交换技术相比,虚拟存储的调入和调出是对部分虚拟空间进行的

3.不连续性:物理内存分配不连续,虚拟空间使用也不连续。(因为换入换出会导致原本连续的地址空间很可能再换回后不再在换出位置)


虚存技术的实现


虚拟页式内存管理


9155ec3314eb524cfdc368cd99c03263_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

如图所示, 逻辑地址空间和物理地址空间是靠页表来维持映射关系的。页表项的索引是页号,页表项的内容是页帧号。页表项除了页帧号之外,其实还有几个单位的bit作为标志位,比如存在位。那么这里的内存访问查找页表发现对应页表项的存在位是0,则说明这个虚拟地址空间没有对应的物理空间,产生访问异常。

大部分虚拟存储系统都采用虚拟页式内存管理。为了实现,除了页式内存管理的基本功能之外,在增加两个新的功能(请求调页和页面置换)【需要访问这个页时,才把这个页调入到内存中】


请求调页:当一个用户进程需要调入内存运行时,不会把所有程序都放入内存中,只是装入一部分程序。放到个别的页里,运行的时候就有可能出现访问的数据和代码不在内存中,此时就会由CPU发出缺页异常的信号,然后OS根据产生异常的地址来找到对应到外存中需要被调入的数据,然后将其放入相应的物理页去,使该页可以继续执行。


页面置换:访问过程中,随着程序的执行他占用内存越来越多,此时需要把不常用页换出,把当前需要的页换入,这就是页面置换。该功能实现的好坏就决定了整体效率,所以后面会专门设计一个有效的页面置换算法,后续会详细讲解。

d58b2aa2e47136a2a5270f83b757fbcc_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

为了实现这两个功能,我们需要在页表项里增加一些特殊的位,来辅助完成这些功能。有4个位比较重要。

1.存在位/驻留位:这个位表示该页是否存在内存中。0表示不在内存中,1表示在内存中。为1也就说逻辑页号一定对应一个物理页帧号。如果为0则说明内存中没有对应物理页支持,很有可能对应数据在外存中,此时访问会出现访问异常

2.保护位:表示允许该页做何种类型的访问,比如只读、只写,可读写、只执行等。 如果只读标识下执行写操作就会出现异常。

3.修改位:表明这个页是否被修改(写操作)过。如果这个页被写过,为1,;没被写过,就为0。如果内存中数据被写过,也就说当前数据与硬盘中数据不一致了,这时候最新的数据放入内存时,进行换出操作,需要把这个数据保存到硬盘中,使得硬盘中数据与内存中数据一致。如果修改位为0,则内外数据一致,此时如果进行换入换出操作,只需要释放就可以。所以修改位的使用可以有效提高修改位的效率。

4.访问位:这个也是否被访问过,访问过为1,没有访问为0。置换算法中,我们会把页换出去,那么换哪些?应该换当前没有访问的页,这位可以表明这个页是否经常使用,近期是否会使用等信息,我们可以根据这个特点决定换出对象。

363d827edf9523a7bc831d30a6b0ce07_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

驻留位为0,没有对应的虚拟地址映射到物理地址上。

这里执行了两个指令。

1.M O V   R E G , 08192

访问,把虚拟0地址的内容赋给一个寄存器。0地址对应页表里的映射关系,是物理地址中的页帧号2位置,所以他的实际物理地址应该是2*4K=8K(8192Byte)

2.MOV REG,32780 ==>M O V   R E G , 缺 页 中 断

把虚拟地址32780读到寄存器中,32780其实对应到逻辑地址中的页号为8的项中,因为驻留位为0,没有对应到物理地址的映射,则会触发缺页异常。


缺页中断处理


76029273b668256fb149d46d70f9b6c4_20200416175751227.gif

①:CPU执行指令,如果一个内存地址没有对应的映射关系,发生缺页异常。

④:需要访问的地址对应的硬盘中的数据以页的单位从硬盘读入内存中,然后修改页表,驻留位改为存在并把页帧号改成该页帧号。

如果没有空闲空间时,需要使用页面替换算法。


后备存储(二级存储)


6f10c532fe27e05d65862804213f0a62_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

硬盘存储数据的特征:

1.数据:数据文件放在硬盘上,当需要时,如果内存中没有,则从数据文件中读出。这是一种后备存储。

2.代码:操作系统会在令程序执行很多指令,指令其实也是一种数据,放在执行程序里/硬盘里。同理,读入内存并让CPU执行,当指令不存在,会进一步从程序中读入这条指令。

3.动态链接库:库的代码数据也是放在硬盘的。同理也是需要时读入

4.交换文件(swap file):程序运行过程中有可能产生许多数据,但是这些数据没有对应到具体的文件,就是动态产生的数据,这些数据也有可能占用了不小的空间且需要换出到硬盘中,则此时OS会在硬盘中开辟一个专门的区域——swap file。这个文件内的数据没有与文件直接对应的内存内容

这四类形成了后备存储(二级存储),有了二级存储的支持,保证了空间的有效性。


虚拟内存性能


11f91f84bc8d75721e51398d127abd0a_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

分析执行开销:

image.png


目录
相关文章
|
3天前
|
运维 Linux 测试技术
操作系统迁移技术
本次分享的主题是操作系统迁移方案,由阿里云路延文分享。 1. 迁移背景:CentOS停更危机 2. KeyarchOS迁移方案 3. 操作系统测试 4. 迁移评估
|
4天前
|
安全 大数据 Linux
云上体验最佳的服务器操作系统 - Alibaba Cloud Linux | 飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是云上体验最佳的服务器操作系统 - Alibaba Cloud Linux ,从 Alibaba Cloud Linux 的产生背景、产品优势以及云上用户使用它享受的技术红利等方面详细进行了介绍。同时,通过国内某社交平台、某快递企业、某手机客户大数据业务 3 大案例,成功助力客户实现弹性扩容能力提升、性能提升、降本增效。 1. 背景介绍 2. 产品介绍 3. 案例分享
|
1月前
|
人工智能 物联网 C语言
SVDQuant:MIT 推出的扩散模型后训练的量化技术,能够将模型的权重和激活值量化至4位,减少内存占用并加速推理过程
SVDQuant是由MIT研究团队推出的扩散模型后训练量化技术,通过将模型的权重和激活值量化至4位,显著减少了内存占用并加速了推理过程。该技术引入了高精度的低秩分支来吸收量化过程中的异常值,支持多种架构,并能无缝集成低秩适配器(LoRAs),为资源受限设备上的大型扩散模型部署提供了有效的解决方案。
69 5
SVDQuant:MIT 推出的扩散模型后训练的量化技术,能够将模型的权重和激活值量化至4位,减少内存占用并加速推理过程
|
27天前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
55 4
|
2月前
|
机器学习/深度学习 人工智能 Android开发
移动应用开发与操作系统的协同进化:探索现代技术融合之道###
随着移动互联网的迅猛发展,移动应用已成为人们日常生活中不可或缺的一部分。本文深入探讨了移动应用开发的最新趋势、关键技术以及移动操作系统的发展如何相互促进,共同推动移动互联网的创新与变革。通过分析当前市场动态和技术挑战,本文旨在为开发者提供有价值的见解和指导,帮助他们在竞争激烈的市场中脱颖而出。
|
1月前
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
1月前
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
|
1月前
|
开发框架 .NET PHP
网站应用项目如何选择阿里云服务器实例规格+内存+CPU+带宽+操作系统等配置
对于使用阿里云服务器的搭建网站的用户来说,面对众多可选的实例规格和配置选项,我们应该如何做出最佳选择,以最大化业务效益并控制成本,成为大家比较关注的问题,如果实例、内存、CPU、带宽等配置选择不合适,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文将详细解析企业在搭建网站应用项目时选购阿里云服务器应考虑的一些因素,以供参考。
|
2月前
|
算法 调度 开发者
深入理解操作系统:从进程管理到内存分配
本文旨在为读者提供一个深入浅出的操作系统知识之旅,从进程管理的基础概念出发,探索内存分配的策略与技巧。我们将通过实际代码示例,揭示操作系统背后的逻辑与奥秘,帮助读者构建起对操作系统工作原理的直观理解。文章不仅涵盖理论知识,还提供实践操作的指导,使读者能够将抽象的概念转化为具体的技能。无论你是初学者还是有一定基础的开发者,都能在这篇文章中找到有价值的信息和启发。
|
2月前
|
算法 调度 C++
深入理解操作系统:从进程管理到内存分配
【10月更文挑战第42天】本文将带你进入操作系统的神秘世界,探索其核心概念和关键技术。我们将从进程管理开始,了解操作系统如何协调和管理多个程序的运行;然后,我们将深入研究内存分配,看看操作系统如何有效地分配和管理计算机的内存资源。通过这篇文章,你将获得对操作系统工作原理的深入理解,并学会如何编写高效的代码来利用这些原理。