본문 바로가기
컴퓨터공학기초 개념/운영체제

22. 프로세스 - IPC 기법(signal, socket)

by devraphy 2021. 4. 27.

- IPC 기법이란, 컴퓨터 구조적으로 불가능한 커뮤니케이션 간의 소통을 가능하게 하는 일종의 우회방법이다. 

- 다양한 IPC 기법이 존재하지만, 가장 많이 사용하고 있는 signal과 socket이 있다.

- 사실 signal과 socket은 IPC를 위해서 만들어진 기능은 아니지만, IPC가 가능하기에 많이 사용되고 있다.

- signal과 socket의 개념을 간단하게 알아보자. 

 

1. Signal 기법이란? 

  • 유닉스에서 30년 이상 사용된 전통적인 기법
  • 어떤 커널 또는 프로세스에서 다른 프로세스에게 어떤 이벤트가 발생되었는지를 알려주는 기법
  • 프로세스 코드에 시그널 핸들러를 등록하여, 해당 시그널을 처리하는 방식으로 동작한다. 

 

a) Signal 이란?

  • 시그널은 운영체제에 기본적으로 정의되어 있는 이벤트다. 
  • 리눅스의 경우, 64개의 시그널이 존재한다. 

리눅스의 시그널

 

b) 주요 Signal 

  • SIGKILL: 프로세스를 죽이는 명령어로 슈퍼관리자가 사용하는 시그널이다. 어떤 경우든 프로세스가 죽도록 되어있다. 
  • SIGALARM: 알람을 발생한다. 
  • SIGSTP: 프로세스를 멈춘다. (ctrl + z) 
  • SIGCONTL: 멈춘 프로세스를 재실행한다.
  • SIGINT: 프로세스에 인터럽트를 보내서 프로세스를 죽인다.(ctrl + c) 
  • SIGSEGV: 프로세스가 다른 메모리영역을 침범함을 알린다. 

 

c) 어떻게 통신하는가?

  • 프로세스 A에서 특정 이벤트(= 시그널)이 발생하면 프로세스 B에게 알리는 형태 
  • 그에따라 특정 명령어를 실행하도록 할 수 있다. 

2. Signal 예제 코드 

a) 시그널 핸들러 등록 및 구현

static void signal_handler (int signo) { // 시그널 핸들러 함수 정의 
    printf("Catch SIGINT! \n");
    exit (EXIT_SUCCESS);
}

int main (void) {
    if (signal (SIGINT, signal_handler) == SIG_ERR) { // SIGINT가 발생히면 핸들러를 실행해라
        printf("Can't catch SIGINT! \n");
        exit (EXIT_FAILURE);
    }
    
    for (;;)
        pause();
    return 0;
}

 

 

b) 시그널 핸들러 무시

int main (void) {
    if (signal (SIGINT, SIG_IGN) == SIG_ERR) { // SIG_IGN = signal ignore
        printf("Can't catch SIGINT! \n");
        exit (EXIT_FAILURE);
    }
    
    for (;;)
        pause();
    return 0;
}

 

- 이 외에도 시그널 블록(정지, 멈춤) 등의 기능을 수행할 수 있으며, 위의 예시와 같이 시그널 핸들러를 정의하여 특정 시그널에 대한 특정 동작을 수행하도록 할 수 있다. 만약 등록된 시그널 핸들러가 없다면, 커널에서 정의된 기본 동작을 수행한다.

 


3. 시그널이 처리되는 과정

- 컴퓨터 구조에 대한 깊은 이해를 요구하는 부분이므로, 간단하게 알아보자. 

 

 

  • 시그널은 PCB에 의해 처리된다. 
  • PCB에서 해당 프로세스가 처리해야하는 시그널 관련 정보를 관리한다.
  • PCB는 시그널을 처리하는 자료구조를 갖고 있다. 
  • 커널 영역이나 다른 프로세스에서 시그널이 넘어오면 위의 그림처럼, 시그널에 해당하는 자료구조를 이용하여 시그널을 처리한다. 

 

a) 그래서 시그널은 어떻게 처리되는가?

  • 프로세스를 실행하면 시스템콜, 스케줄링, 인터럽트 등에 의해 사용자 영역과 커널영역을 빈번하게 전환한다.
  • 사용자 영역에서 커널영역으로 넘어가서 작업을 처리한 뒤, 다시 사용자 영역으로 넘어가기 직전에 해당 프로세스의 PCB를 확인하여 Signal이 있다면 해당 Signal을 처리한 후 사용자 영역으로 돌아가는 방식으로 동작한다.
  • Signal 핸들러에 의해 특정 동작이 정의되어 있다면, 사용자 모드로 돌아가서 해당 동작을 실행하도록 한다. 

 


4. Socket 이란?

  • 소켓은 네트워크 통신을 위한 기술이다. 
  • 기본적으로 클라이언트와 서버로 나뉘어 컴퓨터간의 네트워크 통신을 가능하게 하는 기술이다.
  • 소켓을 이용한 IPC를 간략하게 설명하자면, 네트워크 기기를 이용한 시스템 콜이라고 할 수 있다. 

 

a) 어떻게 Socket을 IPC 기법으로 사용할 수 있는가?

  • 소켓은 다른 컴퓨터와의 통신을 위한 기술이다.
  • 그렇다면, 본인 스스로와 통신을 할 수 있지 않을까? 하나의 컴퓨터 내에서 서로 다른 프로세스간의 통신 말이다.
  • 이와 같은 이유로 Socket을 IPC 기법으로 사용할 수 있다. 

댓글