题目如下:编写一个程序,使用vitualalloc在虚存中建立一个矩阵,在输入数据时根据需要动态提交物理内存,程序结束后释放所用的虚存块。
我已经把题目搞清了,但是是初学,很多东西还把握不好,希望前辈帮忙看看,写写,谢谢!!!我真的很想把它搞好,谢了!!分不够再加

解决方案 »

  1.   

    大家帮忙解决一下,其实不难,只是我对delphi中的变量不是很熟
      

  2.   

    在Delphi中该函数VirtualAlloc用来保留虚拟页。实现在调用线程的虚地址空间中保留或提交一个页区域。
    如果你不使用VirtualLock就不会把过程地址空间中的指定区域封锁在内存中。被保存的内存其它应用程序
    无法使用并不是绝对的,利用VirtualFree就可以释放或收回该空间。你可以通过指针读取修改其中的内容。
    //使用VirtualAlloc可以保存一定的内存,但是这和分配又有什么本质的区别呢?
    没有区别,起码我是这么认为,虚存的分配本就是通过VirtualAlloc函数来完成。一段虚拟内存在申请后并
    不能马上使用,如果要使用必须先提交,并且在提交时指定内存的保护方式。
    //实际分配的过程则会慢一些
    至于速度问题确实存在,进行分配操作往往会造成速度的减慢,例如没有空闲块。或者频繁的分配和重分配
    都会造成速度减慢。但最关键在于竞争问题,如当两个或多个线程同时访问数据,而且在一个线程继续进行之
    前必须等待另一个线程完成时就发生竞争。当大量使用内存块或DLL以多线程方式运行时将导致速度减慢。
    竞争是在分配和释放操作中产生导致速度减慢的问题,在多任务中很难十全十美的解决!Delphi中例子:
    const 
      BlockCode: array [1..2] of Byte = ($59, $E9); 
      PageSize = 4096; 
    var 
      Block: PInstanceBlock; 
      Instance: PObjectInstance; 
    begin 
      if InstFreeList = nil then 
      begin 
        Block := VirtualAlloc (nil, PageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); 
        Block^.Next := InstBlockList; 
        Move(BlockCode, Block^.Code, SizeOf(BlockCode)); 
        Block^.WndProcPtr := Pointer(CalcJmpOffset(@Block^.Code[2], @StdHookProc)); 
        Instance := @Block^.Instances; 
        repeat 
          Instance^.Code := $E8; 
          Instance^.Offset := CalcJmpOffset(Instance, @Block^.Code); 
          Instance^.Next := InstFreeList; 
          InstFreeList := Instance; 
          Inc(Longint(Instance), SizeOf(TObjectInstance)); 
        until Longint(Instance) - Longint(Block) >= SizeOf(TInstanceBlock); 
        InstBlockList := Block 
      end; 
      Result := InstFreeList; 
      Instance := InstFreeList; 
      InstFreeList := Instance^.Next; 
      Instance^.Method := Method 
    end;