관리 메뉴

사과하는 제라스

7. IPC(Inter Process Communication) 본문

대학 전공 공부/운영체제

7. IPC(Inter Process Communication)

Xerath(제라스) 2022. 11. 17. 20:22

목차

    728x90
    반응형

    프로세스들이 어떻게 서로 협력을 할 수 있음...?

    OS는 이를 어떻게 지원함...?

     

    궁금해...!!!

     


    IPC란...?

    : 프로세스들 간에 데이터/정보를 주고 받기 위한 메커니즘.

    -> 커널에서 IPC를 위해 System Call 형태로 도구를 제공함.

    (프로세스들은 이 System Call들을 호출함으로서 프로세스 간에 통신할 거라고 OS에게 얘기해 줌.-> OS는 그 프로세스들에게 그 기능을 사용 가능하게 해줌.)

     

    - IPC의 필요성

    : Process 협력 모델을 구현하기 위해서 반드시 필요함.

    -> 실행 중인 프로세스는 협력하는 다른 프로세스의 영향을 받음.

     어떤 시스템이 돌아갈 때 여러 프로세스들이 사용되는데 그들 간에는 통신을 해야 함. 이러한 통신을 위해서는 IPC가 필요함.

     

    IPC 모델 2가지 - 공유 메모리(Shared Memory), 메시지 교환(Message Passing)

    공유 메모리

    : 프로세스의 특정 메모리 영역을 공유하는 방식.

    공유 메모리 모델 방식

    - 응용 프로그램 레벨에서 통신 기능을 제공하기에, 공유 메모리가 한번 설정되면 이후에는 OS의 도움이 없어도(커널의 도움이 없어도) 협력이 가능함.

     

    ex. Shared Memory

     

    - 동작 방식: Read / Write

    -> 프로세스들의 주소 공간 중 일부를 공유 메모리로 설정. 이후 프로그램에서 바로 접근해서 데이터를 읽거나 씀.

    메시지 교환

    : 공유 메모리 없이 동작함. 커널로 메시지를 보내고 이를 받아오는 방식으로 메시지 통신을 함.

    ∴ 교환 시마다 매번 커널의 도움을 받아야 함.

    메시지 교환 모델 방식

    - Client-Server 방식의 통신.

     

    ex. Pipe, Message Queue, Socket

     

    - 동작 방식: Send / Receive

    -> 커널을 통해 메시지를 전송함. 때로는 커널에 데이터를 버퍼링 되어 있다가(커널이 갖고 있다가) 프로세스에 전달됨.

    - Context Switching에 연관됨.(상대가 실행 중이지 않을 때 메시지를 전송해주는 건 의미없기 때문.)

     

    두 방식의 큰 차이점: OS(커널)를 거쳐서 메시지를 전송해야 하느냐와 공유 메모리를 두고 read/write만 해서도 데이터를 주고받을 수 있느냐의 차이.

    두 모델의 차이

    IPC에서 동기화의 필요성

    - 메시지 교환 방식 - 커널이 동기화를 제공하기에 따로 프로그램에서 동기화 고려 X.

     

    - 공유 메모리 방식 - 메모리 영역에 대한 동시 접근을 제어하기 위한 방법이 필요. ex. Locking, 세마포어(Semaphore)

     

    Pipe

    : 하나의 프로세스가 다른 프로세스로 데이터를 직접 전달하는 방법.

     

    - 데이터는 단방향으로만 이동함.

    ∴ 양방향 통신을 위해서는 2개의 pipe가 필요함.

     

    - 하나의 pipe에서는 1:1 통신만 가능함.

    - 보내진 순서대로만 받음.

    - 용량이 제한되어 있어서 꽉 차면 사용 불가능.

    ∴ Receive를 해주어야 그만큼 비워져서 추가로 보낼 수 있어짐.

    Pipe 관련 예시 코드(hello, world. 메시지를 parent 프로세스에서 child 프로세스로 보내는 코드)

    Signal

    : 특정 프로세스에게 커널을 통해 Event를 전달하는 방법.

     

    - 송신 프로세스: 여러 신호 중 하나를 특정 프로세스에 보냄. 수신할 프로세스의 상태에 상관없이 수행 가능함.

    - 수신 프로세스: 신호 종류에 따라 신호 처리 방법을 지정할 수 있음.(무시 / 단순히 신호를 붙잡아 둠 / Signal Handler를 두어 처리)

     

    - 비동기적인 동작

    : 아무리 송신 프로세스가 수신 프로세스에게 시그널을 보내도 이 시그널의 처리는 수신 프로세스가 Scheduling되어야 가능함.(so 당연..!)

     

    Signal 관련 예시 코드

    * sigaction() : 시그널 핸들러를 등록하는 함수.

    * kill : 프로세스를 죽이는 것 외에도 시그널을 전달할 때도 사용함.

    * waitpid : 자식 프로세스를 기다리다가 종료되면 빠져나감.

     

    Shared Memory

    : 두 개 이상의 프로세스들이 하나의 메모리 영역을 공유하여 통신하는 방법.

     

    - 메모리의 직접 사용이 가능하기에 빠르고 자유로운 통신이 가능함.

    - 두 개 이상의 프로세스가 동시에 메모리를 변경하지 않도록 프로세스 간의 동기화가 필요함.

     

    Shared Memory 관련 예시 코드(11,22로 저장되어 있던 값을 자식 프로세스에서 33,44로 바꾸는 코드)

    * shmget : 공유 메모리를 생성하는 함수.

    * shmat: 공유 메모리의 위치를 찾아서 저장하는 함수.

     

    Message Queue

    : 고정된 크기를 갖는 Message를 Linked-List를 통해 통신하는 방법.

     

    - Message의 단위: 통신하고자 하는 프로세스 간의 약속이 필요함.

    - 여러 프로세스가 동시에 접근이 가능한 방식이기에 동기화가 필요함!!!

     

    Message Queue 관련 예시 코드

    * MSG: 메시지의 타입과 내용이 형식을 정해둔 구조체

    * msgget: 메시지 Queue 생성하는 함수

    * msgsnd: 메시지를 쓰는 함수

    * msgrcv: 메시지를 읽는 함수

    Socket

    - Port를 이용하여 통신하는데에 사용됨.

    -> Port라는 OS가 제공하는 Abstraction을 가지고서 그 번호를 이용해서 통신 상대 프로세스의 Socket을 찾아감.

     

    - 다른 IPC와 달리에 프로세스의 위치에 상관없음.(Local도 가능하고 Remote도 가능함.)

    -> 이건 Port 덕분에 가능한데,

    Local은 Port 번호만으로도 식별이 가능함.

    Remote는 IP주소+ Port 번호로 식별이 가능함.

     

    - 연결의 Semantics를 정할 수 있음.(TCP vs UDP)

     

    - Port를 사용하기에 Machine Boundary가 상관없음.

    - Port로 여러 웹 브라우저를 생성하는데 이때 Remote Machinedms Local Machine의 Port만 보임(그림처럼 ㅇㅇ)

    Socket 관련 사용 코드

    728x90
    반응형

    '대학 전공 공부 > 운영체제' 카테고리의 다른 글

    9. Synchronization(동기화)-1  (0) 2022.11.24
    8. Thread  (1) 2022.11.19
    6. CPU Scheduling  (1) 2022.11.02
    5. Computer Architecture  (0) 2022.10.11
    4. Process  (0) 2022.10.09