운영체제 & 컴퓨터구조

[OS] #7. 프로세스간 통신 ( IPC, Inter-Process Communication )

코딩하는상후니 2022. 9. 7. 22:24

 

 


 

 

 

* 프로세스간 통신 ( IPC, Inter-Process Communication )

 
 
=> 프로세스들끼리 데이터를 주고 받는 방식.

 

 

 

 

 

 

 

* 통신 방법

 
 
 

1. Message Passing ( 메시지 큐 ) 이용.

 
 
=> 커널에서 메시키 큐를 관리.
 
=> 시스템 콜이 빈번할 수 있기에 비용이 크다.
 
=> 양방향 통신을 위해서 총 2개가 필요하다.
 
 
 
 
 
 
2. RAM 을 이용하는 방식 ( Shared Memory )
 
 
 
=> 메모리 부분은 굉장히 민감하므로 OS 가 강하게 확인한다. ( 정확하고 엄격함. )
 
=> 할당 시, 크기를 고정해야한다.
 
=> 'Shared Memory 기법' 을 쓸 때 크기는 '고정 길이' 라는 사실을 주목해야함.
 
 
 
 
 
 
 
 
 
 
3. Socket 을 이용하는 방식
 

 
 
 
 
 
Socket 은 유저 모드에서 커널 영역을 거쳐 네트워크 통신을 하기 위해서
'파일 형태로 구현된 인터페이스' 이다.
 
 
 
=> 해당 프로세스와 다른 컴퓨터의 프로세스로의 통신 가능하다.
 
=> 같은 컴퓨터에 있는 프로세스끼리도 통신이 가능하지만
오버헤드가 크기 때문에 거의 사용하지 않는다.
 
 
 
 
보내질 데이터를 Socket 에 쓰고 받아온 데이터를 Socket 에서 읽는 방식을
'Socket' Programming ( 소켓 프로그래밍 )'  이라고 한다.
 
이러한 통신을 '네트워크 통신' 이라고 한다.
 
 
 
 
또한,
소켓은 어떤 정해진 규칙에 의해서 만들어져야하는데
4계층 Transport 에서 쓰이는 'Protocol (프로토콜)' 기준 으로 만들어진다.
 
대표적으로
TCP/IP , UDP 가 있고 각각 TCP/IP 소켓, UDP 소켓 이라고 부른다.
 
 
 
 
대략적인 과정으로는
 
Socket 을 거쳐 Transport ( 전송 ) 에서 Segmentation ( 세그먼트화 ) 가 일어나고
Network 계층으로 넘어가 패킷 단위로 바뀐 후,
NIC ( Network Interface Card ) 를 통해 Frame 단위로 네트워크 세상으로 나아간다.
 
 
 
 
 
 
 
 
 
 
 
 
이번 방법은 원격 프로시저 호출 ( RPC ) 방법이다.
 
우선,
 
원격 프로시저 호출 ( RPC )을 알아보기 전에 몇 가지 개념을 알고 넘어가자.
 
 
 
 
 
 
 
 
 
 

 

 

 

 

 

* 스트림 ( Stream )

 
 
 
=> 데이터를 바이트 '단위' 로 표현한 것이다.
 
즉,
프로세스끼리 혹은 네트워크 통신을 위해선 데이터를 주고 받아야하는데
 
이 때, 주고 받을 수 있는 파일들을 ( 이미지, 압축 파일... 등 )
바이트로 표현되어 주고 받을 수 있는 '단위' 가 Stream 이다.
 
 
=> 스트림으로 표현된 데이터는 메모리에 파일로 저장되어질 수 있고
DB 가 데이터를 읽을 수 있으며 파일 형태로 다른 프로세스에게 통신이 가능하다.
 
 
 
 
 
 
 
 
 
 
 
 
 

* 직렬화 ( Serialization )

 
 
 
=> 어떠한 객체의 정보를 파일로 따로 저장하거나,
네트워크 상에서 데이터를 주고 받을 때 용이하게 한다.
 
 
네트워크 또는 다른 프로세스에서  받아들이기 쉽게
'스트림' 으로 변환하는 방식이다.
 
 
=> 스트림 단위의 데이터를 추출하는 것을 '역직렬화 ( Deserialization ) ' 라고 한다.
 
 
 
 
 
( 위 링크를 참고했다. 직렬화에 대해 아주 자세히 설명되어있다. )
 
 
현재 프로세스 내의 데이터 ( 객체..등 ) 를 다른 컴퓨터의 프로세스에서는
어떻게 쉽게 받아들일 수 있을까??
 
 
이전에 우리가 알아야할 것은
현재 프로세스 내부의 데이터는 메모리 주소를 가지고 있지만,
이 메모리 주소는 다른 프로세스에서는 아무런 의미가 없다.
( 각각의 프로세스는 독립적인 가상 메모리를 가지기 때문. )
 
 
따라서,
의미가 있는 값은 '해당 데이터의 Primitive ( 원시 ) 한 값 형식' 이다.
 
보낼려는 데이터의 모든 주소 값들을 따라가서
원래의 값 형식 데이터로 전부 변조하는 과정을
'직렬화 ( Serialization )' 이라고 한다.
 
 
=> 보통 파일 저장이나, 패킷 전송 시에 '파싱할 수 있는 데이터를 만들기 위해' 사용된다.
 
 
 
=> 언어와 규약 마다 다르겠지만
직렬화된 데이터는 대부분 일직선의 연속적인 값들의 집합인 형태를 띄게 된다.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

* 마샬링 ( Marshalling, 사전적의미  :  정렬시키기 )

 
 
 
=> 한 객체의 메모리에서 표현 방식을 저장 또는 전송에 적합한 다른 데이터 형식으로 변환하는 과정.
 
=> 직렬화 와는 약간 다른 개념이다.
 
즉,
어떤 정해진 표준에 맞게 해당 데이터를 가공하는 것.
 
 
=> 도착지점의 형식에 맞게 내부적으로 변경해주는 것.
 
 
=> 마샬링은 쓰레드 간 데이터 전송에 필요한
'원격 프로시저 호출 ( RPC, remote procedure call )' 매커니즘 구현에 사용된다.
 
 
예를 들어,
원격지의 메소드를 호출한다고 가정할 때,
서버에 넘겨지는 인자, 리턴 값들을 프로그래밍 인터페이스에 맞도록 데이터를 조직화하고,
정해진 다른 형식으로 변환한다. 이 과정을 '마샬링' 이라고 한다.
 
 
=> 반대의 개념은 '언마샬링 ( UnMarshalling )' 이라고 한다.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

* 직렬화 와 마샬링 차이점

 

 

 

 

 
직렬화  :  데이터를 스트림 단위로 '표현' 하는 것.
 
마샬링  :  데이터를 주고 받는 상황에서,
받는 쪽에서 쉽게 데이터를 받을 수 있도록 형식에 맞게 '구성' 하는 것.
 
 
 
 
 
 
 
 
 
 

4. RPC  ( Remote Procedure Call ) 통신 방법

 

 

 

 

 


 

 

참고 자료