ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로세스 간 통신
    운영체제 2022. 6. 14. 23:14

    프로세스 간 통신 분류

    범위에 따른 분류

    종류 설명
    프로세스 내 통신 한 프로세스 내 여러 스레드 간의 통신으로, 전역 변수나 파일을 이용한다.
    프로세스 간 통신 한 컴퓨터 내의 여러 프로세스 간의 통신으로, 전역 변수, 공용 파일, 파이프를 이용한다.
    네트워크 통신 네트워크로 연결된 여러 컴퓨터 간의 통신으로, 소켓을 사용하여 데이터를 주고받는다.

    통신 방향에 따른 분류

    종류 설명 예시
    양방향 통신 데이터를 동시에 양방향으로 전송할 수 있는 구조이다. 소켓 통신
    반양방향 통신 데이터를 양방향으로 전송할 수 있지만, 특정 시점에 한 방향으로만 전송할 수 있는 구조이다. 무전기
    단뱡향 통신 한쪽 방향으로만 데이터를 전송할 수 있는 구조이다. 전역 변수, 파이프 등

    동기화(synchronization) 여부에 따른 분류

    상대방이 언제 데이터를 보낼지 모르는 경우, 데이터를 받는 쪽에서는 반족적으로 점검하는 수밖에 없다. 이와 같이 상태 변화를 살펴보기 위해 반복문을 무한 실행하며 기다리는 것을 무한 대기(busy waiting)라 한다. 그러나 이는 시스템 차원에서 큰 자원 낭비이다.

    이를 해결하기 위해서는 데이터가 도착했음을 알려주는 동기화를 사용해야 한다. 프로세스 간 통신은 동기화 기능의 존재 여부에 대기가 있는 통신(blocking communication), 대기가 없는 통신(non-blocking communication)으로 나뉜다.

    종류 설명 예시
    대기가 있는 통신 동기화를 지원하는 방식으로, 받는 쪽은 데이터가 도착할 때까지 대기 상태에 머무른다. 파이프, 소켓
    대기가 없는 통신 동기화를 지원하지 않는 방식으로, 바쁜 대기를 사용하여 데이터 도착 여부를 확인한다. 전역 변수, 파일

    프로세스 간 통신 종류

    전역 변수 통신

    공동으로 관리하는 메모리를 사용하여 데이터를 주고받는 방식이다. 데이터를 보내는 쪽에서는 값을 쓰고, 받는 쪽에서는 값을 읽는다. 이 방식은 부모/자식 관계와 같이 직접적인 관련이 있는 프로세스 간에 사용한다. 물론 서로 관련이 없는 프로세스 간에도 extern 전역 변수로 통신할 수 있다.

    int GV; // 전역 변수 선언
    
    int main() {
        // ...
    }

    한 쪽에서 데이터를 쓴 후에 다른 한쪽에서 읽는 방식을 사용하여 반양방향적으로 통신이 가능하다. 물론 한 쪽이 데이터를 언제 쓸지를 다른 쪽에서 알 수 없기 때문에 양쪽에서는 바쁜 대기를 통하여 전역 변수를 주기적으로 확인해야 한다.


    파일 통신

    파일 입출력은 크게 열기, 읽기, 쓰기, 닫기로 나뉜다.

    #include <stido.h>
    #include <unistd.h>
    #include <fcntl.h>
    
    int main(){
        int fd;
        char buf[5];
    
        fd = open("com.txt", 0_RDWR);
        write(fd, "Test", 5);
        read(fd, buf, 5);
        close(fd);
    
        exit(0);
    }

    open에서는 파일이 존재하는지, 해당 파일에 쓰기 권한이 있는지를 확인한다. 정상적으로 파일을 사용할 수 있다면 file descriptor(fd)를 반환받는다. 그 다음 이 file descriptor인 fd를 사용하여 읽기/쓰기(read, write)를 할 수 있다. 그 다음에는 파일을 닫아주면 된다.

    이 코드를 프로세스 관점에서 살펴보자. write는 저장장치에 데이터를 전송하는 명령, read를 데이터를 가져오는 명령이다. 결국 파일 입출력도 일반 프로세스와 입출력 프로세스 간의 통신이다.


    파일 입출력의 경우 프로세스가 알아서 동기화를 해야 한다. 주로 부모 프로세스가 wait()를 사용하여 자식 프로세스의 작업이 끝나기를 기다렸다가 작업을 한다.


    파이프 통신

    파이프는 운영체제가 제공하는 동기화 통신 방식이다. 파일처럼 open() 함수로 descriptor를 얻어서 작업을 하고 close() 함수로 닫는다. 파이프는 단방향 통신이기 때문에 양방향 통신을 위해서는 2개를 사용해야 한다.


    파이프는 운영체제가 동기화를 지원하기 때문에, 파이프의 값을 읽기 전에는 프로세스가 대기 상태를 유지한다는 특징이 있다. 위 그림은 2개의 프로세스가 파이프 2개를 통해 통신하는데, 값을 읽을 때까지 대기하다가, 읽고 나서 대기 상태가 해제되면 값을 보내는 방식을 나타낸 것이다.

    파이프는 이름 없는 파이프와 이름 있는 파이프로 나뉘는데, 전자는 부모/자식 프로세스와 같이 서로 관련 있는 프로세스 간 통신에 사용되고, 후자는 특수 파일을 이용하며, 서로 관련 없는 프로세스 간 통신에 사용된다.


    소켓 통신

    다른 컴퓨터의 함수를 호출하는 것은 원격 프로시저 호출이라 하는데, 이러한 원격 프로시저 호출은 소켓을 이용하여 구현한다. 다른 컴퓨터의 프로세스와 통신을 하기 위해서는 해당 컴퓨터의 위치를 파악하고, 해당 컴퓨터의 어느 프로세스와 통신을 할지를 결정해야 한다. 이 두가지를 위해 소켓은 IP주소와 포트로 구성된다.

    소켓에 쓰기 연산을 하면 데이터가 전송되고, 읽기 연산을 하면 데이터를 받게 된다.


    소켓은 프로세스 동기화를 지원하기 때문에 양쪽 프로세스가 바쁜 대기가 필요없다. 또한 파이프와는 달리 1개로도 양방향 통신이 가능하다.


    Reference

    쉽게 배우는 운영체제
    https://helloworld-88.tistory.com/215

    '운영체제' 카테고리의 다른 글

    교착 상태 - (2) 해결 방법  (0) 2022.06.19
    교착 상태 - (1) 정의 및 필요조건  (0) 2022.06.18
    공유자원과 임계구역  (0) 2022.03.31
    인터럽트 처리  (0) 2022.03.28
    스케줄링 알고리즘  (0) 2022.03.25

    댓글

Designed by Tistory.