在 linux 中为 IPC 创建大页面共享内存
Create huge page shared memory for IPC in linux
我在 linux 中有以下大页面创建源代码:
int iTotalByte = sizeof(datafeed)* ARRAYSIZE ;
conf = (datafeed*) mmap(0, iTotalByte , (PROT_READ | PROT_WRITE), MAP_PRIVATE|MAP_ANONYMOUS|MAP_POPULATE|MAP_HUGETLB , -1 , 0) ;
if(conf == MAP_FAILED)
{
printf(" mmap error ....\n") ;
exit( 0 ) ;
}
它运行良好,numastat -m
将看到大页面 table 应用程序创建了多少 MB。
以下是我创建用于IPC的共享内存的来源:
int shm_fd;
if((shm_fd = shm_open(THE_FILE, (O_CREAT | O_EXCL | O_RDWR),
(S_IREAD | S_IWRITE))) > 0 ) {
; /* We are the first instance */
}
else if((shm_fd = shm_open(THE_FILE, (O_CREAT | O_RDWR),
(S_IREAD | S_IWRITE))) < 0)
{
printf("Could not create shm object. %s\n", strerror(errno));
exit( 0 ) ;
}
int iTotalByte = sizeof(datafeed)*ARRAYSIZE ;
ftruncate(shm_fd, iTotalByte );
conf = (datafeed*) mmap(0, iTotalByte , (PROT_READ | PROT_WRITE), MAP_SHARED, shm_fd, 0) ;
if(conf == MAP_FAILED)
{
printf(" mmap error ....\n") ;
exit( 0 ) ;
}
此源码会创建一个共享内存THE_FILE
用于/dev/shm/
中的IPC,许多进程可以通过THE_FILE
共享内存进行IPC。
我想知道是否有一种方法可以将共享内存映射到
/dev/shm/ 并且同时是大页面?!表示我喜欢
这个hugepages内存用于进程间的IPC,
不仅用于同一进程中的线程。
编辑:
https://lwn.net/Articles/375098/
http://lxr.free-electrons.com/source/Documentation/vm/hugetlbpage.txt?v=2.6.32
让示例代码按预期工作。
https://lwn.net/Articles/374424/
https://lwn.net/Articles/375096/
https://lwn.net/Articles/376606/
https://lwn.net/Articles/378641/
https://lwn.net/Articles/379748/
对理解大页面也有很大帮助。
鉴于您已正确设置页面、页面大小等
sysctl vm.nr_hugepages=1024
检查它:
cat /proc/meminfo | grep Huge
AnonHugePages: 0 kB
HugePages_Total: 1024
HugePages_Free: 986
HugePages_Rsvd: 261
HugePages_Surp: 0
Hugepagesize: 2048 kB
把这样的东西放在你的 /etc/fstab
hugetlbfs /mnt/hugepages hugetlbfs gid=2000,uid=2000 0 0
然后使用 /mnt/hugepages 代替 /dev/shm,您将通过 2M 超级页面支持的共享内存执行 IPC。
我在 linux 中有以下大页面创建源代码:
int iTotalByte = sizeof(datafeed)* ARRAYSIZE ;
conf = (datafeed*) mmap(0, iTotalByte , (PROT_READ | PROT_WRITE), MAP_PRIVATE|MAP_ANONYMOUS|MAP_POPULATE|MAP_HUGETLB , -1 , 0) ;
if(conf == MAP_FAILED)
{
printf(" mmap error ....\n") ;
exit( 0 ) ;
}
它运行良好,numastat -m
将看到大页面 table 应用程序创建了多少 MB。
以下是我创建用于IPC的共享内存的来源:
int shm_fd;
if((shm_fd = shm_open(THE_FILE, (O_CREAT | O_EXCL | O_RDWR),
(S_IREAD | S_IWRITE))) > 0 ) {
; /* We are the first instance */
}
else if((shm_fd = shm_open(THE_FILE, (O_CREAT | O_RDWR),
(S_IREAD | S_IWRITE))) < 0)
{
printf("Could not create shm object. %s\n", strerror(errno));
exit( 0 ) ;
}
int iTotalByte = sizeof(datafeed)*ARRAYSIZE ;
ftruncate(shm_fd, iTotalByte );
conf = (datafeed*) mmap(0, iTotalByte , (PROT_READ | PROT_WRITE), MAP_SHARED, shm_fd, 0) ;
if(conf == MAP_FAILED)
{
printf(" mmap error ....\n") ;
exit( 0 ) ;
}
此源码会创建一个共享内存THE_FILE
用于/dev/shm/
中的IPC,许多进程可以通过THE_FILE
共享内存进行IPC。
我想知道是否有一种方法可以将共享内存映射到 /dev/shm/ 并且同时是大页面?!表示我喜欢 这个hugepages内存用于进程间的IPC, 不仅用于同一进程中的线程。
编辑:
https://lwn.net/Articles/375098/
http://lxr.free-electrons.com/source/Documentation/vm/hugetlbpage.txt?v=2.6.32
让示例代码按预期工作。
https://lwn.net/Articles/374424/
https://lwn.net/Articles/375096/
https://lwn.net/Articles/376606/
https://lwn.net/Articles/378641/
https://lwn.net/Articles/379748/
对理解大页面也有很大帮助。
鉴于您已正确设置页面、页面大小等
sysctl vm.nr_hugepages=1024
检查它:
cat /proc/meminfo | grep Huge
AnonHugePages: 0 kB
HugePages_Total: 1024
HugePages_Free: 986
HugePages_Rsvd: 261
HugePages_Surp: 0
Hugepagesize: 2048 kB
把这样的东西放在你的 /etc/fstab
hugetlbfs /mnt/hugepages hugetlbfs gid=2000,uid=2000 0 0
然后使用 /mnt/hugepages 代替 /dev/shm,您将通过 2M 超级页面支持的共享内存执行 IPC。