프로세스의 실행
- independent processes
- cooperating processes
- 어떤 프로세스가 데이터를 주고 받거나 메시지를 주고 받는 경우
👉 IPC가 발생하게 된다.
IPC(Inter-Process Communication)
- Cooperating processes는 IPC 매커니즘이 필요하다.
- IPC는 데이터를 주고 받는 것을 의미한다.
통신방법
1. shared memory를 이용한다.
2. message passing을 이용한다.
👉 message queue를 이용한다.
1. IPC in Shared-Memory systems
Producer-consumer problem이 발생할 수 있다.
👉 Shared memory로 이러한 문제를 해결할 수 있다.
Producer-Consumer problem
- 가령, 웹 서버가 html file을 제공해 주면 웹 브라우저는 이를 소비한다.
Shared-memory 이용한 문제 해결
shared memory는 메모리의 한 영역을 의미한다.
- producer와 consumer가 concurrent하게 실행될 수 있도록 해준다.
- 중간에 buffer를 사용하면 된다.
👉 producer는 buffer를 채우고, consumer는 buffer에 있는 것을 소비한다.
👉 그런데 대부분은 buffer size가 정해져 있어서 buffer가 가득차면 producer는 'wait' 하고 있어야 한다.
👉 또한 buffer가 비어 있다면 consumer는 buffer가 찰 때까지 기다려야 한다.
⚡ memory 영역은 사적인 영역이어서 privacy가 보장되어야 하기 때문에 프로세스끼리 서로 침범하지 않는다.
Shared-memory라는 특별한 메모리는 os가 관리한다.
Shared buffer
- Circulary linked queue를 이용한다.
- producer와 consumer 프로세스가 공유하는 메모리이다.
👉 in과 out이 같은 자리에 있으면 비어 있다는 뜻이므로 producer가 item을 채우게 되고, 소비할 것이 생기므로 consumer는 item을 가져오게 된다.
Shared memory의 문제점
- 메모리 영역 공유시 메모리 영역에 access, manipulate 하는 것을 프로그래머가 코드를 짜서 명시해 주어야 한다.
👉 그러면 os가 필요없게 된다.
2. IPC in Message-Passing
os가 cooperating processes들에게 API를 제공해 주어 커뮤니케이션시 message-passing을 쉽게 할 수 있도록 해준다.
Message-passing 방식은 다음과 같다.
1. send(message)
2. receive(message)
👉 Communication links를 활용한다.
Communication links
- direct or indirect communication
- synchronous and asynchronous communication
- 자동으로 보내거나 명시적으로 버퍼링을 해서 보내기
1. Direct communication
- 명시적으로 누구에게 보낼 지 받는 사람과 보내는 사람 이름을 붙임
👉 send(P, message): send a message to process P
👉 receive(Q, message): recieve a message from process Q
- P와 Q의 commuication link가 자동으로 생성됨
- '두 개'의 프로세스 간의 link이다.
👉 따라서, 하나의 링크만 성립하게 된다.
2. Indirect communication
- 중간에 매개체가 있다.
- 메시지는 포트(옛날에는 mailbox라고도 했다.)를 통해 주고받게 된다.
👉 ports를 통해 Producer가 메시지를 넣고 Consumer가 메시지를 가져간다.
누구에게 보낼지 명시하지 않고 mailbox에 넣기만 한다.
👉 send(A, message): send a message to mailbox A
👉 receive(A, message): receive a message from mailbox A
-
두 개의 프로세스가 포트를 공유할 때 pair 간의 link가 생성된다.
-
두 개의 프로세스 이상이 공유할 수 있다.
👉 여러 개의 다른 links들이 생길 수 있다.
-
os는 새로운 mailbox(port)를 생성해 준다.
👉 mailbox가 send, receive를 할 수 있도록 해주며 필요가 없으면 delete할 수 있다.
👉 os가 create, send, receive, delete 기능만 제공해 주면 된다.
3. Blocking or non-blocking(synchronous or asynchronous)
Blocking은 synchronous(동기화), non-blocking은 asynchronous(비동기화)
Blocking
👉 느림
- Blocking send: 만약 shared memory를 이용하게 되면 consumer가 buffer에 있는 데이터를 다 소비하지 못해서 consumer가 대기 상태가 될 경우 producer 역시 대기 상태가 된다.(대기)
- Blocking receive: receiver가 메시지를 다 못받아서 받을 때까지 기다리는 경우(대기)
non-blocking
👉 빠름
- Non-blocking send: sender는 message를 보내 놓고 자기 할 일을 함
- Non-blocking receive: receiver가 valid message를 받거나 만약 없으면 null message를 받게 되며 대기하지 않고 자기 할 일을 함
IPC Systems 예시
Shared Memory: POSIX Shared Memory
POSIX: Portable Operating System Interface(for uniX)
👉 운영체제의 표준화 시도
- memory-mapped files를 이용해 shared memory를 생성한다.
👉 파일을 오픈하면 파일은 보통 hard disk의 storage 영역을 잡는데, 메모리에 파일을 생성하면 속도가 매우 빠르게 됨
- 일일이 shm-open, write, read, close를 해주어야 하는 불편함이 있음
Message Passing: Pipes
UNIX에서 초창기에 사용하던 IPC 매커니즘이다.
- pipe는 두 개의 프로세스가 커뮤니케이션 하는 도구처럼 행동한다.
- unidirectional
- two-way communication(왔다갔다가 가능한가?-> 파이프 두 개를 만들면 가능함)
- 구현의 편의상 parent-child 관계를 가져야 함
- 네트워크에서 사용이 불가능함
👉 네트워크를 통해서는 갈 수 없으며, 이를 가능하게 하는 것이 'socket'
1. Ordinary pipes
- P와 Q가 있을 때 상대방이 누구인지 알아야 하기 때문에 P가 parent, Q를 child라 함
- parent가 pipe를 create하면 이를 child와 커뮤니케이션 하는 데 사용함
- P -> Q pipe(fd[0]), Q -> P pipe(fd[1]) 을 만들면 양방향 통신이 가능함
👉 Producer-Consumer 관계이며 producer가 write, consumer가 read를 한다.
- One-way communication을 하고 싶으면 pipe를 하나만 만들면 된다.
2. Named pipes
- parent-child 관계가 없이도 사용 가능(고도화된 파이프)
원격 컴퓨터끼리의 pipe communication
Sockets
- 원격에서 컴퓨터끼리 프로세스 간에 통신할 때 사용한다.
- IP address를 이용해 컴퓨터를 특정하며, 컴퓨터끼리 연결된 pipe는 port를 이용해 특정한다.
- 즉, ip address + port = socket
- 두 개의 원격지에 있는 컴퓨터와의 연결을 의미하는 pipe 형태의 connection을 의미한다.
- 그러나, 컴퓨터끼리 성능이 다를 경우 데이터 형식을 일일이 지정해 socket으로 보내야 하는 번거로움이 있었음
👉 이를 해결하기 위해 등장한 것이 RPCs
- 자바에서 만든 socket programming 세 가지(자바에서 socket을 사용하기 쉽도록 만듦)
👉 Socket class: connection-oriented(TCP socket)
👉 DatagramSocket class: connectionless(UDP socket)
👉 MulticastSocket class: multiple recipients
RPCs(Remote Procedure Calls)
- 원격의 networked system에 있는 process들 간의 원격 호출을 추상화 한다.
- IPC의 확장 개념으로, network에 연결되어 있는 컴퓨터끼리 통신하는 것을 말한다.
- 네트워크 커넥션을 통해 원격에 있는 함수를 호출하는 것을 말한다.
- 클라이언트가 remote host에 있는 함수(procedure)를 호출할 수 있도록 해주면 된다.
- client side에 있는 Stub을 이용해 함수를 호출할 수 있는데 함수의 파라미터를 넘겨줄 때 컴퓨터 시스템에 따라 형식과 형태를 정해서 전달해야 하는 문제가 생긴다.
👉 이를 해결하기 위해 원격 컴퓨터끼리 데이터를 주고 받기 위해 데이터를 정렬하는 것을 marsharling이라 하는데, 컴퓨터끼리 marshaling한 데이터를 주고 받게 된다.