본문 바로가기

별걸다하는 IT/운영체제 OS

[운영체제 IPC]메세지 교환(Message passing) vs 데이터 공유(Shared memory) 프로세스간 통신!

반응형

운영체제 목차

 

IPC = Inter-Process Communication

 

 

 

협력을 위한 소통 방법! IPC

 

Processes executing concurrently in the operating system may be either independent processes or cooperating processes. A process is independent if it cannot affect or be affected by the other processes executing in the system.

Any process that does not share data with any other process is independent.

A process is cooperating if it can affect or be affected by the other processes executing in the system.

Clearly, any process that shares data with other processes is a cooperating process

Cooperating processes requires an interprocess communication(IPC) mechanism that will allow them to exchange data and information.

 

 

프로세스에는 다른 프로세스에게 영향을 끼치지도 받지도 않는 독립적인 프로세스와, 영향을 주고 받으며 자원을 공유하는 협력적인 프로세스로 나눌 수 있습니다. IPC는 cooperating process 사이에서 서로 데이터를 주고 받는 행위 또는 그에 대한 방법이나 경로를 말합니다.

 

그럼 협력 프로세스를 왜 사용하고 허용하는 걸까요?

1. Information sharing

만약에 여러 사람들이 하나의 파일을 공유하고 싶어한다면? 당연히 그 파일(정보)에 동시 접근이 가능하게 환경을 제공해줘야겠죠.

자원을 다른 사람들과 공유하는 것이 즉 협력 프로세스인 것이고 협력 프로세스를 통해 자원을 공유해야하는 것이죠.

2. Computation speedup

1번과 같이 자원을 공유하고자 할 때 뿐만 아니라, 속도를 높일 때에도 사용해요

만약 어떤 작업이 더 빨리 완성되고 싶다면 그 작업을 세부 작업으로 쪼개서 각 작업들이 동시에 진행되게 하면 배로 빨라질 수 있겠죠? 그럼 그 프로세스들은 다른 프로세스들과 협력하면서 동시에 진행하는 것이죠.

3. Modularity

모듈화를 말해요. 어떤 시스템을 모듈 방식으로 개발한다 하면, 시스템 기능을 여러개의 프로세스나 스레드로 나누잖아요. 즉 여러 프로세스가 협력하는 상황이 생기죠.

4. Convenience

이뿐만 아니라 우리 개인도 사실 한번에 많은 일을 진행하죠 (멀티태스킹!) 편집하면서 음악도 듣고 ~ 등등

여기에도 협력 프로세스가 사용됩니다

 

잠깐 쉬어가는 광고 타임! 형님 누나 동생들! 번거롭지만 1초만 시간 투자 부탁드려요

올바르고 신뢰성 있는 정보를 전달하는 블로거로 나아가는데 힘이 됩니다 으쌰으쌰

 

 

 

 

 

Messaging passing(메시지 교환) VS Shared memory (데이터 공유)

 

IPC에는 기본적인 두 가지 방법(모델)이 있습니다. 메시지 교환과 데이터 공유!

1) Message passing

커널(OS)가 memory protection을 위해 대리 전달해주는 것을 말합니다.

따라서 안전하고 동기화 문제가 없습니다 (OS가 알아서 동기화해주기 때문!) 하지만 성능이 떨어지는 단점을 가지고 있어요

Message passing은 direct communication과 indirect communication이 있습니다.

2) shared memory

두 프로세스간의 공유된 메모리를 생성 후 이용하는 것을 말해요!

성능이 좋지만 동기화 문제가 발생합니다 (App에서 직접 동기화를 해줘야 해요)

 

 

 

이해를 돕기 위해 그림을 보면서 풀어서 설명해볼게요

프로세스 A가 있고 프로세스 B가 있습니다. process A에 Rss1이 있고, process B에 Rss2가 있다고 가정합시다. 이 두 프로세스가 서로 자원들을 주고 받으려면 어떻게 해야할까요??? process B가 A의 Rss1에 접근하려고 하면 Memory protection에 의해서 막히겠죠! 내가 아닌 다른 프로세스로의 접근을 안막으면 큰일납니다. A프로세스가 B프로세스를 죽일 수 있게 되는 거거든요. B의 Rss2뿐만 아니라 다른 데도 접근해서 죽일 수 있기 때문에 Memory protection에 의해 이러한 방법은 불가능합니다.

 

 

<Message Passing>

따라서 서로 자원을 협력하려면 운영체제가 도와줄 수 밖에 없어요!!

프로세스 A가 커널로 메시지를 보내면 그걸 커널이 B에게 보내주는 것! 이것이 메시지 교환 방식입니다.

 

 

direct commnunication은 커널에 메시지를 직접 주고 그걸 커널이 B에게 메시지를 직접 전달하는 것이고

indirect communication은 A가 '커널에 ABC라는 메시지 박스에 넣어둘 테니까 너가 거기서 읽어가!'하면 B가 그 ABC라는 메시지 박스에 가서 읽어오는 방식을 말합니다. 둘 다 커널을 이용한 Message passing이지만 커널이 직접 주냐 안주냐로 방법이 나뉘는 것 뿐이에요

아 근데 이거 말만 들어도 사진에서 쌓여있는 메세지들을 보세요 번거롭죠? 네 번거롭고 오버헤드가 큰 것이 단점입니다. ㅎㅎ

위 (a)그림은 메시지 전달 방식 중에서도 indirect 방식을, 왼쪽 그림은 direct 방식을 표현하고 있다는 것을 이제 이해할 수 있겠죠?!

 

<Shared memory>

자 그럼, Process A 와 Process B가 모두 읽고 쓸 수 있는 메모리를 만들고 거기서 주고 받고 할 수 있도록 하는 것은 어떨까?

이것이 shared memory입니다! message passing의 문제가 없으니 성능 측면에서는 당연히 shared memory가 좋겠죠

근데 이 방법은 무엇이 문제일까? -- 동기화가 문제입니다.

동기화가 문제라는 게 무슨말인가요~~~하는 분들을 위한 추가 설명!

프로세스 A에서 쓰고 B에서 읽는 건데 만약 B가 조금 일찍 읽는 상황이라면 지금 A가 이걸 쓴건지 안쓴건지 알수가 없잖아요! 그래서 A가 이걸 썼는지 B가 아는 즉 확인하는 기법이 추가적으로 필요한 이런 문제가 있고 이것이 동기화 문제입니다.

 

 

자, 결국 IPC란 두 개의 프로세스간 통신을 말하는대 하나의 컴퓨터에 있는 두 개의 프로세스만을 의미할까? 그렇지 않다~

근데 서로 다른 컴퓨터에 있는 두 개의 프로세스가 통신하는 것은 결국 네트워킹이지

그 네트워킹도 결국 IPC인거예요. 그 두 개의 프로세스가 네트워크로 연결된 다른 컴퓨터에 존재할 뿐인 것이죠.

이것을 소캣이라고 하는 것이 있고, RPC(C++ 에서는 remote procedure call)이라고 하고 자바에서는 RMI라고 하는 것!!

스케줄링도 그렇고 IPC도 그렇고 넓게 넓게 생각하면 결국 다 같은 맥락인거라는거~

 

 

다음 포스트에서는 두 개의 프로세스가 서로 협력하는 예 중 하나인 producer-consumer 문제를 살펴보도록 하겠습니당~

 

반응형