본문 바로가기

Programing

IPC : 프로세스 간 통신

출처 : http://fattarzan.tistory.com/entry/%EB%AC%B8%EC%84%9C-IPC-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B0%84-%ED%86%B5%EC%8B%A0

IPC는 프로그램들간의 데이터를 공유하고 동기화하기 위해 사용되는 방법을 뜻한다. 이때 프로그램은 보통 프로세스를 의미한다. IPC를 할 수 있게 해주는 일반적인 도구는 세마포어, 공유메모리( Shared memory), 메시지큐등이 있다. 이런 방법이 갖는 이점은 디스크를 통한 파일공유와 관련IO를 통해 공유하는 오버헤드를 줄일 수 있다는 것이다. 

Semaphore

세마포어는 공유 할 수 없는 자원을 액세스하는 것을 제어하는 특화된 데이터 구조체이다. 자원을 놓고 협력하거나 혹은 경쟁하는 프로세스는 그 자원이 사용 가능한가에 대한 결정을 세마포어를 통해서 하게 된다. 자원이 사용 가능하지 않다면 기본적으로 운영체제는 요청한 프로세스를 관련한 큐에 대기 시킨다. 그리고 자원이 사용 가능한 상태가 되면 그 프로세스에게 알려주고 실행시키게 된다. 이것은 자원의 사용가능성에 대한 처리를 간편하게 해주는 역할을 하게 된다. 실생활에서 예를 든다면 교차되는 선로에서 반대 방향으로 진행하는 열차를 대기 시키는 신호등과 같은 역할을 하게 된다. 대부분 세마포어는 프로세스 동기화나 lock을 위해 사용된다. 보통 세마포어는 이진수(Binary)이거나 Counting으로 이루어졋다. 한 binary세마포어는 한 자원을 제어한다. 가령 0이면 자원이 사용 중이라는 뜻이고, 1이면 사용 가능하다는 뜻이 된다 

Message queues

메시지큐는 프로세스간에 크지 않은 양의 데이터를 구조화된 방식으로 넘겨주는데 사용된다. 전달되는 정보는 미리 지정된 메시지 구조체를 통하게 된다. 메시지를 발생시키는 프로세스는 사용자 정의의 형을 명시하고 메시지를 시스템이 유지시키는 메시지 큐에 위치 시킨다. 그 메시지 큐를 액세스하는 프로세스는 FIFO(선입선출)방식으로 특정 타입의 메시지를 선택적으로 읽기 위해 메시지 타입을 이용하게 된다. 메시지큐는 프로그램에게 여러 프로그램으로부터 오는 데이터를 멀티플렉싱을 할.수 있도록 해준다. 

Shared memory

공유메모리는 다중프로세스들이 가상메모리를 공유할 수 있도록 해준다. 이 방법은 메모리 공유를 위한 가장 빠른 수단이긴 하지만 가장 간편한 수단은 아니다. 일반적으로 한 프로세스는 공유메모리 세그먼트를 생성하고 할당하게 된다. 생성시점에서 사이즈와 사용허가권에 대한 설정이 된다. 그리고 프로세스는 세그먼트를 어태치(attach)하고 연다. 이것이 현재의 데이터 영역으로 맵핑을 발생시킨다. 또한 필요하다면 세그먼트를 초기화한다. 이렇게 발생된 공유영역은 다른 프로세스가 허가권이 설정되어 있다면 접근할 수 있게 되고 그 영역을 자신의 데이터 영역으로 맵핑을 하고 쓰게 된다. 보통은 세마포어가 공유영역에 대한 접근을 제어하는데 이용된다. 하나의 프로세스가 작업을 끝내게 되면 공유영역을 지우는 것이 아니라 detach하게 된다. 그리고 자신의 소유권을 다른 프로세스에게 이양하게 된다. 그리고 공유영역을 쓰던 모든 프로세스가 죽게 되었을 때 일반적으로 영역을 생성시킨 프로세스가 제거에 대한 책임을 지게 된다. 데이터는 공유 영역을 통해 전달이 되는데 이것이 가장 빠른 IPC방법이다. 그러나 현재 64bit가 아닌 32bit 컴퓨팅에서 발생되는 대용량 데이터 ( 256MB ) 처리하기 위해서는 새로운 옵션으로 프로그램을 컴파일 할 것을 요구한다. 

Memory mapping 에 대한 이해

응용프로그램의 명령이 수행되는 속도는 보통 프로그램addressable 메모리 영역밖을 얼마나 많이 접근하느냐에 달려있다고 해도 과언이 아니다. 즉 많을수록 속도는 늦어 질 수 밖에 없다. 이런 메모리 외부영역을 접근하는 트랜잭션 오버헤드를 줄이기 위해 OS는 두가지 방식을 제시하고 있다. 하나는 파일을 프로세스 메모리영역에 맵핑하는 것이 있다. 흔히 파일 메모리맵핑기법으로 불리기도 한다. 두번째는 협력하는 프로세스간에 사용하는 공유영역을 둠으로서 오버헤드를 줄일 수 있다 메모리팹핑화일은 프로세스로 하여금 직접적으로 데이터를 접근할 수 있는 메커니즘을 제공한다. 이것은 파일을 열고 읽으면서 데이터를 자신의 데이터 버퍼로 복사하는 작업을 없애 줌으로서 상당한 I/O이동을 줄여준다. 한 파일을 맵핑하는 프로세스가 하나 이상 일 때는 공유를 하게 된다. Mapped memory영역 ( 또한 shared memory 영역으로도 불리는)은 프로세스간에 데이터를 교환하는 대규모 풀(pool)을 제공한 것이다. 그러나 락킹이나 접근제어에 대한 부분은 signal이나 semaphore를 사용하여 설정하여야 한다. 이렇게 하여야 한 프로세스가 사용중인 데이터를 변경하는 것과 같은 접근 충돌을 막을 수 있다. 공유메모리 영역은 메시지로 보내기에는 큰 공용데이터베이스의 데이터를 여러 프로세스가 공유하는 경우에 특히 유용하다. 맵핑은 파일을 읽고 쓰는데에 따르는 오버헤드를 줄일 수 있다고 했다. 파일의 내용이 유저영역으로 올라오게 되면 (맵핑) 다른 프로세스들은 마치 메모리에 올라 온 것처럼 시스템콜(I/O)를 사용하지 않고 포인터를 이용해 직접 접근하게 되는 것이다. 또한 디스크에 있는 파일은 마치 paging 영역처럼 활용됨으로써 페이징 공간을 줄일 수있다. 프로그램은 어떠한 정규파일에 대해서도 맵핑을 할 수 있다. 이런 특징은 실행코드를 가지는 오브젝트코드에도 적용 가능하다. 이렇게 하면 일반 파일보다 좀더 빠르게 액세스 할 수 있게 되기 때문에 실행파일을 좀더 빨리 load할 수 있다. 보다 자세한 사항은 shmat서브루틴을 참고 한다. 

OS 차원에서 개념적으로 접근했는데,,,
개념잡기에는 충분하다고 생각함

'Programing' 카테고리의 다른 글

win api 멀티스레드 개요  (0) 2011.09.14
프로세스&스레드  (0) 2011.09.14