-
IPC Signal 알아보기System 2023. 10. 7. 18:44728x90반응형
- 목차
함께 보면 좋을 글
https://westlife0615.tistory.com/345
소개.
Signal 은 IPC 통신의 한가지 방식입니다.
IPC 는 Inter-Process Communication 의 약자로 프로세스 간의 통신을 의미합니다.
대표적인 IPC 의 방식은 Shared Memory 와 Signal 등이 있는데요.
Signal 에 대해서 알아보도록 하겠습니다.
Signal 는 어떠한 이벤트나 알림을 특정 프로세스에게 전달하는 방식입니다.
"누가" "무엇을" "누구에게" 가 Signal 에 주요 포인트인데요.
"누가" 에 해당하는 주체는 프로세스, 사용자, OS 가 있습니다.
이를 Origin of Signal 이라고 합니다.
"무엇을" 에 해당하는 정보 또는 행위는 운영체제에 따라서 미리 정해진 Signal 들이 존재합니다.
SIGINT, SIGTERM, SIGKILL 등이 존재합니다.
"누구에게" 에 해당하는 대상은 Signal 을 전달받는 프로세스입니다.
요약하자면,
- A 프로세스가 B 프로세스에게 SIGINT 신호를 보낸다.
- 사용자가 A 프로세스에게 SIGTERM 신호를 보낸다.
- 운영체제가 B 프로세스에게 SIGKILL 신호를 보낸다.
이러한 느낌으로 Signal 을 이해할 수 있을 것 같네요.
Signal 의 종류는 운영체제에서 사전에 정의한 목록들을 사용할 수 있습니다.
따로 Custom 한 Signal 을 만들순 있겠지만 그렇게 사용하진 않아요.
이어지는 내용에서 Signal 의 상세한 내용들과 예시에 대해서 작성해가도록 하겠습니다.
Signal vs Interrupt.
Signal 은 Interrupt 와 유사한 성격이라서 혼란을 야기하곤 합니다.
Signal 을 Software Interrupt, Interrupt 를 Hardware Signal 이라고 부를 정도이니까요.
Signal 와 Interrupt 의 공통점은 이들의 목적에 있는데요.
이들의 목적은 긴급한 (또는 우선순위가 높은) 정보를 전달하고 처리해야한다는 점입니다.
Interrupt 의 경우,
하드웨어의 입력이나 저장, 출력 등 안전하고 즉각적인 처리를 위해서 중요한 이벤트나 긴급한 알림을 전달합니다.
또한 프로세스나 운영체제와 같은 소프트웨어에서는 서로 통신을 위해서 Signal 을 사용합니다.
Signal 이나 Interrupt 모두 우선적으로 CPU 를 점유한다는 의미에서 공통된 특징을 갖습니다.
Interrupt 란.
Interrupt 는 보통 하드웨어에서 사용하는 용어인데요.
키보드나 마우스와 같은 입력장치의 경우에 정보가 입력되면
키보드의 텍스트 정보나 마우스의 위치 좌표 정보가 즉각적으로 처리되어야합니다.
왜냐하면 PC 환경에서 사용자의 입력은 우선순위가 높은 처리 대상이기 때문입니다.
여기서 키보드나 마우스는 관련된 드라이버 프로그램에 의해서 CPU 로 Interrupt 요청을 보낼 수 있습니다.
외부 하드웨더들은 Interrupt 를 위한 별도의 Interrupt Line 을 통해서 CPU 에 직접적으로 신호를 보낼 수 있습니다.
CPU 가 어떤 작업을 열심히 처리중이라도, Interrupt Line 을 통한 Interrupt 정보는 최우선권을 가집니다.
하드웨어와 Interrupt 는 이러한 물리적인 구조를 가집니다.
*** CPU Core 가 아무리 열심히 코드들을 실행하고 연산 중이더라고
*** Interrupt Line 을 통한 전기적 신호를 최우선으로 여기고 처리 중인 Process 는 중단됩니다.
Signal Interrupt.
다시 Signal Interrupt 로 돌아오면,
Signal Interrupt 는 소프트웨어를 위한 Interrupt 입니다.
하드웨어에서 사용하는 Interrupt 의 컨셉을 차용한 Software Interrupt 이며,
전용의 Interrupt Line 을 활용하거나 그렇진 않습니다.
프로세스는
사용자 또는 다른 프로세스에 의해서 전달되는 Terminating Signal,
OS 가 전달하는 Error Handling Signal
등의 Signal 을 전달받아 이에 대응되는 처리 작업을 수행하게 됩니다.
이 과정에서 OS 이 관여하고, OS 에 의해서 Interrupt 와 같은 처리의 우선권을 보장받습니다.
Signal 전달 및 처리 과정.
Signal 을 전달하는 주체는 사용자, 프로세스, OS 라고 말씀드렸습니다.
사용자는 보통 Terminating 목적의 Signal 을 전달합니다.
프로세스는 프로세스 간의 커뮤니케이션을 위한 Signal 을 주고 받으며,
OS 는 예외 상황에 대한 알림을 전달합니다.
그리고 전달되는 Signal 에 대응되는 Signal Handler 가 실행됩니다.
대략 30 가지가 넘는 Signal 에 대응하는 Default Signal Handler 가 있으며,
Signal 이 호출되면 이에 대응하는 Handler 가 반응하는 구조입니다.
그림으로 표현하자면 아래와 같습니다.
보통 아래와 같은 방식으로 Signal 을 활성화시키지만,
내부적으로는 모든 Signal 요청은 OS 가 먼저 처리하게 됩니다.
그리고 Signal 과 Process ID 를 확인한 후 적절한 Signal Handler 를 호출합니다.
만약 Process 내부에서 작성한 Custom Signal Handler 가 존재한다면,
해당 Custom Signal Handler 를 사용하게 됩니다.
const process = require('process'); process.kill(PID, 'SIGINT');
kill -9 PID
Signal Handler 예시.
아래는 Custom Signal Handler 의 예시입니다.
Custom Signal Handler 가 작성되지 않는다면, 기본 Signal Handler 가 사용됩니다.
만약 아래와 같은 Custom Signal Handler 가 없다면,
SIGINT, SIGTERM 에 의해서 프로세스는 종료됩니다.
SIGINT, SIGTERM 의 기본 Signal Handler 는 종료 절차를 수행하기 때문입니다.
반면 아래처럼 특정 로직을 작성하면
해당 로직대로 Signal Handler 가 동작합니다.
const process = require('process'); process.on(['SIGINT', 'SIGTERM'], () => { // This code will be executed when the process receives a SIGINT or SIGTERM signal. });
Signal 종류.
Signal 은 30가지가 넘는 종류가 존재합니다.
이들 중에서 흔히 사용되는 Signal 들을 알아보도록 하겠습니다.
SIGINT.
SIGINT 는 Signal Interrupt 의 줄임말입니다.
Interrupt 는 위에서 설명했듯이, 긴급한 (또는 우선 순위가 높은) 처리나 알림을 위한 수단입니다.
Interrupt 를 통해서 CPU 점유를 빼앗을 수 있죠.
하지만 대개 SIGINT 는 SIGTERM, SIGKILL 와 함께 프로세스의 종료의 역할로 사용됩니다.
Custom Signal Handler 에 의해서 프로세스 종료 이외의 다른 처리를 수행할 수도 있습니다.
SIGTERM, SIGKILL 를 프로세스 종료 처리로써 사용하고,
SIGINT 는 Custom Signal Handler 를 사용해 다른 성격의 처리에 사용하는 방식입니다.
SIGTERM.
SIGTERM 은 Signal Termination 의 줄임말입니다.
프로세스의 종료에 사용되는 Signal 입니다.
일반적으로 SIGTERM Signal 의 Handler 로써 Graceful Shutdown 을 구현하곤 합니다.
사용 중인 리소스를 반환하고, 현재 상태를 기록하는 등의 작업을 마무리 짓는 과정이
SIGTERM Handler 의 역할입니다.
( 의무는 아니지만 보통 이런식의 컨벤션이 있습니다. )
SIGKILL.
SIGTERM 이 Graceful Shutdown 을 수행한다면, SIGKILL 은 프로세스는 강제로 종료합니다.
상황에 따란 프로세스 종료 시나리오를 위해서 강제 종료 기능이 있다고 생각하시면 될거 같네요.
SIGSEGV SIGPIPE
반응형'System' 카테고리의 다른 글
Standard Input (표준입력) 이해하기 (0) 2023.10.16 RPC (Remote Procedure Call) 알아보기 (0) 2023.10.14 Shared memory communication 알아보기 (0) 2023.10.07 [memory management] page 알아보기 (0) 2023.09.22 Call Stack 이해하기 (0) 2023.09.21