Chinaunix首页 | 论坛 | 博客
  • 博客访问: 338165
  • 博文数量: 73
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1293
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-07 11:17
个人简介

爱运动,爱看书,爱生活!

文章分类

全部博文(73)

文章存档

2014年(7)

2013年(66)

分类: 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)
 */

 

 

 

 

 

 


 

阅读(785) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~