关于匿名内存映射的优点
mmem_zero方案:
- (SVR 4 ) /dev/zero Memory Mapping
1. 可以将伪设备 “/dev/zero” 作为参数传递给mmap而创建一个映射区。/dev/zero的特殊在于,对于该设备文件所有的读操作都返回值为0的指定长度的字节流 ,任何写入的内容都被丢弃。我们的兴趣在于用它来创建映射区,用/dev/zero创建的映射区,其内容被初始为0。
2. 使用/dev/zero的优点在于,mmap创建映射区时,不需要一个时间存在的文件,伪文件 /dev/zero 就足够了。缺点是只能用在相关进程间。相对于相关进程间的通信,使用线程间通信效率要更高一些。不管使用那种技术,对共享数据的访问都需要进行同步。
mmem_anon方案:
- (4.4 BSD) Anonymous Memory Mapping
1. 匿名内存映射与使用/dev/zero类型,都不需要真实的文件。要使用匿名映射之需要向mmap传入MAP_ANON标志,并且fd参数置为-1。
2. 所谓匿名,指的是映射区并没有通过fd与文件路径名相关联。匿名内存映射用在有血缘关系的进程间。
win32方案中堆内存分配的声明
函数HeapAlloc声明如下:
- WINBASEAPI
- __out_opt
- HANDLE
- WINAPI
- HeapCreate(
- __in DWORD flOptions,
- __in SIZE_T dwInitialSize,
- __in SIZE_T dwMaximumSize
- );
- WINBASEAPI
- BOOL
- WINAPI
- HeapDestroy(
- __in HANDLE hHeap
- );
- WINBASEAPI
- __bcount(dwBytes)
- LPVOID
- WINAPI
- HeapAlloc(
- __in HANDLE hHeap,
- __in DWORD dwFlags,
- __in SIZE_T dwBytes
- );
- WINBASEAPI
- BOOL
- WINAPI
- HeapFree(
- __inout HANDLE hHeap,
- __in DWORD dwFlags,
- __deref LPVOID lpMem
- );
- WINBASEAPI
- SIZE_T
- WINAPI
- HeapSize(
- __in HANDLE hHeap,
- __in DWORD dwFlags,
- __in LPCVOID lpMem
- );
◆hHeap是进程堆内存开始位置。
◆dwFlags是分配堆内存的标志。
◆dwBytes是分配堆内存的大小。
PHP之友评论