在Linux中为IPC创建巨大的页面共享内存

6yt4nkrj  于 2022-11-22  发布在  Linux
关注(0)|答案(1)|浏览(142)

我有以下巨大的页面创建源代码在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将看到应用程序创建了多少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。
我想知道是否存在一种方法,我可以mmap共享内存到/dev/shm/,同时它是巨大的页面?!意味着我喜欢这个巨大的页面内存用于进程之间的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/
也对理解大页面有很大帮助。

t8e9dugd

t8e9dugd1#

假设你已经做了正确的事情设置页面,页面大小等。

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。

相关问题