Linux 进程 | 进程地址空间

文章目录

    • 进程地址空间
      • 程序地址空间
      • 进程地址空间

进程地址空间

程序地址空间

地址空间一共有如下的几个区域,从下到上地址逐渐增加,其中栈区的空间是从上往下使用,即从高地址往低地址增长;堆区的空间是从下往上使用,即从低地址往高地址增长需要注意的是,在不同位操作系统下或者不同编译器下,内存的分配规则都可能是不同的,这里以linux为例,也是最经典的一种。

我们平时敲代码使用程序地址空间的时候,当我们定义一个局部变量,它的空间就是在栈区上开辟的,有临时性;当我们使用malloc申请空间的时候,是在堆区开辟的空间;当我们定义一个全局变量的时候,它的空间就是在全局变量中开辟的,其中也分为未初始化全局变量和已初始化全局变量。在32位系统下的寻址空间是4GB

为了直观地体现出地址分配的规则,我们使用一些例子来做演示:

#include<stdio.h>
#include<stdlib.h>int val1 = 10;
int val2;int main() {//以下均为存储在各区地址空间中的实例printf("代码区:            %p\n", main);const char* str = "helllo linux";printf("字符常量区:         %p\n", str);printf("已初始化全局变量区:  %p\n", &val1);printf("未初始化全局变量区:  %p\n", &val2);char* a = (char*)malloc(sizeof(char));printf("堆区:             %p\n", a);printf("栈区:             %p\n", &str);return 0;
}

运行结果如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过运行结果会发现打印出来的地址从代码区到栈区依次递增。

进程地址空间

当我们使用fork()函数生成一个子进程的时候,子进程会对将要访问的父进程的内容进行写时拷贝,但是会发现子进程和父进程对于同一个全局变量进行访问更改等操作的时候,这个变量的地址是不变的,也就是说同一个地址可能会有两个值,因为这里的地址并不是物理地址,而是虚拟地址(我们平时写程序用到的地址相关的内容一般都是虚拟地址)。如果是物理地址,这是绝对不可能的,可以配合下面案例理解:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int val = 0;
int main()
{pid_t id = fork();if(id < 0){perror("fork");return 0;}else if(id == 0){ //child,子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取val=100;printf("child: %d : %p\n", val, &val);}else{ //parentsleep(3);printf("parent: %d : %p\n", val, &val);}sleep(1);return 0;
}

运行结果如图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

会发现前文所说的现象,同一个变量,子进程对其将要访问的变量进行写时拷贝,但是父子进程中的val确是同一个地址,因此这里的地址是虚拟地址而非物理地址。他们地址上的逻辑应该对应下图(简化):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 当父进程创建出来,系统创建了父进程的PCB和父进程的进程地址空间,PCB指向进程地址空间
  • 这里创建的进程地址空间是虚拟地址,虚拟地址和物理内存是通过页表来映射的
  • 当访问某个地址时,页表通过映射关系,查找到物理地址,并读取存在当中的数据
  • 当父进程创建子进程的时候,系统也根据父进程为模板创建子进程对应的PCB和进程地址空间
  • 由于子进程时以父进程为模板创建的,因此他们页表是一样的,因此子进程和父进程能够共享代码
  • 对于同一个全局变量,当子进程需要对其进行写入等操作时,由于父子进程的虚拟地址对应同一块物理地址,为保证独立性,系统会在物理内存中额外开辟一块空间
  • 至此,父子进程各自页表中对于此全局变量的虚拟地址是相同的,但是对应的物理地址是不同的。

简化):

[外链图片转存中…(img-xn3KL9cr-1724489534997)]

[外链图片转存中…(img-1r95tjqS-1724489534998)]

  • 当父进程创建出来,系统创建了父进程的PCB和父进程的进程地址空间,PCB指向进程地址空间
  • 这里创建的进程地址空间是虚拟地址,虚拟地址和物理内存是通过页表来映射的
  • 当访问某个地址时,页表通过映射关系,查找到物理地址,并读取存在当中的数据
  • 当父进程创建子进程的时候,系统也根据父进程为模板创建子进程对应的PCB和进程地址空间
  • 由于子进程时以父进程为模板创建的,因此他们页表是一样的,因此子进程和父进程能够共享代码
  • 对于同一个全局变量,当子进程需要对其进行写入等操作时,由于父子进程的虚拟地址对应同一块物理地址,为保证独立性,系统会在物理内存中额外开辟一块空间
  • 至此,父子进程各自页表中对于此全局变量的虚拟地址是相同的,但是对应的物理地址是不同的。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【鸿蒙学习】HarmonyOS应用开发者高级认证 - 应用DFX能力介绍(含闯关习题)

学完时间&#xff1a;2024年8月24日 学完排名&#xff1a;第1698名 一、Performance Analysis Kit简介 Performance Analysis Kit&#xff08;性能分析服务&#xff09;为开发者提供应用事件、日志、跟踪分析工具&#xff0c;可观测应用运行时状态&#xff0c;用于行为分析、…

Prometheus学习

监控架构介绍&#xff1a; 基本架构&#xff1a; Prometheus 和 Zabbix 的对比&#xff1a; 安装和使用&#xff1a; Prometheus 采集、存储数据Grafana 用于图表展示alertmanager 用于接收 Prometheus 发送的警告信息node-exporter 用于收集操作系统和硬件信息的 metrics …

Linux:Bash中的命令介绍(简单命令、管道以及命令列表)

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 在Bash中&#xff0c;命令执行的方式可以分为简单命令、管道和命令列表组成。这些结构提供了强大的工具&#xff0c;允许用户组合命令并精确控制其执行方式。以下是对这…

Ubuntu24.04安装MYSQL8.0

更新源 sudo apt update安装mysql服务 默认安装最新版本 sudo apt install mysql-server检查安装版本 mysql --version检查mysql运行状态 systemctl status mysql开启远程访问&#xff0c;在ubuntu下mysql默认是只允许本地访问 sudo vim /etc/mysql/mysql.conf.d/mysqld.…

新疆旅游今年为什么这么火热?

今年新疆旅游火爆全网&#xff0c;不夸张的说&#xff0c;打开朋友圈&#xff0c;几乎一半人在新疆旅游、还有一半人在去新疆旅游的路上。 大家也纷纷在小红书上晒出新疆相关的笔记&#xff0c;覆盖旅游、美食、穿搭、养生、摄影等众多热门行业&#xff0c;相关话题多次登上小…

【C++】12.智能指针

在上一篇博客【C】11.异常中我们知道有些时候会造成内存空间的未释放从而导致内存泄漏&#xff0c;因此本篇博客的内容就是如何减少内存泄漏——智能指针。 一、RAII RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是一种利用对象生命周期来控制程序资…

垃圾分类笔记YOLOV5(一)-pip换源-口罩识别-训练自己的数据集

pip换源网址 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple不进行配置的是临时换源 1、从github上下载YOLOV5的代码 翻墙软件clash 数据集地址roboflow clash配置一键导入 哔哩哔哩视频地址 数据集的下载格式&#xff1a; 2、修改自己的数据…

Webots与ROS1、ROS2接口变迁-2024-

三大免费仿真器CoppeliaSim、Gazebo和Webots。 Gazebo接口总结&#xff1a; Gazebo与ROS1、ROS2接口变迁-2005-2024--CSDN博客 缺点&#xff1a;版本绑定策略 早期webots版本和ros版本绑定 后期&#xff0c;webots接口最新版本和ros特定版本最匹配。 例如&#xff1a; 最好按…

Scrapy 分布式爬虫框架 Scrapy-Redis

github官网代码示例&#xff1a;https://github.com/rmax/scrapy-redis/blob/master/example-project/example/spiders/myspider_redis.py 什么是 Scrapy-Redis Scrapy-Redis 是一个基于 Scrapy 的扩展&#xff0c;用于实现分布式爬虫。它利用 Redis 作为分布式队列来共享待爬…

R 语言学习教程,从入门到精通,R 绘图饼图(23)

1、R 绘图 条形图 条形图&#xff0c;也称为柱状图条形图&#xff0c;是一种以长方形的长度为变量的统计图表。 条形图可以是水平或垂直的&#xff0c;每个长方形可以有不同的颜色。 R 语言使用 barplot() 函数来创建条形图&#xff0c;格式如下&#xff1a; barplot(H,xlab,…

JavaScript初级——DOM和事件简介

一、什么是DOM&#xff1f; 二、模型 三、对象的 HTML DOM 树 四、节点 浏览器已经为我们提供了文档节点对象&#xff0c;这个对象是window属性&#xff0c;可以再网页中直接使用&#xff0c;文档节点代表的是整个网页。 五、事件简介 事件&#xff0c;就是用户和浏览器之间的交…

【每日一题】【素数筛板子题】又是一年毕业季 牛客小白月赛99 D题 C++

牛客小白月赛99 D题 又是一年毕业季 题目背景 牛客小白月赛99 题目描述 样例 #1 样例输入 #1 3 4 2 4 6 5 5 6 2 5 3 2333333 8 11 4 5 14 19 19 8 10样例输出 #1 3 7 2做题思路 首先观察到 即需要保证拍照的时刻 大于等于 2 那么就从2开始往上走&#xff0c;如果有人…

【精选】推荐7款AI论文一键生成论文、开题报告和文献综述网站

在当前的学术研究和写作中&#xff0c;AI技术的应用已经变得越来越普遍。特别是对于论文、开题报告和文献综述的生成&#xff0c;许多平台提供了便捷的一键生成服务。以下是七款推荐的AI论文一键生成工具&#xff0c;包括千笔-aipaperpass。 1. 千笔-aipaperpass 千笔-aipape…

文心快码(Baidu Comate)初体验

文心快码&#xff08;Baidu Comate&#xff09;初体验 1文心快码简介和安装&#xff1a;简要介绍文心快码&#xff08;Baidu Comate&#xff09;、安装方法、使用方法等&#xff1b; Baidu Comate 是由百度自主研发&#xff0c;基于文心大模型&#xff0c;结合百度丰富的编程现…

主机安全-网络攻击监测

目录 概述暴力破解&#xff08;SSH爆破为例&#xff09;原理规则攻击模拟告警 端口扫描原理规则攻击模拟告警 流量劫持原理规则攻击模拟告警 参考 概述 本文介绍主机网络层面上的攻击场景&#xff0c;每种攻击场景举一个例子。监测方面以字节跳动的开源HIDS elkeid举例。 针对…

当前A股平均市盈率

再写一篇【不务正业】的 2023-08-23A股平均市盈率 来自乐咕乐股网 当前A股市盈率是否为低点&#xff1f; 不言而喻 ‌当前A股市场的市盈率确实处于相对低位。‌ 根据东方财富Choice最新数据显示数据&#xff0c;截至2024年8月23日&#xff0c;全A市盈率为13.06倍&#xff0c;…

初识C语言指针(3)

目录 1. 数组名的理解 2. 使⽤指针访问数组 3. ⼀维数组传参的本质 4. 冒泡排序 5. 二级指针 6. 指针数组 7. 指针数组模拟⼆维数组 结语 1. 数组名的理解 对于数组名想必大家并不陌生&#xff0c;数组名就是该数组首元素的地址&#xff0c;设想有一个arr 数组。我们…

解决github访问慢的问题

GitHub是全球开发者广泛使用的代码托管平台&#xff0c;但有时由于网络问题&#xff0c;访问速度可能会受到影响&#xff0c;这对于依赖GitHub进行日常开发工作的程序员来说是一个不小的困扰。为了解决这一问题&#xff0c;我们可以通过修改本地hosts文件来尝试提升访问速度。 …

如何将 Parallels Desktop 许可证密钥移至新的 Mac?

根据 Parallels 最终用户许可协议&#xff08;EULA&#xff09;的规定&#xff0c;您最多可以在一台设备上下载、安装和使用 Parallels Desktop 的一个原始副本。但是面对更换新机的用户&#xff0c;可以通过迁移的方式把 Parallels Desktop 许可证密钥移至新的 Mac&#xff0c…

大数据-91 Spark 集群 RDD 编程-高阶 RDD广播变量 RDD累加器 Spark程序优化

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…