4G内存是最大扩展空间,不是一个进程就分配4G内存,一个电脑进程有的上百个你哪有那么多空间用。。。
虚拟地址是进程内地址,是进程内程序运行使用的地址,它不是物理地址,所有进程的首地址都是虚拟地址0开始的,但不一定是以ffffffff,都是用多少分配多少,你不申请就没得用。。。 为啥要用虚拟内存,一个是程序运行需要,进程要申请内存,但申请的内存未必就和他连续,可能开始用的内存在物理内存前面,但你又申请的内存在物理内存的结尾,这样用物理内存就不连续了,但虚拟地址连续。。。还有一个好处是各进程用各自分配的内存,没分配给你的就没有虚拟地址,你也访问不到,防止你访问到别的进程里边。。。。这样也方便内存映射,比如一个DLL可以被多个进程访问,只要某个进程要用,只要把DLL映射到进程里,为DLL分配该进程的虚拟地址就行,不需要额外的空间,不同进程DLL的虚拟地址是不同,在物理上其实这些进程共用了这段内存,但逻辑上是在不同空间中,虚拟内存地址不同。。。。
虚拟地址是进程私有的地址,其他进程不能使用的,他只能使用自己的虚拟地址。。。。。。
虚拟地址就是进程内内存的编号,很好理解的,比如人人都有身份证(全国唯一,物理地址),当然你还有学号。。。,通常里学校只用学号,不同学校的同一个学号指的是不同人(身份证号不同),所以虚拟地址都是进程内有效。。。。还有一种情况,假设你一个人上了N个学校,但你在不同学校的学号是不同的,假设甲学校你编号是11,乙是21。。。甲学校不可能用21这个号的找你,如果用了找到的只能是别人,所以说虚拟地址不是通用的,自己学校只能用自己的一套编号方式(虚拟地址)。
物理地址是唯一,是确确实实存在在内存条里的硬件地址,所以必须是唯一的,比如甲学校用11找到你,乙用21找你,实际上找的是一个人,当然对于内存就是同一个内存,数据也自然都是一样的,假设甲学校给你一个苹果,乙学校找到你会发现你手里有个苹果。。。你可以通过这种方式,让两个进程通信(通信还有更灵活的方法,比如管道,这里就不提了),两个学校都可以使唤你一个人去做事,当然你也可以作为一个沟通的中间人,甲进程把数据改了,乙进程的自然也会被改,这样这块内存可以作为数据交流,但通常用管道交流,但这种方式也可以办到。。。。。这就是内存映射,这样可以节省内存,同一段程序我没必要放在两个物理内存里,两个进程公用即可,所以他具有1个物理地址,多个虚拟地址,每个虚拟地址是由分配给他地址的进程专用,但他们确确实实用的是同一块内存,在比喻中就是两个学校都在使唤你一个人,不过是用的学号不同罢了。
如果你使用物理地址找东西,一定不会找错,但你把虚拟地址传给另一个进程,他使用一定会找错,就好比乙学校问甲学校你的学号,然后找人,肯定找错,但如果用身份证就没问题。。。。
还有一个问题就是通过虚拟地址很多内存你永远找不到,就比如甲学校要用自己学校的学号
去找乙学校的一个学生,让他卖苦力,这你是不可能办到的,因为该学生不在你们学校,你甚至连她叫啥,身份证号是啥都不知道,在进程内就相当于该物理地址指的内存不存在,就算你有办法得到这个物理地址,使用物理地址找,也办不到,就好像学校需要国家管制,进程也一样,他的行为都是系统授权的,你必须将内存映射到进程中,而且系统允许,比如一个文件可以多个进程看,如果第一个进程把它设置成进程安全,你其他进程就不能打开文件,系统不允许。
进程的虚地址
最新推荐文章于 2022-10-17 20:37:53 发布