概述
文章目录
- 1. 进程地址空间是内存吗?
- 2. 页表&虚拟地址空间
- 3. 什么是地址空间?
- 4 .为什么要有地址空间?
- 5 .地址空间是如何工作的?
- 6 . 什么叫做进程?
1. 进程地址空间是内存吗?
先来两段代码感受一下!
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{
pid_t id = fork();
if(id < 0)
{
perror("fork");
return 0;
}
else if(id == 0)
{ //child
printf("child[%d]: %d : %pn", getpid(), g_val, &g_val);
}
else
{
//parent
printf("parent[%d]: %d : %pn", getpid(), g_val, &g_val);
}
sleep(1);
return 0;
}
输出结果如下:
parent[2995]: 0 : 0x80497d8
child[2996]: 0 : 0x80497d8
我们发现,输出出来的变量值和地址是一模一样的,因为子进程按照父进程为模版,父子并没有对变量进行进行任何修改。可是将代码稍加改动:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{
pid_t id = fork();
if(id < 0)
{
perror("fork");
return 0;
}
else if(id == 0)
{ //child,子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取
g_val=100;
printf("child[%d]: %d : %pn", getpid(), g_val, &g_val);
}
else
{ //parent
sleep(3);
printf("parent[%d]: %d : %pn", getpid(), g_val, &g_val);
}
sleep(1);
return 0;
}
输出结果:
//与环境相关,观察现象即可
child[3046]: 100 : 0x80497e8
parent[3045]: 0 : 0x80497e8
我们发现,父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论:
- 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量。
- 但地址值是一样的,说明,该地址绝对不是物理地址!
- 在Linux地址下,这种地址叫做虚拟地址
- 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理OS必须负责将 虚拟地址 转 化成 物理地址 。
2. 页表&虚拟地址空间
由上图所示:同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址!
3. 什么是地址空间?
地址空间是对物理内存的一种虚拟化表示,是一个虚拟空间最终一定要以某种方式转化到物理内存,进程运行时具有独立性!在数据层面上先进行独立!
4 .为什么要有地址空间?
- 保护内存
- 将内存中的物理地址连续化处理
5 .地址空间是如何工作的?
如上图所示,每个进程都有一个进程的地址空间,系统中可能存在多个进程,所以,系统中一定存在多个地址空间,所以地址空间需要被管理起来。
- 先描述:地址空间本质就是一个数据结构struct
如下:
struct mm _struct
{
unsigned long code_start;
unsigned long code_end;
unsigned long init_data_start;
unsigned long init_data_end;
.......
}
本质就是在划分区域!
申请空间的本质就是:向内存索要空间,得到物理地址,然后在特定区域内申请没有被使用的虚拟地址,建立映射关系,然后返回虚拟地址。
- 再组织
进程 = 代码 + 数据
代码的地址存在 struct mm_struct(地址空间)中,其相当于进程执行的地图。
6 . 什么叫做进程?
进程是加载进内存的程序,由常见的数据结构(struct task_struct(控制块))&& struct mm_struct(地址空间)和代码数据构成。
总结:进程加载进内存后,操作系统为进程创建 task_struct(进程控制块) 和 mm_struct(地址空间),并将两者用指针关联起来。最后利用页表和物理内存建立映射关系!
最后
以上就是花痴机器猫为你收集整理的Linux 进程地址空间详解的全部内容,希望文章能够帮你解决Linux 进程地址空间详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复