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

虚拟内存是什么?

【进程地址空间=虚拟地址空间=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) 的硬件

 


“页(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. 段页式管理机制把主存先分成若干段,每个段又分成若干页,也就是说 段页式管理机制中段与段之间以及段的内部的都是离散的。

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


分页和分段的区别:

  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)多级页表:

引入多级页表的主要目的是为了避免把全部页表一直放在内存中占用过多空间,特别是那些根本就不需要的页表就不需要保留在内存中。多级页表属于时间换空间的典型场景。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/45420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漏洞指北-VluFocus靶场专栏-工具篇

漏洞指北-VluFocus靶场专栏-番外篇奇技淫巧 🌸1、burp suite 、中国蚁剑工具、Strut2扫描软件地址🌸🌸2、burp suite使用🌸step1 浏览器开启代理,**推荐使用:SwitchyOmega** step2 确认浏览器端口和burp su…

nginx反向代理、负载均衡

修改nginx.conf的配置 upstream nginx_boot{# 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2server 192.168.87.143 weight100 max_fails2 fail_timeout30s; server 192.168.87.1 weight200 max_fails2 fail_timeout30s;# 这里的…

LVS负载均衡群集部署(LVS-NAT模型实例)

一、集群 1.1集群的含义 Cluster,集群、群集,为解决某个特定问题将多台计算机组合起来形成的单个系统。 由多台主机构成,但对外只表现为一个整体。 1.2群集的三种类型 1.2.1负载均衡群集 LB: Load Balancing,负载均衡&#x…

Linux 虚拟机Ubuntu22.04版本通过远程连接连接不上,输入ifconfig只能看到127.0.0.1的解决办法

之前给虚拟机配置静态IP之后,可以直接通过主机Vscode远程连接。但是前一段时间把主机的TCP/IPV4静态IP设置了一下之后,再连接虚拟机就连不上了,于是参考解决虚拟机不能上网ifconfig只显示127.0.0.1的问题,又可以连接上了&#xff…

Linux系统下消息中间件RocketMQ下载、安装、搭建、配置、控制台rocketmq-dashboard的安装保姆级教程 rocketmq ui

这里给出我使用的 RocketMQ 版本(5.1.3)、RocketMQ-Dashboard 版本的百度网盘链接: 链接:https://pan.baidu.com/s/1HaKBBDGWZ0WKLGgVwIG9pw 提取码:1234 文章目录 一. 官网下载安装二、启动NameServer三、启动Broker四…

Qt项目报错:Cannot run compiler ‘clang++‘. /bin/sh: 1: clang++: not found

在一台旧电脑上装了深度系统,装了Qt,导入项目, build提示 clang找不到: Project ERROR: Cannot run compiler clang. Output: /bin/sh: 1: clang: not found Maybe you forgot to setup the environment? Error while parsing …

Jenkins+Jmeter集成自动化接口测试并通过邮件发送测试报告

一、Jenkins的配置 1、新增一个自由风格的项目 2、构建->选择Excute Windows batch command(因为我是在本地尝试的,因此选择的windows) 3、输入步骤: 1. 由于不能拥有相同的jtl文件,因此在每次构建前都需要删除jtl…

VS2022远程Linux使用cmake开发c++工程配置方法

文章目录 远程连接CMakePresets.json的配置Task.vs.json配置launch.vs.json配置最近使用别人在VS2015上使用visualgdb搭建的linux开发环境,各种不顺手,一会代码不能调转了,一会行号没了,调试的时候断不到正确的位置,取消的断点仍然会进。因此重新摸索了一套使用vs的远程开…

基于Python的高校学生成绩分析系统

随着计算机技术发展,计算机系统的应用已延伸到社会的各个领域,大量基于网络的广泛应用给生活带来了十分的便利。所以把高校成绩分析与现在网络相结合,利用计算机搭建高校成绩分析系统,实现高校成绩分析的信息化。则对于进一步提高…

深入理解 Flutter 图片加载原理 | 京东云技术团队

前言 随着Flutter稳定版本逐步迭代更新,京东APP内部的Flutter业务也日益增多,Flutter开发为我们提供了高效的开发环境、优秀的跨平台适配、丰富的功能组件及动画、接近原生的交互体验,但随之也带来了一些OOM问题,通过线上监控信息…

ubuntu 编译安装nginx及安装nginx_upstream_check_module模块

如果有帮助到你,麻烦点个赞呗~ 一、下载安装包 # 下载nginx_upstream_check_module模块 wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master# 解压 unzip master# 下载nginx 1.21.6 wget https://github.com/nginx/…

【C++奇遇记】构造函数 | 初始化列表

🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如…

操作系统练习:在Linux上创建进程,及查看进程状态

说明 进程在执行过程中可以创建多个新的进程。创建进程称为“父进程”,新的进程称为“子进程”。每个新的进程可以再创建其他进程,从而形成进程树。 每个进程都有一个唯一的进程标识符(process identifier,pid)。在L…

Java之接口

作者简介: zoro-1,目前大一,正在学习Java,数据结构等 作者主页: zoro-1的主页 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 Java之接口 接口的概念语法规则接口特性接口使用案…

数据结构<树和二叉树>顺序表存储二叉树实现堆排

✨Blog:🥰不会敲代码的小张:)🥰 🉑推荐专栏:C语言🤪、Cpp😶‍🌫️、数据结构初阶💀 💽座右铭:“記住,每一天都是一個新的開始&#x1…

stable diffusion基础

整合包下载:秋叶大佬 【AI绘画8月最新】Stable Diffusion整合包v4.2发布! 参照:基础04】目前全网最贴心的Lora基础知识教程! VAE 作用:滤镜微调 VAE下载地址:C站(https://civitai.com/models…

漏洞指呗-VluFocus靶场专栏-番外篇

漏洞指呗-VluFocus靶场专栏-番外篇奇技淫巧 🌸struts2漏洞扫描工具🌸step1 修改ip和端口step2 验证漏洞是否存在step3 执行cmd命令,获取flag 🌸Goby插件工具headshot🌸step1 输入ip和端口 检测step2 cmd 输入指令 &…

vactor中迭代器失效问题

目录 什么是迭代器失效导致迭代器失效的操作VS和g环境下对与迭代器失效的态度 什么是迭代器失效 迭代器的底层其实就是一个指针,或者对指针进行了封装 vector的迭代器就是一个指针T* 一个迭代器指向某一个空间,此时这块空间被释放了,这个迭…

Appium Desktop安装

【提示:官方已不再维护,建议命令行方式安装,但可以学习了解一下】 Appium Desktop是一款适用于Mac、Windows和Linux的应用程序,它以漂亮灵活的UI为您提供Appium自动化服务器的强大功能。它基本上是Appium Server的图形界面。您可…

【华为认证数通高级证书实验-分享篇2】

实验拓扑 注:代码块为各交换机路由器中的配置命令 配置拓扑文件 实验要求 实现全网通 实验配置 SW3 [SW3]v b 10 20 [SW3]int e0/0/1 [SW3-Ethernet0/0/1]po link-t a [SW3-Ethernet0/0/1]po de v 10 [SW3-Ethernet0/0/1]int e0/0/2 [SW3-Ethernet0/0/2]po li…