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

操作系统 内存相关

0 内存

cpu和内存的关系

内存覆盖

内存的覆盖是一种在程序运行时将部分程序和数据分为固定区和覆盖区的技术。这种技术的主要目的是为了解决程序较大,无法一次性装入内存导致无法运行的问题。

具体来说,内存的覆盖技术将用户空间划分为以下两个部分:

  1. 固定区: 存放程序的经常活跃的部分,这部分内容在程序运行的整个生命周期内都常驻内存中,不发生变化。

  2. 覆盖区: 将程序的其他部分按照调用关系分段,首先将即将要访问的段放入覆盖区,而其他段则放在外存中。在需要调用未在覆盖区的段之前,系统会将其调入覆盖区,替换覆盖区中原有的段,从而实现对程序和数据的动态调度。

内存覆盖技术的特点:

  • 灵活性: 允许程序只在需要时才将特定部分调入内存,而不是一次性装入整个程序。这提高了内存的利用效率。

  • 节省内存空间: 由于只有活跃部分才会常驻内存,可以在有限的内存空间中运行较大的程序。

  • 实现动态调度: 能够根据程序运行时的调用关系,动态地将程序和数据调入内存,避免了全部加载到内存的限制。

  • 需要注意更新的范围: 内存中能够更新的地方主要是覆盖区的段,因为不在覆盖区的段是常驻内存的,不会随着程序的执行而改变。

总体而言,内存的覆盖技术提供了一种灵活的方式,使得较大的程序能够在有限的内存空间中运行,并在需要时动态地调度程序和数据。

内存交换

内存交换是一种操作系统采用的技术,用于在内存紧张时进行动态的进程调度,将部分进程从内存中暂时换出,以便腾出空间供其他进程运行。同时,将一些已具备运行条件的进程从外存(磁盘等)调入内存,实现内存资源的动态调度。

特点:

  1. 解决内存紧张问题: 内存交换的主要目的是解决内存空间不足的问题。当系统中运行的进程过多,导致内存中的页面频繁发生缺页中断时,系统可以考虑进行内存交换,将部分进程换出到外存,腾出内存空间。

  2. 动态调度进程: 交换技术允许系统根据进程的运行状态和优先级,动态地在内存和外存之间进行调度。这样,即使内存中无法容纳所有进程,也可以根据需要调入最需要运行的进程。

  3. 换入和换出: 内存交换包括两个主要阶段,即换入和换出。换入是将准备运行的程序从外存移到内存,而换出是将一些处于等待状态的程序从内存移到外存。这样可以灵活地控制内存中的进程。

  4. 系统负荷降低时暂停: 内存交换通常在系统负荷较大、内存不足的情况下进行。一旦通过内存交换腾出足够的空间,系统负荷下降,缺页率明显下降,就可以考虑暂停内存交换,避免频繁地进行换入和换出,以提高系统性能。

1 虚拟内存

虚拟技术

主要有两种虚拟技术:时(时间)分复用技术和空(空间)分复用技术。

多进程与多线程:多个进程能在同一个处理器上并发执行使用了时分复用技术,让每个进程轮流占用处理器,每次只执行一小个时间片并快速切换。

虚拟内存使用了空分复用技术,它将物理内存抽象为地址空间,每个进程都有各自的地址空间。地址空间的页被映射到物理内存,地址空间的页并不需要全部在物理内存中,当使用到一个没有在物理内存的页时,执行页面置换算法,将该页置换到内存中。

why?

  1. 目的: 虚拟内存的主要目的是将有限的物理内存扩充成更大的逻辑内存空间,使得程序能够运行更大的程序或多个程序同时运行。它为每个程序提供了独立的地址空间,让每个程序都认为它在独占地使用整个内存。

  2. 地址空间和页面: 操作系统将每个程序的地址空间分割成多个块,通常称为页面。这些页面可以映射到物理内存,但不要求页面必须连续,也不要求所有页面都必须在物理内存中。

  3. 缺页中断: 当程序引用不在物理内存中的页面时,会发生缺页中断。硬件会触发必要的映射,将缺失的页面加载到物理内存中,然后重新执行引起缺页的指令。

  4. 允许部分加载: 虚拟内存允许程序只加载部分地址空间到物理内存中,而不是一次性将整个程序加载。这使得大型程序能够在有限的物理内存中运行,因为只有程序当前执行的部分需要在内存中。

分段和分页

分段(Segmentation)

好处:

  1. 产生连续的内存空间,便于程序设计和管理。
  2. 每个段可以独立调整权限,提高了系统的安全性。

问题:

  1. 外部内存碎片:由于分段机制产生的连续内存空间导致了外部内存碎片,使得分配内存的效率降低。
  2. 内存交换效率低:当需要进行内存交换时,可能需要写入或者从磁盘装载整个段,造成浪费。

分段机制将程序的虚拟地址分成若干个逻辑分段,每个分段具有不同的属性,如代码分段、数据分段、栈段、堆段等。这种机制使用段选择因子和段内偏移量构成虚拟地址。

  • 段选择因子和段内偏移量:

    • 段选择子: 存储在段寄存器中,主要包含段号,用作段表的索引。段表中保存了段的基地址、界限、特权级等信息。
    • 虚拟地址: 由段选择因子和段内偏移量组成。段内偏移量必须在0到段界限之间合法,如果是合法的,就可以通过将段基地址与段内偏移量相加得到物理内存地址。
  • 解决程序不需要关心具体物理地址的问题:

    • 分段机制通过将虚拟地址映射到物理地址,使得程序无需关心具体的物理内存地址,提高了程序的抽象性和可移植性。

优点:

段内连续

不足之处:

  1. 内存碎片问题:

    • 外部碎片: 分段机制容易导致外部碎片,不同长度的段在内存中分布可能导致未分配空间的零散浪费。
    • 解决方案: 使用分页机制可以减少外部碎片问题。
  2. 内存交换效率低:

    • 页错误开销: 当访问的段不在内存中时,会引起页错误,需要进行页面调度,导致性能开销。
    • 解决方案: 分页机制相对更适合处理内存交换,因为它可以更细粒度地调度页面。

分页(Paging)

好处:

  1. 解决了外部内存碎片问题:页与页之间是紧密排列的,避免了外部内存碎片。
  2. 更灵活的内存交换:内存分页机制以页为单位进行内存的交换,可以更加灵活地进行页面的读写。

问题:

  1. 内部内存碎片:分页机制分配内存的最小单位是一页,可能会导致内部内存碎片。

置换算法

页错误

操作系统中的页面错误(Page Fault)是指在虚拟内存系统中,当程序访问一个尚未加载到物理内存中的虚拟页面(页)时,操作系统会产生的一种异常情况。页面错误通常是由于程序试图访问虚拟内存中的某个部分,但该部分尚未被加载到物理内存中,因此操作系统需要执行以下步骤来处理页面错误:

  1. 异常触发:当程序访问虚拟内存中的某个页时,如果该页尚未加载到物理内存中,就会触发一个页面错误异常。

  2. 操作系统介入:操作系统会捕获页面错误异常,并将控制权从用户程序切换到内核态,以便处理异常。

  3. 页面加载:操作系统负责将所需的页面从磁盘或其他次级存储设备加载到物理内存中的空闲页框中。这个过程可能会导致其他页面被换出到次级存储设备以腾出空间。

  4. 页表更新:操作系统会更新虚拟内存到物理内存的映射关系,以便将虚拟地址映射到新加载到物理内存中的页面。

  5. 恢复用户程序:一旦所需的页面被加载到物理内存中,操作系统将控制权返回给用户程序,并允许其继续执行。用户程序可以重新访问所需的页面,这次访问将成功,因为页面已经加载到物理内存中。

逻辑转物理

页号、页内偏移量-->是否越界?

内存块号

物理地址

页表和快表

页表(Page Table):

  1. 定义: 页表是一种数据结构,用于存储虚拟地址空间和物理地址空间之间的映射关系。每个进程都有自己的页表,用于将其虚拟地址映射到物理地址。

  2. 工作原理: 当程序访问虚拟内存时,操作系统会使用页表查找虚拟地址对应的物理地址。页表的条目记录了虚拟页号和物理页号的映射关系。如果某个虚拟页不在内存中(发生缺页中断),操作系统会将相应的物理页加载到内存,更新页表。

  3. 缺点: 随着地址空间的增大,页表可能变得非常庞大,占用大量内存。为了解决这个问题,通常会采用多级页表结构。

快表(Translation Lookaside Buffer,TLB):

  1. 定义: 快表是一种高速缓存,用于存储页表中的部分映射关系。它位于CPU和主存之间,加速虚拟地址到物理地址的转换过程。

  2. 工作原理: 当CPU访问虚拟内存时,先在TLB中查找虚拟地址和物理地址的映射关系。如果在TLB中找到了映射关系(TLB命中),则直接使用这个映射,避免了对页表的访问。如果未命中,则需要访问页表,并将映射关系加载到TLB中。

  3. 优势: TLB的速度远高于内存访问速度,因此能够显著提高虚拟内存的访问性能。TLB的大小通常较小,因为只存储了部分页表的映射关系。

  4. TLB Miss: 当TLB未命中时,可能导致TLB Miss,需要从页表中加载映射关系。这时会引起额外的访问延迟。

有快表和每快表的区别

一般情况下:

  1. 算页号、页内偏移量:

    • 这一步主要是进行计算,并不涉及实际的内存访问。因此,这一步没有访存操作。
  2. 检查页号合法性:

    • 同样,这一步仅涉及对计算出的页号进行检查,也不涉及实际内存访问。因此,这一步没有访存操作。
  3. 查页表,找到页面存放的内存块号:

    • 在这一步,需要访问页表,将虚拟地址的页号映射到物理地址的内存块号。这一步涉及实际的内存访问,因为页表通常存储在内存中。所以,这一步有一次访存操作。
  4. 根据内存块号与页内偏移量得到物理地址:

    • 这一步涉及将内存块号与页内偏移量合并,计算出完整的物理地址。在这个过程中,通常不需要再次访问内存,因为前面已经通过页表查找得到了内存块号。所以,这一步没有额外的访存操作。
  5. 访问目标内存单元:

    • 最后一步是实际的内存访问,根据前面得到的物理地址,读取或写入目标内存单元。这一步有一次访存操作。

有快表:

先查快表再查页表,少一次

2 内存管理

malloc 原理

在执行malloc申请内存的过程中,操作系统通过两个主要的系统调用来实现动态内存分配:brkmmap

  1. brk系统调用:

    • brk系统调用用于扩展或缩小进程的数据段(heap)。
    • 当进程需要更多的堆内存时,它调用brk来增加数据段的大小。这会使数据段的末尾地址向高地址移动,为进程提供更多的可用堆空间。
    • 这个过程实际上是在调整数据段的结束地址,将其扩展到新的边界。
  2. mmap系统调用:

    • mmap系统调用用于在进程的地址空间中映射一段虚拟内存区域到某个文件或设备,或者是匿名映射。
    • malloc需要分配大块内存时,通常会使用mmap,而不是依赖于brk
    • 使用mmap可以映射一块连续的虚拟内存,而不需要连续的物理内存。这对于大型分配来说更为高效,因为mmap不会产生内存碎片。

通常,操作系统在处理malloc时会根据请求的内存大小选择使用brk还是mmap。小型分配可能会使用brk,而大型分配则可能使用mmap

内存池(复用)

为什么使用?

内存池是一种管理和分配内存的机制,通过事先分配一块固定大小的内存块(池),在需要使用内存时直接从内存池中分配,而不是通过常规的内存分配方式(如malloc)动态申请内存。内存池的使用有多个优点:

  1. 减少内存碎片: 内存池分配的内存块大小是固定的,避免了内存碎片的产生。在长时间运行的程序中,内存碎片可能导致系统性能下降。

  2. 提高分配速度: 内存池事先分配好一块固定大小的内存,当需要分配内存时,直接从内存池中获取,避免了频繁的系统调用和内存分配操作,提高了分配速度。

  3. 降低内存分配的开销: 内存分配操作本身会涉及到一些开销,例如锁的获取、内存初始化等。内存池可以通过预先分配、缓存等方式降低这些开销。(系统调用)

  4. 提高内存的重复利用: 内存池中的内存块可以被重复利用,不需要频繁地释放和重新分配内存。这对于一些长时间运行的服务或程序来说,能够提高内存的重复利用率。

  5. 控制内存的分配策略: 内存池允许程序员灵活控制内存的分配和释放策略,适应不同的应用场景。

相关文章:

操作系统 内存相关

0 内存 cpu和内存的关系 内存覆盖 内存的覆盖是一种在程序运行时将部分程序和数据分为固定区和覆盖区的技术。这种技术的主要目的是为了解决程序较大,无法一次性装入内存导致无法运行的问题。 具体来说,内存的覆盖技术将用户空间划分为以下两个部分&…...

【模拟IC学习笔记】 PSS和Pnoise仿真

目录 PSS Engine Beat frequency Number of harmonics Accuracy Defaults Run tranisent?的3种设置 Pnoise type noise Timeaverage sampled(jitter) Edge Crossing Edge Delay Sampled Phase sample Ratio 离散时间网络(开关电容电路)的噪声仿真方法 PSS PSS…...

IPv6邻居发现协议(NDP)---路由发现

IPv6路由发现(前缀公告) 邻居发现 邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议。邻居发现协议替代了IPv4的ARP(Address Resolution Protocol)和ICMP路由器发现(Router Discovery),它定义了使用ICMPv6报文实现地址解析,跟踪邻…...

OpenPLC v3 代码结构

OpenPLC v3 是一个基于 C 的开源实时自动化平台,主要用于控制和自动化行业中的设备。该项目具有以下主要模块: 1. Core:核心模块,提供数据结构和算法实现。 2. Master:主设备模块,实现与从设备通信的接口。…...

安全防御之备份恢复技术

随着计算机和网络的不断普及,人们更多的通过网络来传递大量信息。在网络环境下,还有各种各样的病毒感染、系统故障、线路故障等,使得数据信息的安全无法得到保障。由于安全风险的动态性,安全不是绝对的,信息系统不可能…...

条款39:明智而审慎地使用private继承

1.前言 在之前挑款32曾讨论了C如何将public继承视为is-a关系,在那个例子中我们有个继承体系,其中class Student以public形式继承class Person,于是编译器在必要时刻将Student转换为Persons。。现在,我在以原先那个例子&#xff0…...

【数据库原理】(20)查询优化概述

查询优化是关系数据库系统设计和实现中的核心部分,对提高数据库性能、减少资源消耗、提升用户体验有着重要影响。虽然挑战重重,但凭借坚实的理论基础和先进的技术手段,关系数据库在查询优化方面有着广阔的发展空间。 一.查询中遇到的问题 数…...

FineBI实战项目一(18):每小时上架商品个数分析开发

点击新建组件,创建每小时上架商品个数组件。 选择线图,拖拽cnt(总数)到纵轴,拖拽hourStr到横轴。 修改横轴和纵轴的文字。 调节连线样式。 添加组件到仪表板。...

Pytorch常用的函数(六)常见的归一化总结(BatchNorm/LayerNorm/InsNorm/GroupNorm)

Pytorch常用的函数(六)常见的归一化总结(BatchNorm/LayerNorm/InsNorm/GroupNorm) 常见的归一化操作有:批量归一化(Batch Normalization)、层归一化(Layer Normalization)、实例归一化(Instance Normaliza…...

业务记录笔记

一、印尼支付现状 1、银行转账,在app发起转账,生成虚拟账户,在ATM对这个虚拟账户转账就可以,或者线上对这个虚拟账户转账。 2、电子钱包,机构:Gopay、OVO、Dana、LinkAja 3、运营商支付:主要是代付&#x…...

Leetcode16-有多少小于当前数字的数字(1365)

1、题目 给你一个数组 nums&#xff0c;对于其中每个元素 nums[i]&#xff0c;请你统计数组中比它小的所有数字的数目。 换而言之&#xff0c;对于每个 nums[i] 你必须计算出有效的 j 的数量&#xff0c;其中 j 满足 j ! i 且 nums[j] < nums[i] 。 以数组形式返回答案。…...

JavaWeb- Tomcat

一、概念 老规矩&#xff0c;先看维基百科&#xff1a;Apache Tomcat (called "Tomcat" for short) is a free and open-source implementation of the Jakarta Servlet, Jakarta Expression Language, and WebSocket technologies.[2] It provides a "pure Ja…...

Android studio 各本版下载

搜索Android studio下载时发现各种需要付费下载的链接&#xff0c;在此记录一下官方的下载地址。 Android Studio 下载文件归档 | Android 开发者 | Android Developers...

[C#]winform部署PaddleOCRV3推理模型

【官方框架地址】 https://github.com/PaddlePaddle/PaddleOCR.git 【算法介绍】 PaddleOCR是由百度公司推出的一款开源光学字符识别&#xff08;OCR&#xff09;工具&#xff0c;它基于深度学习框架PaddlePaddle开发。这款工具提供了一整套端到端的文字检测和识别解决方案&a…...

谈谈Spring Bean

一、IoC 容器 IoC 容器是 Spring 的核心&#xff0c;Spring 通过 IoC 容器来管理对象的实例化和初始化&#xff08;这些对象就是 Spring Bean&#xff09;&#xff0c;以及对象从创建到销毁的整个生命周期。也就是管理对象和依赖&#xff0c;以及依赖的注入等等。 Spring 提供…...

kubernetes(一)概述与架构

云原生实战 语雀 官网 Kubernetes 文档 | Kubernetes 更新&#xff1a;移除 Dockershim 的常见问题 | Kubernetes B站课程&#xff1a;https://www.bilibili.com/video/BV13Q4y1C7hS/?p26 1.概述 概述 | Kubernetes 大规模容器编排系统 kubernetes具有以下特性&#xf…...

【Scala】——变量数据类型运算符

1. 概述 1.1 Scala 和 Java 关系 1.2 scala特点 Scala是一门以Java虚拟机&#xff08;JVM&#xff09;为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言&#xff08;静态语言需要提前编译的如&#xff1a;Java、c、c等&#xff0c;动态语言如&#…...

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第十天-Linux下mplayer音乐播放器练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…...

线性回归(Linear Regression)

什么是机器学习 线性回归是一种用于建立变量之间线性关系的统计模型。在简单线性回归中&#xff0c;我们考虑一个自变量和一个因变量的关系&#xff0c;而在多元线性回归中&#xff0c;我们考虑多个自变量和一个因变量之间的关系。 简单线性回归 简单线性回归模型可以表示为…...

matlab绘图修改坐标轴数字字体大小及坐标轴自定义间隔设置

一、背景 在matlab使用plot函数绘图后&#xff0c;生成的图片坐标轴数字字体大小及间隔可能并不符合我们的要求&#xff0c;因此需要自定义修改&#xff0c;具体方法如下 二、修改坐标轴数字字体大小 只需添加以下命令即可&#xff1a; set(gca,FontName,Times New Roman,F…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...