반응형
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 |