进程(四)—— 虚拟地址空间(虚拟内存)

在进程(一)的学习中,进程 = 程序控制块(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) + 物理内存中的代码和数据

三、使用虚拟地址空间的优缺点

优点

安全性角度:防止不同进程对物理内存的争夺和践踏,可以对特定内存地址提供写保护,防止恶意篡改

便利性角度方便进程间通信,对于不同的进程而言,自己可以随机选取虚拟内存上的某个地址,随后交由页表连接到同一个物理地址。

缺点

空间角度:虚拟内存需要额外构建数据结构,占用空间

时间角度:虚拟地址到物理地址的转换需要时间,增加了执行时间

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值