📄 teach_sp_61.htm
字号:
<!-- LANGUAGE='JavaScript'>write_body();<-->
<!-- LANGUAGE='JavaScript'>write_bar();<-->
<table width=98% cellspacing="0" cellpadding="0" align=center><!--整体框架-->
<tr><td>
<table border=0 width="100%" cellspacing="0" cellpadding="2"><!--标记放置区域-->
<tr>
<td width="30%" align="center" bgcolor="#8E8E8E" valign=middle><img src=../../img/brand_200_60.gif width=200 height=60 alt="LOGO1"></td>
<td width="70%" align="center" bgcolor="#8E8E8E" valign=middle><!-- LANGUAGE='JavaScript'>write_ban();<--></td>
</tr>
<tr>
<td colspan="2" bgcolor="#939393" align=center><font color=white>您当前位置</font> <a href=../../index.htm><font color=white>首页</font></a> <a href=../index.htm><font color=white>开发教程</font></a> <a href=index.htm><font color=white><font class=engul>Visual C++/MFC</font>专题讲座</font></a> <font color=white>6.1 Win32下的内存管理介绍</font> <font color=white><!-- LANGUAGE='JavaScript'>write_command();<--></font></td>
</tr>
</table><!--标记放置区域 END-->
<table border=0 width=100% cellspacing="0" cellpadding="0">
<tr bgcolor="#F4F4F4">
<td><!-- article title begin here-->
<br>
<p align=center><big>6.1 Win32下的内存管理介绍</big>
<p>在使用C语言是可以利用ANSI C的库函数alloc来分配或者用C++的new操作符来分配,内存但是对于一个操作系统来说利用系统提供的API函数来进行内存分配,这样可以更加有效的利用内存。
<p>在Windows 3.X的时代,分配的内存可以有两种,全局的和局部的,例如GlobalAlloc和LocalAlloc。但在Win32的时代这些函数已经被废弃了,现在的内存只有一种就是虚存。在Win32中所有的进程所使用的内存区域是相互隔离的,每个进程都拥有自己的地址空间。而且系统使用了页面交换功能,就是利用磁盘空间来模拟RAM,在RAM中数据不使用时将会被交换到磁盘,在需要时将会被重新装入RAM。
<p>在Win32中每个进程的地址空间为4GB,从0X00000000到0XFFFFFFFF。对于M$不同的操作系统来讲,应用程序可以使用地址空间是不同的。
<table width=90% align=center border=1>
<tr><td colspan=2>Windows 9X</td></tr>
<tr><td width=40%>范围</td><td width=60%>作用</td></tr>
<tr><td>0X00000000 - 0X00000FFF</td><td>MS DOS</td></tr>
<tr><td>0X00001000 - 0X003FFFFF</td><td>16位Windows</td></tr>
<tr><td>0X40000000 - 0X7FFFFFFF</td><td>Win32应用程序</td></tr>
<tr><td>0X80000000 - 0XBFFFFFFF</td><td>内存映射文件,由Win32进程共享</td></tr>
<tr><td>0XC0000000 - 0XFFFFFFFF</td><td>操作系统</td></tr>
<tr><td colspan=2>Windows NT/2000</td></tr>
<tr><td width=40%>范围</td><td width=60%>作用</td></tr>
<tr><td>0X00000000 - 0X7FFFFFFF</td><td>Win32应用程序</td></tr>
<tr><td>0X80000000 - 0XFFFFFFFF</td><td>操作系统</td></tr>
<tr><td colspan=2>Windows NT Server Enterprise Edition/Windows 2000 Advanced Server</td></tr>
<tr><td width=40%>范围</td><td width=60%>作用</td></tr>
<tr><td>0x00000000 - 0xBFFFFFFF</td><td>Win32应用程序</td></tr>
<tr><td>0xC0000000 - 0XFFFFFFFF</td><td>操作系统</td></tr>
</table>
<p>在系统中内存的最小单位是页,一页的大小不同,例如在Intel系统上Windows9X下一页的大小位4K,而在Alpha系统上NT下一页的大小为8K。通过GetSystemInfo函数可以获得系统信息:
<pre>
VOID GetSystemInfo(
LPSYSTEM_INFO lpSystemInfo // system information
);
typedef struct _SYSTEM_INFO {
union {
DWORD dwOemId;
struct {
WORD wProcessorArchitecture;
WORD wReserved;
};
};
DWORD dwPageSize; //页大小
LPVOID lpMinimumApplicationAddress; //应用程序可以使用的最小地址
LPVOID lpMaximumApplicationAddress; //应用程序可以使用的最大地址
DWORD_PTR dwActiveProcessorMask;
DWORD dwNumberOfProcessors; //CPU数量
DWORD dwProcessorType; //CPU类型
DWORD dwAllocationGranularity;
WORD wProcessorLevel;
WORD wProcessorRevision;
} SYSTEM_INFO;
</pre>
<p>在Win32系统中内存页是可以设定保护方式(存取权限)的(例如可以设定某个内存页为只读,那么如果对这段内存进行写就会引发异常,而通过alloc或new分配的内存却不可以设置存取权限)。对内存的使用方式为先申请一段保留空间,然后提交这段内存空间并设置保护方式(申请和提交可以在一个步骤内完成),之后就可以对提交的内存区域进行操作,如果有必要可以改变内存的保护方式,在不在使用时回收内存,最后释放保留的内存空间。
<p>对于很多关键性的应用来将自己管理内存的使用是很重要的,因为这样可以利用系统特性来提高应用性能和对内存的利用。对于桌面应用程序来说一般不需要直接使用系统提供的虚存管理API。
<p>
<p align=center><a href=index.htm#charpter6>返回</a></p>
<p align=center><small>版权所有 闻怡洋 <a href=http://www.vchelp.net/><font class=engul>http://www.vchelp.net/<font></font></font></a></small></p>
</small>
</td></tr><!-- article content end-->
</table>
</td>
</tr><!-- article title end-->
</table>
</td></tr></table><!--整体框架 END-->
<!-- LANGUAGE='JavaScript'>write_tail();<-->
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -