운영체제에서 shared memory 질문입니다.

조회수 898회

안녕하세요. 공룡책에서 나온 shared memory 의 개념이 자꾸 헷갈립니다...

producer 코드만 가져와봤습니다.

while (true) {
    while (counter == BUFFER_SIZE); // do nothing

    buffer[in] = next_produced;
    in = (in + 1) % BUFFER_SIZE;
    counter++;
}

shared memory에서 buffer[]에 들어가는 item 이 두 프로세스가 공유하면서 사용하는 변수인가요?

이게 저게 정확하지 않아서 헷갈립니다... buffer 안에 들어가는 게 정확히 뭔가요??

만약 저 말이 맞다면 buffer 의 item 만 사용하면 되는데 왜 예제에서 count 라는 공유변수를 따로 사용하는지 궁금합니다. 도와주세요ㅜㅜ

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • OS 위에서 동작하는 프로그램을 프로세스라 부르며, 이 프로세스들은 서로다른 메모리 공간을 갖습니다.

    각각의 프로세스에서 동일한 메모리 주소를 읽거나 쓰더라도 실제로는 다른 물리적 메모리 주소를 읽고 쓰는 것입니다.

    이는 OS 에서 메모리 주소를 가상화 하여서 서로 다른 프로세스간 충돌이 발생하지 않게 만들기 위해서 입니다. 이러한 기능을 가상 메모리, 페이지, 세그먼트 등으로 부르며, 프로그램에서 사용하는 메모리 주소와 실제 물리적 메모리 주소를 분리합니다.

    앞서 말씀드렸듯이 프로세스간 에는 메모리 공간이 다르기 때문에 메모리 접근을 통한 데이터 교환이 안됩니다. 만약 메모리 접근을 통해 프로세스간 데이터를 교환한다면, 속도도 빠르고 사용 방법도 쉬울 것입니다. 그렇기에 OS 는 IPC 중 하나인 공유 메모리를 제공합니다.

    즉, 공유 메모리는 서로 다른 프로세스간 메모리 접근을 통한 데이터 교환을 위해 사용됩니다.


    shared memory에서 buffer[]에 들어가는 item 이 두 프로세스가 공유하면서 사용하는 변수인가요?

    네, 공유 메모리는 두 프로세스가 공유하는 메모리이며, buffer 가 가리키는 주소가 공유 메모리 입니다.

    buffer[in] 으로 접근하면 공유 메모리에 접근하여 값을 쓰고 읽는 것이며, 이는 각각의 원소(item) 가 공유 메모리에 있다고 볼 수 있습니다.

    이게 저게 정확하지 않아서 헷갈립니다... buffer 안에 들어가는 게 정확히 뭔가요??

    올려 주신 코드만 으로는 buffer 에 무엇이 있는지 알수 없습니다. 하지만 공유 메모리 이기때문에 OS 에서 할당한 메모리 주소가 바인딩 되어 있겠죠.

    일반적으로 메모리를 할당 받기 위해서 아래와 같이 malloc() 을 사용합니다.

    int* buffer = (int*) malloc(BUFFER_SIZE  * sizeof(int));
    

    하지만 공유 메모리의 경우 각 OS 의 API 를 사용하여 메모리를 할당 받습니다.

    // Linux
    int id = shmget((key_t)1234, BUFFER_SIZE * sizeof(int), 0666 | IPC_CREAT);
    int* buffer = (int*) shmat(id, NULL, 0);
    

    만약 저 말이 맞다면 buffer 의 item 만 사용하면 되는데 왜 예제에서 count 라는 공유변수를 따로 사용하는지 궁금합니다. 도와주세요ㅜㅜ

    올려주신 코드만으로는 자세히 알 수는 없지만 할당된 공유 메모리의 크기를 넘어서지 않기 위해서 사용하는 것으로 보입니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)