操作系统原理之内存(一)

5、自动化代码结构与运维系统的优化 本文探讨了自动化代码结构与运维系统的优化方法,涵盖审批流程的模块化设计、日志记录与工单系统的集成、通知方式的选择、错误处理的策略以及持续改进的实践。同时,深入分析了运维盲目性问题,通过故障案例揭示了关键指标缺失和日志未充分利用的弊端,提出了开发与运维角色转变的必要性。文章还介绍了如何生成有用的系统指标、建立良好的日志习惯以及实施日志聚合,以提升系统的可观测性和可靠性。最终通过总结和流程图展示了优化措施的核心要点,为构建高效、可靠的运维体系提供了指导。 阅读详情

操作系统原理之内存(一)

一.内存地址重定位

在汇编指令中,我们有时会看到如下指令:

.text
.entry:    代码入口
     call  40
- main:
    .......

那么这里的40指向的是内存中的哪个位置呢?是内存的实际地址吗?

  显然,如果是实际地址的话我们的程序必须被装载在内存0地址处,但这样做肯定是存在问题的,一方面,如果这样的话每个程序都要放到0地址处;另一方面,内存0地址

处已经被操作系统占用。

     因此,这里的40必然是一个逻辑地址(或相对地址)

     那么,程序在内存中需要修改源代码中的逻辑地址,改为实际物理地址(如上图程序被加载到内存1000处时40和300都被修改了),因为程序并不是始终存在于内存的同一位置的,在被换出(swap out)内存并再次换入(swap in)时很可能并不会被加载到同一位置,所以编译时确定实际物理地址是不可取的;在这里,更可行的方式是运行时动态加上一个基地址(base)。

 

(如图中所示,操作系统进行内存调度,将部分程序换出,将其他程序换入)

   那么这个基地址被存放在哪里呢?在Linux中,基地址会被存到PCB中。在操作系统里每个进程都有一个数据结构与之对应,被称为PCB(进程控制块),当我们fork()一个进程的时候实际上是创建了一个PCB并从其父进程的PCB哪里继承一些数据,并将这个数据结构插入到系统的进程树中。

所以,整体大概是如下流程:

    编译程序->fork出PCB(进程)->在内存中找到空闲的内存空间->将这段空间的基地址赋值给PCB中的base字段->载入程序->执行每行程序时将源码中的地址与PCB中的基地址相加。

    当然为了提高效率当操作系统切换到当前进程时base字段会被放入寄存器中,所以相加是在寄存器中进行,而且CPU本身为这种操作提供了硬件支持--MMU(内存管理单元)。

二.内存的分段机制

    我们在平时玩游戏或写代码时,认为我们所使用的进程(比如游戏程序或eclipse)是整个存在于内存中的,而事实上呢?

    如果您学过一些汇编或C/C++的话,可能会很自然地认为进程是如下组成的:

    

     进程分为几个段,每个段都有自己的特点,有不同的用途,而事实上就像上图所示,我们前文所讲的0地址并不是整个程序从0开始,而是程序中的每个段都从0开始,

程序的这几个段有的只读(如代码段),有的可写(如数据段),如果同一处理的话明显会造成混乱,比如错误地写了程序段等。

     因此程序在加载时并非整个一起加载进内存,通常是分段加载。

     所以,在加载段进内存时,地址重定位就与之前加载整个程序进内存有所不同:

  这种情况下,定位一个地址就变为段的基地址+段内偏移量,如果使用之前那种加载整个进程的方式,PCB中只需要存放一个程序基地址,而分段加载则需要

存放每个段的基地址,这样仅仅使用一个base字段是满足不了的,在PCB中必须保存一个表用来保存每个段的基地址:

  如上图,根据进程段表,汇编指令运行时会进行重定位,过程如下:比如执行图中第一条mov指令,会在段表中找到DS段的基地址360k,再于100相加,这才是

实际地址。

     每个Linux中的进程都会使用一个进程段表(LDT表),而操作系统本身也是一个进程,它也同样使用的进程段表(GDT表)。

     因此,我们进程地址重定向的一个整体流程变为:

     编译程序-->创建PCB-->程序中的某个段(如代码段)找到一个空闲的内存空间-->将内存基地址存入PCB中的LDT表里-->其它段载入过程类似

     -->执行程序,将逻辑地址和LDT表中该段的基地址相加。

三.内存分区和分页

     1.内存分区

    前文提到我们需要将首先我们的程序需要载入内存,在载入时需要在内存中找到空闲区域,因此必须将内存事先分割成不同区域,那么如何分割内存才合理呢?

首先,我们可能会想到将内存等分为n个区域,但这明显是不合理的,因为我们的程序占用空间大小不一,每个段需要的空间亦不相同。

一种很自然地想法是,根据每个段实际需要的大小进行分配,并记录已经占用的空间和剩余空间:

 

    

 

 

 

            

    这样,当一个段请求内存时,就到空闲分区中申请一段内存,并在已分配分区表中记录这一过程。

    内存适配:

       当一个段请求内存时,如果有内存中有很多大小不一的空闲位置,那么选择哪个最合理?

       1. 首先适配:空闲分区表中选择第一个位置(优点:查表速度快)

       2. 最差适配:选择一个最大的空闲区域

       3. 最佳适配:选择一个空闲位置大小和申请内存大小最接近的位置,比如申请一个40k内存,而恰巧内存中有一个50k的空闲位置(这里最佳并不意味着最好,

         因为最佳适配可能导致大量内存碎片)

   2.内存分页

    尽管分区的方式解决了申请内存的问题,但很明显的是其会带来大量的内存碎片,意思是尽管我们内存中仍然存在很大空间,但全部都是一些零散的空间,当申请

大块内存时会出现申请失败。如图中所示,灰色区域为内存碎片。

为了不使这些零散的空间浪费,操作系统会做内存紧缩,即将内存中的段移动到另一位置。但明显移动进程是一个低效的操作。

这就引入了内存分页的机制:

     如图中所示,如果操作系统实现将内存分割成多个页框,而段申请内存时按页分配,这样的话,一个段最多浪费一个页框。也就不需要做耗时的内存紧缩操作了。

但如上图所示,一个段会被分割到多个页框中,显然,我们的内存重定位方式需要进一步改变。

VN5620以太网测试——环境搭建篇 CANoe(CAN open environment)VN5620 :是一个紧凑而强大的接口,用于以太网网络的分析、仿真、测试和验证。VN5620 接口支持各种可能的应用。它适用于与其他总线系统、网络参与(例如在模拟和生成帧、测试中的负载和错误)的同步以太网监控。在2021年Vector公司的以太网接口卡VN5610和VN5640设备已经陆续停产,相应被VN5620和VN5650代替。 阅读详情

相关推荐

CentOS 9 Stream 上安装 MySQL 8.0+

根据提示进行设置,包括设置新的 root 密码、禁用远程 root 登录等。MySQL 在首次安装时会生成一个临时密码。这样就完成了 MySQL 8.0.37 的安装。这将安装最新的 MySQL 8.0 版本。

小强不是坑 1679

linux 内存紧缩,避免物理内存碎片化 - 内存紧缩

长期存在的内存碎片问题,已经有多篇文章提及了。简单的说:当系统运行一段时间后,空闲页面趋向于散落在不连续的空间,很难再有足够长的连续物理内存页面分配。内核开发者已经下了很多工夫,减少大块连续物理内存的分配,因此大部分内核功能并不会受到页面碎片化的影响。但是仍然存在对大块连续物理内存的需要,在内存碎片化系统上的内存分配,因此可能失败。过去几年,内核开发者们做出了各种努力来解决这个问题,导致了了ZON...

weixin_34379989的博客 656

512分辨率万能遮罩模型实战指南:从下载到高精度应用

本文提供了512分辨率万能遮罩模型的完整实战指南。该模型经过超过540万次迭代,专门优化了对头发、手、眼睛等复杂区域的识别。文章详细介绍了从可靠渠道下载、环境部署、使用DF_ICE工具批量应用遮罩,到利用XSeg Editor进行高精度精修的全流程,旨在帮助用户显著提升AI换脸合成视频的质量与效率。

y2z3a4b5c的博客 1165

linux 内存紧缩,一文浅析内存管理机制

原标题:一文浅析内存管理机制“本文主要介绍内存管理机制:物理内存与虚拟内存的关系,Linux内存管理机制,Python内存管理机制,Nginx内存管理机制,环形缓冲区机制,以及TC-malloc内存分配器的Andriod管理机制的简单介绍。”一. 物理内存与虚拟内存众所周知,程序需要加载到 物理内存才能运行, 多核时代会出现多个进程同时操作同一物理地址的情况,进而造成混乱和 程序崩溃。计算机当中很...

weixin_34252946的博客 546

Java开发者的福音:Aspose 25.10全系列(Cells/Words/PDF/Slides)最新版破解与集成保姆级教程

本文为Java开发者提供了Aspose 25.10全系列组件(Cells/Words/PDF/Slides)的最新版破解与集成保姆级教程。通过详细的Maven依赖配置、字节码修改技术绕过限制,以及Spring Boot项目中的实战集成指南,帮助开发者高效实现Office文档处理功能,提升开发效率。

weixin_30919429的博客 346

大模型-CLIP 详细介绍

最先进的计算机视觉系统通常被训练来预测一组预定义的对象类别。这种受限的监督形式限制了它们的通用性和可用性,因为要指定任何其他视觉概念,就需要额外的标注数据。比如,它们可以识别“猫”、“狗”、“汽车”等。但是,这种做法有一个明显的局限性:如果你想让系统识别一个新的类别,比如说“独角兽”,你就必须提供大量带有“独角兽”标签的图片来训练系统。这不仅耗时费力,而且限制了系统的灵活性和广泛适用性。直接从原始文本中学习关于图像的信息是一种很有前途的替代方案,因为它利用了更广泛的监督来源。

晓的博客 9719

10分钟!搞懂计算机内存实现原理

震惊,原来内存条是这么实现的!

林老师带你学编程 1768

Tessent实战:网表扫描链插入全流程解析

本文详细解析了使用Tessent工具为网表插入扫描链(Scan Chain)的全流程。从前期环境配置、网表检查,到扫描链数量、时钟域等核心配置,再到执行扫描单元替换与连接,最后进行结果验证与文件输出。文章提供了关键命令与实用技巧,帮助工程师高效完成DFT设计,确保芯片可测试性。

hhh00的博客 747

linux 内存紧缩,内存紧缩(内存碎片化处理)

前边介绍的有关动态内存管理的方法,无论是边界标识法还是伙伴系统,但是以将空闲的存储空间链接成一个链表,即可利用空间表,对存储空间进行分配和回收。本节介绍另外一种动态内存管理的方法,使用这种方式在整个内存管理过程中,不管哪个时间段,所有未被占用的空间都是地址连续的存储区。这些地址连续的未被占用的存储区在编译程序中称为堆。图 1 存储区状态假设存储区的初始状态如图 1 所示,若采用本节介绍的方法管理这...

weixin_31081677的博客 883

六、数据资产平台功能架构

该架构图展示了一个功能完善的数据资产平台,它涵盖了数据资产管理的各个方面,从数据采集、模型设计、编目到使用和分析。通过该平台,企业可以更好地管理数据资产,提高数据利用效率,并为业务决策提供有力支持。

moton2017的博客 1627

半导体材料仿真:二维材料仿真_(1).二维材料的基本概念

在半导体材料仿真领域,二维材料因其独特的物理和化学性质而受到广泛关注。二维材料,也称为二维纳米材料,是指在二维空间(通常是平面)上具有原子级厚度的材料。这些材料的厚度通常在几个纳米甚至单个原子层的范围内,使得它们在电子、光学、热学和机械性能上表现出与传统三维材料显著不同的特性。本节将详细介绍二维材料的基本概念,包括它们的分类、结构、性质以及在半导体材料仿真中的应用。

2401_87715305的博客 1546

操作系统(下)

不过,需要注意的是,实际应用中这些算法会被做一些改进,就比如 InnoDB Buffer Pool( InnoDB 缓冲池,MySQL 数据库中用于管理缓存页面的机制)就改进了传统的 LRU 算法,使用了一种称为"Adaptive LRU"的算法(同时结合了 LRU 和 LFU 算法的思想)。看完了之后你会发现快表和我们平时经常在开发系统中使用的缓存(比如 Redis)很像,的确是这样的,操作系统中的很多思想、很多经典的算法,你都可以在我们日常开发使用的各种工具或者框架中找到它们的影子。

2301_80148369的博客 925

堆一呼一吸之间:动态扩缩容引发JVM堆内存震荡的伸缩算法、代际传导与容器定容解析

Kubernetes扩容后,新Java实例的GC频率常比老实例高出数倍,堆容量反复伸缩。本文从一次支付系统的GC陡增出发,结合HotSpot源码与JDK 8实测,拆解堆伸缩的记账规则:期望容量以GC后已用量为基数、以Xms为下限,按空闲比例判断扩缩,收缩只在老年代回收后按0%、10%、40%、100%步进;再剖析年轻代随老年代联动、晋升风暴与元空间触发线,对比Parallel、G1、ZGC等收集器及JDK 26的变化,讨论容器分账、HPA共振与原地扩缩容,最后给出分级定容、预热与监控的方案。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

操作系统原理与源码实例讲解:自己动手写操作系统学习笔记

1.背景介绍 操作系统是计算机系统中的核心组成部分,它负责管理计算机硬件资源,为计算机用户提供各种服务,如进程管理、内存管理、文件管理等。操作系统的设计和实现是计算机科学的一个重要领域,涉及到许多核心概念和算法。 本文将从《操作系统原理与源码实例讲解:自己动手写操作系统学习笔记》这本书的角度,深入探讨操作系统的核心概念、算法原理、具体实现和应用。我们将从以下几个方面进行讨论: 背景介绍 核...

AI天才研究院 587

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【2021/7/19 更新】【梳理】简明操作系统原理 附录一 虚拟内存子系统案例选讲(VAX/VMS + Linux)(docx)

参考教材: Operating Systems: Three Easy Pieces Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau 在线阅读: http://pages.cs.wisc.edu/~remzi/OSTEP/ University of Wisconsin Madison 教授 Remzi Arpaci-Dusseau 认为课本应该是免费的。 ———————————————————————————————————————— 这是专业必修

COFACTOR 902

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

计算机的心智:操作系统之哲学原理 pdf电子书

重要提示尊敬的用户您好,由于该计算机的心智:操作系统之哲学原理pdf电子书受百度网盘影响无法做公共分享,只能私密分享,有不到之处请多多谅解! 百度网盘链接: http://pan.baidu.com/s/1F0rAa 密码: tkq9 编辑推荐: 所见的是暂时的,所不见的是永远的。 这是一个瞬息万变的时代。 分布式计算的脚步渐行渐远,网格计算的热潮逐步退却,云计算和云存储

花虫专栏 4036

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

读《操作系统之哲学原理》的一点感想

从小就开始数了。 数到懂事,数到成熟, 还没有数清。 天上的星星为什么数不清呢? 像记忆和幻想, 永远背负着固执的迷。。。。。。 不要失望, 不要迷茫; 抬起头来,让我们数星星; 也许,我们能数得清; 也许,我们能看到真理的光芒; 也许,这就是我们的希望。。。。。。 最近看了一本关于操作系统的书,它的中文译名是:《操作系统之哲学原理》。 自己觉得这本书写的很好...

weixin_34258782的博客 206

腾讯技术官又曝神作,两份堪称‘千古绝唱’操作系统笔记现已被全网疯传

操作系统的奥秘 记得小时候常常念过的一首诗是这样的: 从小时候就开始数了。 数到懂事、数到成熟, 还没有数清。 天上的星星为什么数不清呢? 像记忆和幻想, 永远背负着固执的谜.... 对于许多大学计算机及相关专业的同学来说,操作系统就像天上的星星,隐藏着一个固执的谜,永远学不清楚。不过,操作系统真的学不清楚吗? 不是的。学不清楚是因为没有看到其背后的奥秘。这个奥秘不是所有的人都知道的。即使是研究操作系统的人也不一定意识到它,更别提计算机初学者了。 那么这个奥秘是什么呢? 天上的星星数不

m0_50180963的博客 3167

计算机操作系统的工作原理英文,计算机操作系统原理分析

《计算机操作系统原理分析》是2014年清华大学出版社出版的图书,作者是丁善镜[1]。书名计算机操作系统原理分析作者丁善镜ISBN9787302284710定价29.5元出版社出版时间2014-12-18装帧平装计算机操作系统原理分析内容简介编辑语音本书以单处理器计算机系统的并发执行工作方式为管理、控制对象,介绍计算机操作系统的基本原理和方法,主要包括操作系统引论、操...

weixin_30689519的博客 833

操作系统

第三章 内存管理 3.1 内存管理概述 操作系统的内存 管理功能,是指操作系统中负责管理内存使用的那部分功能子集,又称主存管理。其工作内容和任务,取决于内存硬件提供的原始使用方式与用户对内存的使用要求之间的差距。更准确地说,取决于该差距中的硬件相关和应用无关的内容。 内存又称主存。 3.1.1 内存概念、作用、性能指标和计算机存储层次 1.一个计算机系统由三部分组成:计算机子系统、存储子系统和I/O子系统。其中存储子系统用于存储和存取信息,通常由多种不同的存储介质共同构成,从而形成 外存、内存、Cach

weixin_42930828的博客 229

对操作系统底层认识还是一片空白怎么办?

昨天看到一条评论,读者自己说明了自己对操作系统底层认识一片空白的解决方法,小编觉着应该在这里说一下。读者解决问题的方法是看了《操作系统导论》,而且他准备再看第二遍。哈哈。 那么《操作系统导论》到底是一本什么要的书呢? 《操作系统导论》围绕3个主题元素展开讲解:虚拟化(virtualization)、并发(concurrency)和持久性(persistence)。对于这些概念的讨论,...

人邮异步社区 737

告别内存分配烦恼,定长内存池来“救场”

《高效内存管理方案:定长内存池原理与实现》 摘要: 本文探讨了常规内存分配方式(如new/malloc)在频繁操作中导致性能下降和内存碎片化的问题。通过类比酒店房间管理,阐释了定长内存池的核心原理:预先申请大块内存并按固定大小切分,通过空闲链表管理内存块的分配与回收。文章详细解析了关键数据结构(空闲链表、内存池结构体)和核心操作(初始化、分配、释放),并提供了C++实现代码示例。性能测试表明,定长内存池在10万次操作中耗时仅350ms,相比系统分配的1200ms具有显著优势,特别适合游戏粒子、网络数据包等频

深度Linux 835

操作系统之哲学原理12----文件原理

文件是操作系统为磁盘提供的抽象。 磁盘原理 磁盘就是形状像盘子的磁性存储介质。 磁盘的结构: 磁盘由多个盘片组成,每个盘片有两个盘面,正反两面都可以存放数据。 每个盘面一个读写磁头,所有读写磁头连在一根共享的磁臂上。 盘面的结构: 每个盘面分为磁道和扇区。 磁道是一个个同心环。 磁道又分为扇区。 数据以扇区为单位进行存储。 数据访问时间=寻道时间+旋转时间+传输时间 寻道时间:磁头转到要求的磁道的平均时间。 旋转时间:磁头到达磁道后,扇区旋转到磁头下面的时间。 传输时间:读、

一个热爱逆向,喜爱学习、分享的猿。 1399

[其他] 字节byte不总是内存中的最小寻址单位(极少情况下不是)

另外,物理内存是不存在字节这样的概念的,所以字节及数据类型这些标识内存空间大小的概念是由不同的语言标准定义的,而目前几乎所有操作系统都是由c语言编写,所以内存管理模块遵循的是c语言对于内存的划分原则,因此c语言的内存划分规则就变成了“普适性”的惯例。但是我们还是需要了解底层原理,在不同的机器架构上,甚至在特定的操作系统上,最小的内存寻址单位都可能不同,但是在大部分情况下字节就是最小的内存寻址单位,c和c++标准都有明确的要求。这有助于定位一些跨系统和跨硬件架构的兼容问题。

ykun089的博客 833

Pintos操作系统实践报告-综合版:深入探索操作系统的核心奥秘

Pintos操作系统实践报告-综合版:深入探索操作系统的核心奥秘 去发现同类优质开源项目:https://gitcode.com/ 在当前计算机科学领域,操作系统是构筑整个计算机体系的核心。华东师范大学的Pintos操作系统实践报告-综合版项目,为我们提供了一个深入了解操作系统工作原理的绝佳机会。 项目介绍 Pintos操作系统实践报告-综合版,是一份针对操作系统课程学习的实验报告。该项目基于斯坦...

gitblog_06711的博客 316

深入理解操作系统:操作系统精髓与设计原理第六版习题答案推荐

深入理解操作系统:操作系统精髓与设计原理第六版习题答案推荐 去发现同类优质开源项目:https://gitcode.com/ 操作系统精髓与设计原理第六版习题答案:助你掌握操作系统核心功能与设计原理 《操作系统精髓与设计原理》第六版习题答案,作为一本经典教材的辅助资料,为学习者和研究人员提供了一种深入理解操作系统的便捷途径。以下是该项目推荐文章,旨在为读者详细介绍这一开源项目的核心价值。 项目介绍...

gitblog_06758的博客 444
上一篇: redis文件事件结构体
下一篇: 物理地址和逻辑地址
TuxedoLinux
博客等级 码龄9年 268粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值