内存管理学习总结

内存管理

程序内存分配的方式:静态内存和动态内存

静态内存是由编译器来分配的内存,动态内存是由用户分配的内存;

动态内存分配函数

函数

所属头文件

备注

void *malloc(size_t size);

stdlib.h

size表示所分配内存的大小,以字节记,不进行初始化。

void *calloc(size_t nmemb,size_t size);

stdlib.h

分配的大小为nmemvb* size个,进行初始化。

freevoid *ptr

stdlib.h

释放动态分配的内存。

realloc(void *ptr,size_t size);

stdlib.h

调整分配的内存大小,其中size大于原位置大小,且原位置无法完成调整时,将重新开辟新的内存,并将数据复制到新的内存空间;如果ptrNULL时,realloc相当于malloc,当size0时,相当于free

void *alloca(size_t size);

stdlib.h

从进程的栈中分配空间,当函数结束后,所分配内存空间自动释放。

内存锁定函数

函数

所属头文件

备注

int mlockconst 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

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值