2012-02-02 33 views
0

我正在嘗試madvise()將分配的內存標記爲可合併,以便具有相同頁面的兩個應用程序可以合併。madvise()函數不工作

在使用madvise()函數時,它顯示「無效參數」。

#include<stdio.h> 
#include<sys/mman.h> 
#include<stdlib.h> 
#include<errno.h> 
#define ADDR 0xf900f000 
int main() 
{ 
     int *var1=NULL,*var2=NULL; 
     size_t size=0; 

     size = 1000*sizeof(int); 

     var1 = (int*)malloc(size); 
     var2 = (int *)malloc(size); 


     int i=0; 

     for(i=0;i<999;i++) 
     { 
       var1[i] = 1; 
     } 

     for(i=0;i<999;i++) 
     { 
       var2[i] = 1; 
     } 

     i = -1; 

     while(i<0) 
     { 
       i = madvise((void *)var1, size, MADV_MERGEABLE);  //to declare mergeable 

       printf("%d %p\n", i, var1);  //to print the output value 
       err(1,NULL);   //to print the generated error 

       i = madvise((void *)var2, size, MADV_MERGEABLE);  //to declare mergeable 
       printf("%d\n", i); 
     } 

     return 0; 
} 

錯誤:

a.out: Invalid argument 

請幫助我。

謝謝。

回答

1

您只能合併整個頁面。你不能合併任意的數據塊。

+0

感謝您的回覆。 這裏我不想合併頁面,而我試圖將內存塊聲明爲可合併。 通過聲明它可合併,我的意思是如果可能的話,相應的頁面可以與其他頁面合併。 – pratick 2012-02-03 08:38:16

+1

那麼,你有系統的答案。不,不可能合併任意大小的,任意排列的數據塊。 – 2012-02-03 19:56:45

+0

將您的變量和madvise地址與頁面大小的粒度對齊。 – fche 2017-07-11 14:38:14