快速业务通道

内存管理 笔记

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-09

一,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操作.可以在内存中操作数据,,使用指针而不是普通 拥有帝国一切,皆有可能。欢迎访问phome.net
的文件操作函数来访问内存映像文件.
好处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标为可共享.其它
值都是可选的.
私有映像对映像内存区的任何修改都是进程私有的,不会被反映到下面的磁
盘文件中,其它进程也不会得到这些修改. 拥有帝国一切,皆有可能。欢迎访问phome.net
共享映像对映像内存区的任何更新能夠立即让使用同一文件做映像的其它进
程看到.为了防止写入下层的磁盘文件,可以指定MAP_DENYWRITE.
由MAP_ANONYMOUS创建的匿名映像不包含物理文件,只是简单地为进程 私有的用
途分配内存,比如高速I/O区域或自定义的malloc实现.
MAP_FIXED让内核把映像定位在特定的地址.如果这个地址已经在用了或者不能使
用这个地址,则mmap执行失败.如果没有指定MAP_FIXEDstart也不能用,内核
会尝试把映像放置在内存中的其他地方.
MAP_LOCKED允许具有超级用户权限的进程把映像锁定在内存中,而不让它被交換
到磁盘上.
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可以是前 拥有帝国一切,皆有可能。欢迎访问phome.net
表中列出的值‘或‘.函数成功返回0,否则返回-1,并设置errno.
5,锁定内存
内存加锁,意味着防止一块内存区域被交換到磁盘上.即防止被换出内存.
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.

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号