首页 > 系统相关 >【整理】虚拟地址全解析:操作系统内存管理与进程调度的深度揭秘!

【整理】虚拟地址全解析:操作系统内存管理与进程调度的深度揭秘!

时间:2024-09-10 21:13:14浏览次数:11  
标签:操作系统 虚拟地址 内存 进程 物理 揭秘 页面

原创 freedom47

概述

在现代计算机系统中,虚拟地址是内存管理的关键组成部分。
虚拟地址不仅帮助操作系统高效地管理物理内存,还在进程的内存分配中发挥重要作用。
本文将详细介绍虚拟地址的定义、作用、操作系统的内存管理、进程内存分配、32 位与 64 位架构的内存分配差异,以及物理内存不足时的分配策略。

虚拟地址是什么

虚拟地址(Virtual Address)是由操作系统和硬件共同管理的逻辑地址。
它为每个进程提供一个独立的、连续的地址空间,使进程能够认为自己占据了整个内存空间,而实际的物理内存可能是分散的,部分数据甚至可能存放在磁盘上。

虚拟地址的管理依赖于硬件(主要是内存管理单元 MMU)和操作系统。
MMU 负责将虚拟地址映射到物理地址,页面表(Page Table)用于维护虚拟地址与物理地址之间的映射关系。

虚拟地址的作用

1. 地址空间隔离:每个进程都有独立的虚拟地址空间,相互隔离,避免了进程间的数据干扰和非法访问,提高了系统安全性。

2. 简化内存管理:虚拟地址让程序无需关心物理内存的实际布局和大小,开发者可以专注于编写代码,内存管理的复杂性由操作系统处理。

3. 扩展内存使用:虚拟地址支持虚拟内存技术,可以将不常用的数据换入硬盘(如交换分区或页面文件),从而突破物理内存的限制。

4. 内存保护:通过权限控制(如读、写、执行权限),虚拟地址可以保护进程的内存空间,防止恶意或错误的内存访问。

操作系统如何使用物理内存

操作系统通过虚拟地址来管理物理内存,使用分页(Paging)和分段(Segmentation)机制,将物理内存划分为较小的单位,并通过页面表将这些单位映射到虚拟地址。

1. 分页机制:物理内存被划分为固定大小的页面框(Frame),虚拟地址被划分为对应大小的页面(Page)。MMU 将虚拟页面映射到物理页面框,实现虚拟地址到物理地址的转换。

2. 分段机制:将虚拟地址划分为多个段(Segment),每个段可以具有不同的长度和权限,用于代码、数据、堆栈等不同类型的数据组织。分段机制用于逻辑分离,常与分页机制结合使用。

3. 页面调度:当物理内存不足时,操作系统会将不常用的页面交换到磁盘的交换空间(Swap Space)中,从而腾出物理内存。

4. 内存保护与管理:操作系统通过页面表设置访问权限,确保进程只能访问合法的内存区域,避免越界访问其他进程的内存。

进程如何分配虚拟地址空间

每个进程在启动时,操作系统会为其创建一个独立的虚拟地址空间。这个空间通常包含以下几个部分:

1. 代码段(Text Segment):存储可执行代码,通常为只读,以防止程序错误地修改自身代码。

2. 数据段(Data Segment):用于存放已初始化和未初始化的全局变量、静态变量等数据。

3. 堆区(Heap Segment):用于动态内存分配,程序在运行时可随时调整堆的大小,用于存储动态创建的数据。

4. 栈区(Stack Segment):用于函数调用时的临时变量分配,包括局部变量和函数参数。栈具有自动分配和释放的特性。

操作系统通过每个进程独立的页面表来管理虚拟地址到物理地址的映射,确保进程之间的内存使用互不干扰。

32 位与 64 位架构下的内存分配区别

1. 地址空间大小:32 位系统的虚拟地址空间最大为 4GB,而 64 位系统的虚拟地址空间理论上可以达到 16EB(Exabytes),但受限于当前硬件和操作系统的实现。

2. 内存寻址能力:32 位系统最多可寻址 4GB 的物理内存,而 64 位系统的物理内存寻址能力更强,支持更大规模的数据处理和更高效的系统性能。

3. 页面表结构:64 位系统使用多级页面表来管理更大的地址空间,但也增加了内存开销和复杂性。

4. 性能和效率:64 位系统的寄存器数量更多,指针和数据宽度更大,能处理更大的数据块,但相应地也增加了内存占用,这在资源紧张时可能成为负担。

物理内存不足时,各个进程间是如何分配使用的

当物理内存不足时,操作系统通过虚拟内存管理机制进行优化和调度,主要策略包括:

1. 页面置换(Page Replacement):当物理内存无法满足需求时,操作系统通过页面置换算法(如 LRU、FIFO 等)将不常用的页面换出内存,并在需要时重新载入。

2. 内存交换(Swapping):当内存极度不足时,操作系统可能会将整个进程的工作集交换到磁盘中,以释放物理内存供其他进程使用。

3. 优先级调度:操作系统根据进程优先级分配物理内存,高优先级进程可能获得更多内存资源,而低优先级进程可能被限制或交换出内存。

4. 内存回收和紧缩:操作系统定期回收未使用的内存区域,并整理内存碎片,尽可能优化内存的利用率。

5. 内存超分配(Overcommitment):部分操作系统(如 Linux)允许进程申请超过实际可用物理内存的空间,以提高内存利用效率。但在资源不足时,这可能导致 OOM(Out of Memory)错误,系统会终止某些进程以释放内存。

标签:操作系统,虚拟地址,内存,进程,物理,揭秘,页面
From: https://www.cnblogs.com/o-O-oO/p/18406243

相关文章

  • 什么是内存不安全
    内存不安全:是指计算机程序中存在可能导致程序崩溃,数据泄露或者恶意攻击的漏洞。这种问题通常涉及到对内存的错误操作,可能导致程序访问问未分配的内存、访问已经释放的内存、越界访问数组等情况。​ 从硬件层面来看,内存不安全可能涉及到内存泄漏、缓冲区溢出等问题。比如,当程序......
  • 揭秘一个新兴品牌——PFU
    在竞争激烈的美妆市场中,一个新兴品牌PFU正以其独特的魅力迅速崛起,吸引着众多消费者的目光。究竟是什么让PFU在短时间内获得如此高的关注度呢?让我们一同揭开这个品牌的神秘面纱。PFU品牌的诞生源于对女性美的深刻理解和追求。其研发团队由一群专业的美妆专家和科学家组成,......
  • 精选大模型书籍推荐:揭秘大语言模型的奥秘——《自然语言处理:大模型理论与实践》
    《自然语言处理:大模型理论与实践》(预览版)由赵宇教授编写,是一本深入探讨大语言模型世界的专业著作。作为一名正在学习和研究自然语言处理的学生,这本书为我提供了宝贵的理论基础和实践指导。赵宇教授简介西南财经大学教授,博导,四川省学术和技术带头人后备人选,金融智能与金融......
  • java如何定义一个全局变量(内存中)
    前言java如何定义一个全局变量(内存中),项目启动时,通过读取配置文件来构建一个实体类对象,然后在之后可以直接使用,而不是每次使用都要进行构建前置准备实体类结构packagecn.daenx.demo;importlombok.Data;@DatapublicclassPerson{privateStringinfo;}配置文件......
  • 深入理解java虚拟机---第 3 章 垃圾收集器与内存分配策略
    3.2.2可达性分析算法当前主流的商用程序语言(Java、C#,上溯至前面提到的古老的Lisp)的内存管理子系统,都是通过可达性分析(ReachabilityAnalysis)算法来判定对象是否存活的。这个算法的基本思路就是通过一系列称为“GCRoots”的根对象作为起始节点集,从这些节点开始,根据引用关......
  • 三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?
    俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方都是一夫当关,万夫莫开;再加上千里运粮,根本不需要打,司马懿只需要坚守城池拼消耗就能不战而屈人之兵。另一边,洛阳的虎......
  • 动态内存管理
    内容索引为什么存在动态内存分配动态内存函数的介绍mallocfreecallocrealloc常见的动态内存错误几个经典的笔试题柔性数组为什么存在动态内存分配我们已经掌握的内存开辟方式有:intval=20;//在栈空间上开辟四个字节chararr[10]={0};//在栈空间上开辟10......
  • C++---内存管理
    1C/C++内存分布栈区:由编译器自动分配和释放,存放运行时候的局部变量,函数参数,返回数据,返回地址。堆区:一般由程序员自己分配,然后自己释放,例如栈的实现malloc开辟的数组空间。数据段(静态区):存放全局变量,静态数据,常量,程序结束后自动释放。代码段(常量区):存放常量字符串和可执行代......
  • 揭秘 C++ List 容器背后的实现原理,带你构建自己的双向链表
    本篇博客,我们将详细讲解如何从头实现一个功能齐全且强大的C++List容器,并深入到各个细节。这篇博客将包括每一步的代码实现、解释以及扩展功能的探讨,目标是让初学者也能轻松理解。一、简介1.1、背景介绍在C++中,std::list是一个基于双向链表的容器,允许高效的插入和......
  • pmap: 命令查看 Linux 中进程的内存使用情况
    在Linux系统中,了解进程的内存使用情况对于调试和优化程序非常重要。pmap命令是一个强大的工具,可以帮助你查看进程的内存映射和使用情况。本文将介绍如何使用pmap命令来获取这些信息,并解释输出结果的含义。什么是pmap命令?pmap是一个Linux命令行工具,用于报告进程的内存......