linux下的管理内存相关的函数





malloc的实现,在linux下的实现是这样的,当所需要分配的内存大于128k,会用mmap(匿名映射)来实现。小于128k使用在堆分配(改天会分析下malloc函数的源码实现)。 



这里还有几个 

mallopt(int param,int value); 

这个函数能设置一些内存分配管理的参数,也就是设置param为value的值(比如我们想要强制所分配的内存是mmap分配的)。具体的参数可以去看man手册。 


使用这个很简单,就是在使用malloc之前设置就好了。 

struct mallinfo mallinfo(void); 

可以看下mallinfo结构体的结构; 

Java代码   收藏代码
  1. struct mallinfo {  
  2.   int arena;    /* non-mmapped space allocated from system */  
  3.   int ordblks;  /* number of free chunks */  
  4.   int smblks;   /* number of fastbin blocks */  
  5.   int hblks;    /* number of mmapped regions */  
  6.   int hblkhd;   /* space in mmapped regions */  
  7.   int usmblks;  /* maximum total allocated space */  
  8.   int fsmblks;  /* space available in freed fastbin blocks */  
  9.   int uordblks; /* total allocated space */  
  10.   int fordblks; /* total free space */  
  11.   int keepcost; /* top-most, releasable (via malloc_trim) space */  
  12. };  


也就是一些内存分配的统计信息。 

还有就是在栈上复制字符串,我们可以用alloca+strcpy来实现,或者可以使用linux特别提供的2个函数: 

Java代码   收藏代码
  1. char *strdupa(char *s);  
  2. char *strndupa(char *s)  



下面来介绍locking memory 

Java代码   收藏代码
  1. mlock (const void *addr,size_t len)  
  2.   
  3. int mlockall(int flags)  


第一个函数是锁住一段虚拟地址空间,第二个函数是锁住本进程的整个地址空间。 

解锁用下面两个函数: 

Java代码   收藏代码
  1. munlock (const void *addr,size_t len)  
  2.   
  3. int munlockall(int flags)  


由于locking memory对系统影响很大,因此这里系统有些限制。 

可以看下man手册中的这段 

引用
In Linux 2.6.8 and earlier, a process must be privileged (CAP_IPC_LOCK) 
       in  order  to  lock  memory  and the RLIMIT_MEMLOCK soft resource limit 
       defines a limit on how much memory the process may lock. 

       Since Linux 2.6.9, no limits are placed on the amount of memory that  a 
       privileged  process can lock and the RLIMIT_MEMLOCK soft resource limit 
       instead defines a limit on how much memory an unprivileged process  may 
       lock.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值