爱运动,爱看书,爱生活!
分类: LINUX
2013-05-26 19:10:12
/*
1.进程地址空间
Linux,如同任何现代的操作系统,会虚拟化他的物理内存,进程不会直接寻址物理内存,事实上,
内核会将每个进程关联到唯一的虚拟地址空间,此地址空间是线性的,所使用的地址从零算起,
而且递增至某个上限值。
2。页面与页面调度
虚拟地址空间由页面(page)组成,一个页面的大小是固定的,实际的大小取决于系统架构及其机器类型,
典型的大小包括4kb(32位系统)以及8kb(64位系统),页面不是有效的,就是无效的。一个有效的页面会被关联到物理内存
中的一个页面或某个辅助存储器,一个无效的页面不会被关联到任何地方,而是会被表示成一段未使用、未分配的地址空间。
地址空间未必是连续的,尽管他是线性的。
3.分配动态内存
void *malloc(size_t size),执行成功时,malloc会分配size字节个内存,而且返回一个指针指向刚才分配内存的
首地址,这断内存不会被填满零值,执行失败Malloc会返回null,并将errno设定为ENOMEM
4.分配数组
void calloc(size_t n,size_t size),calloc会将返回的内存快中所有字节填满0值
5.调整分配内存的大小
void *realloc(void *ptr,size_t size),如果size为0,则他的作用如同free,如果ptr为Null,如同malloc
调整之后的内存不一定还在原处,所以如果调整成功,原地址不再使用,而使用新的地址,调整失败,原地址
状态不会改变,可以继续使用。
6.释放动态内存
使用malloc,calloc,reallco分配的内存不再使用时,必须由free释放
void free(void *ptr);//ptr的值可以是null
7.对奇
数据的对齐(alignment)是指从硬件来看数据的地址与内存块之间的关系,一个变量所位于的内存大小若
是其大小倍数,则称为自然对其。这样有利于内存管理。
非标准的数据对齐(结构联合)
一个结构的对齐需求就是该结构的组成类型的最大者,结构的补齐在结构内的最大数据所占空间不超过4字节时,
按其大小标准对其,超过4字节仍然以4字节的倍数标准补齐
一个联合的对其需求就是成员类型的最大者
一个数组的对齐需求就是基本类型
8.管理数据断
unix系统提供了可用于直接管理数据段的接口
#include
int brk(void *end):可用于将数据段的结尾设定为end所指的地址,执行成功返回0,失败返回-1
void *sbrk(intptr_t increment):根据increment的值来增加数据段结尾的地址,返回修改过的结尾地址标识
9.匿名存储映射
所谓的匿名是指背后没有文件支持,匿名存储映射只是一个可供你使用的大型的填满0值的内存块
好处:与碎片无关,当程序不再需要时,映射自动解除;大小可调整;每个内存分配存在于独
立的内存映射中,不需要管理全局的堆
10.创建匿名内存映射
#include
void *mmap(void *start,//常设置为NULL,表示内存映射存储起始地址由系统自动安排
size_t length,//内存大小
int port,//PROT_READ|PROT_WRITE可供读取与写入
int flags,//MAN_ANONYMOUS|MAP_PRIVATE匿名与私有
int fd,//当Port设置为匿名时,offset,fd会被忽略,一般均设定为-1
off_t offset,//0
)
释放匿名内存映射
int munmap(void *start,size_t size);
另一种如同匿名映射的内存映射方式:映射/dev/zero
即将内存映射到/dev/zero
举例:
void *p;
int fd;
//打开/dev/zero以准备读取写入
fd=open("/dev/zero",OREWR);
if(fd<0){
printf("Error.\n");
exit(0);
}
// /dev/zero的[0,pagesize 映射]
p=mmap(NULL,
getpagesize(),//映射一个页面
PROT_READ|PROT_WRITE,//读写
MAP_PRIVATE,//私有映射
fd,//映射/dev/zero
0
)
munmap(p,getpagesize());
11.操作内存
#include
void *memset(void *s,int c,size_t n);//从s开始将N个字节设置为c
12.比较字节
类似与strcmp,memcmp可用于比较两个内存块是否相等
int memcmp(cosnt void *s1,const void *s2,size_t size)
比较s1与s2的前n个字节,如果两个内存块相等返回0,s1小于s2返回小于0的值,反之
13.移动字节
void *memmove(void *dst,const void *src,size_t n),//将src的前N个字符复制到dst,并返回dst
他的变体执行速度更快void *memcpy(void *dst,const void *src,size_t n),//将src的前N个字符复制到dst,并返回dst
14.搜索字节
void *memchr(cosnt void *s,inc,size_t size)//在s所指向的内存的n个字节中搜索c,返回第一个指针,
指向第一个与匹配的字节,找不到c返回null
15.锁定内存
锁定部分地址空间:
#include
int mlock(const void *addr,size_t len)//从addr 开始把虚拟内存中的len个字节锁定在物理内存
锁定整个地址空间
int mlockall(int flags);
flags:
MCL_CUTURE:当前被映射的所有页面,包括堆栈、数据段、映射文件等锁定在进程的地址空间
MCL_FUTURE:将来会被映射到地址空间的所有页面锁定在内存
执行成功返回0,失败返回-1
16.替内存解锁(允许内核在有需要时将相应的页面置换出内存)
int munlock(const void *addr,size_t len);
int munlockall(void)
*/