티스토리 뷰

728x90

대표적인 IPC 및 동기화 기법

1) 파이프(pipe) --- 운영체제 영역 이용

2) 메시지 큐(message queue) --- 운영체제 영역 이용

3) 공유 메모리(shared memory) --- 사용자 영역 이용

4) 세마포어(semaphore) --- 동기화 기법

 

기본적인 IPC 과정

① 공유 메모리 확보

 공유 메모리 접근

공유 메모리 반납

 

 

1-1) 이름 없는 파이프 (unnamed pipe)

공유 메모리 확보

- 파일 디스크립터 번호를 저장하기 위한 정수형 배열 변수 선언한다. (int pipefd[2];)

- pipe() 함수를 사용하여 커널 영역에 파이프 채널을 생성한다. (pipe(pipefd);)

- fork() 함수를 사용하여 자식 프로세스를 생성한다.

공유 메모리 사용

- read() 함수를 사용하여 파이프 채널에서 읽기 한다. (read(pipefd[0], buf, 256);)

- write() 함수를 사용하여 파이프 채널에 쓰기 한다. (write(pipefd[1], buf, 256);)

공유 메모리 반납

- 부모 프로세스가 종료될 때 반납된다.

 

- 공유 메모리가 커널 영역에 존재하므로 동기화가 필요하지 않다.

- 제어의 흐름이 간결하다.

- 무제한 크기의 메시지 전송이 가능하다.

- 부모-자식 프로세스 간에만 가능하다.

- 채널이 영구적이지 못하다.

 

 

1-2) 이름 있는 파이프 (named pipe)

공유 메모리 확보

- mkfifo() 함수를 사용하여 FIFO 파일을 생성한다. (mkfifo(“fifo”, 0666);)

공유 메모리 사용

- open() 함수를 사용하여 FIFO 파일을 읽기/쓰기용으로 연다. (fd = open(“fifo’, O_RONLY);)

- read() 함수를 사용하여 FIFO 파일을 읽기 한다. (read(fd, buf, 256);)

- write() 함수를 사용하여 FIFO 파일에 쓰기 한다. (write(fd, buf, 256);)

공유 메모리 반납

- unlink() 함수를 사용하여 FIFO 파일을 삭제한다. (unlink(“fifo”);)

 

- 공유 메모리가 커널 영역에 존재하므로 동기화가 필요하지 않다.

- 파이프 채널에 이름을 부여한 것이다. (FIFO 파일)

- 파일명을 이용하기 때문에 임의의 프로세스들 사이에서 사용할 수 있다.

- 파일이 삭제되기 전까지 영구적이다.

 

 

2) 메시지 큐 : msgget()

 공유 메모리 확보 : msgget()

 공유 메모리 사용 : msgsnd(), msgrcv()

 공유 메모리 반납 : msgctl()

 

- 커널 영역에 메시지 큐를 생성하므로 동기화가 필요하지 않다.

- 메시지 큐 ID을 이용함으로 임의의 프로세스들 사이에서 통신할 수 있다.

- 메시지 단위로 송수신한다.

- 메시지마다 타입이 존재한다.

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함