科普文:linux系列之操作系统内存管理简介
概叙
操作系统内存管理是计算机系统中的核心技术之一,页式管理、段式管理和段页式管理各有优缺点。页式管理通过固定大小的页框减少了外部碎片,但可能导致内部碎片;段式管理符合程序逻辑,提供了灵活的内存保护,但可能导致外部碎片;段页式管理结合了两者的优点,但增加了复杂性。
在实际应用中,不同操作系统可能采用不同的内存管理方式。例如,Linux系统采用的是页式管理,而Windows系统则采用段页式管理。了解这些内存管理技术,有助于我们更好地理解和优化计算机系统的性能。
希望这篇文章能帮助大家更好地理解操作系统的内存管理。
内存管理方式有很多种,今天我们主要讨论页式管理、段式管理和段页式管理。
内存管理的基本概念
在现代计算机系统中,内存是关键资源之一。操作系统负责管理内存,以确保程序能高效、可靠地运行。内存管理的核心任务是将物理内存分配给进程,同时保护进程不互相干扰。为此,操作系统需要解决以下问题:
-
内存分配:将内存分配给不同的进程。
-
内存保护:防止一个进程访问另一个进程的内存。
-
地址转换:将虚拟地址转换为物理地址。
-
内存回收:回收已终止进程的内存
页式管理
1. 基本概念
页式管理(Paging)是最常用的内存管理方式之一。它将物理内存分成固定大小的块,称为页框(Frame),同时将程序的逻辑地址空间也分成同样大小的块,称为页(Page)。页框和页的大小通常是相同的,例如4KB。
2. 地址转换
在页式管理中,逻辑地址被分为两部分:页号和页内偏移量。地址转换通过页表(Page Table)完成,页表记录了每个页对应的页框号。具体步骤如下:
-
从逻辑地址中提取页号。
-
在页表中查找页号对应的页框号。
-
用页框号和页内偏移量计算物理地址。
3. 页表结构
页表的结构可能有多种形式,例如单级页表和多级页表。单级页表较简单,但对大内存不够高效。多级页表通过分级管理页表,减少了内存占用,提高了查找效率。
4. 页式管理的优点和缺点
-
消除外部碎片:所有页大小相同,避免了外部碎片。
-
简化内存分配:固定大小的页框简化了内存管理。
-
增加页表开销:需要大量内存存储页表,特别是多级页表。
-
内部碎片:最后一个页框可能未被完全使用,导致内部碎片。
-
优点:
-
消除外部碎片:所有页大小相同,避免了外部碎片。
-
简化内存分配:固定大小的页框简化了内存管理。
-
-
缺点:
-
增加页表开销:需要大量内存存储页表,特别是多级页表。
-
内部碎片:最后一个页框可能未被完全使用,导致内部碎片。
-
段式管理
1. 基本概念
段式管理(Segmentation)将程序的逻辑地址空间分为若干段(Segment),每段有不同的长度和属性。例如,代码段、数据段和堆栈段。每个段有一个段号和一个段内偏移量。
2. 地址转换
段式管理使用段表(Segment Table)进行地址转换。段表记录了每个段的基地址和段长。具体步骤如下:
-
从逻辑地址中提取段号。
-
在段表中查找段号对应的基地址和段长。
-
用基地址和段内偏移量计算物理地址。
3. 段表结构
段表记录每个段的基地址和段长,可以是单级段表,也可以是多级段表。多级段表用于管理大规模的段。
4. 段式管理的优点和缺点
-
符合编程逻辑:段的划分更符合程序的逻辑结构,例如代码段和数据段。
-
灵活的内存保护:不同段可以有不同的保护属性,提高了内存保护的灵活性。
-
外部碎片:段的大小不固定,可能导致外部碎片。
-
复杂的地址转换:段表管理和地址转换较为复杂。
-
优点:
-
符合编程逻辑:段的划分更符合程序的逻辑结构,例如代码段和数据段。
-
灵活的内存保护:不同段可以有不同的保护属性,提高了内存保护的灵活性。
-
-
缺点:
-
外部碎片:段的大小不固定,可能导致外部碎片。
-
复杂的地址转换:段表管理和地址转换较为复杂。
-
段页式管理
1. 基本概念
段页式管理(Segmented Paging)结合了页式管理和段式管理的优点。它先将逻辑地址空间分为若干段,每段再分为若干页。段页式管理既有段表,也有页表。
2. 地址转换
段页式管理的地址转换过程分两步:
-
从逻辑地址中提取段号和段内地址。
-
段表查找段号对应的基地址和段长,得到页表基地址。
-
页表查找页号对应的页框号,计算物理地址。
3. 段页式管理的优点和缺点
-
减少外部碎片:页式管理减少了外部碎片问题。
-
灵活的内存保护:段式管理提供了灵活的内存保护机制。
-
增加复杂性:地址转换需要两级查找,增加了复杂性和开销。
-
优点:
-
减少外部碎片:页式管理减少了外部碎片问题。
-
灵活的内存保护:段式管理提供了灵活的内存保护机制。
-
-
缺点:
-
增加复杂性:地址转换需要两级查找,增加了复杂性和开销。
-
相关文章:
科普文:linux系列之操作系统内存管理简介
概叙 操作系统内存管理是计算机系统中的核心技术之一,页式管理、段式管理和段页式管理各有优缺点。页式管理通过固定大小的页框减少了外部碎片,但可能导致内部碎片;段式管理符合程序逻辑,提供了灵活的内存保护,但可能…...
【已解决】关于MyBatis的collection集合中只能取到一条数据的问题
一、问题 在涉及多表查询的时候,使用collection元素来映射集合属性时,出现了只能查询到一条数据的情况,但用sql语句在数据库中查询会有多条记录。 二、原因 如果两表联查,主表和明细表的主键都是id的话,明细表的多条…...
前端的学习-CSS(弹性布局-flex)
一:什么是弹性布局-Flex flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。 语法: .box{display: flex; } .box{display: inline-flex; } 注意,设为 Flex 布局以后࿰…...
vue3集成LuckySheet实现导入本地Excel进行在线编辑,以及导出功能
第一步:克隆或者下载下面的代码 git clone https://github.com/dream-num/Luckysheet.git第二步:安装依赖 npm install npm install gulp -g 第三步:运行 npm run dev效果如下图所示 第四步:打包 打包执行成功后,…...
【征求意见】同济大学--城镇给水厂碳排放核算与评价方法
城镇给水厂保障城镇居民正常生活,是社会经济良性发展的重要基础性设施,对于我国双碳战略目标的实现至关重要。 随着城镇化的发展,城镇供水量不断升高,加上 水资源与生态环境问题不断涌现,人们对水的安全和品质的需求日…...
【Python】后台开发返回方法和状态码类的实现
Python 后台开发中,获取返回的类方法,以及状态码类的实现 代码备份 Code - response.py """ Response class for quick generate response """ from loguru_logger import get_loggerlogger get_logger(__name__)clas…...
opencloudosV8.6和openEuler 24安装 k8s
在三台机器上部署 Kubernetes 集群 1.环境准备2.在所有节点上进行以下步骤1. 更新系统和安装必要的软件包2. 禁用交换分区3. 禁用防火墙和SElinux4.系统主机名5.设置主机名与IP地址解析6.配置内核转发及网桥过滤7. 配置 Docker Cgroup 驱动8. 添加 Kubernetes 仓库并安装 kubea…...
Tensor安装和测试
1: 打开git官方 https://github.com/NVIDIA/TensorRT 2: 下载得到:TensorRT-10.2.0.19.Linux.x86_64-gnu.cuda-11.8.tar.gz 3: 下载后配置环境变量,上面地址记得改成真实地址。 4: 如果想python使用tensorrt,那么 解压后目录,…...
ELK对业务日志进行收集
ELK对业务日志进行收集 下载httpd 进到文件设置收集httpd的文件进行 设置 编辑内容 用于收集日志的内容 将日志的内容发送到实例当中 input {file{path > /etc/httpd/logs/access_logtype > "access"start_position > "beginning"}file{path &g…...
新质生产力
新质生产力”是一个相对较新的概念,指的是在数字化、智能化背景下,依托新技术、新业态、新模式,提升生产力质量和效率的一种生产力形态。它强调的是技术和创新对生产力的提升作用,尤其是在人工智能、大数据、互联网等新兴技术的推…...
《LeetCode热题100》---<5.②普通数组篇五道>
本篇博客讲解LeetCode热题100道普通数组篇中的六道题 第三道:轮转数组(中等) 第四道:除自身以外数组的乘积(中等) 第三道:轮转数组(中等) 方法一:使用额外的数…...
【面试题】【C语言】寻找两个正序数组的中位数
寻找两个正序数组的中位数 仅供学习 题目 算法时间复杂度 二分查找算法,时间复杂度为 O(log(min(m, n))),其中 m 和 n 分别是两个数组的长度。 子函数 查找两个数字的最大值 int max(int a, int b) {return a > b ? a : b; }查找两个数字的最小…...
原始的原型链是怎样玩的
带着问题看代码: 1、原始的继承是怎样实现继承的? A类的prototype 属性 B类的实例 2、实现继承后,连B类的中实例的属性(放在了A类的prototype中)和原型链的上的东西都可以用 3、A.prototype.constructor实际上已经指向…...
RabbitMQ高级篇(如何保证消息的可靠性、如何确保业务的幂等性、延迟消息的概念、延迟消息的应用)
文章目录 1. 消息丢失的情况2. 生产者的可靠性2.1 生产者重连2.2 生产者确认2.3 生产者确认机制的代码实现2.4 如何看待和处理生产者的确认信息 3. 消息代理(RabbitMQ)的可靠性3.1 数据持久化3.2 LazyQueue( 3.12 版本后所有队列都是 Lazy Qu…...
正点原子imx6ull-mini-Linux驱动之platform设备驱动实验(14)
我们在前面几章编写的设备驱动都非常的简单,都是对IO进行最简单的读写操作像I2C、 SPI、LCD 等这些复杂外设的驱动就不能这么去写了,Linux 系统要考虑到驱动的可重用性,因此提出了驱动的分离与分层这样的软件思路,在这个思路下诞生…...
z3基础学习
z3基础学习 z3是一个微软出品的开源约束求解器,能够解决很多种情况下的给定部分约束条件寻求一组满足条件的解的问题。 安装:pip install z3-solver 1. 简单使用 from z3 import * x Int(x) #创建名为x的int类型变量 y Int(y) solve(x y10,2*x…...
开发助手专业版,有反编译等多种功能
软件介绍 开发助手能够用来快速调试应用以及查看手机软硬件相关信息,包括:快速打开或关闭开发者选项中的选项。 将原来几十秒的操作缩短为一次点击。包括显示布局边界,显示 GPU 过度绘制。显示布局更新。强制 GPU 渲染 显示 GPU 视图更新&a…...
嵌入式初学-C语言-十一
#接嵌入式初学-C语言-十,以及部分例题# 循环结构 break和continue break 功能: 1. 用在switch中,用来跳出switch的case语句;如果case没有break,可能会产生case穿透。 2. 用在循环中(while、do..while、for..&#…...
浅谈几个常用OJ的注册方式
众所周知,好的OJ是成功的一半,但是有些英文OJ的注册很让人伤脑筋。 CodeForces 点进官网 戳这里 然后就会进入这个页面 在这一页里面里填写好信息即可 最后,一个邮件就会发到你的邮箱上,点击其中的链接即可激活账号 AtCoder …...
Html实现全国省市区三级联动
目录 前言 1.全国省市区的Json数据 2.找到Json数据文件(在此博文绑定资源)之后,放到resource目录下。 3.通过类加载器加载资源文件,读取Json文件 3.1 创建JsonLoader类 3.2 注入JsonLoader实体,解析Json文件 4.构建前端Html页面 5.通过…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
