• Windows系统编程 chap5


    Windows系统编程  chap5

    内存管理,内存映射文件和DLL

    内存映射文件把进程地址空间跟文件直接关联,允许操作系统管理在文件和内存之间的所有的数据移动,从而程序员不需要处理ReadFile,WriteFile,SetFilePointer或其它I/O函数。有了内存映射文件,可以方便程序维护永久文件中的动态数据结构,且基于内存的算法可以处理文件数据。而且,内存映射将大大加快顺序文件和处理速度,并能提供在进程之间内存共享的机制。

    DLL是文件映射和共享内存的特例,此时文件(主要是只读代码文件)被映射到进程地址空间以执行。

    5.1 Win32和Win64内存管理架构

    “32位”在内存地址本身就可以体现,指针(LPCTSTR, LPDWORD等等)是4字节(32位)对象。

    每个Win32进程具有自己4GB长的私有虚拟地址空间。Win32中至少有一半(2-3GB,3GB在启动时必须打开)地址用于进程。虚拟地址空间的剩余部分分配给共享数据和代码,系统代码,驱动器等等。

    操作系统管理虚拟内存到物理内存映射,页面交换,页面调度等。 《Inside Windows 2000》

    。系统具有相对较少的物理内存

    。每个进程具有自己的虚拟地址空间

    。操作系统映射虚拟地址到物理地址

    。许多虚拟页面将不在物理内存中,因此操作系统响应页面错误(引用的页面不在内存中),并从硬盘上的系统交换文件或普通文件中加载数据。

    VOID GetSystemInfo(LPSYSTEM_INFO  lpSystemInfo)

    5.2       堆

    Windows以堆的方式来维护内存池。一个进程可以包含多个堆,可以从这些堆中分配内存。

    如果单个堆足够了,就使用C库内存管理函数(malloc, free, calloc, realloc)

    堆是Windows对象。因此,它们具有句柄。当分配内存时堆句柄是必需的。每个进程具有自己的缺省堆,它被malloc使用,而下一个函数获得其句柄。

    HANDLE  GetProcessHeap(VOID)

    不同堆的优点如下:

    。公开

    。多线程性能

    。分配效率

    。解除分配效率

    。引用局部化的效率

    5.3       管理堆内存

    通过指定堆句柄,块大小和几个标记来从堆中获得内存块。

    LPVOID HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes)

    通过堆句柄和块指针来调用HeapSize(该函数应该命名为BlockSize因为它不包含堆的大小)以决定分配块的大小。

    DWORD HeapSize(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem)

    5.3.1        HEAP_NO_SERIALIZE标记

    使用该标记会有较小的性能提升,因为该函数跟访问堆的线程没有相互排斥。

    5.3.2        HEAP_GENERATE_EXCEPTIONS标记

    5.3.3        其它堆函数

    HeapCompact试图整理堆中邻近空闲块的碎片。

    HeapValidate检测堆的出错。

    HeapWalk列举堆里的块

    5.3.4        小结:堆管理

    1).使用CreateHeap或者GetProcessHeap来获取一个堆句柄

    2). 使用HeapAlloc在堆内分配块

    3).

    5.4       范例:使用

    5.5       内存映射文件

    5.5.1        文件映射对象

    5.5.2        映射进程地址空间到映射对象

    分配虚拟内存空间并通过映射对象映射到文件。分配的块映射到用户指定的文件中,而不是页面调度文件中。

    LPVOID MapViewOfFile()

    5.5.3        文件映射的限制

    5.5.4        小结:文件映射

    1. 打开文件,确保它具有GENERIC_READ访问权限
    2. 文件是新建的,需要通过CreateFileMapping或者使用SetFilePointer和SetEndOfFile来设置文件长度
    3. 使用CreateFileMapping或OpenFileMapping来映射文件
    4. 使用MapViewOfFile创建一个或多个视图
    5. 通过内存引用来访问文件
    6. 在结束时,依次对映射句柄执行UnmapViewOfFile,CloseHandle,对文件句柄执行CloseHandle

    5.6       范例:对映射文件进行顺序文件处理

    5.7       排序内存映射文件

    5.8       范例:使用基准指针

    5.9       动态链接库

    DLL是文件映射最明显和重要的应用。DLL对于高级技术比如COM来说是必需的

    5.9.1        静态和动态库

    单映像模式缺点:

    5.9.2        隐式链接

    5.9.3        导出和导入接口

    5.9.4        显式链接

    5.10    

    5.11   DLL入口点

    BOOL DllMain(HINSTANCE hDll, DWORD Reason, LPVOID Reserved)

    5.12   DLL版本管理

    HRESULT CALLBACK DllGetVersion(DLLVERSIONINFO *pdvi)

    5.13   总结

  • 相关阅读:
    如何在VS 2010中使用 VS2013的解决方案(转)
    A2W、W2A、A2T、T2A的使用方法
    海康网络摄像机YV12转换为BGR,由opencv Mat显示 (转)
    特征提取代码总结
    请不要做浮躁的人
    linux下操作问题与总结
    项目问题与解决方案
    电脑故障与解决方案
    给年轻工程师的十大忠告
    记忆的马太效应
  • 原文地址:https://www.cnblogs.com/wolflion/p/3083681.html
Copyright © 2020-2023  润新知