在进程(一)的学习中,进程 = 程序控制块(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) + 物理内存中的代码和数据
三、使用虚拟地址空间的优缺点
优点
安全性角度:防止不同进程对物理内存的争夺和践踏,可以对特定内存地址提供写保护,防止恶意篡改。
便利性角度:方便进程间通信,对于不同的进程而言,自己可以随机选取虚拟内存上的某个地址,随后交由页表连接到同一个物理地址。
缺点
空间角度:虚拟内存需要额外构建数据结构,占用空间
时间角度:虚拟地址到物理地址的转换需要时间,增加了执行时间
本文介绍了进程如何通过程序控制块找到代码和数据。首先,进程定位到虚拟内存,然后找到代码的虚拟地址,接着利用页表将虚拟地址映射到物理地址,最终在物理内存中获取代码和数据。虚拟地址空间确保了进程间的地址隔离,提高了安全性并简化了内存管理,但同时也带来了额外的空间和时间成本。

1284

被折叠的 条评论
为什么被折叠?



