2017-04-15 5 views
0

공유 메모리 및 세그먼트 오류에 대한 질문이 있습니다. 거대한 크기의 메모리를 사용하는 것이 좋을 것이라고 생각했습니다. Shmmax를 선택했을 때, 나는 거대한 메모리가 할당 될 수 있음을 발견했다. 데이터에서특정 배열 크기로 공유 메모리를 만드는 방법은 무엇입니까?

는 $의 결과 IPCS -lm

------ 공유 메모리 제한 -------- 세그먼트

최대 수 = 4096

최대 SEG 크기 (킬로바이트) = 18,014,398,509,465,599

최대 총 공유 메모리 (킬로바이트) = 18,014,398,442,373,116

분 SEG 크기 (바이트) = 1

,451,515,
#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; 
    } 
} 

크기의 작은 금액을 가지고 루프의 첫 번째를 실행할 수있는 프로그램은

문제, 그러나입니다 40,000,000 크기

내가이 코드를 실행하기 위해 수정해야하는지 어떤 제안에 두 번째 루프 ?

+2

1 플로트의 공간을 할당했지만 40,000,000 개의 플로트에 쓰려고합니다. –

+0

공유 메모리 세그먼트를 얻으려면 시스템에있는 경우'shm_open','truncate' 및'mmap'을 사용하십시오. 이것들은 설정하는 것이 훨씬 쉽습니다. –

+0

스택 오버플로에 오신 것을 환영합니다. 여기서 '감사합니다'라고 말하면 가장 좋은 방법은 위의 좋은 질문과 유용한 답변 (충분한 답변을 얻으려면 명을 얻은 것임)이며, 질문에 대한 가장 유용한 답변을 수락하면됩니다. (이는 또한 평판에 대한 귀하의 에 약간의 도움이됩니다). [정보] 페이지 및 [질문은 어떻게합니까? 여기에 있습니까?] (http://stackoverflow.com/help/how-to-ask) 및 [내 질문에 대한 대답은 무엇을해야합니까? ?] (http://stackoverflow.com/help/someone-answers) –

답변

1

SEGFAULT의 이유는 shmget으로 충분한 크기 세그먼트를 만들지 않았기 때문입니다.

shmget에 전달 된 인수는 sizeof(float)이며 1 float을 저장할 수 있습니다.

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

그런 다음 올바르게 모든 메모리를 사용할 수 있습니다 - 당신이해야 할 일은

이런 식으로 호출하는 shmget입니다.

shmgetPAGE_SIZE의 배수 인 세그먼트를 생성하기 때문에 400의 작은 루프가 작동하는 이유가 있습니다. 당신이 sizeof(float)을 통과 할 때

그래서 심지어는 400 개 수레를 보유 할만큼 충분히했다이어야 한 페이지를 할당하지만 40000000.

나는 그 혼란을 지 웁니다 바랍니다.

+0

의견을 주셔서 감사합니다. 그러나이 경우에는 코드를 편집 한 후 shmget 함수로 인한 'shmid'를 가져 오는 데 문제가 있습니다. – Gabriel722

+0

그래서'shmget'에서 -1을 얻었습니까? –

+0

이 문제를 해결하기 위해 shmget (IPC_PRIVATE, sizeof (float) * 40000000 등)와 같은 shmget 함수를 편집해야했습니다. 나는 입력 키와 커널을 관리하는 메모리의 방식 사이에 속임수 관계가 있다고 생각한다. – Gabriel722