概述
在进程(一)的学习中,进程 = 程序控制块(task_struct)+ 代码和数据
那么 在运行程序的时候,CPU是如何根据程序控制块找到对应的代码和数据呢??
一、C/C++内存区域划分
栈区:一般存放临时变量,调用函数时会给函数创建栈帧(栈比较小,大概在8M左右)
堆区:通过new / malloc 等方式动态开辟的空间都在堆上
静态区/常量区:存放static修饰的变量、全局变量
代码区:存放代码和常量数据
二、虚拟地址空间
从上面的图可以看出,一块内存区域大概是 4GB
每一个进程都认为自己分配到的内存有 4GB,也就是自己独占 4GB的空间
实际上这里的内存都是指虚拟内存,代码和数据实际上是放在物理内存中的!!
每个进程控制块(task_struct) 都会指向一块虚拟内存
问题1:进程之间的地址不会冲突吗??
答:解决这个问题的,是页表。页表的作用就是让OS根据虚拟地址找到对应的物理地址如果两个变量的地址相同,指的是虚拟地址相同,物理地址一定是不同的!!
将上述内容联系在一起就是
一个进程要找到对应的代码,
(1)先定位到虚拟内存
(2)在虚拟内存中找到代码的虚拟地址
(3)根据页表映射,找到对应的物理地址
(4)在物理地址中找到对应的代码
因此,进程 = 进程控制块(task_struct) + 虚拟内存(mm_struct) + 页表(MMU) + 物理内存中的代码和数据
三、使用虚拟地址空间的优缺点
优点
安全性角度:防止不同进程对物理内存的争夺和践踏,可以对特定内存地址提供写保护,防止恶意篡改。
便利性角度:方便进程间通信,对于不同的进程而言,自己可以随机选取虚拟内存上的某个地址,随后交由页表连接到同一个物理地址。
缺点
空间角度:虚拟内存需要额外构建数据结构,占用空间
时间角度:虚拟地址到物理地址的转换需要时间,增加了执行时间
最后
以上就是美丽橘子为你收集整理的进程(四)—— 程序地址空间一、C/C++内存区域划分二、程序地址空间的全部内容,希望文章能够帮你解决进程(四)—— 程序地址空间一、C/C++内存区域划分二、程序地址空间所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复