关于WINDOWS虚拟内存的问题.(100分)

  • 主题发起人 主题发起人 liguang
  • 开始时间 开始时间
L

liguang

Unregistered / Unconfirmed
GUEST, unregistred user!
今天看了一&lt;WINODWS核心编程&gt;这本书关于虚拟内存的部分.感觉有点胡图.<br>使用VirtualAlloc可以保存一定的内存,但是这和分配又有什么本质的区别呢,被保存的内存<br>其它应用程序无法使用,是不是只是在速度上有一定的差别,保留内存只是给内存块做一个标<br>记,而实际分配的过程则会慢一些.
 
还请各位回答。
 
这个问题真的是这么有难度吗?<br>难道大富翁上都是那些只做数据库而不做系统编程的程序员吗?
 
我做系统编程比数据库的要多,但这个问题答不了。也许应该查查MSDN。我这刚好有&lt;&lt;<br>WINDOWS核心编程&gt;&gt;的电子书,是在虚拟内存章节中说到的吗,我去看看先:)
 
在Delphi中该函数VirtualAlloc用来保留虚拟页。实现在调用线程的虚地址空间中保留或提交一个页区域。<br>如果你不使用VirtualLock就不会把过程地址空间中的指定区域封锁在内存中。被保存的内存其它应用程序<br>无法使用并不是绝对的,利用VirtualFree就可以释放或收回该空间。你可以通过指针读取修改其中的内容。<br>//使用VirtualAlloc可以保存一定的内存,但是这和分配又有什么本质的区别呢?<br>没有区别,起码我是这么认为,虚存的分配本就是通过VirtualAlloc函数来完成。一段虚拟内存在申请后并<br>不能马上使用,如果要使用必须先提交,并且在提交时指定内存的保护方式。<br>//实际分配的过程则会慢一些<br>至于速度问题确实存在,进行分配操作往往会造成速度的减慢,例如没有空闲块。或者频繁的分配和重分配<br>都会造成速度减慢。但最关键在于竞争问题,如当两个或多个线程同时访问数据,而且在一个线程继续进行之<br>前必须等待另一个线程完成时就发生竞争。当大量使用内存块或DLL以多线程方式运行时将导致速度减慢。<br>竞争是在分配和释放操作中产生导致速度减慢的问题,在多任务中很难十全十美的解决!<br><br>Delphi中例子:<br>const <br>&nbsp; BlockCode: array [1..2] of Byte = ($59, $E9); <br>&nbsp; PageSize = 4096; <br>var <br>&nbsp; Block: PInstanceBlock; <br>&nbsp; Instance: PObjectInstance; <br>begin <br>&nbsp; if InstFreeList = nil then <br>&nbsp; begin <br>&nbsp; &nbsp; Block := VirtualAlloc (nil, PageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); <br>&nbsp; &nbsp; Block^.Next := InstBlockList; <br>&nbsp; &nbsp; Move(BlockCode, Block^.Code, SizeOf(BlockCode)); <br>&nbsp; &nbsp; Block^.WndProcPtr := Pointer(CalcJmpOffset(@Block^.Code[2], @StdHookProc)); <br>&nbsp; &nbsp; Instance := @Block^.Instances; <br>&nbsp; &nbsp; repeat <br>&nbsp; &nbsp; &nbsp; Instance^.Code := $E8; <br>&nbsp; &nbsp; &nbsp; Instance^.Offset := CalcJmpOffset(Instance, @Block^.Code); <br>&nbsp; &nbsp; &nbsp; Instance^.Next := InstFreeList; <br>&nbsp; &nbsp; &nbsp; InstFreeList := Instance; <br>&nbsp; &nbsp; &nbsp; Inc(Longint(Instance), SizeOf(TObjectInstance)); <br>&nbsp; &nbsp; until Longint(Instance) - Longint(Block) &gt;= SizeOf(TInstanceBlock); <br>&nbsp; &nbsp; InstBlockList := Block <br>&nbsp; end; <br>&nbsp; Result := InstFreeList; <br>&nbsp; Instance := InstFreeList; <br>&nbsp; InstFreeList := Instance^.Next; <br>&nbsp; Instance^.Method := Method <br>end;
 
在Delphi中该函数VirtualAlloc用来保留虚拟页。实现在调用线程的虚地址空间中保留或提交一个页区域。<br>如果你不使用VirtualLock就不会把过程地址空间中的指定区域封锁在内存中。被保存的内存其它应用程序<br>无法使用并不是绝对的,利用VirtualFree就可以释放或收回该空间。你可以通过指针读取修改其中的内容。<br>//使用VirtualAlloc可以保存一定的内存,但是这和分配又有什么本质的区别呢?<br>没有区别,起码我是这么认为,虚存的分配本就是通过VirtualAlloc函数来完成。一段虚拟内存在申请后并<br>不能马上使用,如果要使用必须先提交,并且在提交时指定内存的保护方式。<br>//实际分配的过程则会慢一些<br>至于速度问题确实存在,进行分配操作往往会造成速度的减慢,例如没有空闲块。或者频繁的分配和重分配<br>都会造成速度减慢。但最关键在于竞争问题,如当两个或多个线程同时访问数据,而且在一个线程继续进行之<br>前必须等待另一个线程完成时就发生竞争。当大量使用内存块或DLL以多线程方式运行时将导致速度减慢。<br>竞争是在分配和释放操作中产生导致速度减慢的问题,在多任务中很难十全十美的解决!<br><br>Delphi中例子:<br>const <br>&nbsp; BlockCode: array [1..2] of Byte = ($59, $E9); <br>&nbsp; PageSize = 4096; <br>var <br>&nbsp; Block: PInstanceBlock; <br>&nbsp; Instance: PObjectInstance; <br>begin <br>&nbsp; if InstFreeList = nil then <br>&nbsp; begin <br>&nbsp; &nbsp; Block := VirtualAlloc (nil, PageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); <br>&nbsp; &nbsp; Block^.Next := InstBlockList; <br>&nbsp; &nbsp; Move(BlockCode, Block^.Code, SizeOf(BlockCode)); <br>&nbsp; &nbsp; Block^.WndProcPtr := Pointer(CalcJmpOffset(@Block^.Code[2], @StdHookProc)); <br>&nbsp; &nbsp; Instance := @Block^.Instances; <br>&nbsp; &nbsp; repeat <br>&nbsp; &nbsp; &nbsp; Instance^.Code := $E8; <br>&nbsp; &nbsp; &nbsp; Instance^.Offset := CalcJmpOffset(Instance, @Block^.Code); <br>&nbsp; &nbsp; &nbsp; Instance^.Next := InstFreeList; <br>&nbsp; &nbsp; &nbsp; InstFreeList := Instance; <br>&nbsp; &nbsp; &nbsp; Inc(Longint(Instance), SizeOf(TObjectInstance)); <br>&nbsp; &nbsp; until Longint(Instance) - Longint(Block) &gt;= SizeOf(TInstanceBlock); <br>&nbsp; &nbsp; InstBlockList := Block <br>&nbsp; end; <br>&nbsp; Result := InstFreeList; <br>&nbsp; Instance := InstFreeList; <br>&nbsp; InstFreeList := Instance^.Next; <br>&nbsp; Instance^.Method := Method <br>end; <br><br><br>同意!
 
后退
顶部