我正在努力改进程序,以便在Linux而不是标准的4Kb页面中使用静态分配的大页面。我已经建立了一个具有静态大页面支持的系统,并在巨大的页面池中分配了大量的大页面(/ prov / sys / vm / nr_hugepages)。我现在希望通过该程序找到大型malloc()的位置,这样我就可以删除malloc()并将其替换为shmget / shmat,它将设置SHM_HUGETLB标志。
请记住,这是高度并发的计划。
我使用共享内存的目的不是以共享方式实际使用内存。我想保留malloc()例程的所有函数,同时只使用静态分配的大页面支持。
以下是我正在尝试完成的示例代码段。在程序达到这一点之前,它已经分解了许多进程。每个进程将同时执行此段代码。最初这段只包含以下代码:
if( !( PANEL->WORK = (void *)malloc( (size_t)(lwork) *
sizeof( double ) ) ) )
{
HPL_pabort( __LINE__, "HPL_pdpanel_init",
"Memory allocation failed" );
}
哪种方法正常。
现在我已将其修改为:
注意!!:我使用随机数作为密钥,因此每个进程都有一个随机密钥,用于标识它的独立内存分配。
int shmid1;
size_t dsize = (size_t)(lwork) * sizeof( double );
/*2097152 is 2MB or the huge page size, if memory request is less,
resort to standard malloc */
if( dsize < 2097152) {
if( !( PANEL->WORK = (void *)malloc(dsize) ) )
{
HPL_pabort( __LINE__, "HPL_pdpanel_init",
"Memory allocation failed" );
}
}
else {
/* Get random number to use as a key */
int randomData = open("/dev/random",O_RDONLY);
int random;
read(randomData, &random, sizeof(random));
close(randomData);
/* Get shared memory segment */
shmid1 = shmget(random, dsize, SHM_HUGETLB
| IPC_CREAT | SHM_R
| SHM_W);
if ( shmid1 < 0 ) {
perror("shmget");
exit(1);
}
printf("HugeTLB shmid: 0x%x\n", shmid1);
PANEL->WORK = (void *)shmat(shmid1, 0, 0);
}
每当我尝试从PANEL-> WORK时读取这个新实现,我都会遇到分段错误。在我真正开始深入研究为什么这是segfaulting之前,我不禁想知道我是否正确接近这一点。这是解决这个问题的最好方法吗?有没有人看到这种方法的错误?