将malloc()转换为具有多个进程的SYS V共享内存

时间:2012-08-05 21:33:31

标签: c linux malloc shared-memory huge-pages

我正在努力改进程序,以便在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之前,我不禁想知道我是否正确接近这一点。这是解决这个问题的最好方法吗?有没有人看到这种方法的错误?

0 个答案:

没有答案