티스토리 뷰

나의 공부방

[IPC] 내부 프로세스간의 통신

망나니개발자 2017. 11. 3. 20:58
반응형

이번에 포스팅을 하는 내용은 IPC(Inter Process Communicaton) 즉, 프로세스간의 통신입니다!

이 내용은 3학년 1학기 운영체제 수업시간에 배운 내용들인데, 그 때 열심히 정리했던 자료들을 가지고 포스팅을 했으면 

좋았을 텐데, 시험종료와 함께 다 버려버려서 아쉽게도 그때의 내용은 없지만 그래도 열심히 정리해보려고 합니다.



1. IPC(Inter Process Communication)



IPC는 영어 단어 그대로 해석해도 어떠한 내용인지 받아들이기 참 쉽습니다. 

       내부 프로세스들 끼리 통신을 하는 것


바로 프로세스들 간의 의사소통을 하는 것이라는 뜻인데, 프로세스가 통신 가능하다는 것은 서로 다른 프로세스가 데이터를 

주고 받을 수 있다는 것이며, 동시에 접근 가능한 메모리 즉, 프로세스들이 공유하는 메모리가 필요하다는 뜻입니다.

IPC는 그러므로 컴퓨터 내부에서 보다 더 효율적으로 정보를 주고 받기 위해서 통신한 통신의 일종이라고 생각하면 되고,

인터넷 통신을 IPC의 확장으로 이해해도 됩니다.(프로세스<->프로세스 가 서버<-> 클라이언트와 유사하기 때문입니다.)

그래서 프로세스간의 통신을 위해 PIPE와 같은 개념이 등장하게 되었답니다!


Q) 프로세스 간의 통신은 왜 어렵나요?

프로세스끼리의 통신이 어려운 이유를 이해하기 위해서는 프로세스와 스레드의 차이에 대해서 먼저 이해해야합니다.

우리는 fork와 같은 함수로 프로세스를 pthread_create와 같은 함수로 쓰레드를 각각 생성해주는데, 둘을 만드는 과정에서

큰 차이가 존재합니다. 프로세스는 생성되면서 * PC 를 포함하여 메모리 공간 등을 복사하여 자원을 할당하지만 

쓰레드는 메모리 공간와 자원들을 공유하기 때문에 그렇습니다. 즉, 우리가 프로세스와 쓰레드를 생성하기 전에 a라는 변수를 선언해 놓았다고 한다면 프로세스는 a를 각각 1개씩 갖게 되지만 쓰레드는 a를 공유합니다. 그래서 프로세스는 통신을 할 공간이 없기 때문에 별도의 공간을 만들어주어야 하기 때문에 프로세스간의 통신은 쓰레드 간의 통신보다 어렵습니다.



* PC(Program Counter) : 여기서의 PC는 Personal Computer가 아니라 프로그램 카운터로 다음에 수행해야하는 명령어의 주소를 가리키는 레지스터입니다. 어느 line을 실행할 지에 대한 주소를 저장하고 있는 포인터로 쉽게 이해하면 됩니다!





2. PIPE



위에서 설명하였듯 프로세스는 메모리공간을 복제하기 때문에, 통신을 하기 위해서 별도의 메모리 공간을 할당해주어야 합니다.

그래서 등장한 기술이 바로 PIPE인데 통신을 위한 메모리공간(버퍼)을 생성하여 프로세스가 데이터를 주고받게 끔 해줍니다.

PIPE를 응용하면 외부 프로세스와의 통신에도 사용이 가능하지만 PIPE는 단방향의 통신이라는 단점이 존재합니다. 

(하나의 파이프를 사용하여 생성하면 데이터의 중복 등의 문제가 발생하기 때문입니다.)


그렇기 때문에 일반적으로 2개의 프로세스가 통신을 한다고 할 때 2개의 PIPE를 사용하여 통신을 합니다.

이렇게 파이프를 2개 생성해주면 입출력의 타이밍에 따른 영향을 받지 않아서 모든 문제가 해결된 것 처럼 보입니다.

하지만 그렇다고 모든 문제가 해결된 것은 아닙니다. 예를 들어 100개의 프로세스가 통신을 하는 경우에는 어떻게 할까요?

100P2 9900 총, 9900개의 파이프가 필요하므로 자원의 낭비가 심하다는 단점을 해결하지 못한 PIPE입니다.




3. PIPE의 종류



PIPE에는 Named PIPE와 Anonymous PIPE 2종류가 존재하는데, 일반적으로 네임드파이프와 익명파이프라고 얘기합니다.


[ 익명파이프(Anonymous Pipe) ]

일반적인 PIPE 함수로 생성시킨 파이프는 이름이 없는 익명파이프 입니다. 왜 익명파이프라고 하는지 이해가 가나요?

우리는 길에서 오랜만에 만난 친구를 만나서 큰소리로 부르려고 하는데 갑자기 이름이 기억나지 않습니다! 그럴때 우리는

그 친구를 부르지 못하는 상황이 오는데, 이름을 몰라서 부르지 못한다! 이를 다시 프로그래밍에 대입하면

즉, 외부 프로세스에서 이 파이프를 사용할 수 없어서 익명파이프라고 하는 것입니다.

이름이 없기 때문에 외부프로세스에서는 이 파이프를 부를 수 없지만, 부모프로세스가 자식 프로세스를 생성하는 경우에

파일 지정 번호를 상속받아 익명파이프로 통신을 할 수 있습니다. 상당히 사용이 제한적이네요~


[ 네임드파이프(Named Pipe) ]

이번에는 네임드 파이프에 대해서 정리해봅시다. 익명파이프와 반대로 생각하면 이해가 빠를 것 같네요!

익명파이프는 부모와 자식프로세스간의 통신만 가능하기 때문에, 외부 프로세스와 통신을 하기 위해서 파이프에 이름을 

붙여주자는 생각으로 네임드 파이프가 등장하게 됩니다.  그래서 각 파이프에 이름과 권한을 부여하여 파이프를 생성해줍니다.

네임드파이프는 읽기와 쓰기가 모두 가능하지만 한번에 한 방향으로만 통신이 가능한 반이중통신이기 때문에 전이중통신을

위해서는 읽기 파이프와 쓰기파이프 총 2개의 파이프를 생성해주어야 합니다.

즉, 다수의 클라이언트를 처리하기에는 비효율적이라는 문제는 해결하지 못했습니다!


익명파이프와 네임드파이프를 표로 정리하면 아래와 같습니다.




4. Unix Domain Socket



Unix Domain Socket은 소켓 함수와 기술을 그대로 사용한 것으로 이름에서 눈치챌 수 있듯이, 유닉스 영역(같은 시스템)에서의 통신에서 사용하며 유닉스 서버에서 서버/클라이언트 환경을 만들 수 있습니다. 그러므 다음과 같은 2가지 특징을 지닙니다.

① 서버/클라이언트 환경을 구축하는데 용이하다.

중대형 애플리케이션에서 주로 사용한다.

이를 그림으로 표현하면 아래와 같습니다. (여전히 파일시스템을 사용하는 것을 알 수 있습니다.)




5. Shared Memory(공유메모리)



이번에는 OS가 제공하는 메모리를 프로세스들이 공유하는 공유메모리에 대해서 설명을 해보도록 하겠습니다. 

직감적으로 느껴지듯, 프로세스A가 메세지를 공유메모리에 전송하면 프로세스 B가 공유메모리의 메세지를 읽는 방식으로 동합니다.

그림으로 표현하면 아래와 같습니다. (저장 공간이 메모리라는 점에서 Unix Domain Socket과 차이가 있습니다.)




메모리 공간을 공유한다는 점 때문에 아래와 같은 3가지 특징을 지니게 됩니다.

① 대량의 정보를 다수의 프로세스에게 배포가능하다

 빠르고 효율적이다.

③ 공유 메모리 공간에 대한 접근 제어가 필요하다.


여기서 공유메모리가 동작하는 방식에 대해서만 가볍게 집고 넘어가도록 하겠습니다.

공유메모리는 공유메모리가 각 프로세스에게 첨부(attach)하는 방식으로 작동하게 되는데, 그렇기에 위에서 언급한 3가지의

특징을 가지게 된 것입니다. 이를 그림으로 표현하면 아래와 같습니다. (각 프로세스가 메모리영역에 첨부됨을 알 수 있습니다.)




반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함