目录

函数声明

函数原型与使用


函数声明

void *malloc_huge_pages(size_t size);
void free_huge_pages(void *ptr);

函数原型与使用

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h> #define HUGE_PAGE_SIZE (2 * 1024 * 1024) #define ALIGN_TO_PAGE_SIZE(x) \(((x) + HUGE_PAGE_SIZE - 1) / HUGE_PAGE_SIZE * HUGE_PAGE_SIZE) void *malloc_huge_pages(size_t size)
{ // Use 1 extra page to store allocation metadata // (libhugetlbfs is more efficient in this regard) size_t real_size = ALIGN_TO_PAGE_SIZE(size + HUGE_PAGE_SIZE); char *ptr = (char *)mmap(NULL, real_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_POPULATE | MAP_HUGETLB, -1, 0); if (ptr == MAP_FAILED) { // The mmap() call failed. Try to malloc instead ptr = (char *)malloc(real_size); if (ptr == NULL) return NULL; real_size = 0; } // Save real_size since mmunmap() requires a size parameter *((size_t *)ptr) = real_size; // Skip the page with metadata return ptr + HUGE_PAGE_SIZE;
}void free_huge_pages(void *ptr)
{ if (ptr == NULL) return; // Jump back to the page with metadata void *real_ptr = (char *)ptr - HUGE_PAGE_SIZE; // Read the original allocation size size_t real_size = *((size_t *)real_ptr); assert(real_size % HUGE_PAGE_SIZE == 0); if (real_size != 0) // The memory was allocated via mmap() // and must be deallocated via munmap() munmap(real_ptr, real_size); else // The memory was allocated via malloc() // and must be deallocated via free() free(real_ptr);
}int main()
{char *string = malloc_huge_pages(1024);   if(string == NULL) {printf("error: malloc_huge_pages error.\n");}strcpy(string, "Hello World!");printf("string: %s\n", string);free_huge_pages(string);return 0;
}

大页内存的使用:大页内存分配与释放相关推荐

  1. C++ 内存池介绍与经典内存池的实现

    代码编译运行环境:VS2012+Debug+Win32 文章目录 1.默认内存管理函数的不足 2.内存池简介 2.1 内存池的定义 2.2 内存池的优点 2.3 内存池的分类 3.经典的内存池技术 3 ...

  2. 大页内存与透明大页详解

    大页内存 大页内存(HugePages),有时也叫"大内存页"."内存大页"."标准大页".操作系统以内存页为单位管理内存,内存页的大小对系 ...

  3. 透明大页相关内核参数_Oracle关于内存参数及大页设置的相关概念和设置之hugepage概念和配置...

    一.概念: Oracle 数据库和 Linux 内存管理 系统中使用的内存越多,管理该内存所需的资源也就越多.对于 Linux 操作系统,通过 Linux kswapd 进程和页表内存结构(针对系统中 ...

  4. 内存虚拟化、内存复用、大页内存作用及详解

    内存虚拟化.内存复用.大页内存作用及详解 1. 内存虚拟化 2. 内存复用 2.1. 内存共享 2.2. 内存置换 2.3. 内存气泡 3. 大页内存 3.1. 大页内存原理 3.2. 大页内存配置 ...

  5. 文件服务器的内存要多少,文件服务器内存要多大

    文件服务器内存要多大 内容精选 换一换 Windows场景中,当把源端服务器迁移到华为云后,目的端服务器C盘的已用空间比对应源端服务器C盘的已用空间大至少1GB,而不是与源端服务器C盘的已用空间一致, ...

  6. C/C++中程序内存区域划分大总结

    此图来自http://www.blog.163.com/tao198352__4232/blog/static/8502064520105611157897/ 程序由代码和数据组成,其中代码存储在代码 ...

  7. 内存管理之虚拟页式分配

    分页内存分配和分段内存分配可以解决程序在内存中离散存放的问题,但是,这个两种方式都要求程序将整个装入内存.如果程序比内存大,那么分页和分段都无法解决这个问题.其实一个程序在短时间内的执行可能局限于某小 ...

  8. 操作系统内存管理——分区、页式、段式管理

    操作系统内存管理--分区.页式.段式管理 标签: 内存管理操作系统数据结构算法 2010-07-05 11:26 20805人阅读 评论(5) 收藏 举报 分类: 操作系统(4) 版权声明:本文为博主 ...

  9. 操作系统概念学习笔记 16 内存管理(二) 段页

    操作系统概念学习笔记 16 内存管理 (二) 分页(paging) 分页(paging)内存管理方案允许进程的物理地址空间可以使非连续的.分页避免了将不同大小的内存块匹配到交换空间上(前面叙述的内存管 ...

  10. 我是如何学习写一个操作系统(八):内存管理和段页机制

    前言 多进程和内存管理是紧密相连的两个模块,因为运行进程也就是从内存中取指执行,创建进程首先要将程序和数据装入内存.将用户原程序变成可在内存中执行的程序,而这就涉及到了内存管理. 内存的装入 绝对装入 ...

最新文章

  1. python表白程序-用Python做一个表白小姐姐的程序
  2. Beamer 目录分栏
  3. b站2020用户画像_B站2020年度动画大选来袭!论引战,还是要看B站!
  4. 国内开源社区软件 PHPWind 团队已解散
  5. python set函数排序_python set集合排序_Python Set集合
  6. SpringBoot使用Validation校验参数
  7. 期货术语-关于升、贴水,点价,洗船
  8. juqery addClass方法失效问题
  9. 移动设备管理(MDM)有哪些关键功能?
  10. statis关键字的使用
  11. l2范数求导_稀疏编码学习笔记(二)L2范数
  12. JAVAweb开发(一)javaweb概述
  13. multisim14晶振在哪里_石英晶振在multisim中哪里
  14. 微信官方提供的生成二维码接口得到的是当前公众号的二维码
  15. 【TWRP】TWRP Recovery中文介绍--安卓卡刷、救转工具
  16. 简明教程 | Docker篇 · 其二:Dockerfile的编写
  17. 【应用统计学】第一类/α/弃真错误与第二类/β/取伪错误的解释与举例
  18. 联想G480—win8.1安装Centos7双系统
  19. 的it生活_IT青春 | 认真生活,认真热爱
  20. 有vip的服务器获取客户端的ip地址

热门文章

  1. html关于计时的函数,关于JavaScript获取时间函数及实现倒计时
  2. Java线程类核心方法
  3. 李开复的 给创新工场求职者的一封信
  4. mysql 类型及其他
  5. FPGA开平方的实现
  6. echarts 水桶注水式柱状图
  7. mybatis 显示 sql日志
  8. SwipeRefreshLayout下拉刷新
  9. Android学习笔记——ProgressBarHandler
  10. 80端口未占用,apache无法启动解决办法