ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2024 운영체제 정리 - 3. IPC
    Operating System 2024. 4. 2. 19:16
    728x90

     

     

     

    2024 운영체제 정리 - 3. IPC

     

     

    • 1. 운영체제란
    • 2. Process & Thread
    • 3. IPC
    • 4. CPU Scheduling  
    • 5. Synchronization
    • 6. Virtual Memory 

     

     

     

     

     

    IPC와 관련된 코드적인 내용은 아래 링크에 더 자세히 설명해두었다 

    https://asidefine.tistory.com/94

     

    시스템 프로그래밍 실습 8주차 : IPC

    시스템 프로그래밍 실습 8주차 : IPC [목차] - IPC - Open Files in Kernel - I/O Redirection - Pipes - Anonymous Pipe - Named Pipe (FIFOs) IPC란? IPC = Inter Process Communication! - 프로세스들끼리 데이터를 주고 받는 기능 - IPC

    asidefine.tistory.com

    https://asidefine.tistory.com/98

     

    시스템 프로그래밍 실습 9주차 : System V IPC

    시스템 프로그래밍 실습 9주차 : System V IPC [목차] - System V IPC interface - Message Queue - Shared Memory System V IPC interface 시스템 V IPC - 시스템 V 계열 유닉스에서 개발해 제공하는 프로세스 간 통신방법 - 메

    asidefine.tistory.com

     

     


     

     

    • 프로세스마다 각각 다른 메모리 공간을 가지기 때문에, 데이터를 주고 받기 위해선 IPC (Inter Process Communication)가 필요하다 
    • IPC에는 5가지 방법이 있다 -> 1) 파일, 2) 소켓, 3) 파이프, 4) 메세지 큐, 5) 공유 메모리 
      • 위에서 2) 소켓, 3) 파이프, 4) 메세지 큐는 메세지 전달 방법에 속하며 system call을 사용해서 구현된다 

     

     

    아래에서는 메세지 전달 방식과 공유 메모리 방식을 나눠서 살펴 볼 것이다. 

     

     


    +) IPC와 System V IPC!? 



    유닉스는 처음 개발된 이래 다양한 형태로 발전했으며, 크게 BSD 계열과 시스템 V 계열로 구분할 수 있다.

     System V IPC는 시스템 V 계열 유닉스에서 개발해 제공하는 프로세스 간 통신방법으로, 

    위에서 언급한 5가지 방법 중 메세지 큐, 공유 메모리가 System V IPC에 속한다 (뒤에서 나올 Semaphore도 여기에 속함)


    공통 요소 
    - 시스템 V IPC를 사용하기 위해서는 IPC 객체를 생성해야 함 
    - IPC 객체를 생성하기 위해 공통적으로 사용하는 기본 요소는 키와 식별자



     

     

     

     

     

     

    메세지 전달 (Message Passing)

     

     

    • system call를 통해 kernel에 요청하면 kernel이 다른 process에게 전달 
    • 장점 
      • 안전하고 구현하기 쉬움
    • 단점 
      • 적은 데이터 전달 가능 
      • 속도가 느림 
        • -> System call을 이용하기 때문에 Kernel의 관여를 한 번 거쳐야 하기 때문에 
    •  2) 소켓, 3) 파이프 , 4) 메세지 큐는 메세지 전달 방법에 속함
      • 2) 소켓은 네트워크를 이용하는 방식 
      • 3) 파이프, 4) 메세지 큐는 운영체제 단에서 작동한다 

     

     

     

    • 3) 파이프 (PIPE) 
      • 통신할 프로세스가 명확하게 알 수 있는 경우 사용
        • 부모 자식 or 형제 프로세스 간에만 사용 가능 (외부 프로세스에서는 사용할 수 없다) 
      • 단방향 통신 - 한 프로세스는 데이터를 쓰기만 할 수 있고, 다른 하나는 읽기만 할 수 있다 
        •  송/수신을 모두하고 싶다면 두 개의 파이프를 만들어야 한다 

     

     

     

     

     

    • +) Named PIPE
      • 전혀 모르는 상태의 프로세스들 사이의 양통신에 사용
        • 부모 프로세스와 무관한 다른 프로세스도 통신 가능
      • FIFO 라 불리는 특수 파일을 이용해 서로 관련 없는 프로세스 간 통신에 사용한다.
        • mkfifo() 함수를 통하여 FIFO 파일을 생성한 후 어떤 프로세스라도 이 파일의 경로를 안다면 이 파일에 접근하여 read/write을 할 수 있다

     

    - client (writer) 코드 

    #include <fcntl.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MSG_SIZE 80
    #define PIPENAME "./named_pipe_file"
    
    int main(void) {
      char msg[MSG_SIZE];
      int fd;
      int nread, i;
    
      /* named pipe 열기, Write 전용으로 열기 */
      if ((fd = open(PIPENAME, O_WRONLY)) < 0) {
        printf("fail to open named pipe\n");
        return 0;
      }
    
      /* Data를 보낸다. */
      for (i = 0; i < 3; i++) {
        snprintf(msg, sizeof(msg), "Send Message[%i]", i);
        if ((nread = write(fd, msg, sizeof(msg))) < 0 ) {
          printf("fail to call write()\n");
          return 0;
        }
      }
      return 0;
    }

     

     

     

     

      • 4) Message Queue
        • 입출력 방식은 Named 파이프와 동일하다.
        • 다른 점
          • 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간이다. (메모리를 사용한 PIPE)
          • PIPE나 FIFO와는 달리, 다수의 프로세스간 메시지를 전달 할 수 있음
        • 특징
          • 커널에서 제공하는 Message queue 이기 때문에 EnQueue 하는데 제한이 존재 한다.
          • 각 메시지에는 메시지 유형이 있어 수신 프로세스는 어떤 유형의 메시지를 받을 것인지 선택 가능
        • 사용 방법
          •  msgbuf라는 임의의 구조체를 만들어줘서 message queue에 보내줘야 한다
          • 무조건 맨 처음에는 msgtype이 들어있어야 한다
          • msgsnd할 때는 msgtype을 설정해줘야 하며, msgrcv에서는 원하는 msgtype을 읽어올 수 있다!

     

     

     

     

     

     

    메시지 큐 방식은 위와 같이 메시지를 구분하기 위해 메시지에 태그(번호)를 달아 메시지를 구분 합니다. 위 그림의 동작을 보면 프로세스 A에서는 송신 함수를 통해 메시지 #3을 메시지 큐로 송신하는 과정이고 프로세스 B는 recv(수신 함수)를 통해서 메시지 #2를 프로세스 B의 메모리 공간으로 가져오는 작업입니다

     

     




    2) 소켓 

    • 네트워크 소켓 통신을 통해 데이터를 공유한다.
      • 데이터 교환을 위해 양쪽 PC에서 각각 임의의 포트를 정하고 해당 포트 간의 대화를 통해 데이터를 주고받는 방식이다.
      • 이 때 각각 PC의 PORT를 담당하는 소켓은 각각 하나의 프로세스이다.
      • 즉 해당 프로세스는 임의의 PORT를 맡아 데이터를 송수신 하는 역할을 진행하는 프로세스인 것 입니다.
      • 각각의 PC에서 프로세스를 통해 타 PC PORT에 연결하라는 명령을 보내게 되면 두 프로세스는 서로 확인과정을 거쳐 연결을 진행하고 연결 후 마치 PIPE와 같이 1 대 1로 데이터를 주고받는 방식이다.


        클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용한다.





     

     

     

    공유 메모리 (Shared Memory)

     

    • process들이 주소 공간의 일부를 공유 -> 공유한 메모리 영역에 읽기/쓰기를 통해서 통신을 수행
    • process가 공유 메모리 할당을 kernel에 요청하면 kernel은 해당 process에 메모리 공간을 할당
      • 공유 메모리 영역이 구축된 이후에는 모든 접근이 일반적인 메모리 접근으로 취급되기 때문에 더이상 kernel의 도움없이도 각 process들이 해당 메모리 영역에 접근할 수 있음
      • 단 그래도 공유메모리는 커널에 의해서 관리되긴 함 
    • 장점 
      • 커널의 관여 없이 데이터를 통신할 수 있기 때문에 IPC속도가 빠르다는 장점
      • 단순히 공유 메모리를 point 함으로써 프로세스에서 사용되는 메모리가 증가되지는 않는다.
    • 단점 
      • 동시에 같은 메모리 위치에 접근하게 되면 일관성 문제가 발생할 수 있음 -> 동기화 문제 발생 가능 

     

     

     

     

     

     

     

    728x90
Designed by Tistory.