|
发表于 2016-3-4 08:27:19
|
显示全部楼层
"每个任务的地址段再虚拟出更大的一部分地址被前面的地址控制"不是这么理解。
所有地址都是操作系统分配的,被操作系统控制。
这么理解:每个应用程序都拥有独立的4G的地址空间(32位操作系统前提下)。比如LOL打开了,
它自己可以利用的内存空间就有4G;这时候快播又打开了,操作系统也让他知道,他有4G的内存空间可以
使用。但是!你电脑配置一共就2G,咋整?这不是扯淡吗?哪来的那两个G?这个工作就交给操作系统,
他会忽悠LOL和快播说让他们尽情使用4G空间,而LOL和快播是不知道系统到底实际内存大小的。
这个时候,LOL说:我地图上要绘制大龙,要用到内存地址0x11111111。于是他写入了这个地址一堆数据;
快播又说:我搜到一个好种子,需要分配一个线程来下载,索要的地址是0x11111111,于是把0x11111111
写入了一堆0.难道他们两个就不能愉快的一起运行了?不,LOL的0x11111111地址对应物理内存地址可能
是0x00001111,快播对应的物理内存地址可能是0x00010000,这个得看系统怎么分配。
总结:操作系统启动应用程序时,只是把他们必要的部分先调入内存,其他数据在需要的时候再取。并且
每个应用程序使用的物理地址都是独立的,不可能重复。你Debug在正常权限下想修改其他应用程序的
内存数据?你都摸不到人家。这就很好的解释了,虽然他们都觉得自己有4G,但是物理内存实际才4G,不
可能达到唰唰的速度,如果一个LOL开起来之后,物理内存有3G分配给了他,只剩1G(忽略操作系统所需要)
内存给其他程序用,肯定慢死啊。 |
|