精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>技术精解:内存、进程、线程等>>Win98 内存管理>>Win98 内存管理(五)

主题:Win98 内存管理(五)
发信人: skyice()
整理人: skyice(2000-06-22 00:28:37), 站内信件
分配内存页
  你可以使用 VirtualAloc() 分两步或一步来分配内存页。分两步的
方法是首先预留内存,然后把内存提交到页。下面是一个按两步的方法分
配内存的例子:
  // Reserve a 64K range of addresses.
  LPVOlD p=VirtualAlloc(0,0x10000,MEM_RESERVE,PAGE_READWRITE);
  if(p==NULL)
    {
      /* Error. */
  }
  // Commit a 4K range of addresses.
  LPVOID pTemp=VirtualIAlloc(p,0X1000,MEM_COMMIT,
  PAGE_READWRITE);
  if(pTenp==NULL)
   {
      /* Error. */
  }
  对 VirtualAlloc() 的第一次调用预留了一个 64K 的地址区段,并
定位在操作系统选定的位置处。第二次调用把 4K 预留地址提交到一个内
存页。注意,这个代码片段怎样分别为每次调用保存返回值。因为页和区
段有不同的间隔尺寸,又由于每个调用都有失败的可能性,所以必须把每
种调用看成分离的、独立的内存分配行为。
  一步方式是用 MEM_COMMIT 标志调用 VirtualAlloc()。换句话说,
在得到页前不预留地址,而是把预留和提交请求合并进一个调用:
  // Commit a 4K range of addresses.
  LPVOID pTemp=VirtualIAlloc(0,0X1000,MEM_COMMIT,
  PAGE_READWRITE);
  if(pTenp==NULL)
    {
      /* Error. */
  }
  要收回前面提交的页,或者放弃前面预留的地址范围,要调用 Virt-
ualFree()。用 MEM_DECOMMIT 标志调用这个函数时,页被收回(但是地
址范围仍然预留着)。要放弃一定范围的预留信息,可以用 MEM_RELEASE
标志调用 VirtualFree()。
  Win32 虚拟内存函数的完整集合在下表中进行了总结。大多数函数很直
观,不需要更多的解释,只要看一看 Win32 帮助数据库或文档中的 Win32
函数名就会明白。为 Win32 进程直接分配的最后一组私有页是用于堆栈的
页。下面将继续讨论。

               控制进程页分配的函数
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  函数                说明
——————————————————————————─—————
  VirtualAlloc()      预留一个地址范围和/或分配内存页
———————————————————————————————─
  VirtualFree()       收回预留的地址范围和/或释放已分配内存的页
———————————————————————————————─
                      为核心工作进程组添加一组页。尽管页可被写
  VirtualLock()       入页文件,但是一旦该进程中的线程被调度运
                      行,它们就将被读回内存。
———————————————————————————————─
  VirtualProtect()    改变当前进程中一组已提交页上的访问保护。
———————————————————————————————─
  VirtualProtectEx()  在调用者有足够访问权的系统中,改变任何进
                      程中一组已提交页上的访问保护。
———————————————————————————————─
  VirtualQuery()      返回当前进程中具体地址处的虚拟内存细节。
———————————————————————————————─
  VirtualQueryEx()    在调用者有足够访问权的系统中,返回任何进
                      程中具体地址处的虚拟内存细节。
———————————————————————————————─
  VirtualUnlock()     从核心工作进程组中删除一组页,因此当进程
                      中的线程运行时,它并不一定非要在内存中;
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

分配栈空间
  栈是编译器用于短期内存需求的临时内存区。栈中容纳着四种类型的
数据:函数的局部变量、函数被调用时传人的参数、寄存器值和返回地址。
栈的的使用就象动态的时涨时落的潮水。
  也许关于栈的最重要问题就是栈的大小。在 Windows 98 和 Windows
NT 上,Win32 线程默认的栈大小为1MB。对于在 Win32s 下运行的 Win32
程序,可用的栈更小一些:只有 128K。如果你编写一个使用了许多局部变
量或用了许多递归的 Win32 程序,应当在 Win32s 上测试你的应用程序,
以确保没有超越可用的栈空间。

--
我想我是海,宁静的深海
不是谁都明白 ...

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.99.91.3]

[关闭][返回]