段,页,段页,三种内存(RAM)管理机制分析

段,页,段页

        是为实现虚拟内存而产生的技术。直接使用物理内存弊端:地址空间不隔离,内存使用效率低。

段:就是按照二进制文件的格式,在内存给进程分段(包括堆栈、数据段、代码段)。通过段寄存器中的段表来进行虚拟地址和物理地址的转换。

段实现的虚拟地址 = 段号+offset

物理地址:被分为很多个有编号的段,每个进程的虚拟地址都有段号,这样可以实现虚实地址之间的转换。其实所谓的地址映射,就是虚实地址转换之间的那个公式。

经过上面的理解我们知道了,实现段机制的器件其实就是段寄存器(段表)

不足:内存碎片(程序结束后内存被分割为一小块一小块),解决方法是SWAP分区(将散开的进程读出来再粘贴到另一个进程边上,使空闲的内存是连贯的,但这样效率很低)

页:就是将物理内存固定大小地分为n个页(linux中是4KB一页)。通过MMU的页表来进行虚实地址转换,这里就不是用寄存器来实现了。页表记录着页号、页号对应的物理地址,比较创新的是还记录着权限。基本功能已经有了,就是物理地址和页号怎么对应上。

页实现的虚拟地址 = 页号 + 页内偏移

物理地址:被分为很多个有编号的页,每个进程的虚拟地址都是用页号和偏移来记录,通过MMU来进行虚实转换。

经过上面的理解我们知道了,实现页机制的器件其实就是MMU。

优点:为什么说MMU可以让原本1G SDRAM的物理内存,实现能够实际使用4G SDRAM空间?甚至给每个程序都安排上4G SDRAM的内容空间?为什么每一个进程的内存空间是独立的?

就是因为物理SDRAM用页来管理,有些不用的页,可以暂时先存到硬盘上,硬盘的空间就非常大了动不动就是几百个G,所以可以做到虚拟出很大的内存空间给到程序。因为每一个进程都有自己单独的页表,一个进程根本没法知道或者操作另一个进程的页表,对应的也就不知道另一个进程的地址(虚拟地址对应的物理地址)在哪里,自然就是独立的。

缺点:页表本身占用的内存太多了,每一个进程有一个页表,那么理论上32位的机器4G的物理内存,每一页是4K的话,总共会有4G/4K = 2^10 * 2*10 个页表,如果一个页表要4MB,那光是记录页表就要占用800M的内存。

解决:套娃,用多级页表。

采用多级页表机制的虚拟地址 = 一级页号 + 二级页号 + 页内偏移。这样MMU可以通过页号1来找到页号2,通过页号2+页内偏移来找到对应的物理地址从而实现虚实转换。那为啥这样能够降低页表占用内存的大小呢?其实就行把文件折叠了一样,如果一级页表里面有的二级页表没有被分配,那这些二级页表实际上就是没有分配内存的;如果有些二级页表很久没有被使用,那这些二级页表也可以暂时存到硬盘里,也不占用空间。假如一个一级页表是4MB的话,那就相当于你可以用1个4MB的内存大小去管理很多个占4MB的二级页表,然而实际只占用了4MB。照着这个思路,可以造出很多级的页表,进行极致的页表空间压缩。

缺点2:多级页表是省了空间,但是从虚拟地址转成物理地址也多了很多步骤,要一级一级地查找最终才能找到对应的物理地址。

解决2:建立快表TLB,实际就是把一些最近使用的进程它虚拟地址对应的最底层页号和偏移,存到一个一级表中(快表),这样要地址转换时,先去快表找,找不到再去查多级页表。如此就显著提高了虚实地址转换速度,而且也节省了空间。

段页式

段页式:其实就是把物理地址分为一大段一大段的,在段的内部,再进行分页。

段页式机制下虚拟地址 = 段号 + (段内)页号 + 页内偏移

这样就结合了段(契合二进制文件堆栈,代码段,数据段分层,便于程序分配地址)和页(多级页表节省空间)两个特点。

不足:就是实现起来比较复杂。但是段页式是现在内存(SDRAM)管理的主流。需要注意的是,Linux是使用页机制的。

但是linux中的页机制也一定程度上有段页结合的影子,下面是段页式的虚实地址转换流程:

linux中每一个进程虚拟地址中的段号都是对应的0~4GB的地址空间,每一个进程段空间范围都一样就意味着虚拟地址中的段号没有划分地址的作用,实际上linux中的虚拟地址是 "虚拟地址 = 段号+页号+页内偏移 ",系统有规定某些段号只有内核程序能使用,应用层程序只能使用另一些段号。从而实现了访问权限的机制。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 算法交易实验72 QTV200第一步: 获取原始数据并存入队列

说明 最近的数据流往前进了一步,我觉得基本可以开始同步的推进QTV200了。上次规划了整体的数据流,现在开始第一步。 内容 1 结构位置 这是上次的总体图: 以下是这次要实现的一小部分: 从结构上,这个是整体数据流的…

每日AI资讯-20240622

1. 可灵AI全新功能上线! 可灵AI全新功能上线!图生视频和视频续写来啦! 图生视频:上传任意图片,生成5秒精彩视频。支持添加提示词控制图像运动视频续写:对生成视频一键续写4~5秒,支持…

LeetCode:经典题之1491、896 题解与延伸

系列目录 88.合并两个有序数组 52.螺旋数组 567.字符串的排列 643.子数组最大平均数 150.逆波兰表达式 61.旋转链表 160.相交链表 83.删除排序链表中的重复元素 389.找不同 1491.去掉最低工资和最高工资后的工资平均值 896.单调序列 206.反转链表 92.反转链表II 141.环形链表 …

基于uni-app和图鸟UI开发上门服务小程序

一、技术栈选择 uni-app:我们选择了uni-app作为开发框架,因为它基于Vue.js,允许我们编写一次代码,发布到多个平台,包括iOS、Android、Web以及各种小程序。uni-app的丰富组件库、高效的状态管理以及便捷的预览调试功能&…

LightGBM算法详解

LightGBM算法详解 LightGBM(Light Gradient Boosting Machine)是由微软开发的高效梯度提升决策树(GBDT)实现。它以速度和效率著称,特别适用于大规模数据集和高维特征的场景。本文将详细介绍LightGBM的原理、特点、常用…

用于世界上最先进的医疗应用的精密电阻器

EAK的高性能电阻器使医疗产品设计人员能够继续改善全球患者的生活质量。我们的电阻器专为用于医疗诊断、治疗和预防的各种产品而设计。从小型植入式和非侵入性设备到大型诊断成像设备,医疗制造商之所以选择EAK 电阻器,是因为操作环境是高电压和磁场&…

AI-算力产业链之存力

在数字经济大潮下,数据已经成为新型的生产资料。 目前数据中心有三大力量:计算的力量——算力、存储的力量——存力、运输的力量——运力,即网络的力量。 算力产业链正在火热发展的同时,存力的需求也大幅度提升。2023年上半年&…

总结 CSS 选择器的常见用法

一,什么是css 在前端网页中,css就相当于化妆术,把一个很生硬的网页页面变得排版有序起来。 CSS可以对网页中的元素位置进行像素级精准控制,实现美化页面的效果,也能做到页面的样式和结构分离。 二,css的基…

MySQL中的ibd2sdi—InnoDB表空间SDI提取实用程序

ibd2sdi 是一个用于从 InnoDB 表空间文件中提取序列化字典信息(Serialized Dictionary Information, SDI)的实用程序。这个实用程序可以用于提取存储在持久化 InnoDB 表空间文件中的 SDI 数据。 可以对以下类型的表空间文件使用 ibd2sdi: 每…

消息认证码解析

1. 什么是消息认证码 消息认证码(Message Authentication Code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC。 消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据&#x…

C语言之详解预处理

前言: 预处理也叫预编译,是编译代码时的第一步,经过预处理后生成一个.i文件,如果不明白编译与链接作用的小伙伴可以先看看博主的上一篇博客—— ,不然知识连贯性可能会显得很差哦。 正文目录: 预定义符号#…

discuz迪恩cul!教育课程培训网站模板

Discuz x3.2模板 迪恩cul!教育课程培训 GBK,程序包中内附详细的安装教程,下载后按照教程安装即可 discuz迪恩cul!教育课程培训网站模板

qemu 安装ubuntu22.04虚拟机 -纯命令行-可ssh-带网络-编译安装 linux kernel-编译安装 kernel module

tar -xjf xxx.tar.bz2 1,预备系统盘数据 1.1 下载光盘 注意需要 liver-server $ wget https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-live-server-amd64.iso 1.2 挂载并拷贝 $ sudo mkdir /mnt/iso_ubuntu-22.04.4-live-server-amd64 $ sudo mount u…

星闪指向遥控,做家电交互的破壁人

“面壁者罗辑,我是你的破壁人。” 科幻小说《三体》中,当人类的基础科学被三体人封锁,变得停步不前,人类启动了自救的面壁计划,通过一次又一次破壁,找到战胜三体人的办法。 现实中,有一点已经成…

html--好看的手机充值单页

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>线上充值-首页</title><meta content"widthdevice-width,initial-scale1.0,maximum-scale1.0,user-scalable0" name"viewport&…

【Vue-Vben-Admin】1、初次运行和介绍

【Vue-Vben-Admin】1、初次运行和介绍 Vben-Admin 初次运行和介绍 小小的介绍规定版本文件树安装依赖运行项目 小小的介绍 一款 Vue3 Typescript4 Vite2 后台管理项目&#xff0c;功能挺多的&#xff0c;还有组件库 规定版本 此个人文档规定版本为 2.8.0&#xff0c;可能版本…

AI大模型企业应用实战(16)-langchain核心组件

1 stuff 将文档列表插入到提示词中&#xff0c;适合文档较小或少量文档的应用。 2 refine 通过循环输入文档并迭代更新答案来构建响应&#xff0c;一次只传递给LLM一个文档&#xff0c;适合LLM上下文大小不能容纳的小文档。 参考&#xff1a; https://js.langchain.com/v0.1…

QT中利用qss来创建一个圆角矩形窗口,并利用Qt::WA_TranslucentBackground属性解决留白问题

1、效果 2、实现 QWidget#centralwidget {border-radius: 30px solid default;border-image: url(:/images/bk<

【Golang - 90天从新手到大师】Day06 - 数组

系列文章合集 Golang - 90天从新手到大师 数组是golang中最常用的一种数据结构,数组就是同一类型数据的有序集合 定义一个数组 格式: var name [n]type n为数组长度,n>0 且无法修改,type为数组的元素类型如: var a [2]int上面的例子定义了一个长度为2,元素类型为int的数组…

MySQL数据库(三):读取数据库数据

上一节&#xff0c;我们介绍了数据库的基本操作&#xff0c;以及最后演示了如何使用库来连接数据库&#xff0c;在实际应用中&#xff0c;我们通常需要按照指定的条件对数据库进行操作&#xff0c;即增删改查操作&#xff0c;这是非常重要的&#xff01;这一节我们继续通过一个…