【操作系统】虚拟内存相关&分段分页&页面置换算法

这篇具有很好参考价值的文章主要介绍了【操作系统】虚拟内存相关&分段分页&页面置换算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

虚拟内存是什么?

【进程地址空间=虚拟地址空间=C/C++程序地址空间就是那个4G的空间】

虚拟内存是操作系统内核为了对进程地址空间进行管理,而设计的一个逻辑意义上的内存空间概念。在程序运行过程中,虚拟内存中需要被访问的部分会被映射到物理内存空间中,CPU 通过将虚拟地址翻译成物理地址,这样才能访问到真实的物理内存,使得程序顺利执行。

【比如我们在写完一段C++程序之后都需要采用g++进行编译,这时候编译器采用的地址其实就是虚拟内存空间的地址。因为这时候程序还没有运行,指令和数据还没有被加载到内存中,那此时使用的就是虚拟内存的地址了。】

运行进程时,通过页表将虚拟内存内容与真实物理空间内容对应。内核会为系统中每个进程维护一个页映射表。页映射表的基本原理是将程序运行过程中需要访问的段虚拟内存空间通过页映射表映射到一段物理内存空间上,这样CPU访问对应虚拟内存地址的时候就可以通过这种查找页映射表的机制访问物理内存上的某个对应的地址。


虚拟内存的计算方式:

虚拟内存的最大容量是由计算机的地址结构(CPU寻址范围)确定的。

虚拟内存的实际容量 = min(内存和磁盘容量之和,CPU寻址范围)

比如:

某计算机地址结构 32 位,内存大小为 512M,磁盘大小为 2GB,则:

虚拟内存的最大容量 = 2^32B = 4GB。

虚拟内存的实际容量 = min(2^32B, 512MB+2GB) = 2GB+512MB。


CPU通过页表获得数据的过程:

无论命中与否,都会访问两次内存。

若访问页表发现页命中(即,页被加载到物理内存):

首先CPU(CPU调用MMU)根据虚拟地址访问内存中的页表,获取到页表的中描述的所需数据存放在物理内存位置,再次访问内存,获得真正的数据。

若访问页表发现未页命中(即,页未被加载到物理内存):

首先CPU(CPU调用MMU)根据虚拟地址访问内存中的页表,获取到页表后发现发现页不在内存中,未命中,因此MMU发送一个缺页中断,交由缺页异常处理程序处理。缺页异常处理程序根据页置换算法,选择出一个牺牲页,如果这个页面已经被修改了,则写出到磁盘上。并将这个牺牲页的页表项有效位设置为0,存入磁盘地址。对于新调入的页面,如果该虚拟页尚未分配磁盘空间,则分配磁盘空间,然后磁盘空间的页数据拷贝到该物理页上,并更新有效位为1,更新对应的物理页号。完成这些操作后,从缺页异常处理程序返回,重新按照页表项命中的步骤执行。
————————————————
原文链接:https://blog.csdn.net/daocaokafei/article/details/116207148


CPU寻址和虚拟地址空间

现代处理器使用的是一种称为 虚拟寻址(Virtual Addressing) 的寻址方式。使用虚拟寻址,CPU 需要将虚拟地址翻译成物理地址,这样才能访问到真实的物理内存 实际上完成虚拟地址转换为物理地址转换的硬件是 CPU 中含有一个被称为 内存管理单元(Memory Management Unit, MMU) 的硬件

【操作系统】虚拟内存相关&分段分页&页面置换算法,java,算法,linux


“页(page)"是虚拟内存空间向物理内存空间映射的基本单元.

虚拟地址和物理地址:

我们程序中各个变量等使用的地址其实都是这个虚拟内存空间中的地址。在编程过程中我们面对的也都是逻辑地址。

【可省略】举个最简单的例子,父子进程各种有一份虚拟空间地址,在子进程刚被创建时,父子进程代码和数据共享,所以此时虚拟地址空间的内容是基本一样的(当然有部分数据不同,比如各子的id等),且映射关系也是一样的,但是当子进程对数据进行修改时,子进程对那份数据进行写时拷贝,所以物理空间地址发生了变化,但是虚拟地址还是没有发生变化,只是改变了子进程的页表中那份虚拟地址的映射关系而已,所以两个相同的虚拟地址在父子进程分别看到了不同的物理地址空间。
————————————————
原文链接:https://blog.csdn.net/weixin_58450087/article/details/123461959

虚拟地址访问内存有以下优势:

  1. 程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。
  2. 程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。数据或代码页会根据需要在物理内存与磁盘之间移动。
  3. 不同进程使用的虚拟地址彼此隔离一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。
  4. 同时,虚拟地址通过页表映射可以实现内存保护:

    比方说你的进程申请了一个数组,这个时候你会获得一个虚拟地址的范围,这时页表就会保存你的虚拟地址范围和映射到内存中的物理地址范围。同时页表还会保存数据的一些相关信息,比方说“可读可写”、“只可读不可写”。

    这样当你通过地址访问数组的时候,操作系统会就会在页表中找有没有该虚拟地址和物理地址的对应关系。如果地址正常,页表中一定会有映射关系存在,这样就可以正常访问数组。如果发生越界情况,操作系统在页表中找不到该虚拟地址和物理地址的对应关系,说明非法访问,然后报错。

    还有如果当你试图更改一个不可写的数据时,操作系统会判断当前数据是否可写,如果不可写就会报错。比方说:字符串、常量等等…


虚拟内存是如何实现的:

虚拟内存的实现需要建立在离散分配的内存管理方式的基础上。内存需要实现分页或分段的内存管理形式:

  1. 请求分页存储管理:建立在分页管理之上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种实现虚拟存储器的方法。
  2. 请求分段存储管理:建立在分段存储管理之上,增加了请求调段功能、分段置换功能。
  3. 请求段页式存储管理:

分段、分页是针对物理内存进行的管理方式。将物理内存划分好后与虚拟内存进行映射对应

内存的管理有4种方式:

常见的内存管理机制

  1. 块式管理 : 远古的计算机操系统的内存管理方式。将内存分为几个固定大小的块,每个块中只包含一个进程。如果程序运行需要内存的话,操作系统就分配给它一块。
  2. 页式管理 :把主存分为大小相等且固定的一页一页的形式,页较小,相对相比于块式管理的划分力度更大,提高了内存利用率,减少了碎片。页式管理通过页表对应逻辑地址和物理地址。
  3. 段式管理 : 页式管理虽然提高了内存利用率,但是页式管理其中的页实际并无任何实际意义。 段式管理把主存分为一段段的,段是有实际意义的每个段定义了一组逻辑信息,例如,有主程序段 MAIN、子程序段 X、数据段 D 及 栈段 S 等。 段式管理通过段表对应逻辑地址和物理地址。
  4. 段页式管理机制把主存先分成若干段,每个段又分成若干页,也就是说 段页式管理机制中段与段之间以及段的内部的都是离散的。

简单来说:页是物理单位,段是逻辑单位。分页可以有效提高内存利用率,分段可以更好满足用户需求。

【操作系统】虚拟内存相关&分段分页&页面置换算法,java,算法,linux


 

分页和分段的区别:

  1. 用户空间划分为大小相等的部分称为逻辑上相邻的页物理上不一定相邻。
  2. 用户进程地址空间按照自身逻辑划分为若干每段在内存中占据连续空间,各段可以不相邻
  3. 用户进程先按段划分,在段内按照页划分 

区别:

  1. 目的不同:分页的目的是管理内存,用于虚拟内存以获得更大的地址空间分段的目的是满足用户的需要,使程序和数据可以被划分为逻辑上独立的地址空间
  2. 大小不同:段的大小不固定,由其所完成的功能决定;页的大小固定,由系统决定;
  3. 地址空间维度不同:分段是二维地址空间(段号+段内偏移),分页是一维地址空间(每个进程一页表/多级页表,通过一个逻辑地址就能找到对应的物理地址);
  4. 分段便于信息的保护和共享;分页的共享收到限制;
  5. 碎片:分段没有内碎片,但会产生外碎片,因为段与段之间不连续;分页没有外碎片,但会产生内碎片(因为一个页填不满)

分页和分段地址转换408题目:

段、页、页框、页表、页表项_页框号_biggerbugger的博客-CSDN博客


top命令:

top命令作为 Linux下最常用的性能分析工具之一,可以监控、收集进程的CPU、IO存使用情况。比如我们可以通过top命令获得个进程使用了多少虚拟内存(VIRT)、物理内存(RES)、共享内存(SHR)
2.1 top命令中ⅥRT、RES和SHR的含义

VIRT的含义。搞清楚了虚拟内存的概念之后解释ⅥRT的含义就很简单了。ⅥRT表示的是进程虚拟内存空间大小。对应到图1中的进程A来说就是A1、A2、A3、A4以及灰色部分所有空间的总和.也就是说VIRT包含了在已经映射到物理内存空间的部分和尚未映射到物理内存空间的部分和。

RES的含义。指进程虚拟內存空间中已经映射到物理內存空间的那部分的大小。对应到图1中的进程A来说就是A1、A2、A3以及A4几个部分空间的总和。所以说,看进程在运行过程中占了多少内存应该看RES的值而不是VIRT的值。
SHR的含义。SHR是 share(共享)的缩写,它表示的是进程占用的共享内存大小。在上图1中我们看到进程A虚拟内存空间中的A4和进程B虚拟内存空间中的B3都映射到了物理内存空间的A4/B3。为什么会出现这样的情况呢?其实我们写的程序会依赖于很多外部的动态库(.so),比如libc.so、libd.so等等。这些动态库在内存中仅仅会保存/映射一份,如果某个进程运行时需要这个动态库,那么动态加载器会将这块内存映到对应进程的虚拟内存空间中。多个进程之间通过共享内存的方式相互通信也会出现这样的凊况。这么一来,就会出现不同进程的虚拟内存空间会映射到相同的物理内存空间。这部分物理内存空间其实是被多个进程所共享的,所以我们将他们称为共享内存,用SHR来表示。某个进程占用的内存除了和别的进程共享的内存之外就是自己的独占内存了。所以要计算进程独占内存的大小只要用RES的值减去SHR值即可 。
————————————————
原文链接:https://blog.csdn.net/qq_41687938/article/details/120479067


页面置换算法的作用

因为发生了缺页,因此可能会出现使用页面置换算法的情况,

缺页中断,就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。

当发生缺页中断时,如果当前内存中并没有空闲的页面,操作系统就必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。用来决定淘汰哪一页的规则叫做页面置换算法。


页面置换算法有什么?

  1. 最佳页面置换算法OPT(Optimal replacement algorithm):置换以后不需要或者最远的将来才需要的页面,是一种理论上的算法,是最优策略;
  2. 先进先出FIFO:置换在内存中驻留时间最长的页面。缺点:有可能将那些经常被访问的页面也被换出,从而使缺页率升高;
  3. 最近最少使用算法LRU(Least Recently Used):LRU算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 T,当须淘汰一个页面时,选择现有页面中其 T 值最大的,即最近最久未使用的页面予以淘汰。
  4. 最少使用页面置换算法LFU (Least Frequently Used): 该置换算法选择在之前时期使用次数最少的页面
  5. 最近未使用算法NRU(Not Recently Used):检查访问位R、修改位M,优先置换R=M=0,其次是(R=0, M=1);

什么是块表和多级页表:

1)快表:

为了解决虚拟地址到物理地址的转换速度,操作系统在页表方案基础之上引入了 快表 来加速虚拟地址到物理地址的转换。我们可以把快表理解为一种特殊的高速缓冲存储器(Cache),其中的内容是页表的一部分或者全部内容。

2)多级页表:

引入多级页表的主要目的是为了避免把全部页表一直放在内存中占用过多空间,特别是那些根本就不需要的页表就不需要保留在内存中。多级页表属于时间换空间的典型场景。文章来源地址https://www.toymoban.com/news/detail-661917.html


到了这里,关于【操作系统】虚拟内存相关&分段分页&页面置换算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【操作系统基础】【CPU访存原理】:寄存 缓存 内存 外存、内存空间分区、虚拟地址转换、虚拟地址的映射

    存储器怎么存储数据、内存空间分区、虚拟地址转换 计算机的存储器:寄存 缓存 内存 外存(按功能划分) 计算机的处理器需要一个存储器来存储大量的指令和数据以便自己不断取指执行和访问数据。 内存 (内存就是运行内存,如手机的8G运行内存,电脑的16G运行内存)就

    2024年01月25日
    浏览(50)
  • 操作系统实验:虚拟存储器 (C语言实现) 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。

    模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺 页中断。 模拟分页式存储管理中硬件的地址转换和产生缺页中断。 用先进先出(FIFO)页面调度算法处理缺页中断。 由于是模拟调度算法,所以,不实际启动输出一页和装入一页的程序,

    2024年02月04日
    浏览(55)
  • 【操作系统】——基本分页存储管理

    将内存分为一个个大小相等的分区, 这些分区称作为(页框、页帧、内存块、物理块、物理页面)若对分区进从编号,则又有了对应的(页框号、页帧号、内存块号、物理块号、物理页号),从0开始 进程的信息都是要存在内存中的,既然内存有了分区,那么进程逻辑地址空间

    2024年02月06日
    浏览(34)
  • 微软8月系统更新引发问题:虚拟内存分页文件出现错误

    微软的八月系统更新引发了一系列问题,其中包括“UNSUPPORTED_PROCESSOR”蓝屏错误和文件管理器故障。尽管微软已经修复了前者,但据国外科技媒体Windows Latest报道,仍有用户反馈在非微星设备上出现“fault in nonpaged area”蓝屏错误。 如果出现“Page Fault In Nonpaged Area”蓝屏错误,

    2024年02月09日
    浏览(43)
  • 【操作系统】03.内存管理

    现代操作系统使用的连接方式:运行时动态链接 对某些模块的链接推迟到程序执行时才进行 现代操作系统使用的装入方式:动态重定位 程序装入内存后,逻辑地址不会立即转换成物理地址,而是推迟到指令执行的时候,需要一个重定位寄存器的支持 单一连续分配 固定分区

    2024年02月07日
    浏览(35)
  • 【操作系统】内存管理

    本系列参考王道考研-操作系统以及博主@BitHachi 因为cpu的处理速度很快,而外存的读取速度又很慢,所以我们就需要先加载到内存中,内存的读取速度比外存要快得多,如此实现更高效的处理 指令的工作原理 从X=X+1大致看一下指令的执行过程 指令的工作基于地址。每个地址对

    2024年02月07日
    浏览(46)
  • 【操作系统】内存管理概念

    1、 编译:由编译程序将用户源代码编译成若干个目标模块(编译就是把高级语言翻译成机器语言) 2、 链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块 ① 静态链接:在程序运行之前,先将各目标模块及它们所需的库函

    2024年02月06日
    浏览(41)
  • [操作系统]3.内存管理

    和前面两篇是差不多的思路,仅为快速复习操作i系统基础知识点,例题暂无,考试不要参考,知识点来自王道操作系统 内存管理主要完成的功能有 内存空间的分配和回收 地址转换(把逻辑地址转化为内存物理地址) 内存空间的扩充(覆盖,交换,虚拟化) 存储保护 因为一个进程如果想

    2024年02月08日
    浏览(46)
  • 操作系统-内存分配算法

    操作系统原理实验报告 实验题目   实 验 四内存分配算法     1.1 实验目的 一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请主存储器空间时,存储管理必须根据申请者的要求,

    2024年02月03日
    浏览(38)
  • 【操作系统】内存空间

    想要pmap这个进程,需要进程号 但是这个进程在启动的一瞬间就执行完了 用GDB把程序暂停下来,然后用pmap观察地址空间 用 info inferiors 得到gdb里的进程号 ro 可读 :只读数据 rx 可读可执行 :代码 rw 可读可写 :待初始化值的变量 动态链接的二进制文件在开始执行main函数之前

    2024年02月03日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包