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

【Linux】深入理解进程(四)(进程地址空间)

文章目录

  • 进程地址空间
    • 虚拟地址
    • 流程
    • mm_struct
  • 进程独立性
  • 🚩页表和虚拟地址作用

进程地址空间

在这里插入图片描述
地址空间按此方式存储

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int g_val1;
int g_val2=1;
int main()
{printf("code:%p\n",main);const char* str="hello";printf("read only:%p\n",str);printf("%p\n",&g_val1);printf("%p\n",&g_val2);char* mem1=(char*)malloc(100);char* mem2=(char*)malloc(100);char* mem3=(char*)malloc(100);printf("heap:%p\n",mem1);printf("heap:%p\n",mem2);printf("heap:%p\n",mem3);printf("stack:%p\n",&str);static int a=1;int b=1;int c=1;printf("static:%p\n",&a);printf("stack:%p\n",&b);printf("stack:%p\n",&c);return 0;
}
code:0x4006dd
read only:0x400909
0x601060
0x601054
heap:0x74f010
heap:0x74f080
heap:0x74f0f0
stack:0x7fff479f3040
static:0x601058
stack:0x7fff479f303c
stack:0x7fff479f3038

验证了一个事,🚩static和全局变量存储在一个区,

问题来了:

int main()
{pid_t id=fork();if(id==0){printf("i am a child g_val:%d &g_val:%p\n",g_val,&g_val);}else if(id>0){g_val=200;printf("i am parent g_val:%d &g_val:%p\n",g_val,&g_val);}return 0;
}

在这里插入图片描述
相同的地址,值不同?
为什么?

虚拟地址

既然地址相同,值不同,说明这个地址绝对不是物理地址,我们叫做虚拟地址(线性地址)
我们平时写的C/C++使用的指针用的都是虚拟地址
🚩每个进程都有独立一张虚拟地址表
🚩CPUcr3寄存器(本质属于进程硬件上下文)页表指针管理这张虚拟地址表

流程

在这里插入图片描述
父进程先创建自己的页表,子进程复制父进程的页表,两者id虚拟地址相同,(代码共享,数据也共享),等到🚩访问任意一个id,物理内存就新开辟一块地址在这里插入图片描述
所以两个id虚拟地址是相同的,但是实际物理内存是不同的

mm_struct

32位计算机有32根地址总线,每根地址总线传01信号,可以指定2^32个不同的内存地址
2^32*1byte=4GB

地址总线排列组合形成地址范围[0,2^32),在范围内,每个连续空间的每个最小单位都可以有自己的地址

进程地址空间:

描述进程可视范围的大小,是内核数据结构对象,存在于task_struct,里面要划分各种区域,start,end划出线性地址
进程地址空间也要被操作系统先描述再组织

总结:
🚩进程=内核数据结构(task_struct+mm_struct+页表)+程序的代码和数据

进程独立性

🚩进程被创建时,先创建内核数据结构再加载可执行程序

两个问题
1,怎么实现代码区和字符串常量区只读
2,进程可以挂起?怎么知道代码是否在内存中呢
在这里插入图片描述
页表第三列可设置权限第4列可以知道代码是否加载到内存

此外,操作系统对大文件采用分批加载,(惰性加载),就是先只分配虚拟地址,不分配物理内存,这叫做缺页中断

🚩页表和虚拟地址作用

1,让进程以统一视角看待内存
2,避免直接接触物理内存,越界访问对物理内存造成损害,增加一个转换过程,可以拦截不合法请求
3,实现进程管理和内存解耦合

http://www.dtcms.com/a/618122.html

相关文章:

  • 数据结构1.0 面试题
  • 网站定制哪家快高档网站设计公司
  • 信创产品认证机构有哪些?信创检测报告和信创产品评估证书如何办理?
  • 官方网站建设计划书文山做网站yunling88
  • 数据分析笔记12:函数
  • 如何驯服AI编程
  • 电动自行车起火酿事故,智慧社区如何分阶段阻绝灾害发生?
  • 淄博做网站的公司排名优化系统
  • 基于Rust构建一个实用的图片转Base64工具
  • asp.net mvc做网站难吗胶州网站优化
  • [C#] NO.4 我的第一个项目
  • 运放之电压跟随器
  • CSS3 框大小
  • 商城网站系统资源
  • 网站源码怎么有苏州首页关键词优化
  • 深度学习实战(基于pytroch)系列(二十二)多通道输入输出
  • 本周热搜(11月9日~11月16日)
  • React useMemo(当依赖项未变化,重复渲染时直接返回上一次缓存计算结果,而非重新执行计算)
  • 【IOS开发】Objective-C 与 Swift 的对比
  • 在STM32 HAL库中使用 WFI 实现低功耗准确延时
  • 编程语言落地手册:erlang实现与汇编剖析
  • 搜索下单(es、mysql、MQ同步;关于事务失效)
  • aleph-node Node upgrade instructions 节点升级说明
  • 找谁做网站网站建设与运营培训班
  • 智能制造与工业4.0:5G与物联网的深度融合
  • GSV1201S(2201S)#ACP@支持 DisplayPort 1.2 到 HDMI 1.4 转换且集成嵌入式 MCU
  • Linux SPI 驱动实验
  • 【开题答辩全过程】以 基于Java的水族馆销售与经营管理系统的设计与实现为例,包含答辩的问题和答案
  • 网站响应是什么问题吗最近国际时事
  • 从拟南芥到线虫:我的生物信息学多组学实操笔记