我是靠谱客的博主 美丽橘子,最近开发中收集的这篇文章主要介绍进程(四)—— 程序地址空间一、C/C++内存区域划分二、程序地址空间,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在进程(一)的学习中,进程 = 程序控制块(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++内存区域划分二、程序地址空间所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部