[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/운영체제

[운영체제] IPC

inu 2022. 1. 18. 13:43
반응형

IPC (Inter Process Communication)

  • Inter Process Communication의 약자로 운영체제에서 실행중인 프로세스 간에 정보를 주고받는 통신방법을 총칭하는 단어이다.
  • 프로세스는 독립적인 실행객체이기 때문에 자신에게 할당된 메모리 내의 정보에만 접근 권한을 가진다. 하지만 커널 공간은 서로 공유하며 사용하게 된다. 따라서 커널에서는 프로세스 간 통신을 위해 다양한 방법을 제공하게되고 프로세스들은 이를 통해 서로의 정보를 공유하게 된다.
  • IPC에도 다양한 방법들이 존재하는데 상황에 맞는 적절한 IPC 방법을 선택해야 한다. 잘못된 IPC 방법의 선택은 코딩과정을 어렵게하거나 프로그램 작동에 비효율을 초래할 수 있기 때문이다.
  • 다양한 IPC 방법과 그 특징을 살펴보자.

pipe (파이프)

  • 기본적인 익명 파이프는 단방향 통신이다.
  • 시스템콜 fork()를 통해 자식 프로세스를 만들면, 부모가 자식에게 단방향으로 통신하게 된다.
  • 부모/자식 프로세스 간에서만 사용가능하며 단방향 통신이라는 특징이 있다.

Example

char* msg = "Hello Child Process!"; 
int main() {
    char buf[255];
    int fd[2], pid, nbytes;
    if (pipe(fd) < 0) // pipe(fd)
        exit(1);
    pid = fork(); 
    if(pid>0) { 
        write(fd[1], msg, MSGSIZE); 
        exit(0); 
    }
    else { 
        nbytes = read(fd[0], buf, MSGSIZE); 
        printf("%d %s\n", nbytes, buf);
        exit(0);
    }
    return 0; 
}
  • pipe(fd)로 배열에 파이프를 생성하고 해당 주소값을 넘긴다.
  • fork를 통해 자식 프로세스와 부모 프로세스가 나뉘어진다.
  • 부모 프로세스는 자식 프로세스의 pid를, 자식 프로세스는 pid 0을 반환받는다.
  • 이에 따라 조건문이 나누어지고 부모 프로세스는 fd[1]에 필요한 데이터를 작성한다.
  • 자식 프로세스는 이를 fd[0]에서 읽어들인다.

Named Pipe (네임드 파이프)

  • named pipe는 부모 프로세스와 무관한 전혀 다른 모든 프로세스에서 사용이 가능하다.
  • 프로세스 통신을 위해 이름있는 파일을 사용한다.
  • 단방향 통신만 가능하다.

message queue (메시지 큐)

  • Queue이기 때문에 FIFO 정책으로 데이터를 전송한다. (먼저 넣은 데이터가 먼저 읽힌다.)
  • 부모/자식 프로세스 여부는 상관없으며, 양방향 통신이 가능하다.

Example

// A 프로세스
msqid = msgget(key, msgflg)
msgsnd(msqid, &sbuf, buf_length, IPC_NOWAIT)

// B 프로세스
msqid = msgget(key, msgflg)
msgrcv(msqid, &rbuf, MSGSZ, 1, 0)
  • key를 동잃하게 주어서 msqid를 받아오고 활용한다. (msgflg는 옵션)
  • msgsnd를 통해 메세지를 던지고 msgrcv를 통해 메세지를 받아온다.

shared memory(공유 메모리)

  • 커널 공간에 공유할 수 있는 메모리 공간을 만들고 해당 공간을 변수처럼 사용한다.
  • 공유메모리 key를 가지고 여러 프로세스가 접근할 수 있다.
  • 다른 IPC 방법에 비해 중개자가 필요없기 때문에 가장 빠르게 작동할 수 있다.
  • 비슷한 방법으로 memory map이 있는데, 이는 시스템이 전역적으로 공유하는 자원인 열린 파일을 메모리에 맵핑시켜서 공유하는 방식이다.

Example

// 1. 공유 메모리 생성 및 메모리 주소 얻기
shmid = shmget((key_t)1234, SIZE, IPC_CREAT|0666)) 
shmaddr = shmat(shmid, (void *)0, 0)

// 2. 공유 메모리에 데이터작성
strcpy((char *)shmaddr, "Linux Programming")

// 3. 공유 메모리에서 읽어오기
printf("%s\n", (char *)shmaddr)

signal (시그널)

  • 커널 혹은 프로세스에서 다른 프로세스에게 어떤 이벤트가 발생했는지 알려준다.
  • IPC만을 위한 기능은 아니지만 이를 활용해서도 프로세스 간 통신이 가능하다.
  • 프로세스 관련 코드를 시그널 핸들러로 등록하여 해당 시그널이 들어오면 해당 코드를 처리하도록 하는 것이다.

socket (소켓)

  • 소켓은 일반적으로 네트워크 프로그램 사이에서 데이터 입출력의 관문 혹은 그를 위한 운영체제 API의 이름으로 쓰인다.
  • 다른 네트워크로 보내지 않고 소켓을 생성한 두 프로세스가 같은 컴퓨터의 운영체제 상에서 실행중이라면 이를 통해 IPC가 가능해진다.
  • 하나의 컴퓨터에서의 IPC를 위한 유닉스 도메인 소켓이라는 것도 존재한다.

semaphore (세마포어)

  • Semaphore 은 프로세스간 데이터를 동기화하고 보호하는데 목적을 둔다.
  • Semaphore 도 결국 서로다른 프로세스간 통신을 함에 있어서 동기화 문제를 해결하기 위해 사용되기 때문에 IPC 중 하나로 취급한다.
반응형

'💻 CS > 운영체제' 카테고리의 다른 글

[운영체제] RAID  (0) 2020.06.12
[운영체제] 디스크 스케줄링  (0) 2020.06.10
[운영체제] 디스크 공간할당  (0) 2020.06.08
[운영체제] 파일시스템  (0) 2020.06.03
[운영체제] 쓰레싱 및 커널메모리  (0) 2020.06.01