[转帖]大页内存的使用:大页内存分配与释放

内存,使用,分配,释放 · 浏览次数 : 0

小编点评

**函数声明** ```c void *malloc_huge_pages(size_t size); void free_huge_pages(void *ptr); ``` **函数原型** * `malloc_huge_pages(size_t size)`:接受一个大小的字节数,并返回指向所需内存的指针。 * `free_huge_pages(void *ptr)`:释放指向的内存,并将其大小设置为 `size`。 **使用** ```c #include <stdio.h>#include <assert.h> #include <stdlib.h> #include <string.h>#include <sys/mman.h> int main() { char *string = malloc_huge_pages(1024); if (string == NULL) { printf("error: malloc_huge_pages error."); } else { strcpy(string, "Hello World!\"); printf("string: %s\\", string); free_huge_pages(string); } return 0; } ``` **示例** 这段代码将创建一个大小为 1024 字节的字符串并将其赋值给 `string` 变量。然后,它使用 `free_huge_pages()` 函数释放该字符串的内存。 **注意** * `HUGE_PAGE_SIZE` 常量定义为 2uberge 1024 字节,这通常与 libhugetlbfs 库的配置相关。 * `ALIGN_TO_PAGE_SIZE()` 函数使用 `HUGE_PAGE_SIZE` 的倍数来调整内存地址。 * `mmap()` 函数允许对内存进行不可修改的访问,而 `munmap()` 函数允许对不可修改内存进行修改。

正文

目录

函数声明

函数原型与使用


函数声明

  1. void *malloc_huge_pages(size_t size);
  2. void free_huge_pages(void *ptr);

函数原型与使用

  1. #include <stdio.h>
  2. #include <assert.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <sys/mman.h>
  6. #define HUGE_PAGE_SIZE (2 * 1024 * 1024)
  7. #define ALIGN_TO_PAGE_SIZE(x) \
  8. (((x) + HUGE_PAGE_SIZE - 1) / HUGE_PAGE_SIZE * HUGE_PAGE_SIZE)
  9. void *malloc_huge_pages(size_t size)
  10. {
  11. // Use 1 extra page to store allocation metadata
  12. // (libhugetlbfs is more efficient in this regard)
  13. size_t real_size = ALIGN_TO_PAGE_SIZE(size + HUGE_PAGE_SIZE);
  14. char *ptr = (char *)mmap(NULL, real_size,
  15. PROT_READ | PROT_WRITE,
  16. MAP_PRIVATE | MAP_ANONYMOUS |
  17. MAP_POPULATE | MAP_HUGETLB, -1, 0);
  18. if (ptr == MAP_FAILED) {
  19. // The mmap() call failed. Try to malloc instead
  20. ptr = (char *)malloc(real_size);
  21. if (ptr == NULL)
  22. return NULL;
  23. real_size = 0;
  24. } // Save real_size since mmunmap() requires a size parameter
  25. *((size_t *)ptr) = real_size;
  26. // Skip the page with metadata
  27. return ptr + HUGE_PAGE_SIZE;
  28. }
  29. void free_huge_pages(void *ptr)
  30. {
  31. if (ptr == NULL)
  32. return;
  33. // Jump back to the page with metadata
  34. void *real_ptr = (char *)ptr - HUGE_PAGE_SIZE;
  35. // Read the original allocation size
  36. size_t real_size = *((size_t *)real_ptr);
  37. assert(real_size % HUGE_PAGE_SIZE == 0);
  38. if (real_size != 0)
  39. // The memory was allocated via mmap()
  40. // and must be deallocated via munmap()
  41. munmap(real_ptr, real_size);
  42. else
  43. // The memory was allocated via malloc()
  44. // and must be deallocated via free()
  45. free(real_ptr);
  46. }
  47. int main()
  48. {
  49. char *string = malloc_huge_pages(1024);
  50. if(string == NULL) {
  51. printf("error: malloc_huge_pages error.\n");
  52. }
  53. strcpy(string, "Hello World!");
  54. printf("string: %s\n", string);
  55. free_huge_pages(string);
  56. return 0;
  57. }

 

与[转帖]大页内存的使用:大页内存分配与释放相似的内容:

[转帖]大页内存的使用:大页内存分配与释放

目录 函数声明 函数原型与使用 函数声明 void *malloc_huge_pages(size_t size);void free_huge_pages(void *ptr); 函数原型与使用 #include #include #include

[转帖]配置大页内存实施方案

https://tool.4xseo.com/article/35670.html 如果系统性能稳定无异常,则不需要大的页面内存。HugePages_Free等于HugePages _ Total ... 展开 一、概述HugePages是通过使用大页内存来取代传统的4kb内存页面,使得管理虚拟地址

[转帖]内存配置+大页 HugePage

内存配置 例1:不加内存参数,模拟一个默认大小内存的客户机系统。 qemu-system-x86_64 /home/dudu/kvm/ubuntu14.04.img 在客户机中,可以通过两种常用的方式来查看内存信息,具体如下: free命令通常用来查看内存的使用情况,“-m”参数是指内存大小以MB为

[转帖]Oracle大页未正常使用导致大量SWAP案例分析

http://blog.itpub.net/30310891/viewspace-2927363/稀奇古怪的.. 故障背景 某次,用户反馈一套已经正常运行一段时间的 Oracle 11.2.0.4 RAC 数据库( 128G 物理内存),在调整 process 阈值之后, R AC 集群中其中一个节

[转帖]内存优化(开启内存大页vm.nr_hugepages)

大页内存(hugepages) 为优化内存管理引入了hugepages 可以自定义设置、将原来标准内存也4k设置为更大。 hugepages 优点: 使得Oracle SGA 不可交换; 减轻 TLB 的压力; 减少页表的开销; 减少页表查询的开销; 提升内存访问的整体性能; oracle建议设置h

[转帖]内存管理干货推荐:巨页HugePage

https://zhuanlan.zhihu.com/p/542132384 前言: 巨页的提出初衷是提供对内存使用量大的进程在某些场合下能拥有更好的性能的一种策略。巨页的定义有些含糊,按照最初提出patchset的人的意思,只要大于系统默认PAGE_SIZE的页,都可以称之为巨页。巨页从2.6发展

[转帖]透明大页(huge pages) ---Transparent HugePages

https://www.coonote.com/linux-note/transparent-hugepages.html 从RedHat 6, OEL 6, SLES 11 and UEK2 kernels 开始,系统缺省会启用 Transparent HugePages :用来提高内存管理的性能

[转帖]Linux 调优篇:虚拟化调优(hugepage 大页内存)* 叁

一. 大页(HugePages)概念 Hugepage的引入二. hugepages相关概念三.Regular Pages 与 HugePages a、Regular Pages b、Huge Pages四. hugepage 优点五.调优方法 5.1 在Host侧查看各个numa节点上的大页分配情

【转帖】Linux 调优篇:虚拟化调优(hugepage 大页内存)* 叁

一. 大页(HugePages)概念 Hugepage的引入二. hugepages相关概念三.Regular Pages 与 HugePages a、Regular Pages b、Huge Pages四. hugepage 优点五.调优方法 5.1 在Host侧查看各个numa节点上的大页分配情

[转帖]网络转发性能测试方法 ( l3fwd, ovs-dpdk )

https://aijishu.com/a/1060000000212215 1 简介 本文记录l3fwd和ovs-dpdk性能测试中用到的关键脚本。 2 测试拓扑 l3fwd测试拓扑 ovs-dpdk测试拓扑 3 测试步骤 设置大页内存 #set hugepage umount /dev/huge