꾸준하게 기록하기
article thumbnail
Published 2022. 3. 3. 12:13
IPC기법 CS/시스템 프로그래밍

 

다양한 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 정책으로 데이터 전송

 

- 메시지 큐 코드 예제 

msgget() 함수로 메시지 큐 생성

key 값은 구분되는 정수 값 , msgflg은 메시지 큐를 생성할 때 옵션

→ msgflg 설정 

   - IPC_CREAT : 새로운 키면 식별자를 새로 생성,  IPC_CREAT|접근 권한

 

msgsnd 라닌 시스템 콜 사용해 메시지 큐 보냄

→ msgsnd 설정 : 블록모드(o)

→ 메시지를 받을때는 아이디를 똑같이 써야한다.

 

3. IPC 기법과 커널 모드 

pipe, message queue 는 모두 kernel 공간의 메모리를 사용한다.

 

ipcs 명령어

 현재 커널 공간에 생성되어 있는 message queue, 공유 메모리, Semaphore 정보를 확인 할 수 있다. 

msgctl 명령어

→ 해당 메시지 큐를 커널 영역에서 삭제하는 명령

 

4. shared memory(공유 메모리)

- 노골적으로 kernel space에 공유공간을 만들고 해당 공간을 변수처럼 쓰는 방식

- message queue처럼 FIFO방식이 아니라 해당 메모리 주소를 마치 변수처럼 접근하는 방식

- 공유메모리 key를 가지고, 여러 프로세스가 접근 가능

- 공유 메모리 코드 예제 

 

1. 공유 메모리 생성

shmget : 공유 메모리를 생성하는 시스템 콜

2. 공유메모리 연결

3. 공유메모리 해제

 

- 공유 메모리 읽기 / 쓰기 

 

4. 공유메모리에서 읽기

5. 공유메모리에 쓰기

 


정리 

1. 주요 IPC 기법

 - pipe

 - message queue

 - shared memoey

 

2. 모두 커널 공간을 활용해서 프로세스간 데이터 공유

 

 

 

제로베이스 컴퓨터 공학 전공자 따라잡기 강의 정리한 내용입니다.
728x90

'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
profile

꾸준하게 기록하기

@:_:

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!