09. 프로세스간 커뮤니케이션(IPC 기법)
프로세스간 통신이 왜 필요할까?
성능을 높이기 위해 여러 프로세스를 만들어 동시실행
이 때 프로세스간 상태 확인 및 데이터 송수신 필요
프로세스간 통신 예제
fork()시스템콜
fork()함수로 프로세스 자신을 복제해서 새로운 프로세스로 만들 수 있음
부모 프로세스, 자식 프로세스
프로세스를 fork()해서 여러 프로세스를 동시 실행 할 수 있음
최근 CPU안에 코어가 8개 되는 경우도 많고 각 프로세스를 각 코어에서 동시 실행 가능하기 때문(병렬 처리 가능)
여러 프로세스 동시 실행하기 예
1~10000까지 더하기
fork()함수로 10개의 프로세스를 만들어서 1~1000,1001~2000,... 더하기
(core가 10개 있다고 생각하면 병렬로 각 프로세스를 처리 가능)
각각 더한 값을 모두 합하면 더 빠르게 동작 가능
단, 이 때 각 프로세스가 더한 값을 수집해야 하므로, 프로세스 간 통신 필요
CPU 병렬 처리 가능하면 빠른 대응 가능 각 프로세스 제어 및 상태 정보 교환을 위해 프로세스간 통신필요
프로세스간 공간은 완전히 분리되어있음
하나의 프로세스는 총 4GB(가상주소)
0~3GB: 사용자모드(user mode)
3~4GB: 커널모드
각 프로세스의 사용자 공간 끼리는 서로 접근이 불가능하지만(stack, heap, bss, data,code)
커널 공간은 실제 물리 메모리에 동일한 공간을 공유할 수 있게끔 만들어져 있음.
가상주소 != 물리주소
더 깊은 내용은 가상 메모리 참조
InterProcess Coummunication(IPC)기법
원칙적으로는 프로세스 간 공간에 쉽게 접근 불가능 프로세스 데이터나 코드가 바뀌면 위험하니까~~! 따라서, 원칙상 프로세스는 다른 프로세스의 공간에 직접 접근 불가능! 프로세스 간 어떻게 커뮤니케이션을 할 수 있을까? 프로세스간 통신 방법을 제공! => IPC 기법
한 가지 방법: file 사용
간단히 다른 프로세스에 전달할 내용을 file에 쓰고, 다른 프로세스가 해당 파일을 읽으면 됨
다만, file을 사용하면 실시간으로 원하는 프로세스에 데이터 전달 어려움
해당 프로세스가 파일을 읽어야 하는데, 실시간으로 읽기 어려우니까.
저장 매체에 다녀와야 하니까 오래 걸림
(커널 공간 사용하지 않음)
그래서 보다 다양한 IPC 기법이 있음
핵심: 커널 공간을 사용하는 것(물리 메모리에 있음)
file을 사용하는 것보다 빠른편
pipe
message queue
shared memory
signal
semaphore
socket
...
[정리]
여러 프로세스 동시 실행을 통한 성능 개선, 복잡한 프로그램을 위해 프로세스 간 통신 필요
프로세스 간 공간 완전 분리
프로세스 간 통신을 위해 특별한 기법 필요
IPC(InterProcess Communicate)
대부분의 IPC기법은 결국 커널 공간을 활용하는 것
이유: 커널 공간은 공유하기 때문
각 IPC 기법 이해하기
pipe
기본 파이프는 단방향 통신[부모(write) => 자식(read)]
fork() 실행 다음 코드부터
부모 프로세스
자식 프로세스(부모로 부터 복사한 프로세스)
ProcessID값이 다름(부모: 실제 프로세스 ID, 자식: 0)
fork()로 자식 프로세스 만들었을 때, 부모와 자식 간의 통신
실제 데이터는 kernel 위치에 있음
message queue
기본은 FIFO정책으로 데이터 전송
msgsnd()로 메세지를 넣고
msgrcv()로 해당 주소의 메세지를 읽어옴.
동일한 key값을 통해서 각 프로세스를 데이터 송수신을 할 수 있다.
먼저 넣은 데이터가 먼저 읽힌다.
부모/자식 관계는 없음
양방향가능
공유 메모리(shared memory)
노골적으로 kernel space에 메모리 공간을 만들고 해당 공간을 변수처럼 쓰는 방식
공유 메모리 key를 가지고 여러 프로세스가 접근 가능
shmget()으로 공유 메모리 생성
shmat()으로 공유메모리 주소 얻기
shmaddr() 읽고, 쓰기 가능.
커널 공간에 아예 메모리 공간을 하나 파는 개념
signal(가장 많이 사용됨!)
유닉스에서 30년 이상 사용된 전통적인 기법
커널 또는 프로세스에서 다른 프로세스에 어떤 이벤트가 발생되었는지 알려주는 기법
(커널 <=> 프로세스)
(프로세스 <=> 프로세스)
시그널은 미리 정의되어 있는 이벤트들
(기본 OS (Linux, Unix) 에서 이미 정의되어 있음)
SIGKILL
SIGALARM
SIGSTP
....
특별한 동작을 정의할 수도 있다.
터미널에
kill -l
입력하면 이미 정의된 시그널 종류를 볼 수 있음.
프로세스 관련 코드에 관련 시그널 핸들러를 등록해서 해당 시그널 처리 실행
PCB에서 해당 프로세스가 block또는 처리 해야 하는 시그널 관련 정보 관리
커널 모드에서 사용자 모드로 전환 시 시그널 사용.
socket
네트워크 통신을 위한 기술
기본적으로는 클라이언트와 서버 등 두 개의 다른 컴퓨터 간에 네트워크 기반 통신을 위한 기술
하나의 컴퓨터 안에서, 두 개의 프로세스 간에 통신 기법으로도 사용 가능
Last updated