본문 바로가기

Operating System

[OS] 프로세스 간 통신

프로세스 통신!
2개 이상의 프로세스가 동시에 실행중이라고 가정을 해봅시다.
동시에 이 프로세스들은 독립적인 프로세스 / 협력적인 프로세스

독립적인 프로세스 : 딱히 데이터를 주고받지 않는 즉 공유하지 않는 경우
협력적인 프로세스 : 데이터를 공유하는 프로세스
다른 프로세스의 영향을 받거나 반대로 영향을 줄 수 있다. 그리고 이 과정에서 다른 프로세스와 데이터를 공유를 할 것이다.

IPC(Inter-Process Communication) : 프로세스 간 통신
협력적인 프로세스는 IPC 메커니즘이 필요하다! 
즉 이 말은 데이터를 교환할 수 있게 해주고, 이 과정에서 수신 데이터와 송신 데이터가 생긴다는 뜻이다.

IPC 방법으로는 크게 두가지 방법
1. shared memory : 메모리 공간을 따로 두고 이 메모리 공간을 이용을 해서 데이터를 공유한다.
2. message passing : 메세지라는 방법을 이용해서 데이터를 주고받는 방식

데이터를 만들어서 보내는 역할 - 데이터를 가져가서 사용을 하는 역할
Producer(생산자) Consumer(소비자)

생산자-소비자 문제
협력적인 프로세스들을 말로 풀어쓴 것! 협력적인 프로세스의 일반적인 파라다임!

정의 : 생산자는 소비자에 의해서 소비될 정보들을 생산한다!
예로 들어서 C언어 컴퍼일러! 에셈블리 코드를 생산한다! 어셈블러가 이것을 소비한다.
웹 서버가 HTML 파일을 생산하면, 브라우저(즉 클라이언트)는 이것을 소비한다.

shared memory에서는 생산자와 소비자가 동시에 돌아갈 수 있게 해준다.
버퍼가 이것을 가능하게 해준다.
1. 생산자는 버퍼를 채운다.
2. 소비자는 버퍼를 비운다.

shared memory는 기본적으로 메모리의 한 영역이다.
즉 생산자와 소비자 프로세스가 이것을 함께 공유할 것이다.

shared memory의 원칙
메모리의 공유되는 영역이 존재를 해야된다. (즉 버퍼에 필요한 메모리 공간이 필요하다.)
그리고 프로그램에는 shared memory에 접속하고 조작을 할 수 있는 코드가 들어가야 한다.
- 프로그래머는 명시적으로 이것을 프로그램에 작성을 한다.

message passing
OS 차원에서 협력적인 프로세스를 위한 수단으로 이 message passing을 제공을 한다.
message passing은 프로세스가 각각 메시지를 전달하기 위해 사용을 한다.
send()/receive() 함수를 사용을 한다.

통신 연결 : P라는 프로세스와 Q라는 프로세스가 통신을 하고 싶다.
그럼 P,Q는 send와 receive 메시지를 서로 데이터를 보내야 한다.

이러한 통신의 링크는 다양한 방법으로 구현을 할 수 있다.
1. 직접적인 또는 간접적인 통신
2. 동기적인 또는 비동기적인 통신 방법
3. 자동적인 아니면 수동적인 버퍼링 방식

1. 직접적인 또는 간접적인 통신
1.1. 직접적인 통신
각각의 프로세스가 통신을 원한다. 직접적인 방식은 반드시 프로세스 이름을 통신상 수신자나 송신자의 이름을 명시를 해야 한다.
즉 함수는 다음과 같이 구성이 된다.
send(P, message) - P 프로세스가 메시지를 보냅니다.
receive(Q, message) - Q 프로세스가 메시지를 받습니다.

이런 경우에는 다음과 같은 원칙을 지킬 수 있다.
1. 알아서 링크가 연결이 된다.
2. 이 링크는 두 프로세스를 정확하게 연관을 시킬 수 있고
3. 각각의 두 프로세스 사이에선 정확하게 하나의 링크가 존재한다.

1.2. 간접적인 통신
이 경우는 중간에 mailbox 즉 우편함이나 포트를 만들어서 송신과 수신을 진행한다.
우편함이 무엇인가?
하나의 오브젝트로 보인다! 
이 오브젝트 안에는 프로세스가 보내는 메시지들이 들어간다.
이 오브젝트 안에 있는 메시지가 제거될 수 있다.

send(A, message) - A 우편함으로 메시지를 보냅니다.
receive(A, message) - A 우편함에서 메시지를 받습니다.

이런 경우는 다음과 같은 원칙을 가지게 될 것이다.
1. 각 프로세스들은 공유된 메일 박스에서 메시지를 참조를 한다.
2. 이 우편함에는 2개 이상의 프로세스가 연결될 수 있다.
3. n개만큼의 다른 연결이 존재할 수 있다.  (하나의 메일박스에 연결된 수만큼)

OS차원에서는 다음과 같은 메커니즘을 제공을 해준다.
1. 새로운 우편함을 생성한다.
2. 우편함을 통해서 send와 receive가 처리된다.
3. 우편함을 제거한다.

2. 동기적인 또는 비동기적인 통신 방법

blocking or non-blocking : synchronous(동기적인) or asynchronous(비동기적인)

blocking send : 송신자 프로세스가 메시지를 받을 때까지 기다린다.
Non-blocking send : 송신자 프로세스가 메시지를 받지 않아도 메시지를 그냥 보낸다.
blocking receive : 수신자 프로세스가 메시지가 들어올 때까지 기다린다.
Non-blocking receive : 수신자 프로세스가 딱히 메세지가 없다면 자기 할 일을 한다.

Client-server 아키텍처 방식
1. 소켓 : 통신을 위한 정점으로 정의한다.
2. RPC(Remote Procedure Calls) : 네트워크 시스템 상에서 프로세스 간에 추상적인 함수 콜(call)을 둔다.

1. 소켓
- IP 주소하고 포트 번호를 이용을 해서 정점을 정의를 한다.
1.1 TCP : Socket 클래스를 이용해서 Berkeley 소켓 인터페이스를 구현한다. TcpServer, TcpClient
1.2. UDP : DatagramSocket UdpServer, UdpClient

1.2. RPC 
- 리모드 서비스의 가장 흔한 방식
- 네트워크 상에서 추상적인 함수호출 메카니즘을 이용을 한 방식
- 하나의 클라이언트는 원격 호스트의 함수를 호출하는 방식

즉 네트워크 상에서 클라이언트가 대기중인 서버의 함수를 원격으로 실행하는 방식(이 때 사용하는 방식이 message passing)

'Operating System' 카테고리의 다른 글

[OS] CPU 스케쥴링  (0) 2022.02.08
[C#, OS] Monitor  (0) 2022.02.08
[OS] 쓰레드  (0) 2022.01.20
[OS] Process란  (0) 2022.01.06
[Operating System] 1. OS란 무엇인가  (0) 2021.12.21