我与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等语言的加密能力,并修复了…...
ARM嵌入式开发:寄存器操作与函数指针实战
## 1. 嵌入式开发中的寄存器操作技巧### 1.1 寄存器地址访问方法 在ARM架构嵌入式开发中,直接操作硬件寄存器是底层开发的核心技能。通过C语言访问特定内存地址的标准做法是使用指针类型转换:c #define GSTATUS1 (*(volatile unsigned int *)0x560000B0)…...
联想M920x黑苹果配置指南:从硬件适配到性能优化的完整方案
联想M920x黑苹果配置指南:从硬件适配到性能优化的完整方案 【免费下载链接】M920x-Hackintosh-EFI Hackintosh Opencore EFIs for M920x 项目地址: https://gitcode.com/gh_mirrors/m9/M920x-Hackintosh-EFI 联想M920x作为一款紧凑型商用主机,通过…...
Python开源代码管理避坑实战:从Git高级操作到Docker环境配置
前言:为什么你总在开源门前徘徊? “这个项目看起来好复杂,我连代码都看不懂...” “提交PR会不会被大佬嘲笑?” “环境配置又报错了,算了,下次再说吧” 如果你有过这些想法,别担心ÿ…...
3步完成Logisim-evolution开源工具安装:跨平台数字电路设计效率指南
3步完成Logisim-evolution开源工具安装:跨平台数字电路设计效率指南 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution 引言:开启数字电路设计的高效…...
QMK Toolbox:机械键盘固件定制与刷写全攻略
QMK Toolbox:机械键盘固件定制与刷写全攻略 【免费下载链接】qmk_toolbox A Toolbox companion for QMK Firmware 项目地址: https://gitcode.com/gh_mirrors/qm/qmk_toolbox 一、核心价值:重新定义键盘控制自由 QMK Toolbox 作为开源硬件领域的…...
RWKV7-1.5B-g1a实操手册:基于CSDN GPU平台的完整调用流程
RWKV7-1.5B-g1a实操手册:基于CSDN GPU平台的完整调用流程 1. 模型简介 rwkv7-1.5B-g1a 是基于新一代 RWKV-7 架构的多语言文本生成模型,特别适合中文场景下的轻量级应用。这个1.5B参数的版本在保持较高生成质量的同时,对硬件要求非常友好&am…...
NSC_BUILDER:Switch游戏文件管理的全能解决方案
NSC_BUILDER:Switch游戏文件管理的全能解决方案 【免费下载链接】NSC_BUILDER Nintendo Switch Cleaner and Builder. A batchfile, python and html script based in hacbuild and Nuts python libraries. Designed initially to erase titlerights encryption fro…...
PVB于EVA胶片的区别
PVB于EVA胶片的区别实例:PVB用于封装“双玻璃光伏组件”:玻璃+PVB+电池片+PVB+玻璃,PVB胶片已取代EVA胶片。为什么用PVB,不像我们现在一样用EVA?因为: 在玻璃…...
北京大学钟亦武老师招收博士生、实习生
点击下方卡片,关注“CVer”公众号AI/CV重磅干货,第一时间送达冲刺今年春招、秋招和实习!大家快加入2026年AI校招群!赠送今年最大的80元优惠券,大家扫码下方二维码即可加群学习!北京大学智能学院介绍&#x…...
OpenCore Legacy Patcher终极指南:让你的老Mac焕发新生,体验最新macOS
OpenCore Legacy Patcher终极指南:让你的老Mac焕发新生,体验最新macOS 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否还在为老旧的Mac无法升…...
