OS/IPC

[OS] IPC - Shared Memory

동누크 2022. 12. 26. 16:04

Process

  • 컴퓨터에서 실행되고 있는 프로그램
  • 실행되고 있는 프로그램의 인스턴스
  • 프로세스간 독립적
  • CPU로부터 메모리 할당

Thread

  • 프로세스 내에서 실행되는 흐름의 단위
  • 프로세스가 할당받은 자원을 이용
  • 같은 메모리 공간 공유

IPC

  • 프로세스는 독립적으로 실행되기 때문에 메모리를 공유할 수 없다.
  • 따라서 프로세스간 통신을 통해 서로 데이터를 주고 받을 수 있게 해야한다.
  • 방법은 다음과 같다.

1) Message Passing

  • 커널을 통해 메시지를 전달
  • 안전하지만 성능이 떨어짐 (Overhead가 큼)
  • 예제

2) Shared Memory

  • 프로세스간 공유된 메모리를 생성 후 이용
  • 성능이 좋지만 동기화 문제 발생 가능
#include <sys/shm.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
  int shmid;
  int pid;
  
  int * cal_num;
  void * shared_memory = (void *) 0;
  
  // 공유 메모리 공간 생성
  shmid = shmget((key_t) 1234, sizeof(int), 0666|IPC_CREAT);
  
  // shmget() 실패 시 -1 return
  if (shmid == -1) {
    perror("shmget failed : "); // 오류 메시지 출력
    exit(0);
  }
  
  printf("shmid return value : %d\n", shmid);
  
  // 공유 메모리를 사용하기 위해 프로세스 메모리 부착
  shared_memory = shmat(shmid, (void *)0, 0);
  if (shared_memory == (void *) -1) {
    perror("shmat failed : ");
    exit(0);
  }
  
  cal_num = (int *) shared_memory;
  // 자식 프로셋스 생성
  pid = fork();
  
  if (pid == 0) {
    // 자식 프로세스
    shmid = shmget((key_t) 1234, sizeof(int), 0);
    
    if (shmid == -1) {
      perror("shmget failed : "); // 오류 메시지 출력
      exit(0);
    }
    shared_memory = shmat(shmid, (void *) 0,  0666|IPC_CREAT);
    if (shared_memory == (void *)-1) {
      perror("shmat failed : ");
      exit(0);
    }
    cal_num = (int *) shared_memory;
    *cal_num = 1;
    
    while(1) {
      *cal_num = *cal_num + 1;
      printf("child %d\n", *cal_num);
      sleep(1);
    }
  } else if (pid>0) {
    // 부모 프로세스
    while(1) {
      sleep(1);
      printf("*cal_num : %d\n", *cal_num);
    }
  }
}

int shmget(key_t , key, size_t size, int flags)

- #include  에 포함
- 새 공유 메모리 세그먼트를 생성하거나 키를 찾는데 사용
- 0666 | IPC_CREAT
0666 : Linux에서 일반적인 엑세스 권한, 메모리 세그먼트 권한 지시
IPC_CREAT : 공유 메모리에 대한 새 메모리 세그먼트를 만들도록 지시
- 참고 : [What is the use of IPC_CREAT | 0666 Flag in shmget()?](https://stackoverflow.com/questions/40380327/what-is-the-use-of-ipc-creat-0666-flag-in-shmget-function-in-c) - Stackoverflow

void shmat(int id, const void addr, int flags)

- #include <sys/shm.h> 에 포함
- 공유 메모리 세그먼트를 프로세스에 연결하는데 사용 ⇒ 메모리 내용에 엑세스 가능

fork()

- 자식 프로세스 생성

 

 

'OS > IPC' 카테고리의 다른 글

[OS] Signaling  (0) 2022.12.26
[OS] IPC - Message Passing  (0) 2022.12.26