当前位置: 首页 > news >正文

科普文:linux系列之操作系统内存管理简介

概叙

操作系统内存管理是计算机系统中的核心技术之一,页式管理、段式管理和段页式管理各有优缺点。页式管理通过固定大小的页框减少了外部碎片,但可能导致内部碎片;段式管理符合程序逻辑,提供了灵活的内存保护,但可能导致外部碎片;段页式管理结合了两者的优点,但增加了复杂性。

在实际应用中,不同操作系统可能采用不同的内存管理方式。例如,Linux系统采用的是页式管理,而Windows系统则采用段页式管理。了解这些内存管理技术,有助于我们更好地理解和优化计算机系统的性能。

希望这篇文章能帮助大家更好地理解操作系统的内存管理。

内存管理方式有很多种,今天我们主要讨论页式管理、段式管理和段页式管理。

内存管理的基本概念

在现代计算机系统中,内存是关键资源之一。操作系统负责管理内存,以确保程序能高效、可靠地运行。内存管理的核心任务是将物理内存分配给进程,同时保护进程不互相干扰。为此,操作系统需要解决以下问题:

  • 内存分配:将内存分配给不同的进程。

  • 内存保护:防止一个进程访问另一个进程的内存。

  • 地址转换:将虚拟地址转换为物理地址。

  • 内存回收:回收已终止进程的内存

页式管理

1. 基本概念

页式管理(Paging)是最常用的内存管理方式之一。它将物理内存分成固定大小的块,称为页框(Frame),同时将程序的逻辑地址空间也分成同样大小的块,称为页(Page)。页框和页的大小通常是相同的,例如4KB。

2. 地址转换

在页式管理中,逻辑地址被分为两部分:页号和页内偏移量。地址转换通过页表(Page Table)完成,页表记录了每个页对应的页框号。具体步骤如下:

  1. 从逻辑地址中提取页号。

  2. 在页表中查找页号对应的页框号。

  3. 用页框号和页内偏移量计算物理地址。

3. 页表结构

页表的结构可能有多种形式,例如单级页表和多级页表。单级页表较简单,但对大内存不够高效。多级页表通过分级管理页表,减少了内存占用,提高了查找效率。

4. 页式管理的优点和缺点

  • 消除外部碎片:所有页大小相同,避免了外部碎片。

  • 简化内存分配:固定大小的页框简化了内存管理。

  • 增加页表开销:需要大量内存存储页表,特别是多级页表。

  • 内部碎片:最后一个页框可能未被完全使用,导致内部碎片。

  • 优点

    • 消除外部碎片:所有页大小相同,避免了外部碎片。

    • 简化内存分配:固定大小的页框简化了内存管理。

  • 缺点

    • 增加页表开销:需要大量内存存储页表,特别是多级页表。

    • 内部碎片:最后一个页框可能未被完全使用,导致内部碎片。

段式管理

1. 基本概念

段式管理(Segmentation)将程序的逻辑地址空间分为若干段(Segment),每段有不同的长度和属性。例如,代码段、数据段和堆栈段。每个段有一个段号和一个段内偏移量。

2. 地址转换

段式管理使用段表(Segment Table)进行地址转换。段表记录了每个段的基地址和段长。具体步骤如下:

  1. 从逻辑地址中提取段号。

  2. 在段表中查找段号对应的基地址和段长。

  3. 用基地址和段内偏移量计算物理地址。

3. 段表结构

段表记录每个段的基地址和段长,可以是单级段表,也可以是多级段表。多级段表用于管理大规模的段。

4. 段式管理的优点和缺点

  • 符合编程逻辑:段的划分更符合程序的逻辑结构,例如代码段和数据段。

  • 灵活的内存保护:不同段可以有不同的保护属性,提高了内存保护的灵活性。

  • 外部碎片:段的大小不固定,可能导致外部碎片。

  • 复杂的地址转换:段表管理和地址转换较为复杂。

  • 优点

    • 符合编程逻辑:段的划分更符合程序的逻辑结构,例如代码段和数据段。

    • 灵活的内存保护:不同段可以有不同的保护属性,提高了内存保护的灵活性。

  • 缺点

    • 外部碎片:段的大小不固定,可能导致外部碎片。

    • 复杂的地址转换:段表管理和地址转换较为复杂。

段页式管理

1. 基本概念

段页式管理(Segmented Paging)结合了页式管理和段式管理的优点。它先将逻辑地址空间分为若干段,每段再分为若干页。段页式管理既有段表,也有页表。

2. 地址转换

段页式管理的地址转换过程分两步:

  1. 从逻辑地址中提取段号和段内地址。

  2. 段表查找段号对应的基地址和段长,得到页表基地址。

  3. 页表查找页号对应的页框号,计算物理地址。

3. 段页式管理的优点和缺点

  • 减少外部碎片:页式管理减少了外部碎片问题。

  • 灵活的内存保护:段式管理提供了灵活的内存保护机制。

  • 增加复杂性:地址转换需要两级查找,增加了复杂性和开销。

  • 优点

    • 减少外部碎片:页式管理减少了外部碎片问题。

    • 灵活的内存保护:段式管理提供了灵活的内存保护机制。

  • 缺点

    • 增加复杂性:地址转换需要两级查找,增加了复杂性和开销。

相关文章:

科普文:linux系列之操作系统内存管理简介

概叙 操作系统内存管理是计算机系统中的核心技术之一,页式管理、段式管理和段页式管理各有优缺点。页式管理通过固定大小的页框减少了外部碎片,但可能导致内部碎片;段式管理符合程序逻辑,提供了灵活的内存保护,但可能…...

【已解决】关于MyBatis的collection集合中只能取到一条数据的问题

一、问题 在涉及多表查询的时候,使用collection元素来映射集合属性时,出现了只能查询到一条数据的情况,但用sql语句在数据库中查询会有多条记录。 二、原因 如果两表联查,主表和明细表的主键都是id的话,明细表的多条…...

前端的学习-CSS(弹性布局-flex)

一:什么是弹性布局-Flex flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。 语法: .box{display: flex; } .box{display: inline-flex; } 注意,设为 Flex 布局以后&#xff0…...

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,那么 解压后目录&#xff0c…...

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.通过…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...

StarRocks 全面向量化执行引擎深度解析

StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计,相比传统行式处理引擎(如MySQL),性能可提升 5-10倍。以下是分层拆解: 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...