Linux_进程地址空间

news2024/11/30 2:26:58

我们用c语言写的程序,经过编译后形成可执行程序存放在硬盘。当运行该程序时,操作系统将该程序加载到内存中,创建进程控制块,变为进程,然后开始执行该程序。大家是否想过,操作系统是如何加载的呢;我们在程序中使用的地址,是否是内存地址呢;当程序所占空间大于内存时,又该如何,比如游戏100G,内存只有16G;这一切的答案都在进程地址空间中,下面我拿c/c++的程序地址空间来举例。

一.为什么要有程序地址空间呢?

如果没有进程地址空间,程序直接载入内存,这样就无法保证进程独立性。因为c语言的野指针问题,当内存暴露于程序当中,这样程序员就可以用指针随意访问内存,这样造成的危害是巨大的。故此,产生了进程地址空间。此时,程序看到的空间不是内存,使用的地址也不是内存地址,而是虚拟地址。于是,也就不存在访问其他进程的情况,保证了进程间独立性。
image.png

二.什么是进程地址空间?

2.1 进程地址空间概念

进程地址空间,即虚拟地址空间。一个进程运行时,它所认为自己管理的空间就是虚拟地址空间,一个进程地址空间的大小取决于计算机系统架构,比如32位机,进程地址空间为4GB。

2.2 c/c++进程地址空间的区域划分

在这里插入图片描述

2.3 进程地址空间的管理

在Linux中,需要对每个进程的进程地址空间进行管理,怎么管理?先描述再组织。进程地址空间本质Linux内核中的一个数据结构struct mm_struct{},对于每一个进程,都有自己的mm_struct,且其大小都一样,32位下都是4GB,4GB是进程可管理空间的大小。Linux中进程控制块task_struct中有一个成员指针,指向自己的进程地址空间。

//内核中大致是这样描述进程地址空间的
struct mm_struct()
{
    long code_start;
    long code_end;
    long brk_start;
    long brk_end;
    long init_start;
    long init_end;
    //.....
}

image.png

1.4 虚拟地址到物理地址

我们的程序在编译时,编译器就按照程序地址空间的方式对程序进行划分,为代码和数据分配好了空间,这种文件的格式就是ELF格式。在程序中的每一条指令都有自己的地址,这个地址就是虚拟地址,在Linux中可以使用objdump -S file 进行反汇编查看。
当操作系统加载程序时,要为每一个程序创建task_struct,mm_struct ,页表…,而页表可以实现从虚拟地址转换为物理地址。每一个进程的入口地址(虚拟地址)是规定的,cpu通过入口地址经过页表转换为访问物理地址,同时读取物理地址空间的内容,即第一条指令。下面的页表只是一种简化情况,真实页表还有许多字段,比如权限位等等。
image.png

三.进程地址空间的作用

  1. 防止一个进程内部的指针随意访问,保护物理内存和其他进程。

如果没有虚拟地址空间,那么我们每个进程都是直接访问物理内存的,如果一个进程中出现了错误,导致访问了别的进程中的数据,这样就无法保证进程之间的独立性

  1. 将进程管理和内存管理进行解耦合

使程序员只需要关心自己程序而不用关心内存方面,可以大大增加开发的效率。因为程序员看到的是虚拟地址,而不是内存地址。

  1. 不用将一个大型程序一次载入内存,只要载入用到的部分即可

100G游戏,可能只会用到一部分功能,而其他功能的代码和数据不用载入内存,可以更好的利用内存。

  1. malloc相关

malloc之后,操作系统并不会立即分配空间,因为操作系统追求高效,当你使用该块空间的时候,继而为你开辟空间,怎么实现这样机制呢?使用的是缺页中断,即:将页表中只分配虚拟内存,等程序用该块空间的时候,分配物理内存,并且填充页表,建立完整映射关系。而这种方式得益于虚拟地址空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1449949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

164基于matlab的奇异值分解、小波降噪、zoom细化

基于matlab的奇异值分解、小波降噪、zoom细化。程序已调通,可直接运行。 164 奇异值分解 小波降噪 zoom细化 (xiaohongshu.com)

ESP32学习(1)——环境搭建

使用的ESP32板子如下图所示 它可以用Arduino 软件,基于C语言开发。但是,在这里,我是用Thonny软件,基于micro_python对其进行开发。 1.安装Thonny Thonny的软件安装包,可以去它官网上下载。Thonny, Python IDE for begi…

春节专题|产业7问:区块链厂商的现在和未来——基础设施厂商

2023转瞬即逝,不同于加密领域沉寂一整年后在年末集中爆发,对于我国的区块链厂商而言,稳中求胜才是关键词,在平稳发展的基调下,产业洗牌也悄无声息的到来。 从产业总体而言,在经过了接近3年的快速发展后&…

利用C语言编程从数学角度揭秘2024春晚刘谦魔术《守岁共此时》

目录 一、魔术《守岁共此时》的步骤 二、揭秘魔术《守岁共此时》 三、数学模型约瑟夫问题(约瑟夫环) 四、编程复现魔术《守岁共此时》 五、程序运行结果 一、魔术《守岁共此时》的步骤 在今年的春晚里,魔术师刘谦表演了一个和纸牌相关的…

AndroidStdio修改安卓模拟器的安装位置

AndroidStdio修改安卓模拟器的安装位置 1.删除原有的虚拟机 可以直接删除这个avd文件,放心大胆删除 在这个目录下可以看到.avd文件和.ini文件。.avd占了我10G.上图是我转移.avd后截的。发现这个.ini文件,.ini文件就是配置文件,就像mysql安装…

HTML快速入门教程

HTML:超文本标记语言(Hyper Text Markup Language),是通过标签的形式将内容组织起来然后共享到网络之上供其他电脑访问查看。 大家可以思考一下,怎么将自己电脑上的文件或图片共享给其他电脑? 这时候会说通…

C++ //练习 6.7 编写一个函数,当它第一次被调用时返回0,以后每次被调用返回值加1。

C Primer(第5版) 练习 6.7 练习 6.7 编写一个函数,当它第一次被调用时返回0,以后每次被调用返回值加1。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /**********************…

【MySQL进阶之路】千万级数据删除导致的慢查询SQL调优实战

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复 「资料」 可领取编程高频电子书! 在我后台回复「面试」可领取硬核面试笔记! 文章导读地址…

Pandas数据库大揭秘:read_sql、to_sql 参数详解与实战篇【第81篇—Pandas数据库】

Pandas数据库大揭秘:read_sql、to_sql 参数详解与实战篇 Pandas是Python中一流的数据处理库,而数据库则是数据存储和管理的核心。将两者结合使用,可以方便地实现数据的导入、导出和分析。本文将深入探讨Pandas中用于与数据库交互的两个关键方…

2024,欢迎来到性价比时代

「不是XX买不起,而是YY更有性价比。」——翻开过去一年的商业消费史,这句话几乎可以贯穿始终。年轻消费者们追求性价比的眼光一旦定型,一些品牌过去被品质生活、消费升级包装出来的华丽外壳,很容易一击就碎。 胜出的「性价比之王…

关于nuclei-ai-extension

nuclei-ai-extension 🍁 Nuclei 官方开发的 利用 AI 生成 nuclei 模板的工具。Nuclei AI - 用于快速生成 Nuclei 模板的浏览器扩展,Nuclei AI Browser Extension建立在 cloud.projectdiscovery.io 之上,使用户能够从任何网页中提取漏洞信息&…

【JAVA-Day77】Java线程继承Thread类实现Runnable接口

Java线程继承Thread类实现Runnable接口 《Java线程编程指南:轻松掌握线程的创建和启动》摘要 😊引言 🚀一、什么是进程和线程 ❓二、线程如何创建 😎2.1 继承Thread类并重写run()方法 📝2.2 实现Runnable接口并实现run…

ZISUOJ 2022年算法基础公选课练习四(Map)

说明: 博主为了提早预习数据结构和C的一些知识,自己琢磨外加查阅资料所写的代码,题目来源于22年初的学院老师组织的算法基础公选课的练习。我的代码甚至思路肯定存在许多不足和错误,欢迎大家批评指正。 题目列表: 问题…

操作系统-408

一、操作系统概述 1、定义 负责协调软件和硬件的计算机资源的工作为上层应用提供简易的服务操作系统是系统软件 2、功能: 操作系统是系统资源的管理者 处理机管理存储器管理文件管理设备管理向上层提供方便易用的服务 命令接口程序接口对硬件机器的扩展 3、特征…

(四十)大数据实战——Zabbix监控平台的部署搭建

前言 Zabbix是一款能够监控各种网络参数以及服务器健康性和完整性的软件。Zabbix使用灵活的通知机制,允许用户为几乎任何事件配置基于邮件的告警,这样可以快速反馈服务器的问题。基于已存储的数据,Zabbix提供了出色的报告和数据可视化功能。…

OpenGL-ES 学习(1)---- AlphaBlend

AlphaBlend OpenGL-ES 混合本质上是将 2 个片元的颜色进行调和(一般是求和操作),产生一个新的颜色 OpenGL ES 混合发生在片元通过各项测试之后,准备进入帧缓冲区的片元和原有的片元按照特定比例加权计算出最终片元的颜色值,不再是新&#xf…

PR:剪辑工具的使用

这些是剪辑工具: 选择工具 用来选择、拉伸或者拖拽用,如果放置到片段开头和结尾处会变成红色带箭头的方框,可以拉升或者缩短片段的时长 如果缩短的话,两段视频之间会出现空挡 可以点击空挡处,右键点击删除波纹&#xf…

Java毕业设计-基于ssh的网上电子商城管理系统-第74期

获取源码资料,请移步从戎源码网:从戎源码网_专业的计算机毕业设计网站 项目介绍 基于ssh的网上电子商城管理系统:前端jsp、js,后端 struts、spring、hibernate,集成商品浏览,商品详情,购物车&…

【Apache Superset】从概述、安装到运用,一篇掌握!

文章目录 什么是 Superset?Superset 的优势安装安装 Anaconda 包管理工具创建 Superset 的 Python 环境 下载 Superset 依赖更新工具安装 Superset配置 MySQL 元数据库初始化 Superset 数据库报错一报错二报错三数据库初始化完成 初始化 Superset报错一警告信息 启动…

【顶刊|修正】多区域综合能源系统热网建模及系统运行优化【复现+延伸】

目录 主要内容 部分代码 结果一览 下载链接 主要内容 该程序复现《多区域综合能源系统热网建模及系统运行优化》模型并进一步延伸,基于传热学的基本原理建立了区域热网能量传输通用模型,对热网热损方程线性化实现热网能量流建模&#xff…