2017-04-15 80 views
0

我有一個關於共享內存和分段錯誤的問題。 我認爲可以使用大容量的內存。 當我檢查Shmmax時,我發現可以分配巨大的內存。如何使特定數組大小的共享內存?

下數據是$結果IPCS -lm

------共享內存限制--------段

最大數量= 4096

最大SEG大小(字節)= 18014398509465599

最大總共享存儲器(千字節)= 18014398442373116

分鐘SEG大小(字節)= 1

#include <stdio.h> 
#include <sys/shm.h> 
#include <sys/ipc.h> 
#include <sys/types.h> 
#include <stdlib.h> 
#include <unistd.h> 

#define ARRAY_SIZE 40000000 


int main(int argc, char *argv[]){ 

    int shmid; 
    void *shared_memory = (void *)0; 
    shmid = shmget((key_t)1234, sizeof(float), IPC_CREAT|0666); 
    if (shmid == -1) 
    { 
     perror("shmget failed : "); 
     exit(0); 
    } 

    shared_memory = (float *)shmat(shmid, NULL, 0); 
    if (shared_memory == (void *)-1) 
    { 
     perror("shmat failed : "); 
     exit(0); 
    } 

    static float *testx; 
    testx = (float *)shared_memory; 

    int k = 0; 
    for(k;k<400;k++){ 
     testx[k] = 1.12; 
    } 
    for(k;k<40000000;k++){ 
     testx[k] = 1.12; 
    } 
} 

程序可以循環具有規模的少量運行第一

的問題,然而,這是第二個循環與40000000大小

我應該怎麼修改才能運行此代碼的任何建議?

+2

您正在爲1浮點分配空間,但正在嘗試寫入40,000,000浮點數。 –

+0

要獲得共享內存段,請考慮在系統具有共享內存段時使用'shm_open','truncate'和'mmap'。這些設置起來要容易得多。 –

+0

歡迎來到堆棧溢出。 請注意,在這裏說'謝謝'的首選方式是通過 提高投票的好問題和有用的答案(一旦你有足夠的聲譽這樣做),並接受任何 問題最有用的答案,你問(這也給你一個小小的提升,以你的聲望 )。 請參閱[關於]頁面,以及[如何在此處提問 ?]和 [當有人回答我的 問題時,我該怎麼辦? ?](http://stackoverflow.com/help/someone-answers) –

回答

1

SEGFAULT的原因是你還沒有創建足夠的尺寸段shmget

您傳遞給shmget的參數的大小爲sizeof(float),這個參數剛好足以存儲1個浮點數。

你需要做的就是調用shmget的這樣 -

shmget((key_t)1234, sizeof(float)*40000000, IPC_CREAT|0666); 

然後你就可以正確地使用所有的內存。

400工作的較小循環的原因是因爲shmget創建了PAGE_SIZE倍數的分段。

所以,即使你通過sizeof(float),它分配ATLEAST 1頁這足以容納400輛彩車但不40000000.

我希望清除的混亂。

+0

感謝您的評論。但是,在這種情況下,在編輯代碼後,我遇到了由shmget函數導致的'shmid'問題。 – Gabriel722

+0

所以你從'shmget'得到-1? –

+0

爲了解決這個問題,我不得不編輯像shmget(IPC_PRIVATE,sizeof(float)* 40000000,...)這樣的shmget函數。我猜想輸入密鑰和內核管理方式之間存在一種技巧關係。 – Gabriel722