티스토리 뷰
대표적인 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을 이용함으로 임의의 프로세스들 사이에서 통신할 수 있다.
- 메시지 단위로 송수신한다.
- 메시지마다 타입이 존재한다.
'cs > operating system' 카테고리의 다른 글
[운영체제/OS] 프로세스 간 통신(메시지 전송/공유 메모리 방식) (0) | 2021.04.17 |
---|---|
[운영체제/OS] 스레드 동기화 기법 뮤텍스(mutex)/세마포어(semaphore) (0) | 2021.04.16 |
[운영체제/OS] 임계 영역(critical section) (0) | 2021.04.02 |
[운영체제/OS] 결정성, 생산자/소비자 프로세스, 경쟁 조건 (0) | 2021.04.02 |
[운영체제/OS] 리눅스 프로세스 (0) | 2021.03.28 |