남이 읽는 CS/운영체제

[운영체제 8편] IPC란 무엇인가

배발자 2022. 4. 13.
반응형

 

 

안녕하세요! 개발자 배씨입니다~~ :)

저번 시간에는 인터럽트에 대해서 알아보았어요!! 오늘은 예전부터 언급했던 IPC 가 무엇인지 이제 배워볼게요 ㅎㅎ 

 

지금껏 제가 설명드렸던 프로세스는 각자 독립적인 주소 공간을 가지고 수행되기 때문에 다른 프로세스와 정보를 주고 받을 수 있는 방법이 없다고 생각 하셨을거에요~

 

멀티 스레드 환경에서는 서로 공유하는 공간이 있기 때문에 데이터를 주고 받을 수 있겠지만 프로세스는 독립된 구조인데 어떻게 자원을 공유할 수 있을까요?  

 

그래서 똑똑한 조상이 운영체제가 프로세스 간의 협력 메커니즘을 제공해서 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있게 해줬답니다. 

 

즉, 하나의 컴퓨터 안에서 실행 중인 서로 다른 프로세스 간에 발생하는 통신! IPC(Inter-Process Communication) 이라고 부릅니다. 


 

IPC의 대표적인 방법(모델)은 메세지 전달방식공유 메모리 방식이 있어요~ 

하나하나 살펴봅시다 ㅎㅎ

 

1. 메시지 전달방식  (Message passing)

 

 

여러분 만약 집에 물이 안나와요~  그러면 물이 나오는 우물을 찾아야겠죠?? 

자신의 집과 친구의 집들은 모두 독립적인 공간에 위치하고 있지만 우물이라는 서로 공유할 수 있는 그런 공간이 따로 할당 되어 있다면 서로 그 우물이 있는 위치에 가야겠죠.??

 

이처럼 서로 독립된 공간에 있는 프로세스들이 자원을 공유하기 위해 커널에 있는 공유 공간 속에 데이터를 주고 받는 방식이 메세지 전달 방식인거에요~ 

 

 

 

위의 그림을 보시면 각 프로세스들이 커널에 있는 메세지 큐 공간으로 자원을 던져주는 것이 보일겁니다!

즉, 메시지 전달 방식은 운영체제가 대리 전달하는 방식인거에요~

 

만약, 프로세스 A가 현재 자원 a가 있고 프로세스 B가 현재 자원 b가 있다고 가정해봐요~

프로세스 B가 프로세스 A가 들고있는 자원 a가 필요하다면 운영체제가 전달해준다는 거죠!

 

자 여기서 직접 통신(direct communication), 간접 통신(indirect communication) 라는게 있습니다. 

 

만약 프로세스 A가 자원 a를 커널의 메세지 큐로 전달하고 커널이 그 자원 a를 프로세스 B에게 전달하는 방식을 직접 통신이라고 합니다. 

 

반대로, 간접 통신프로세스 A가 자원 a를 커널의 메세지 큐로 전달하고나면 프로세스 B보고 너가 와서 이 자원을 읽어가 라는 거죠. 

 

이 두가지 방식의 차이는 연산의 인터페이스에 대한 차이일뿐 실제 메시지 전송이 이루어지는 내부 구현은 커널의 중재에 의해 사실상 동일한 방식으로 이루어진다고 합니다~

 

 

 

 

출처 : https://itpenote.tistory.com/722

 

 

 

메세지 큐에 대해서 조금 더 알아봅시다 ㅎㅎ

 

위의 그림을 보시면 프로세스 A가 어떤 자원을 메세지 큐로 던져주는 것이 보일겁니다. 그리고 그 자원을 프로세스 B에게 전달하는 것이 보이네요! 직접 통신의 한 예인거죠~

 

여기서 msgsnd(), msgrcv() 라는 것은 시스템 콜인거에요! 저번에 학습한 적 있었죠? 

사용자 프로그램에서 처리못하는 명령어를 커널 모드로 전환해서 운영체제가 처리해주는 특권 명령인거죠 ㅎㅎ

msgsnd()는 메시지 전송, msgrcv()는 메시지 수신이라는 시스템 콜이라고 생각하시면 됩니다 ㅎㅎ

 

근데 메세지 전달 방식은 메시지 전달 시마다 운영체제가 개입하다보니 높은 커널 의존성을 가지게 되며, 속도가 낮아지게 되는거에요~  하지만, 운영체제가 개입하다보니 자원에 대한 동기화 문제는 발생하지 않게 되는거죠 !

즉, 서로 같은 자원에 대한 접근 충돌은 발생하지 않는다는 겁니다 !! 왜냐! 커널이 다 관리하기 때문인거죠~ 

 

 

2. 공유메모리 방식 (Shared Memory)

 

 

 

공유 메모리 방식은 프로세스들이 주소 공간의 일부를 공유하는 방식입니다!

 

원칙적으로 서로 다른 프로세스 A와 B는 각자 독립적인 주소 공간을 가지므로 자신이 아닌 다른 프로세스의 메모리에 대한 접근은 할 수 없어요. 

 

그러나 운영체제 공유 메모리를 사용하는 시스템 콜을 지원해서 서로 다른 프로세스들이 그들의 주소 공간 중 일부를 공유할 수 있도록 하고 있어요. 

 

이게 무슨 말이냐면, 프로세스가 공유 메모리 할당을 시스템콜을 통해 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해줍니다. 이후 어떤 프로세스건 해당 메모리영역에 접근할  있는거죠!

 

이렇게 공유메모리 구축 시에만 시스템 콜이 발생하고 커널이 직접 자원을 전달하는 것이 아니라 프로세스의 메모리를 접근하게 해줌으로써 어떤 프로세스건 해당 메모리영역에 바로 접근할 수 있게 되는거에요~

그래서 공유메모리는 중개자가 없이 곧바로 메모리에 접근할 수 있기 때문에 빠르게 작동할 수 있습니다.

 

하지만 공유 메모리 방식은 프로세스간의 통신을 수월하게 만드는 인터페이스를 제공하지만 서로의 데이터에 일관성 문제가 발생할 수 잇겠죠?  즉, 동기화 문제가 발생한다는 겁니다. 

 

멀티 스레드 환경에서 언급한 적이 있었을 겁니다~ 그렇다면 동기화 문제를 해결하기 위해서 어떻게 해야할까요!

이미 포스팅을 했었습니다 ㅎㅎ 기억 안나시는 분들은 [운영체제 3편][운영체제 4편]을 참고해주세요!

 


 

고생하셨습니다!! 다음 포스팅에서는 어떤것을 다뤄볼까요?  

드디어 배워야 할 시간이 왔네요

 

"[운영체제 9편] 스케줄링" 

 

다음 포스팅에서는 진짜 복잡하고 머리를 많이 써야하기 때문에 준비 단단히 하시고 들어오세요! 

감사합니다  :) 

 

 

반응형

 

반응형

댓글