운영체제 | 프로세스끼리 통신하기

Jihun Kim·2021년 10월 27일
0

운영체제

목록 보기
3/5
post-thumbnail

프로세스의 실행

  1. independent processes
  2. 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를 활용한다.

  1. direct or indirect communication
  2. synchronous and asynchronous communication
  3. 자동으로 보내거나 명시적으로 버퍼링을 해서 보내기

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한 데이터를 주고 받게 된다.
profile
쿄쿄

0개의 댓글