您的位置:首页 > 其它

内存管理学习总结

2011-06-09 20:15 162 查看

内存管理

程序内存分配的方式:静态内存和动态内存
静态内存是由编译器来分配的内存,动态内存是由用户分配的内存;

动态内存分配函数

函数
所属头文件
备注
void *malloc(size_t size);
stdlib.h
size表示所分配内存的大小,以字节记,不进行初始化。
void *calloc(size_t nmemb,size_t size);
stdlib.h
分配的大小为nmemvb* size个,进行初始化。
free(void *ptr)
stdlib.h
释放动态分配的内存。
realloc(void *ptr,size_t size);
stdlib.h
调整分配的内存大小,其中size大于原位置大小,且原位置无法完成调整时,将重新开辟新的内存,并将数据复制到新的内存空间;如果ptr为NULL时,realloc相当于malloc,当size为0时,相当于free。
void *alloca(size_t size);
stdlib.h
从进程的栈中分配空间,当函数结束后,所分配内存空间自动释放。
内存锁定函数
函数
所属头文件
备注
int mlock(const void *addr,size_t length);
sys/types.h
锁定某一内存区域,addr表示内存的起始位置,length表示锁定的内存大小。
int munlock(void *addr,size_t length);
sys/types.h
解除对某一内存的锁定。
int mlockall(int flag);
sys/types.h
用于一次锁定多个内存页,常用选项有:
MCL_CURRENT:锁定所有内存页;MCL_FUTURE:锁定所有为进程的地址空间添加到内存页。
int munlock(void);
sys/types.h
解除所有内存锁定。

内存映像I/O

含义:
在内存中创建一个与外存中文件完全相同的映像,用户可以将整个文件映射到内存中,也可以将文件一部分映射到内存中。使用操作内存的方法来对文件进行操作。
特点:
l 可以加快I/O的速度
l 将文件映射到内存中,用户可以通过指针对文件进行访问,与访问其他内存毫无差别
l 可以实现文件数据的共享
局限性:
当用户将文件或文件的一部分映射到内存中时,必须事先指定内存空间的大小,要向内存映像中添加数据是一件很麻烦的事情;此外,内存映像操作只能针对普通文件这样可以内部定位的文件,而不能对管道,套接字这样的文件进行操作。

内存映像相关函数

函数:void *mmap(void *start,size_t length,int prot,int flag,int fd,off_t offset);
所属头文件:sys/types.h sys/mman.h
作用:将文件或其部分映像到内存中;
参数说明:
start通常为NULL,如果不为NULL表示希望将文件映射到指针的位置,但不能保证调用一定映射到该位置,length定义内存映像所占用的内存空间的大小,以字节记,prot表示内存映像的安全属性,flag是内存映像的标志;offset表示所映射到数据内容距离文件头的偏移量;
prot选项:(安全属性)
PROT_EXEC:被映像内存可能含有机器码,可以被执行;
PROT_NONE:被映像内存不允许被访问;
PROT_READ:被映像内存可读;
PROT_WRITE:被映像内存可写;
flag相关标志位:(内存映像标志)
MAP_FIXED:如果无法再START指定的地址建立内存映像,则出错返回;
MAP_PRIVATE:对内存映像所作的改动不反映到外存文件中;
MAP_SHARED:对内存映像
函数:int munmap(void *start,size_t length);
所属头文件:sys/types.h sys/mman.h
作用:撤销内存映像
参数说明:
start表示要撤销内存映像的起始地址,参数length表示要撤销的内存映像的大小,调用成功时,返回值为0,调用失败时,返回值为-1,并将errno设置为相应值。
函数:int msync(const void *start,size_t length,int flag);
作用:将所做的改动保存到外存;
参数说明:
参数start表示要保存到外存文件的源文件的起始地址,参数length表示内存映像的大小,参数flag设置了函数的相应操作;
flag相关标志位:
MS_ASYNC:调度一个写操作并返回;
MS_INVALIDATE:使映像到相同文件的内存无效以便使它们更改为新的数据;
MS_SYNC:完成写操作后返回;
函数:int protect(const void *addr,size_t length, int prot);
所属头文件:sys/types.h sys/mman.h
作用:修改内存映像的保护值
参数说明:
参数addr表示内存映像的起始地址,参数length表示内存映像的大小,参数prot为新设定的保护值,调用成功,返回0,调用失败返回-1,并将errno设置为相应值。
函数:void* mremap(void *old_addr.size_t old_length,size_t new_length,unsigned long flag);
作用:将参数old_addr所指向的内存映像的大小由old_length调整到new_length。
参数说明:
参数flag用于设置是否需要移动该内存映像的位置,相应取值为mremap_maymove,如果设置了该值,表示在需要时移动位置,否则将出错返回。调用成功时,返回值为0,调用失败时,返回值为-1。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: