Linux 进程 | 进程地址空间

news2025/1/18 7:22:27

文章目录

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

进程地址空间

程序地址空间

地址空间一共有如下的几个区域,从下到上地址逐渐增加,其中栈区的空间是从上往下使用,即从高地址往低地址增长;堆区的空间是从下往上使用,即从低地址往高地址增长需要注意的是,在不同位操作系统下或者不同编译器下,内存的分配规则都可能是不同的,这里以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{ //parent
 	sleep(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.coloradmin.cn/o/2070276.html

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

相关文章

简单实现进度条效果(vue2)

如果用echarts或者其他图表来写个进度条有点大材小用&#xff0c;所以直接简单html、js写一下就可以&#xff1b; 以下代码基于vue2&#xff0c; 部分代码来自国内直连GPT/Claude镜像站 <template><div class"progress-container"><div class"p…

aosp源码导入android studio无法跳转-学员答疑

背景&#xff1a; 在学习framework入门课时候&#xff0c;一个很重要环节就是导入aosp的源码到android studio&#xff0c;这样有了IDE之后开发起来就很方便了&#xff0c;但是很多学员朋友对编译出来的ipr&#xff0c;iml文件改造不知道该怎么搞&#xff0c;导致android stud…

mysql 开启binlog并设置

打开my.cnf 文件&#xff0c;Linux系统文件默认位置为 /etc目录下&#xff0c;若不存在&#xff0c;可以使用下述命令查询 find / -name my.cnf修改my.cnf文件&#xff0c;开启binlog mysqld 模块下添加以下内容 server_id1 #给当前mysql机器设置一个id log-binmysql_bin …

分布式事务理论和解决方案

分布式事务理论 business&#xff08;下单&#xff09;远程调用库存&#xff08;storage&#xff09;,保存订单&#xff08;order&#xff09;&#xff0c;扣减积分&#xff08;account&#xff09;&#xff0c;只有这三个步骤全部成功&#xff0c;我们的下订单才算成功。 如果…

2024-01-开发技术积累

文章目录 递归删除文件执行任务超时时间读写锁获取异常栈信息通过NIO读取文件单例模式代码NIO管道写文件(来自nacos)NIO读取文件(来自Nacos)spring指定注解扫描 递归删除文件 xxl-job源码 public static boolean deleteRecursively(File root) {if (root ! null && ro…

JAVA中的Stream流的使用详解

1.Stream的介绍 Java 8 API添加了一个新的抽象称为流Stream&#xff0c;可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力&#xff0c;让程…

React+Vis.js(04):vis.js设置节点显示图片

文章目录 实现效果关键代码完整代码设置图片边框和背景颜色我们继续以 复仇者联盟为例,来介绍如何实现节点显示 图片。 实现效果 以图片进行节点的显示,使得显示效果更加直观,信息更为明了。 关键代码 在vis.js中,通过属性shape来控制节点显示为图像。 const nodes …

Shire 0.5 发布:构建数据安全 RAG,充分整合研发资产

最近&#xff0c;我们发布了新版本的 Shire&#xff0c;在这个新的发布&#xff08;Shire 0.5&#xff09;里&#xff0c;你可以更好地融合本地研发资产&#xff0c;同时构建数据安全 RAG。在这次版本中&#xff0c;我们增加了&#xff1a; 对 SonarQube 的 issue 支持。可以直…

1.反爬虫机制

一、IP 封锁 网站可以检测请求的IP地址&#xff0c;并封锁那些频繁请求的IP&#xff0c;使其无法访问网站。这是一种常见的反爬虫策略&#xff0c;用于防止单个IP地址对服务器造成过大的负载。 解决办法 &#xff1a; 使用代理IP池以避免IP封锁 // 待补充 二、请求头检测(Us…

2024百元学生党蓝牙耳机有哪些?甄选四款精品王炸机型推荐

近年来&#xff0c;随着手机的普及和音乐娱乐的盛行&#xff0c;蓝牙耳机成为越来越多人的选择。蓝牙耳机的优点在于无需使用线缆&#xff0c;方便携带&#xff0c;而且可以随时随地享受音乐或者通话。在市面上&#xff0c;有各种各样的蓝牙耳机可供选择&#xff0c;对于预算有…

Star-CCM+探针查看与创建

在实际应用工况中&#xff0c;数值计算结束后为了产看某个点的标量场或矢量场可以采用探针查看。而在软件中可以通过“&#xff0c;”、“。”快捷键进行创建与查看。两者的区别具体如下所示&#xff1a; 鼠标放在要查看部件的位置&#xff0c;同时点击键盘上的“。”键&#…

神经网络动画讲解 - 神经网络工作流程

神经网络工作流程 神经网络工作流程&#xff1a; 特征分解1&#xff08;手写数字->简单笔画组合&#xff09;、特征分解2&#xff08;简单笔画->最小笔画组合&#xff09;、特征识别1&#xff08;最小笔画组合->简单笔画&#xff09;、特征识别2&#xff08;简单笔画…

Java 入门指南:迭代器(Iterator)

迭代器 迭代器&#xff08;Iterator&#xff09; 是一种行为型设计模式&#xff0c;属于设计模式之一&#xff0c;迭代器模式提供了一种方法来顺序访问一个聚合对象&#xff08;如List、Set等&#xff09;中各个元素&#xff0c;而不需要暴露该对象的内部表示。 Iterator 对象…

攻防世界-web题型-6星难度汇总-个人wp

i-got-id-200 这一题很清楚的告诉了考点是什么&#xff0c;就是cgi相关的知识&#xff0c;不过我对这个不了解。。。也不会perl语言&#xff0c;先去网上看看这个东西吧&#xff0c;了解一下 看到一篇挺有意思的视频CGI&#xff08;通用网关接口&#xff09;_百度百科 看了这…

MediaTek 天玑9000 旗舰5G,都有哪些突破

天玑9000&#xff0c;是MTK 在2022发布的全新旗舰SOC , 采用台积电4nm制程和Armv9架构,八核CPU。 市场上采用天玑9000的手机有小米12Pro、小米Redmi K50 Pro、Vivo X80等。 今天我们看下这款soc更详细的一些特点介绍。 一、率先采用台积电 4nm 先进制程 业界率先采用台积电 4nm…

传统2D3D视觉分享

哈喽&#xff0c;大家好&#xff0c;本文主要是说明关于【视觉源码小铺】知识星球内的相关内容 视觉源码小铺都有什么内容 IVision拖拽平台&算法 星球内算法&#xff08;持续更新&#xff09;

滚雪球学Java(90):Java图形界面新篇章:Swing框架深度解析,真有点东西!

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE啦&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好习惯&#…

解决MySQL的PacketTooBigException异常问题

一、背景 在大数据量导入mysql的时候&#xff0c;提示错误Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large 原因是MySQL的max_allowed_packet设置最大允许接收的数据包过小引起的&#xff0c;默认的max_allowed_packet如果不设置&…

Stable Diffusion 使用详解(9)--- 艺术字及海报融入

目录 背景 方法一 利用controlNet lineart invert depth 提示词 效果 方法二 准备蒙版 绘制大型场景艺术字 controlnet Lora 模型 效果 PS 融入 背景 如果看过上一期你应该知道如何利用layer diffusion 制作场景动漫海报&#xff0c;其实掌握这个方法后&#xf…

DFS 算法:记忆化搜索

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 无 此系列更新频繁&#xff0c;求各位读者点赞 关…