【操作系统】第五章:虚拟内存(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


目录
相关文章
|
1月前
|
存储 安全 物联网
操作系统的心脏:深入理解现代操作系统架构与核心技术
本文旨在为读者提供一个关于现代操作系统(OS)架构和核心技术的全面概述。通过分析OS的主要组件、功能以及它们如何协同工作,本文揭示了操作系统在计算机系统中的核心地位及其复杂性。我们将探讨进程管理、内存管理、文件系统和输入/输出(I/O)等关键技术,并讨论它们对系统性能的影响。此外,本文还将涵盖一些最新的操作系统趋势和技术,如云计算、虚拟化和物联网(IoT)。通过阅读本文,读者将获得对操作系统内部运作方式的深刻理解,这对于软件开发人员、IT专业人士以及对计算机科学感兴趣的任何人来说都是宝贵的知识。
|
30天前
|
安全 Android开发 iOS开发
安卓vs iOS:探索两种操作系统的独特魅力与技术深度###
【10月更文挑战第16天】 本文旨在深入浅出地探讨安卓(Android)与iOS这两种主流移动操作系统的特色、优势及背后的技术理念。通过对比分析,揭示它们各自如何塑造了移动互联网的生态,并为用户提供丰富多彩的智能体验。无论您是科技爱好者还是普通用户,都能从这篇文章中感受到技术创新带来的无限可能。 ###
50 2
|
1月前
|
分布式计算 算法 大数据
探索操作系统的核心:调度与内存管理机制
【10月更文挑战第11天】 本文深入探讨了操作系统中两大核心功能——调度与内存管理机制。通过分析调度算法、进程状态转换及内存分配策略等关键方面,揭示了它们如何共同维护系统性能和稳定性。旨在为读者提供对操作系统内部运作的深刻理解,同时引起对优化策略的思考。
59 5
|
19天前
|
人工智能 Anolis 开发者
|
1月前
|
算法
深入理解操作系统:内存管理机制的探索之旅
【10月更文挑战第2天】在数字世界的浩瀚海洋中,操作系统犹如一艘精密的航船,承载着软件与硬件的和谐共舞。本文将揭开内存管理的神秘面纱,从基础概念到高级策略,引领读者领略操作系统内存分配的智慧。通过深入浅出的解释和生动的比喻,我们一同遨游在内存的江河之中,感受操作系统如何巧妙地协调资源,确保数据的有序流动。让我们跟随内存的脚步,探索那些隐藏在每次点击、每次命令背后的奥秘。
|
1月前
|
监控 开发者
深入理解操作系统:内存管理的艺术
【10月更文挑战第2天】在数字世界的幕后,操作系统扮演着至关重要的角色。本文将深入探索操作系统的心脏——内存管理,揭示它是如何协调和管理计算机的宝贵资源。通过浅显易懂的语言和生活化的比喻,我们将一起走进内存管理的奥秘世界,了解它的原理、机制以及为何对整个系统的性能和稳定性有着不可替代的影响。无论你是技术新手还是资深开发者,这篇文章都将为你打开新的视角,让你对日常使用的设备有更深层次的认识和尊重。
|
1月前
|
缓存 算法 调度
深入浅出操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅。我们将从进程管理的基本概念出发,逐步深入到内存管理的复杂世界,最终探索如何通过实践技巧来优化系统性能。文章将结合理论与实践,通过代码示例,帮助读者更好地理解操作系统的核心机制及其在日常技术工作中的重要性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往操作系统深层次理解的大门。
|
2月前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
|
1月前
|
存储 前端开发 Java
MacOS环境-手写操作系统-18-图片分层技术
MacOS环境-手写操作系统-18-图片分层技术
21 0
|
1月前
|
存储 算法 C语言
MacOS环境-手写操作系统-17-内存管理算法实现
MacOS环境-手写操作系统-17-内存管理算法实现
37 0