windows内存结构(1)

操作系统使用的内存结构是理解操作系统如何运行的重要关键
创建进程时,系统会赋予进程4GB的虚拟空间地址(32位),16EB的虚拟空间(64位),32位从0x00000000-0xFFFFFFFF,64位从0x0000000000000000-0xFFFFFFFFFFFFFFFF
需要注意的是虚拟两个字,虚拟表示这个空间地址不是真实存在的,是想象中的,这个地址有什么用,我现在就来做说明
1.虚拟地址空间作用初步解说
我们知道,在程序中我们会用到各种各样的指针,当我们申请到了一个地址为0x12345678的地址,这时,虚拟的地址空间会对该地址做个记录,同时将它映射到物理存储器上即物理地址(如内存),同时该进程会建立一张表来维护该进程的虚拟地址到物理地址的映射。如果这个虚拟地址不被释放,则这个虚拟空间的地址再也无法被申请到
2.虚拟地址空间的由来
早期的计算机系统在运行程序时都是将程序直接装入内存,程序是直接运行在内存上的,假设有128MB内存,A,B两个进程,A需要使用10MB内存,B使用50MB内存,那么系统时如何分配内存的呢,先分配10MB内存给A,然后在剩下的118MB内存中分配50MB内存给B
但是这样带来两个问题
1.进程的地址空间无法隔离,在A进程中可以恶意篡改B进程的数据,甚至系统的数据
2.程序运行的地址不确定,如果这个时候,还需要运行C进程,只能从剩下的内存中再分配给C进程,可以说进程的运行地址完全取决于当前系统状况
3.内存使用效率低,如果再加一个进程C,但是进程C需要70MB内存,因为剩下的内存不够70MB,只能从内存中把某个进程的数据拷贝到硬盘,然后释放该内存,然后把C加载到内存中,如此反反复复,效率极低(这就是内存分页的原因)

虚拟地址空间可以在程序与物理地址之间做隔离,这个隔离我再举个例子,进程A申请了一个内存空间,地址为0x12345678,进程B也申请了一个内存空间,地址为0x12345678,不要以为这两个地址会冲突,这两个地址可能会映射到物理存储器不同的地方,而且被映射到的RAM页一定是空闲的(所以系统占据的部分肯定不会被使用,保证了系统的安全)

现在我们来看看虚拟地址空间的分区
这里写图片描述
我们能使用的只有用户方式的分区,内核方式的分区是系统所使用的,我们在程序中经常会遇到分配内存失败返回0x00000000,当用户访问该地址时,由于这个地址属于NULL分区,就会直接判定异常
我们发现,用户方式分区趋近于2GB(32位),内核分区为2GB,这就表示,如果再程序中申请内存,一共只能申请2GB,或者最多只能申请2GB/4Byte个int类型的指针(以上是我的理解,能看懂的就看)
其实在x86中也可以获得3GB方式分区,只需要打开/LARGEADDRESSAWARE开关,打开之后,系统可以创建的线程,堆栈和其他资源的数量将减少

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值