[Linux] IPC(Inter Process Communication) 간단한 개념
본 글은 대학 수업 듣다가 하도 이해가 안돼서 정리하면서 이해해보고자 쓰는 글입니닷
Process 들은 분리 된 데이터 영역을 가진다.
그치만 우린 그 프로세스 간에 데이터를 주고받고싶을때가 있는 것이다.
이를 IPC(Inter-Process Communication)라고 하고 그 수단은 크게 두가지로 나뉘고 또 그 두개에서 세부적으로 나뉜다.
내가 수업에서 배운 큰 분류는 다음과 같다.
Message passing 커널이 관리, 동기화 문제 신경쓸 필요X 오버헤드 큼 |
PIPE 부모-자식 프로세스간 단방향 전송(read or write) |
FIFO 부모자식 관계가 아닌 프로세스들도 통신 가능 |
|
Shared Memory 메모리 공간을 할당받아 2개 이상의 프로세스들이 같은 메모리공간에 접근함 동기화문제가 생길 수 있다. < 보통 세마포어를 써서 해결 |
shared memory 관련 system call 사용 |
MMP (Memory mapped file) 을 shared memory로 사용 |
PIPE 는 시스템콜 PIPE로 생성할 수 있으며 그냥 파일디스크립터 처럼 read, write 시스템콜을 사용하면 된다.
파일 디스크립터를 복사하는 dup라는 기능도 있다.
이걸 사용하면 STD_OUT에 써지는 내용을 PIPE에도 동일하게 보내거나
STD_OUT은 닫아버리고 모든 출력을 PIPE가 받도록 할 수도 있다.
FIFO는 자료구조의 FIFO가 맞다.
프로세스로부터 메시지를 받아 요청이 들어올 때마다 선입선출시킴..
mkfifo 시스템콜로 FIFO를 만들고 그 객체를 open, close, read, write 할 수 있다.
Shared Memory 내 머리를 터지게 하는 유용한 기능
사실 쉐어드메모리 개념 자체가 아니라 동기화문제가 구웨엑이다..
서로 다른 둘 이상의 프로세스가 같은 메모리를 함께 사용한다.
일단 관련 시스템콜은 아래와같다.
shget :운영체제야 쉐어드메모리 줘 없으면 만들어서 줘!!!
- shared memory ID 를 리턴.
shmat : Virtual address 에 physical memory 주소 연결해줘!!!(= mapping)
- 쉐어드메모리의 포인터가 리턴
그리고 이때 얘가 가리키는 주소에는 flag로 0이 들어있다
shmdt : 연결한거 떼줘!!
- 정상적으로 수행 시 0 리턴
할당해제는 컨트롤 오퍼레이션을 사용한다
shmctl( 쉐어드메모리ID, IPC_RMID, 0 )
두번째 인자로 IPC_RMID 를 주면 system 상에서 shared memory가 사라진다. 옵션은 보통 NULL로 준다.
그리고 Memory mapped file 은
디스크상의 파일을 Virtual address와 mapping 해서 쓰는것인데
file 에 바로 쓰므로 file I/O와는 다르다...........고 하나
실상 페이지가 메모리에서 내려갈 때 변경사항이 반영되므로 File I/O와 섞어쓰다가는 동기화문제가 생긴다고 한다.
관련 시스템콜은
mmap : VA를 할당
munmap: 할당 해제
이 있다.
mmap 은 파라미터가 좀 복잡하다고 느껴지는데... 순서대로
mapping할 address : 0추천 > 시스템이 알아서 고름
사이즈
prot : PROT_READ, PROT_WRITE, PROT_EXEC, PROT_NONE
flag : offset, 보통 0 넣으면 됨
이렇게 4개가 들어간다
끝!