다양한 IPC 기법
1. file 사용
2. Message Queue
3. Shared Memory
4. Pipe
5. Signal
6. Semaphore
7. Socket
→ 프로세스 A와 B가 서로 통신할 필요가 있을 경우가 있어서 IPC 기법이 나왔다.
저장 매체를 접근 할 수 있기 때문에 파일을 통해서 데이터를 공유할 수 있다.
다만, 파일에 프로세스 A 가 뭔가를 사용했을 때 프로세스 B가 알아차릴 수 있는 방법이 없다.
그래서 커널 공간이 물리 메모리에 특정한 주소를 공유 할 수 있다.
각 페이지 테이블에 커널 공간에 해당하는 주소를 둘 다 동일한 위치를 가리키도록 써 놓으면
결과적으로 가상메모리로는 공유가 안되는 것 처럼 보이지만 실제 메모리상으로 공유 가능하다.
커널 공간이 공유되어서 다양한 IPC 기법이 나왔다.
1. pipe(파이프)
- 기본 파이프는 단방향 통신(반드시 부모 프로세스에서 자식 프로세스로 데이터를 보낼 수만 있음)
- fork() 로 자식 프로세스 만들었을 때, 부모와 자신간의 통신
- 파이프 코드 예제
10번째 줄. fd 변수를 배열로 2개 만듬.
11번째 줄. pipe 시스템콜을 써서 2개의 배열을 인자로. pipe 를 커널 영역에 생성
→ 1 이 나오면 파이프가 생성되지 않은 것임.
13번째 줄. fork하면 자식 프로세스에는 pid 0 , 부모 프로세스 pid는 0보다 크다는 것이므로
14~18는 부모프로세스
16번째 줄. write 라는 시스템콜을 사용. fd[1]사용. 부모프로세스이기때문에 write 함수만 가능
21번째 줄. read 시스템콜 사용. 부모프로세스의 write와 동일한 커널영역에 들어가서 buf 에 넣어줌
22번째 줄. 자식 프로세스임에도 "Hello Child Process!" 가 출력된다.
2. message queue(메시지 큐)
- 큐닌까 기본은 FIFO 정책으로 데이터 전송
- 메시지 큐 코드 예제
→ key 값은 구분되는 정수 값 , msgflg은 메시지 큐를 생성할 때 옵션
→ msgflg 설정
- IPC_CREAT : 새로운 키면 식별자를 새로 생성, IPC_CREAT|접근 권한
→ msgsnd 설정 : 블록모드(o)
→ 메시지를 받을때는 아이디를 똑같이 써야한다.
3. IPC 기법과 커널 모드
pipe, message queue 는 모두 kernel 공간의 메모리를 사용한다.
ipcs 명령어
→ 현재 커널 공간에 생성되어 있는 message queue, 공유 메모리, Semaphore 정보를 확인 할 수 있다.
msgctl 명령어
→ 해당 메시지 큐를 커널 영역에서 삭제하는 명령
4. shared memory(공유 메모리)
- 노골적으로 kernel space에 공유공간을 만들고 해당 공간을 변수처럼 쓰는 방식
- message queue처럼 FIFO방식이 아니라 해당 메모리 주소를 마치 변수처럼 접근하는 방식
- 공유메모리 key를 가지고, 여러 프로세스가 접근 가능
- 공유 메모리 코드 예제
1. 공유 메모리 생성
2. 공유메모리 연결
3. 공유메모리 해제
- 공유 메모리 읽기 / 쓰기
4. 공유메모리에서 읽기
5. 공유메모리에 쓰기
정리
1. 주요 IPC 기법
- pipe
- message queue
- shared memoey
2. 모두 커널 공간을 활용해서 프로세스간 데이터 공유
제로베이스 컴퓨터 공학 전공자 따라잡기 강의 정리한 내용입니다.
'CS > 시스템 프로그래밍' 카테고리의 다른 글
쉘 스크립트 (0) | 2022.03.03 |
---|---|
시그널(Signal) (0) | 2022.03.03 |
프로세스 종료(exit) (0) | 2022.03.02 |
프로세스 생성(copy on write) (0) | 2022.03.02 |
프로세스 생성(wait) (0) | 2022.03.02 |