[OS] 프로세스 (3) - 프로세스 협력 메커니즘

doongidoong·2024년 1월 18일
0

운영체제

목록 보기
4/8

✅ IPC(Inter-process communication)

1장에서 말했듯 프로세스는 독립된 자원을 할당받음으로 각각 고유의 공간을 가지게 된다.
이 때문에, 다른 프로세스와 자원을 공유하기 위해서는 IPC(Inter-process communication)가 필요하다.

✔️ Cooperating Process v. Independent Process

운영체제의 프로세스는 Independent Process이거나 Cooperating Process이다.

  • Independent Process
    • 다른 프로세스의 수행에 영향을 주거나 받지 않는다.
  • Cooperating Process
    • 다른 프로세스의 영향을 주거나 영향을 받을 수 있다.
    • Process Cooperation은 다음과 같은 장점을 갖는다.
      • 정보 교류
      • 연산 속도 증가


✅ IPC 메커니즘 방식

  • Shared Memory
  • Message Passing
  • Pipe

✔️ 공유메모리(Shared Memory)

서로 다른 프로세스 간에 일부 주소 공간을 공유하게 하는 방식

  • 커널을 거치지 않기 때문에 속도가 빠르지만 메모리에 동시에 접근하는 것을 방지하기 위해 별도의 구현이 필요하다.

Shared Memory의 위치
프로세스 주소 공간 내부에 위치한다. 다른 프로세스와 Shared Memory를 통해 통신하고자 하는 프로세스는 다른 프로세스의 주소 공간을 자신의 주소 공간에 붙여야 한다.
일반적으로 운영체제는 한 프로세스가 다른 프로세스의 주소 공간에 접근하는 것을 막고 있지만 Shared Memory를 이용한다는 것은 그러한 제한을 잠시 거두는 것이다.

✔️ 메시지 패싱(Message Passing)

메시지 패싱은 동일한 주소 공간을 공유하지 않고 커널을 통해 메시지를 주고 받는 방식

  • Context Switch가 발생하기 때문에 속도가 느리지만, 커널이 기본 기능을 제공하기 때문에 공유 메모리 방식보다 구현이 쉽다.
  • 기본적으로 Send/Receive 작업을 통해 메시지를 교환해야 한다.

메시지 패싱에서 메시지를 교환하는 방식은 Direct, Indirect 두 방식으로 나뉜다.

1. Direct(링크)

  • Direct 방식에는 통신하려는 프로세스의 이름을 명시적으로 표시해야 한다.
    • send(P, message)
      • 프로세스 P에게 메시지를 전송한다.
    • receive(Q, message)
      • 프로세스 Q로부터 메시지를 수신한다.
  • 각각의 프로세스 쌍에 대하여 연결(Link)이 자동으로 이루어진다. 따라서 프로세스끼리 상대의 정보(이름)을 알고 있어야 한다.
    • 이름을 반드시 알아야하는 단점이 있으며 제한된 모듈성을 가진다.

💡 모듈성
모듈성이란 구성요소 일부를 변경할 때 전체에 영향을 미치지 않도록 일부만 바꿀 수 있도록 설계되어 있는 것을 의미하는데 Direct 방식은 어떤 프로세스의 이름을 변경한다면 연결되어 있는 모든 Sender와 Recieve 프로세스를 변경해야한다.

  • 이러한 링크는 두 개의 프로세스만 연결하며 하나의 링크만이 두 프로세스 간에 존재한다.
    • 링크는 주로 양방향이지만 단방향일 수도 있다.

2.Indirect(메일박스)

  • 메시지는 mailbox(port)를 통해 전송하고 수신된다.

    • send(A, message)
      • mailbox A로 메시지를 전송한다.
    • receive(A, message)
      • mailbox A에서 메시지를 회수한다.
  • mailbox (a.k.a port)는 메시지를 저장, 삭제할 수 있는 객체라 할 수 있다.

  • 각각의 mailbox는 unique한 ID를 가지고 있다. 프로세스들은 서로 mailbox를 공유하고 있는 경우 링크가 생성되어 통신할 수 있다.

    • 양방향, 단방향 뿐만 아니라 셋 이상 통신도 가능하다. (many-to-many, one-to-many)

➕ 동기화 문제

동기화 문제란 다른 프로세스가 동시에 어떤 자원에 접근했을 때 예측과 다른 결과를 가지게 되는 문제이다.
메시지 패싱은 이런 동기화 문제를 해결하기 위해 Blocking 방식과 Non-Blocking 방식이 사용된다.

  • Blocking Send
    • mailbox나 수신 측에서 메시지를 회수하기 전까지 전송측의 메시지 전송이 제한된다.
  • Non-Blocking Send
    • 메시지를 전송하는 측에서 바로바로 메시지를 전송한다.
  • Blocking Receive
    • 메시지를 수신하는 측은 회수할 메시지가 올 때까지 기다린다.
  • Non-Blocking Receive
    • 메시지를 수신하는 측은 메시지를 받거나 NULL을 받는다.

➕ 임시 큐

프로세스 사이에서 교환되는 메세지는 Temporary Queue에 거주한다. 이런 임시 큐는 세 방법 중 하나로 구현된다.

  • Zero Capacity : 발신자는 반드시 수신자를 기다려야 한다.
  • Bounded Capacity : 링크가 꽉 찬다면 발신자는 기다려야한다.
  • Unbounded Capacity : 발신자는 전혀 기다리지 않는다.

✔️ Pipe 방식

프로세스와 프로세스를 연결하는 바이트 스트림

  • 채널의 한 쪽 끝에서 쓰여진 데이터가 다른 한 쪽 끝에서 읽히는 방식이다.
  • UNIX 시스템의 첫 번째 IPC 매커니즘 중 하나이다.
  • Logical한 관점에서 pipe는 char type 데이터를 저장하는 Queue로 볼 수 있다.

1. 익명 PIPE(Anonymous PIPE)

  • 파이프는 두 개의 프로세스를 연결하게 되고, 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 데이터를 읽기만 할 수 있다.

    • 한쪽 방향으로만 통신이 가능한 파이프의 특징 때문에 Half-Duplex(반이중) 통신이라고 부르기도 한다.
  • 따라서 파이프는 단방향 통신만 가능하기 때문에 양방향으로 정보를 주고받으려면 두 개의 파이프가 필요하다.

    • PIPE와 같은 반이중 통신의 경우 하나의 통신선로는 읽기나 쓰기 중 하나만 가능하므로 만약 읽기와 쓰기, 즉 송/수신을 모두 하기 원한다면 두개의 파이프를 만들어야만 가능
  • 익명 파이프(Pipe)는 통신을 할 프로세스가 명확하게 알 수 있는 경우 사용


2. Named PIPE(FIFO)

  • 프로세스 통신을 위해 이름이 있는 파일을 사용하는 방식
    • UNIX는 pipe를 파일의 한 종류로 취급한다. 그래서 pipe는 read(), write() 시스템 콜을 통해 접근이 가능하다.
    • Named PIPE의 생성은 mkfifo를 통해 이뤄지는데, mkfifo가 성공하면 명명된 파일이 생성된다.
  • 따라서 Named PIPE는 부모 프로세스와 무관하게 전혀 다른 모든 프로세스들 사이에서 통신이 가능하다.
  • Named PIPE도 PIPE의 단점인 읽기/쓰기가 동시에 가능하지 않으며, read-only, write-only만 가능
    • 하지만 통신선로가 파일로 존재하므로 하나를 읽기 전용으로 열고 다른 하나를 쓰기 전용으로 열어서 이러한 read/write문제를 해결 할 수 있음

호스트 영역의 서버 클라이언트 간에 전이중 통신을 위해서는 결국 PIPE와 같이 두개의 FIFO파일이 필요하다.

💡 Anonymous PIPE vs Named PIPE
Named PIPE는 전혀 모르는 상태의 프로세스들 사이의 통신의 경우 사용 가능하나 익명 파이프(PIPE)는 같은 PPID(같은 부모 프로세스)를 가지는 프로세스들 사이에서만 통신이 가능하다.

💡 메세지 패싱과 차이
메시지 패싱은 양방향 통신이 가능하며 명시적인 메시지를 사용하는 범용적인 IPC 방식이고, 파이프는 단방향 통신에 주로 사용되며 한 방향으로 데이터의 흐름을 지원하는 IPC 방식
메세지 패싱은 보통은 메시지 큐, 소켓, RPC(Remote Procedure Call) 등을 사용하여 구현하며 파이프는 운영 체제에서 제공하는 파이프 또는 네트워크 상에서 사용되는 파이프라인 등을 이용한다.

profile
안녕하세요! 신입 개발자입니다.

0개의 댓글