一,C内存管理函数
1,malloc函数的使用。
1,它分配的内存块是没有被初始化过的。
2,从堆中分配size所指定的字节数的内存,并返回指向新分配的内存的指针,
如果执行失败则返回NULL.
#include <stdlib.h>
void *malloc(size_t size);
2,calloc函数的使用
1,它分配的内存块每个比特位都被设置为0
2,它从堆中返回一个指向包含nmemb个元素的数组的指针,数组中每个元素的大
小为size个字节。成功则返回指向内存的指针,否则返回NULL。
#include <stdlib.h>
void *calloc(size_t nmemb, size_t size);
3,realloc函数的使用
1,改变以前分配的内存块的大小。
2,realloc不对增加的内存块做初始化。
3,realloc如果不能扩大内存块,就返回NULL,而且保持原来的数据不动。
4,realloc的第一个参数如果为NULL,则它的作用和malloc函数一样。
5,realloc第二个参数如果是0,则释放原来的内存块。
#include <stdlib.h>
void *realloc(void *ptr, size_t size);
4,free函数的使用。
1,它释放一块内存。
#include <stdlib.h>
void free(void *ptr);
5,alloca函数的使用。
1,它是从栈中分配的内存。所以,当调用的alloca函数返回时,已分配的内存会
被自动释放。
#include <stdlib.h>
void *alloca(size_t size);
二,内存映像文件。
进程把一个磁盘文件映像到内存中,在磁盘文件和它在内存中的映像间创建逐字
节的对应关系。
好处1,可以加速I/O操作。可以在内存中操作数据,而且,使用指针而不是普通
的文件操作函数来访问内存映像文件。
好处2,可以共享数据。内存映像文件能够向任何进程独立地提供数据访问,并
且把内存区的内容保存在一个磁盘文件中。此时,还要对内存采取一种串行访
问(serializing access)的方法(锁或信号灯或其它),以保证统一的,可预测的
读写操作。
1,mmap函数
#include <unistd.h>
#include <sys/mman.h>
void *mmap(void *start, size_t length, int prot, int flags, int fd,
off_t offset);
在文件描述符fd指定的打开文件中,从文件起始处偏移offset的位置开始映像到
内存中start开始的地方,length指定了文件被映像的大小,映像的内存区有保护
模式,其值可'或'。
PROT_NONE 不允许访问
PROT_READ 被映像内存区可读
PROT_WRITE 被映像内存区可写
PROT_EXEC 被映像内存区可执行
映像的属性由flag值指定,可为以下值'或‘得到。
标志 POSIX兼容性描述
MAP_FIXED兼容如果start无效或正在使用则失败
MAP_PRIVATE兼容对映像内存区的写入操作是进程私有的
MAP_SHARED兼容对映像内存区的写入也被复制到文件
MAP_ANON(MAP_ANONYMOUS) 不兼容创建匿名映像,忽略fd
MAP_DENYWRITE不兼容不允许正常的写文件
MAP_GROWSDOWN不兼容映像内存区是向下增长的
MAP_LOCKED不兼容把页面锁定在内存中
如果函数执行成功则返回指向内存区的指针,否则返回-1,并设置errno变量。
注意:映像内存必须用MAP_PRIVATE标为私有,或用MAP_SHARED标为可共享。其它
值都是可选的。
私有映像使得对映像内存区的任何修改都是进程私有的,不会被反映到下面的磁
盘文件中,其它进程也不会得到这些修改。
共享映像使得对映像内存区的任何更新能�蛄⒓慈檬褂猛�一文件做映像的其它进
程看到。为了防止写入下层的磁盘文件,可以指定MAP_DENYWRITE.
由MAP_ANONYMOUS创建的匿名映像不包含物理文件,只是简单地为进程 私有的用
途分配内存,比如高速I/O区域或自定义的malloc实现。
MAP_FIXED让内核把映像定位在特定的地址。如果这个地址已经在用了或者不能使
用这个地址,则mmap执行失败。如果没有指定MAP_FIXED而且start也不能用,内核
会尝试把映像放置在内存中的其他地方。
MAP_LOCKED允许具有超级用户权限的进程把映像锁定在内存中,而不让它被交�Q
到磁盘上。
2,munmap函数的使用。
当使用完一个内存映像文件后,可以调用munmap解除内存映像并把内存释放返回
给操作系统。
#include <unistd.h>
#include <sys/mman.h>
int munmap(void *start, size_t length);
执行成功返回0,否则返回-1, 设置errno
3,msync函数的使用
它把被映像的文件写入磁盘
int msync(const void *start, size_t length, int flags);
被强行写入到磁盘的内存区从start指定的地址开始:写入length个字节的数据。
参数flag可以是下面这些值一个或多个的逻辑‘或’。
MS_ASYNC 调度一次写入操作然后返回
MS_SYNC 在msync返回前写入数据
MS_INVALIDATE让映像到同一文件的映像无效,以便用新数据更新它们。
4,mprotect函数的使用
它修改在内存映像上的保护模式
#include <unistd.h>
#include <sys/mmap.h>
int mprotect(const void *start, size_t len, int prot);
mprotect把自start开始的内存区的保护模式修改为prot指定的值,prot可以是前
表中列出的值‘或‘。函数成功返回0,否则返回-1,并设置errno.
5,锁定内存
内存加锁,意味着防止一块内存区域被交�Q到磁盘上。即防止被换出内存。
4个函数提供对内存的加锁和解锁
#include <unistd.h>
#include <sys/mmap.h>
int mlock(const void *start, size_t len);
int munlock(void *start, size_t len);
int mlockall(int flags);
int munlockall(void);
// flag 可以是MCL_CURRENT和MCL_FUTRUE之一或两个都有。 MCL_CURRENT在调
用返回前,请求锁住所有内存页面,MCL_FUTRUE指出锁住所有增加到进程的地址空
间的内存页面。以上都需要超级用户权限进程才能对内存区加锁,解锁。
6,mremap函数的使用
#include <unistd.h>
#include <sys/mmap.h>
void *mremap(void *old_addr, size_t old_len, size_t new_len, unsigned
long flags);
这个函数是用来调整内存区的大小。flag指出是否在内存中移动内存区。
MREMAP_MAYMOVE允许改动地址;如果没有这个值,调整内存区大小的操作执行失
败。如果执行成功返回 内存区调整后的地址,如果 执行失败则返回 NULL.
本文出自 “WIK” 博客,请务必保留此出处http://noyear.blog.51cto.com/819034/405845