内存控制篇calloc free getpagesize malloc mmap munmap

calloc(配置内存空间)
相关函数
malloc,free,realloc,brk
表头文件
#include <stdlib.h>
定义函数
void *calloc(size_t nmemb,size_t size);
函数说明
calloc()用来配置nmemb个相邻的内存单位,每一单位的大小为size,并返回指向第一个元素的指针。这和使用下列的方式效果相同:malloc(nmemb*size);不过,在利用calloc()配置内存时会将内存内容初始化为0。
返回值
若配置成功则返回一指针,失败则返回NULL。
范例
/* 动态配置10个struct test 空间*/
#include<stdlib.h>
struct test
{
int a[10];
char b[20];
}
main()
{
struct test *ptr=calloc(sizeof(struct test),10);
}
 

free(释放原先配置的内存)
相关函数
malloc,calloc,realloc,brk
表头文件
#include<stdlib.h>
定义函数
void free(void *ptr);
函数说明
参数ptr为指向先前由malloc()、calloc()或realloc()所返回的内存指针。调用free()后ptr所指的内存空间便会被收回。 假若参数ptr所指的内存空间已被收回或是未知的内存地址,则调用free()可能会有无法预期的情况发生。若参数ptr为NULL,则free()不会 有任何作用。
 

getpagesize(取得内存分页大小)
相关函数
sbrk
表头文件
#include<unistd.h>
定义函数
size_t getpagesize(void);
函数说明
返回一分页的大小,单位为字节(byte)。此为系统的分页大小,不一定会和硬件分页大小相同。
返回值
内存分页大小。附加说明在Intel x86 上其返回值应为4096bytes。
范例
#include <unistd.h>
main()
{
printf(“page size = %d\n”,getpagesize( ) );
}
 

malloc(配置内存空间)
相关函数
calloc,free,realloc,brk
表头文件
#include<stdlib.h>
定义函数
void * malloc(size_t size);
函数说明
malloc()用来配置内存空间,其大小由指定的size决定。
返回值
若配置成功则返回一指针,失败则返回NULL。
范例
void p = malloc(1024); /*配置1k的内存*/
 

mmap(建立内存映射)
相关函数
munmap,open
表头文件
#include <unistd.h>
#include <sys/mman.h>
定义函数
void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize);
函数说明
mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内容的读写。参数start指向欲对应的内存起始地址,通常设为NULL,代表让系统自动选定地址,对应成功后该地址会返回。参数length代表将文件中多大的部分对应到内存。
参数
prot代表映射区域的保护方式有下列组合
PROT_EXEC 映射区域可被执行
PROT_READ 映射区域可被读取
PROT_WRITE 映射区域可被写入
PROT_NONE 映射区域不能存取
参数
flags会影响映射区域的各种特性
MAP_FIXED 如果参数start所指的地址无法成功建立映射时,则放弃映射,不对地址做修正。通常不鼓励用此旗标。
MAP_SHARED对映射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享。
MAP_PRIVATE 对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回原来的文件内容。
MAP_ANONYMOUS建立匿名映射。此时会忽略参数fd,不涉及文件,而且映射区域无法和其他进程共享。
MAP_DENYWRITE只允许对映射区域的写入操作,其他对文件直接写入的操作将会被拒绝。
MAP_LOCKED 将映射区域锁定住,这表示该区域不会被置换(swap)。
在调用mmap()时必须要指定MAP_SHARED 或MAP_PRIVATE。参数fd为open()返回的文件描述词,代表欲映射到内存的文件。参数offset为文件映射的偏移量,通常设置为0,代表 从文件最前方开始对应,offset必须是分页大小的整数倍。
返回值
若映射成功则返回映射区的内存起始地址,否则返回MAP_FAILED(-1),错误原因存于errno 中。
错误代码
EBADF 参数fd 不是有效的文件描述词
EACCES 存取权限有误。如果是MAP_PRIVATE 情况下文件必须可读,使用MAP_SHARED则要有PROT_WRITE以及该文件要能写入。
EINVAL 参数start、length 或offset有一个不合法。
EAGAIN 文件被锁住,或是有太多内存被锁住。
ENOMEM 内存不足。
范例
/* 利用mmap()来读取/etc/passwd 文件内容*/
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/mman.h>
main()
{
int fd;
void *start;
struct stat sb;
fd=open(“/etc/passwd”,O_RDONLY); /*打开/etc/passwd*/
fstat(fd,&sb); /*取得文件大小*/
start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);
if(start= = MAP_FAILED) /*判断是否映射成功*/
return;
printf(“%s”,start);
munma(start,sb.st_size); /*解除映射*/
closed(fd);
}
执行
root : x : 0 : root : /root : /bin/bash
bin : x : 1 : 1 : bin : /bin :
daemon : x : 2 : 2 :daemon : /sbin
adm : x : 3 : 4 : adm : /var/adm :
lp : x :4 :7 : lp : /var/spool/lpd :
sync : x : 5 : 0 : sync : /sbin : bin/sync :
shutdown : x : 6 : 0 : shutdown : /sbin : /sbin/shutdown
halt : x : 7 : 0 : halt : /sbin : /sbin/halt
mail : x : 8 : 12 : mail : /var/spool/mail :
news : x :9 :13 : news : /var/spool/news :
uucp : x :10 :14 : uucp : /var/spool/uucp :
operator : x : 11 : 0 :operator : /root:
games : x : 12 :100 : games :/usr/games:
gopher : x : 13 : 30 : gopher : /usr/lib/gopher-data:
ftp : x : 14 : 50 : FTP User : /home/ftp:
nobody : x :99: 99: Nobody : /:
xfs :x :100 :101 : X Font Server : /etc/xll/fs : /bin/false
gdm : x : 42 :42 : : /home/gdm: /bin/bash
kids : x : 500 :500 :/home/kids : /bin/bash
 

munmap(解除内存映射)
相关函数
mmap
表头文件
#include<unistd.h>
#include<sys/mman.h>
定义函数
int munmap(void *start,size_t length);
函数说明
munmap()用来取消参数start所指的映射内存起始地址,参数length则是欲取消的内存大小。当进程结束或利用exec相关函数来执行其他程序时,映射内存会自动解除,但关闭对应的文件描述词时不会解除映射。
返回值
如果解除映射成功则返回0,否则返回-1,错误原因存于errno中错误代码EINVAL
参数
start或length 不合法。
范例
参考mmap()
时间: 2024-12-22 18:03:07

内存控制篇calloc free getpagesize malloc mmap munmap的相关文章

Linux常用C函数---内存控制篇

函数讲解部分参考http://net.pku.edu.cn/~yhf/linux_c/ calloc(配置内存空间) 相关函数 malloc,free,realloc,brk 表头文件 #include <stdlib.h> 定义函数 void *calloc(size_t nmemb,size_t size); 函数说明 calloc()用来配置nmemb个相邻的内存单位,每一单位的大小为size,并返回指向第一个元素的指针.这和使用下列的方式效果相同:malloc(nmemb*size);

【原创】(十三)Linux内存管理之vma/malloc/mmap

背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本:4.14 ARM64处理器,Contex-A53,双核 使用工具:Source Insight 3.5, Visio 1. 概述 这篇文章,让我们来看看用户态进程的地址空间情况,主要会包括以下: vma; malloc; mmap; 进程地址空间中,我们常见的代码段,数据段,bss段等,实际上都是一

【C/C++学院】0724-堆栈简介/静态区/内存完成篇/多线程

[送给在路上的程序员] 对于一个开发者而言,能够胜任系统中任意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并可以运用到系统中,由此简化系统的开发,是其架构生涯的第一步. 对于一个开发团队而言,能在短期内开发出用户满意的软件系统是起核心竞争力的体现. 每一个程序员都不能固步自封,要多接触新的行业,新的技术领域,突破自我. 堆栈简介.内存完成篇 Const是一个伪常量 #include<stdio.h> #include<stdlib.h> #define

nginx——内存池篇

nginx--内存池篇 一.内存池概述 内存池是在真正使用内存之前,预先申请分配一定数量的.大小相等(一般情况下)的内存块留作备用.当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存. 内存池的好处有减少向系统申请和释放内存的时间开销,解决内存频繁分配产生的碎片,提示程序性能,减少程序员在编写代码中对内存的关注等 一些常见的内存池实现方案有STL中的内存分配区,boost中的object_pool,nginx中的ngx_pool_t,google的开源项目TCMal

C/C++ 使用mmap/munmap函数分配内存

在C/C++ 中常用的内存分配和管理的方式有很多,如智能指针, STL容器, new/delete, malloc/free, brk, sbrk等等,最近研究了一下Unix比较底层的一种内存管理方式mmap/munmap,需要完全自己来维护分配的虚拟内存,没有任何其他辅助的数据结构来帮助维护内存空间. 一.在终端里输入 man mmap 可以查看此函数的API文档,此函数的具体描述如下: void *mmap(void *start,size_t length,int prot,int fla

深入浅出NodeJS——内存控制

基于无阻塞.事件驱动建立的Node服务,具有内存消耗低的优点,非常适合处理海量的网络请求. V8的垃圾回收机制与内存限制 Javascript和Java类似,由垃圾回收机制来进行自动内存管理,而Node是构建在V8虚拟机基础上,所以其内存回收和V8运行机制息息相关. V8的内存限制:64位系统约为1.4GB.32位系统约为0.7GB process.memoryUsage(),返回值包括heapTotal代表已申请到的堆内存,heapUsed当前使用的内存,rss(resident set si

Oracle内存管理理论篇二

目标 了解oracle内存管理方式 掌握ASMM管理方式 掌握AMM管理方式 监控内存使用 学习一个知识点时,最好先了解其历史.ORACLE近期的版本都对内存管理做了简化,从9i通过PGA_AGGREGATE_TARGET参数实现PGA的自动管理,10g通过Automatic Shared Memory Management(ASMM)实现SGA的自动管理,到11g通过Automatic Memory Management(AMM)实现内存(SGA+PGA)的自动管理.目前的11G版本,DBA只

RabbitMQ 内存控制 硬盘控制

一.内存控制: vm_memory_high_watermark 该值为内存阈值,默认为0.4.意思为物理内存的40%.40%的内存并不是内存的最大的限制,它是一个发布的节制,当达到40%时Erlang会做GC.最坏的情况是使用内存80%.如果把该值配置为0,将关闭所有的publishing . rabbitmqctl set_vm_memory_high_watermark 0 Paging 内存阈值,该值为默认为0.5,该值为vm_memory_high_watermark的20%时,将把内

【读书笔记】《深入浅出nodejs》第五章 内存控制

海量请求+长时间运行 -> 内存控制 -> 一切资源高效循环利用 1. V8的垃圾回收机制与内存限制 在Node中通过JavaScript使用内存时,只能使用部分内存(64位系统下约1.4GB,32位系统下约为0.7GB). 在V8中,所有的JavaScript对象都是通过堆来进行分配的,当申请的堆空闲内存不够分配新的对象,将继续申请堆内存,直到堆得大小超过V8的限制为止. 为什么V8要限制堆得大小? -> (1)V8最初为浏览器设计,不太可能遇到用大量内存的场景. -> (2)V