[운영체제] 프로세스 간 통신

찬들이·2022년 8월 15일
0

컴퓨터공학

목록 보기
13/34

🎯 IPC

  • 프로세스들 간의 의사소통하는 것을 IPC라고 한다.

  • 일반적인 방법으로는 프로세스들 간의 공유가 불가능하지만, 동시에 접근 가능한 메모리 즉 프로세스들이 공유하는 메모리가 필요하다.

    공유 메모리(Shared Memory)

    • 공유 메모리는 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용한다.
    • 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당한다. 이후 어떤 프로세스건 해당 메모리 영역에 접근할 수 있다.
    • 프로세스간 Read와 Write를 모두 필요로 할 때 사용한다.
    • 중개자 없이 곧바로 메모리에 접근할 수 있기 때문에 모든 IPC 중에서 가장 빠르게 작동한다.

    파이프(Pipe)

    • 통신을 위한 메모리 공간(버퍼)을 생성하여 프로세스가 데이터를 주고 받게끔 한다.
    • 파이프는 익명 파이프와 네임드 파이프 2가지로 나뉘어진다.
    1. 익명 파이프(Anonymous PIPE)
      • 일반적인 파이프
      • 통신할 프로세스가 명확하게 알 수 있는 경우 사용.
      • 파이프는 두 개의 프로세스를 연결하고, 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 데이터를 읽기만 할 수 있다.
      • 한 쪽 방향으로만 통신이 가능한 파이프의 특징 때문에 반이중통신이라고 부르기도 한다.
      • 송/수신을 모두 하기 원한다면 두 개의 파이프를 만들어야 가능하다.
      • 간단하게 사용이 가능하고, pipe 함수로 생성한다.
      • 단점
        • 반이중 통신이라 프로세스가 읽기와 쓰기 통신을 모두 해야한다면, PIPE 두 개를 만들어야 하므로, 구현이 복잡해질 수 있다.
        • 전이중 통신을 고려해야될 상황이라면 낭비가 심하게 때문에 좋은 선택이 아니다.
    2. 네임드 파이프(Named PIPE)
      • 전혀 모르는 상태의 프로세스들 사이의 통신에 사용
      • 익명 파이프의 확장된 상태로 부모 프로세스와 무관한 다른 프로세스도 통신 가능.
        • 프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문에 가능하다.
        • FIFO라 불리는 특수 파일을 이용해 서로 관련 없는 프로세스 간 통신에 사용한다.
        • 외부 프로세스와 통신 가능
      • mkfifo or mknod 함수로 생성 가능.
      • 단점
        • 익명 파이프와 같이 반이중 통신이라는 단점이 있다.

    소켓(Socket)

    • Unix 도메인 소켓 또는 IPC 소켓은 동일한 호스트 운영체제에서 실행되는 프로세스간 데이터를 교환하기 위한 데이터 통신 엔드 포인트이다.
    • 네트워크 소켓 통신을 통해 데이터를 공유한다.
    • 클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용한다.
    • 전이중(양방향)통신이 가능하다.
    • 서버/클라이언트 환경을 구축하는데 용이하다.
    • 중대형 어플리케이션에서 주로 사용한다.

    메시지 큐(Message Queue)

    • 입출력 방식은 Named 파이프와 동일하다.
    • 다른점은
      • 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간을 사용한다.
      • PIPE나 FIFO와는 달리 다수의 프로세스간 메세지를 전달 할 수 있다.
    • 사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
    • 메시지의 접근을 위해서는 키가 필요하다.

    메모리 맵(Memory Map)

    • 공유 메모리처럼 메모리를 공유해준다.
    • 메모리 맵은 열린 파일을 메모리에 맵핑시켜서 공유하는 방식이다.
    • 주로 파일로 대용량 데이터를 공유해야 할 때 사용한다.
    • FILE IO가 느릴 때 사용하면 좋다.
    • 대부분의 운영체제에서는 프로세스를 실행할 때 실행 파일의 각 세그먼트를 메모리에 사상하기 위해 메모리 맥 파일을 이용한다.
    • 메모리 맵 파일은 파일의 크기를 바꿀 수는 없으며 메모리 맵 파일을 사용하기 이전, 또는 이후에만 파일의 크기를 바꿀 수 있다.

🎯 공유자원과 임계구역

공유자원

  • 공유자원은 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말한다.
  • 공유자원은 공동으로 이용되기 때문에 누가 어떻게 데이터를 쓰냐에 따라 결과가 달라질 수 있다.
  • 문제점
    * 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황을 Race Condition이 발생했다고 한다.

    임계구역

  • 공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역을 임계구역(Critical Section)이라고 한다.

    임계구역 관련한 문제와 해결 방법

    생산자-소비자 문제

    • 임계구역 관련한 유명한 문제로 생산자 소비자 문제가 있다.
    • 생산자는 계속 물건을 생산해서 버퍼에 넣고, 소비자는 계속 버퍼에서 물건을 가져온다.
    • 버퍼의 크기 확인을 위해 sum이라는 전역변수를 사용하는데, 이때 생산자와 소비자가 동시에 실행되면 문제가 발생한다.

      해결 방법

    • 상호배제 : 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없다.
    • 한정 대기 : 어떤 프로세스도 무한 대기하지 않아야 한다.
    • 진행의 융통성 : 한 프로세스가 다른 프로세스의 진행을 막아선 안 된다.

🎯 교착상태와 해결 방법

교착상태(Deadlock)란?

  • 둘 이상의 프로세스가 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하여 무한정 기다리는 현상을 의미한다.

    교착상태 발생 조건

  • 교착상태가 발생하기 위해선 아래 4가지 조건을 모두 충족하면 교착상태가 발생한다.
    ( 모두 만족하면 좋지 않다는 의미이다.)
    상호배제
    점유와 대기
    비선점
    환형 대기

    교착상태 해결 방법

  • 교착상태를 해결하는 방법에는 총 3가지가 있다.
    • 예방 또는 회피
    • 탐지 및 복구
    • 무시

    교착상태 예방

    • 교착상태 발생 조건 중 하나 이상을 부정하여 방지하는 방법

    교착상태 회피

    • 교착 상태가 발생하기 전에 교착상태를 예상하여 안전한 상태에서만 자원 요청을 허용하는 방법
      ( 자원 할당 그래프 알고리즘, 은행원 알고리즘)
    • 회피를 위한 가정 4가지
      • 프로세스 수가 고정되어 있어야 한다.
      • 자원의 종류와 수가 고정되어 있어야 한다.
      • 프로세스가 요구하는 자원 및 최대 자원의 수를 알아야 한다.
      • 프로세스는 반드시 자원을 사용 후 반납해야 한다.
    • 이러한 가정들이 필요하기 때문에 회피는 현실성이 부족하다.

    교착상태 탐지

    • 탐지 알고리즘을 사용하여 교착상태가 발생했는지를 탐지한다.
      ( 대기 그래프, 은행원 알고리즘)
    • 탐지되었다면 복구 기법을 통해 교착상태를 복구한다.
    • 이 방식은 지속적으로 확인하는 작업이 필요하기 때문에 성능 저하가 발생한다.

    교착상태 복구

    • 교착상태가 발생했다면 교착 상태를 일으킨 프로세스를 종료하거나, 할당된 자원을 헤제함으로써 복구를 한다.
    • 복구 방식은 종료와 자원선점 2가지 방법이 있다.
    • 프로세스 종료
      • 교착 상태의 프로세스를 모두 중지 or 교착 상태가 제거될 때까지 한 프로세스씩 중지
    • 자원 선점
      • 교착 상태에 있는 프로세스가 점유하고 있는 자원을 선점하여 다른 프로세스에게 할당하여 해당 프로세스를 일시 정지 시키는 방법.
      • 자원 선점에 필요한 고려사항
        1. 희생자 선택
        2. 롤백
        3. 기아상태
profile
Junior-Backend-Developer

0개의 댓글