[운영체제] 프로세스 구조 - (5)

Yeongsan Son·2021년 6월 30일
0
post-custom-banner

IPC 기법 중 파이프, 메시지큐, 공유메모리 기법을 알아보자.

IPC

Pipe

  • 기본 파이프는 단방향 통신
  • fork()로 자식 프로세스를 생성했을 때, 부모와 자식간의 통신

파이프 코드 예제

char* msg = "Hello Child Process!";
int main()
{
  char buf[255];
  int fd[2], pid, nbytes;
  if (pip(fd) < 0) // pipe(fd)로 파이프 생성
    exit(1);
  pid = fork(); // 함수 실행 다음 코드부터 부모/자식 프로세스로 나뉨
  if (pid > 0) { // 부모 프로세스는 pid에 실제 프로세스 ID가 들어감
    wrtie(fd[1], msg, MSGSIZE); //fd[1]
    exit(0);
  }
  else { // 자식 프로세스는 pid가 0이 들어감
    nbytes = read(fd[0], buf, MSGSIZE); // fd[0]으로 읽음
    exit(0);
  }
  return 0;
}
  • pid: process ID
    • 부모 프로세스는 정수형 ID
    • 자식 프로세스는 ID가 0
  • fork(): 새로운 프로세스를 생성하는 시스템콜 함수
    • 부모 프로세스를 복사해 자식 프로세스를 생성
  • pipe(fd): 파이프가 정상적으로 생성되면 특정한 주소값을 2개 반환
    • fd(1)과 fd(0)
  • msg: 데이터
  • MSGSIZE: 데이터 크기

Message Queue

  • 큐는 기본적으로 FIFO 로직으로 데이터를 전송

메시지큐 코드 예

  • A 프로세스
msqid = msgget(key, msglfg)
msgsnd(msqid, &sbuf, buf_length, IPC_NOWWAIT)
  • B 프로세스
msqid = msgget(key, msgflg)
msgrcv(msqid, &rbuf, MSGSZ,  1, 0)
  • A 프로세스에서 B 프로세스로 데이터 전달
    • sbuf => rbuf

파이프와 메시지 큐의 차이

  • 메시지 큐는 부모/자식 관계가 아니라, 어느 프로세스간에 데이터 통신 가능
  • FIFO 로직으로 먼저 들어간 데이터가 먼저 읽힌다.
  • 단방향 소통이냐 양방향 소통이냐
    • 메시지큐에서 양방향 소통시 큐를 하나 더 생성

파이프와 메시지 큐의 공통점

  • 파이프와 메시지큐는 모두 커널 공간의 메모리를 사용
    • 메모리 공간도 커널과 유저로 구분

Shared Memory

  • kernel space에 메모리 공간을 만들고, 해당 공간을 변수처럼 사용
  • 메시지 큐처럼 FIFO 로직이 아니라, 해당 메모리 주소를 변수처럼 접근하는 방식
  • 공유 메모리 key를 가지고, 여러 프로세스가 접근 가능

공유 메모리 코드 예제

  • 공유 메모리 생성 및 공유 메모리 주소 얻기
    • shmid: 특별한 키 값을 가지고 공유 메모리 공간을 만듬
    • shmaddr: 메모리 공간에 대한 주소를 가지고 옴
shmid = shmget((key_t)1234, SIZE, IPC_CREAT | 0666))
shmaddr = shmat(shmid, (void *)0, 0)
  • 공유 메모리에 쓰기
    • 해당 주소 값에 데이터를 쓰기
strcpy((char *)shmaddr, "Linux Programming")
  • 공유 메모리에서 읽기
printf("%s\n", (char *)shmaddr)

정리

  • 파이프, 메시지큐,공유메모리 모두 커널 공간을 활용해 프로세스간 데이터를 공유함
profile
매몰되지 않는 개발자가 되자
post-custom-banner

0개의 댓글