当前位置: 首页 > news >正文

Linux--线程地址空间

1.程序地址空间

   先来就看这张图

这是一张程序地址分布的图,通过一段代码来证明地址空间的分布情况

编译结果:

 

 可以看出的是,父子进程中对于同一个变量打印的地址是一样的,这是因为子进程以父进程为模板,因为都没有对数据进行修改,所以这里变量地址也是一样的。


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int g_val = 10;int main()
{int ret = fork();if (ret < 0){// errorperror("fork error");return 0;}else if (ret == 0){// childint count = 0;while (1){printf("修改数据前:\n");printf("I am child,pid:%d %d:%p\n", getpid(), g_val, &g_val);sleep(1);count++;if (count == 3){g_val = 20;// 子进程对数据进行修改printf("修改数据后:\n");}}else{// parentwhile (1){printf("I am parent:pid:%d %d:%p\n", getpid(), g_val, &g_val);sleep(1);}}return 0;
}

通过这段代码可以进一步看出父子进程共用一段代码,子进程是父进程的副本,获得了父进程数据空间、堆和栈的副本;父子进程并不共享这些存储空间,共享正文段(即代码段);因此子进程对变量的所做的改变并不会影响父进程。 当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间,如果不是因为exec,内核会给子进程的数据段、堆栈段分配相应的物理空间(至此两者有各自的进程空间,互不影响),而代码段继续共享父进程的物理空间(两者的代码完全相同).事实上,在Linux地址下,这种地址叫做虚拟地址(下面讨论)。且平时我们在C/C++语言打印所看到的地址都是虚拟地址,物理地址对于我们用户是看不到的,由OS管理.

2.进程地址空间

 父子进程各种有一份虚拟空间地址,在子进程刚被创建时,父子进程代码和数据共享,所以此时虚拟地址空间的内容是基本一样的(当然有部分数据不同,比如各子的id等),且映射关系也是一样的,但是当子进程对数据进行修改时,子进程对那份数据进行写时拷贝,所以物理空间地址发生了变化,但是虚拟地址还是没有发生变化,只是改变了子进程的页表中那份虚拟地址的映射关系而已,所以两个相同的虚拟地址在父子进程分别看到了不同的物理地址空间。

http://www.lryc.cn/news/139629.html

相关文章:

  • 华为OD机试 - 最佳植树距离 - 二分查找(Java 2023 B卷 100分)
  • RNN+LSTM正弦sin信号预测 完整代码数据视频教程
  • 如何自己实现一个丝滑的流程图绘制工具(四)bpmn-js开启只读状态
  • 字节跳动 Git 的正确使用姿势与最佳实践
  • 龙迅LT7911UX TYPE-C/DP转MIPI/LVDS,内有HDCP
  • Spearman Footrule距离
  • docker 安装 Wordpress 用lnmp搭建出现的故障
  • 【C++入门到精通】C++入门 —— 继承(基类、派生类和多态性)
  • 【Spring框架】Spring事务的介绍与使用方法
  • 七夕特别篇 | 浪漫的Bug
  • 数据结构双向链表
  • 解决政务审计大数据传输难题!镭速传输为政务行业提供解决方案
  • redis 7高级篇1 redis的单线程与多线程
  • GO语言:Worker Pools线程池、Select语句、Metex互斥锁详细示例教程
  • vue ui 创建项目没有反应
  • go语言中channel类型
  • 基于STM32F1的电子罗盘HMC5883L角度测量
  • Oracle解锁表、包、用户、杀会话、停job
  • 软考高级系统架构设计师系列论文九十九:论软件开发平台的选择和应用
  • Redis Pub/Sub 指南
  • Nest(2):Nest 应用目录结构和脚手架命令介绍
  • 【嵌入式】MKV31F512VLL12 微控制器 (MCU) 、Cyclone® IV E EP4CE10E22I8LN,FPGA-现场可编程门阵列芯片
  • 矢量调制分析基础
  • ensp-Ipv6配置配置
  • java八股文面试[java基础]—— hashCode 与 equals 区别 == 与 equals的区别
  • Dubbo之PojoUtils源码分析
  • 【C++】—— C++11新特性之 “右值引用和移动语义”
  • 谈一谈redis脑裂
  • 基于原生Servlet使用模板引擎Thymeleaf访问界面
  • 【C语言】15-函数-1