我与Linux的爱恋:进程地址空间

🔥个人主页:guoguoqiang. 🔥专栏:Linux的学习

文章目录
- 1.来段代码
- 2.引入最基本的理解
- 3.尝试理解
1.来段代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <unistd.h>
int g_val = 100;int main()
{printf("father is running, pid: %d, ppid: %d\n", getpid(), getppid());pid_t id = fork();if(id == 0){//childint cnt = 0;while(1){printf("I am child process, pid: %d, ppid: %d. g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);sleep(1);cnt++;if(cnt == 5){g_val = 300;printf("I am child process, change %d -> %d\n", 100, 300);}}}else{//fatherwhile(1){printf("I am father process, pid: %d, ppid: %d. g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);sleep(1);}}
}

从一开始父子进程是相同的,由此可以推出我们打印的地址不是物理地址,而是虚拟地址,所以我们在c/c++中看到的都为虚拟地址,由操作系统负责转化为物理地址。
关于地址,从低地址到高地址存储的依次是:代码段、初始化全局数据区、未初始化全局数据区、堆区、栈区、命令行参数与环境变量。其中,堆区的空间是从小到大增长的,而栈区的空间是从大到小增长的
其中在32位机器中,使用32位(比特位)来表示一个地址,这意味着它可以表示 2^32
个不同的地址,也就是4GB;在64位机器中,使用64位(比特位)来表示一个地址,它可以表示 2^64 个不同的地址,也就是16EB
需要注意的是,这里的EB指的是艾字节(Exabyte),1EB等于 1,0241,024 PB(拍字节),而1PB等于 1,0241,024 TB(太字节),1TB等于 1,0241,024 GB(千兆字节),1GB等于 1,0241,024 MB(兆字节),1MB等于 1,0241,024 KB(千字节),1KB等于 1,0241,024 字节。因此,16EB是一个非常巨大的数字,远远超过了当前大多数应用场景的需求。

32位下是4GB 64位下是16EB
2.引入最基本的理解
当子进程修改g_val的值时,为了确保进程的独立性(也就是说子进程的数值修改不应该影响父进程),此时就会发生写时拷贝,会给子进程g_val开辟独立的物理地址空间,而不是与父进程共享同一块空间,通过我们观察发现,代码依旧共享一段空间,只是数据区不同了。

3.尝试理解
什么叫做地址空间?
在32位机器下,数据与地址总共32根线,每根数据与地址线可以产生充电和放电两种状态即0和1.因此地址总线组合排列形成的地址范围为[0,2^32],这就是地址空间。
那么如何理解地址空间的区域划分呢?
有时候你和同桌(张三和李四)吵架了,然后桌子总共200cm,然后规定每人100cm,即把课桌划分为[0,100] ,[101,200]这两个区域划分,如果我们要记录区域结果,我们需要先描述再组织
struct desktop{int zhangsan _start;int zhangsan _end;int lisi _start;int lisi _end;
}
操作系统为每个进程创建了进程地址空间和mm_struct,用于记录每个进程的各个区域的起始位置和结束位置。在已经被分配给某进程的空间范围内,该进程可以随意使用和访问

那么为什么要有进程地址空间呢?
例子:大富翁的私生子
大富翁有三个私生子,三个私生子之间互不直到对方的存在,这个大富豪对每个私生子说我有100亿,等到哪天你就继承我的100亿。如果其中某个儿子有需求要10w大富翁就给10w,但是如果要100亿 ,就可能无法成功,但他并不会觉得这100亿不是他的,而是觉得自己申请的太多了。

这里的大富翁就相当于操作系统,而这三个私生子就相当于进程。操作系统有4GB的内存空间,每个进程都认为自己有4GB,但是在通常情况下,进程并不会申请过大的空间。

因此 1.将无序变为有序
在操作系统中,虚拟内存是一种内存管理功能,它让每个进程都认为自己有连续的、独立的地址空间。而物理内存可能并不是连续的,并且被多个进程共享。这样每个进程都认为自己有所有的内存,但是实际上它们操作的是不同的物理内存区域。
进程隔离:每个进程都不能访问其他进程的内存,这增强了系统的稳定性和安全性。
内存保护:操作系统可以设置权限,防止进程访问它不应该访问的内存区域。
内存扩展:通过虚拟内存,系统可以使用硬盘空间作为临时的内存使用,即交换空间(swap space),从而扩展可用内存的大小
例子:压岁钱
小明新年获得了200块压岁钱,母亲担心小明会乱花钱,于是和小明说“你的压岁钱由我来保管,你需要买什么就和我说,我在从这里给你钱”。于是有一天小明要买一款游戏机150元,找妈妈去要,结果妈妈说“游戏机,会害了你的学习,不给买”。再一次小明要去买学习资料,向妈妈申请50块钱,妈妈同意了。因此,新增一个人,作为中间层,可以对非法请求进行拦截
在操作系统中,页表除了包含虚拟地址到物理地址的映射关系,还记录了该区域的读写权限。当用户对其已申请空间做了超出读写权限外的操作,则会被操作系统识别到,并终止该进程。
2.操作系统会拦截非法请求–>对物理内存进行保护
使用虚拟地址+页表的方式可以保证进程的独立性
3.因为有地址空间和页表的存在,将进程管理模块和内存管理模块进行了解耦合
我们也可以知道C/C++申请的地址是虚拟地址。
我们要重新定义一下我们对进程的概念 进程=内核数据结构(PCB+页表+进程地址空间)+代码和数据
相关文章:
我与Linux的爱恋:进程地址空间
🔥个人主页:guoguoqiang. 🔥专栏:Linux的学习 文章目录 1.来段代码2.引入最基本的理解3.尝试理解 1.来段代码 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h&g…...
C++的哲学思想
C的哲学思想 文章目录 C的哲学思想💡前言💡C的哲学思想☁️C底层不应该基于任何其他语言(汇编语言除外)☁️只为使用的东西付费(不需要为没有使用到的语言特性付费)☁️以低成本提供高级抽象(更…...
IO(输入输出流)
1.IO a.介绍 i.IO是指Input和Output,即输入和输出,以内存为中心: 1.Input是指从外部读入数据到内存。 2.Output是指把数据从内存输出到外部。 ii.IO流是一种顺序读写数据的模式,它的特点是单向流动。数据类似自…...
python爬虫:从12306网站获取火车站信息
代码逻辑 初始化 (init 方法): 设置请求头信息。设置车站版本号。 同步车站信息 (synchronization 方法): 发送GET请求获取车站信息。返回服务器响应的文本。 提取信息 (extract 方法): 从服务器响应中提取车站信息字符串。去掉字符串末尾的…...
Android个性名片界面的设计——约束布局的应用
节选自《Android应用开发项目式教程》,机械工业出版社,2024年7月出版 做最简单的安卓入门教程,手把手视频、代码、答疑全配齐 【任务目标】 使用约束布局、TextView控件实现一个个性名片界面的设计,界面如图1所示。 图1 个性名片…...
Python 课程18-SQLAlchemy
前言 SQLAlchemy 是一个功能强大的 Python SQL 工具包和对象关系映射(ORM)库,它使得开发者能够通过 Python 代码与数据库进行交互,而不必编写 SQL 查询。SQLAlchemy 提供了对多种数据库的支持,包括 MySQL、PostgreSQL…...
Module did not self-register: ‘drivelist.node‘报错解决
报错如下: node_modules/bindings/bindings.js:121throw e;^Error: Module did not self-register: xxxx/node_modules/drivelist/build/Release/drivelist.node.at process.func [as dlopen] (electron/js2c/asar.js:140:31)at Object.Module._extensions..node (…...
zabbix基本概念与组件
文章目录 一、zabbix简介二、zabbix构成三、zabbix监控对象四、zabbix常用术语五、 Zabbix 6.0 新特性1.Zabbix server高可用防止硬件故障或计划维护期的停机2.Kubernetes系统从多个维度采集指标 六、zabbix 工作原理1、主动模式2、…...
Linux常用网络工具及示例
Linux系统中有许多用于网络管理、监控和故障排除的工具。以下是一些常用的网络工具及其基本用法示例: 1. ping - 测试主机之间的网络连接。 ping www.google.com 2. netstat - 显示网络连接、路由表、接口统计等信息。 netstat -an # 显示所有网络连接和监听…...
Go容器化微服务系统实战
1-1 本课的go微服务有什么不同? 聚焦于容器化可观测的购物微服务系统实战,通过介绍Go语言的应用趋势、容器化优势及微服务适用性,旨在解决学习微服务过程中遇到的难点。课程内容涵盖微服务整体架构、技术工具框架及容器平台等关键技术&#…...
研究生三年概括
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、研一1.上学期2. 下学期 二、研二1.研二上2.研二下 三、研三1.研三上2.研三下 前言 不知道是谁说的了,人生的路很长,关键的就那么几…...
MongoDB在Linux系统中的安装与配置指南
在这篇文章中,我们将介绍如何在CentOS 7服务器上安装MongoDB,并通过DataX将数据从MongoDB迁移到MySQL数据库。这将包括MongoDB的安装、配置、数据准备以及使用DataX进行数据迁移的详细步骤。 MongoDB简介 MongoDB是一个高性能、开源、无模式的文档型数据…...
Linux下如何实现不用加路径调用启动脚本
配置Systemctl启动 Linux下便于启停服务,可以配置systemcl,配置如下描述 说明 只有root用户可配置,文件路径为 /etc/systemd/system/XXX.service,本文将用nginx.service举例说明 1、创建文件 首先创建一个nginx.service文件,用于配置ngi…...
编程练习2 数据单元的变量替换
示例1: 1,2<A>00 示例2: 1,2<A>00,3<A>00 示例3: <B>12,1,2<B>1 示例4: <B<12,1 输出依次如下: #include<iostream> #include<vector> #include<string>using namespace std;/* 字符分割函数 将传入…...
mysql的查询操作
MySQL的查询操作是数据库管理和数据检索的核心。通过SQL(Structured Query Language,结构化查询语言)语句,用户可以执行包括数据检索、数据插入、更新和删除在内的多种操作。在本文中,我们将重点讨论数据检索ÿ…...
0基础学前端 day2
大家好,欢迎来到无限大的频道。 今天继续带领大家开始0基础学前端。 一、CSS简介与基础 层叠样式表(CSS,Cascading Style Sheets)是用来进行网页样式和布局设计的语言。通过CSS,开发者可以控制网页中元素的颜色、字体…...
Invalid Executable The executable contains bitcode
Invalid Executable The executable contains bitcode xcode世界xcode16后,打包上传testflight时三方库报错:Invalid Executable - The executable ***.app/Frameworks/xxx.framework/xxx contains bitcode. 解决方案: 执行一下指令删除该f…...
音视频入门基础:FLV专题(4)——使用flvAnalyser工具分析FLV文件
一、引言 有很多工具可以分析FLV格式,这里推荐flvAnalyser。其支持: 1.FLV 文件分析(Tag 列表、时间戳、码率、音视频同步等),HEVC(12)/AV1(13) or Enhanced RTMP v1 with fourCC(hvc1/av01); 2.RTMP/HTT…...
Java服务端开发中的网络安全:防护DDoS与数据泄露的策略
Java服务端开发中的网络安全:防护DDoS与数据泄露的策略 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java服务端开发中,网络安全是我们必须重点关注的领域,…...
CodeMeter 8.20AxProtector 11.50版本更新
CodeMeter是一款强大的软件保护和许可管理工具,此次8.20版本更新引入了多个重要的新功能和优化,进一步提升了不同平台上的兼容性与使用体验。本次更新扩展了对CmCloudContainer的支持,优化了Python、Rust等语言的加密能力,并修复了…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
