windows内存结构的几个概念疑问?解决方案
windows内存结构的几个概念疑问?
1.虚拟地址空间
2.物理地址空间
3.已保留的地址空间区域
4.物理存储器
-----------------
先说我自己的理解吧
1.虚拟地址空间
该地址空间只是内存地址的一个范围。在你能够成功地访问数据而不会出现违规访问之前,必须赋予物理存储器,或者将物理存储器映射到各个部分的地址空间。(Windows核心编程上的原话)
我是这么理解:虚拟地址空间其实是不存在的,他只是代表一个范围,操作系统维持了虚拟地址空间到物理地址空间的映射关系,使用虚拟地址空间实际上必须准备物理地址空间
2.物理地址空间
与虚拟地址空间相对应,操作系统应该维持了一个映射算法
3.已保留的地址空间区域
从字面意思来看就是操作系统对虚拟地址空间的一个划分,以便用来做些什么
4.物理存储器
若要使用已保留的地址空间区域,必须分配物理存储器,然后将该物理存储器映射到已保留的地址空间区域。这个过程称为提交物理存储器。物理存储器总是以页面的形式来提交的。若要将物理存储器提交给一个已保留的地址空间区域,也要调用Vi r t u a l A l l o c函数。(书上原话)
我这么理解:操作系统现在要使用保留的地址空间区域,就必须通过映射,提供足够大的物理内存。
-------------------------
对于Windows的内存管理这一章真心觉得很难理解,我自觉把其放到了最后才看。
以上4个概念,期待得到比较明确的解释
------解决方案--------------------
纯接分。个人觉得书上说得比较清楚了。
------解决方案--------------------
这个还是看书吧。理解不了也不用急,等什么时候用到了,结合实际再看,理解起来更容易。
------解决方案--------------------
《深入解析Windows操作系统-Windows Internals》
------解决方案--------------------
好抽象啊...那本书刚看就如泥牛入海,看不懂啊...继续学习~
------解决方案--------------------
1. 虚地址空间的每个单元(页)是一条路,通向一个物理地址空间单元。
2. 物理地址空间的每个字节又是一条路,通向某个硬件上的一个字节(可能是内存上的,也可能是别的什么物件上的)
3. 保留的空间,这部分空间不会被占用保证以后在这里能申请到连续的空间。
4. commit本身生不会把虚地址空间和物理地址空间关联,只是标记虚地址空间的一个页有效,只有真正读写的时候才会和物理空间绑定,并且即便发生过读写也可能因为物理内存不足而被解除关联(内存中的数据会被写到映射文件上)。
------解决方案--------------------
Operating System Concepts
Windows Internals
Windows Research Kernel
------解决方案--------------------
你这个书讲的很麻烦很绕。
关于1~32位windows下,操作系统为应用程序划分了4GB的虚拟的线性地址,既虚拟内存。
高2GB线性地址由内核程序占用,应用程序自己可使用的是低2GB的线性地址(有些低2GB区域仍然是不可访问的,但很少)。
关于2~与虚拟地址空间相对应,操作系统应该维持了一个映射算法(你的原话即可理解)
关于3~这句话是说,应用程序向系统申请再低端的2GB线性地址中,保留一块地址区域,这块区域不会被操作系统作为资源,分配给应用程序使用(并且这块内存不会被映射进物理内存).
关于4~使用Vi r t u a l A l l o c函数激活保留空间。
------解决方案--------------------
这里面硬件起到了很大的作用
1.虚拟地址空间
2.物理地址空间
这些都是cpu提供支持
------解决方案--------------------
首先说我们需要访问硬件,其中一种方法就是把硬件上的数据对应到物理地址上,然后CPU说我要读物理地址xxxx上的内容,对应的硬件就把那个内容发送给CPU。这种处理方式最常发生在内存上,但是不限于内存,可能换了新显卡以后发现可用内存变少了,因为显卡上的寄存器更重要的是显存也需要分配物理地址,而以前的台式机主板只能有4GB的物理地址,就只好把内存的物理地址占了。
对于多任务系统,所有任务都是用同一套物理地址是很痛苦的事,于是有了内存管理器和虚地址。虚地址模式下,地址并不直接对应硬件,需要翻译成物理地址,进一步对应硬件。并且一个虚地址也不一定对应物理地址——根本没有使用的虚地址和因为主存储器不足数据被临时保存在外部存储器上的虚地址。
对于主内存以外的硬件,一般都是直接将其物理地址和虚地址直接绑定(当然这个也是用VirtuaAlloc处理的)。但是对于主内存,这种绑定是动态的。通过commit把一部分虚地址标记为有效以后,第一次使用这些虚地址的时候,系统会把当前空闲的主内存物理地址绑定给虚地址。当主内存不足的时候,系统可能会把一些可能暂时不用的虚地址对应的主内存内容备份到外部存储器,然后释放那部分主内存给别的需要主内存的虚地址使用。而在此需要使用那些虚地址的时候,系统又会找一些当前空闲的主内存绑定个它们,同时从外部存储器读出备份数据,还原这些虚地址对应的内容。
对于reserve,对于物理地址,如果最大需要用10MB的空间就只能都占下来。但是对于虚地址就没这个必要。虚地址只有使用的时候需要对应实在的东西,否则就是“虚”的。如果我们最大需要10MB的空间,可以保留10MB的空间保证不会被别人使用,而即便我们这次只commit其中4KB,也不会造成主内存的浪费。
1.虚拟地址空间
2.物理地址空间
3.已保留的地址空间区域
4.物理存储器
-----------------
先说我自己的理解吧
1.虚拟地址空间
该地址空间只是内存地址的一个范围。在你能够成功地访问数据而不会出现违规访问之前,必须赋予物理存储器,或者将物理存储器映射到各个部分的地址空间。(Windows核心编程上的原话)
我是这么理解:虚拟地址空间其实是不存在的,他只是代表一个范围,操作系统维持了虚拟地址空间到物理地址空间的映射关系,使用虚拟地址空间实际上必须准备物理地址空间
2.物理地址空间
与虚拟地址空间相对应,操作系统应该维持了一个映射算法
3.已保留的地址空间区域
从字面意思来看就是操作系统对虚拟地址空间的一个划分,以便用来做些什么
4.物理存储器
若要使用已保留的地址空间区域,必须分配物理存储器,然后将该物理存储器映射到已保留的地址空间区域。这个过程称为提交物理存储器。物理存储器总是以页面的形式来提交的。若要将物理存储器提交给一个已保留的地址空间区域,也要调用Vi r t u a l A l l o c函数。(书上原话)
我这么理解:操作系统现在要使用保留的地址空间区域,就必须通过映射,提供足够大的物理内存。
-------------------------
对于Windows的内存管理这一章真心觉得很难理解,我自觉把其放到了最后才看。
以上4个概念,期待得到比较明确的解释
------解决方案--------------------
纯接分。个人觉得书上说得比较清楚了。
------解决方案--------------------
这个还是看书吧。理解不了也不用急,等什么时候用到了,结合实际再看,理解起来更容易。
------解决方案--------------------
《深入解析Windows操作系统-Windows Internals》
------解决方案--------------------
好抽象啊...那本书刚看就如泥牛入海,看不懂啊...继续学习~
------解决方案--------------------
1. 虚地址空间的每个单元(页)是一条路,通向一个物理地址空间单元。
2. 物理地址空间的每个字节又是一条路,通向某个硬件上的一个字节(可能是内存上的,也可能是别的什么物件上的)
3. 保留的空间,这部分空间不会被占用保证以后在这里能申请到连续的空间。
4. commit本身生不会把虚地址空间和物理地址空间关联,只是标记虚地址空间的一个页有效,只有真正读写的时候才会和物理空间绑定,并且即便发生过读写也可能因为物理内存不足而被解除关联(内存中的数据会被写到映射文件上)。
------解决方案--------------------
Operating System Concepts
Windows Internals
Windows Research Kernel
------解决方案--------------------
你这个书讲的很麻烦很绕。
关于1~32位windows下,操作系统为应用程序划分了4GB的虚拟的线性地址,既虚拟内存。
高2GB线性地址由内核程序占用,应用程序自己可使用的是低2GB的线性地址(有些低2GB区域仍然是不可访问的,但很少)。
关于2~与虚拟地址空间相对应,操作系统应该维持了一个映射算法(你的原话即可理解)
关于3~这句话是说,应用程序向系统申请再低端的2GB线性地址中,保留一块地址区域,这块区域不会被操作系统作为资源,分配给应用程序使用(并且这块内存不会被映射进物理内存).
关于4~使用Vi r t u a l A l l o c函数激活保留空间。
------解决方案--------------------
这里面硬件起到了很大的作用
1.虚拟地址空间
2.物理地址空间
这些都是cpu提供支持
------解决方案--------------------
首先说我们需要访问硬件,其中一种方法就是把硬件上的数据对应到物理地址上,然后CPU说我要读物理地址xxxx上的内容,对应的硬件就把那个内容发送给CPU。这种处理方式最常发生在内存上,但是不限于内存,可能换了新显卡以后发现可用内存变少了,因为显卡上的寄存器更重要的是显存也需要分配物理地址,而以前的台式机主板只能有4GB的物理地址,就只好把内存的物理地址占了。
对于多任务系统,所有任务都是用同一套物理地址是很痛苦的事,于是有了内存管理器和虚地址。虚地址模式下,地址并不直接对应硬件,需要翻译成物理地址,进一步对应硬件。并且一个虚地址也不一定对应物理地址——根本没有使用的虚地址和因为主存储器不足数据被临时保存在外部存储器上的虚地址。
对于主内存以外的硬件,一般都是直接将其物理地址和虚地址直接绑定(当然这个也是用VirtuaAlloc处理的)。但是对于主内存,这种绑定是动态的。通过commit把一部分虚地址标记为有效以后,第一次使用这些虚地址的时候,系统会把当前空闲的主内存物理地址绑定给虚地址。当主内存不足的时候,系统可能会把一些可能暂时不用的虚地址对应的主内存内容备份到外部存储器,然后释放那部分主内存给别的需要主内存的虚地址使用。而在此需要使用那些虚地址的时候,系统又会找一些当前空闲的主内存绑定个它们,同时从外部存储器读出备份数据,还原这些虚地址对应的内容。
对于reserve,对于物理地址,如果最大需要用10MB的空间就只能都占下来。但是对于虚地址就没这个必要。虚地址只有使用的时候需要对应实在的东西,否则就是“虚”的。如果我们最大需要10MB的空间,可以保留10MB的空间保证不会被别人使用,而即便我们这次只commit其中4KB,也不会造成主内存的浪费。