CS 지식/시스템프로그래밍
Chapter 6 : Signals
goldpig
2023. 12. 25. 17:10
728x90
Signals
- 시그널: sent to a process to notify an event
- IPC(Inter-Process Communication, 프로세스 간 통신)의 한 형태로, 프로세스나 프로세스 그룹에게 짧은 메시지를 보냅니다.
- 시그널의 번호는 해당 시그널을 식별하는 데 사용되며 인자를 가지지 않습니다.
- 그것은 간단하고 효율적이기 때문에 널리 사용되며, 처음 UNIX에서 도입된 이래로 40년 동안 소소한 변경만 있었습니다.
- 대개 프로세스는 시그널에 반응하여 사용자 공간 함수(시그널 핸들러)를 호출합니다.
- IPC(Inter-Process Communication, 프로세스 간 통신)의 한 형태로, 프로세스나 프로세스 그룹에게 짧은 메시지를 보냅니다.
- 목적
- 특정 이벤트가 발생했음을 프로세스가 인지하도록 하는 데 사용됩니다.
- 프로세스가 코드에 포함된 시그널 핸들러 함수를 실행하도록 강제하는 데 사용됩니다.
- 비유
- "프로세스"에 대한 "시그널"은 "커널"에 대한 "인터럽트"와 비슷합니다.
Remind! Exceptions in Linux
- About 20 different exceptions
- The kernel must provide a dedicated exception handler for each exception type.
- The exception handler sends a UNIX signal to the process that caused the exception
결국 시그널을 프로세스에게 보내는 이유는 어떤 이벤트가 발생했음을 알리기 위한 것입니다. 그리고 프로세스가 이 이벤트를 시그널 핸들러를 통해 해결하도록 하는 것이다.
Characteristics of Signals
- 시그널은 프로세스에게 언제든지 보내질 수 있습니다. (signals may be sent at any time to processes)
- 실행 중이지 않은 프로세스에게 보내진 시그널은:
- 커널에 의해 저장되어야 하며, 프로세스가 실행을 재개할 때까지 보관됩니다.
- 시그널은 보통 현재 실행 중인 프로세스에 의해서만 처리됩니다. (i.e., the current process)
- 보내진 각 시그널은 한 번만 수신될 수 있습니다.
- 프로세스에 시그널을 저장하기 위한 비트맵이 있습니다.
- 시그널은 프로세스에 의해 선택적으로 "차단(blocked)"될 수 있습니다.
- 프로세스는 차단을 해제할 때까지 시그널을 수신하지 않습니다.
- 프로세스가 시그널 핸들러 함수를 실행할 때, 그것은 핸들러가 종료될 때까지 시그널을 차단합니다.
- 시그널 핸들러는 다른 발생한 동일한 시그널에 의해 중단될 수 없습니다.
시그널이 프로세스에게 비동기적으로 이벤트를 알리는 수단이라는 것과, 시그널이 프로세스의 흐름을 제어하는데 사용될 수 있는 방법을 설명합니다. 예를 들어, 프로세스가 중단할 수 있는 시그널을 차단하거나, 특정 시그널을 받을 준비가 되었을 때만 받도록 할 수 있습니다. 이는 멀티태스킹 환경에서 프로세스의 동작을 유연하게 제어할 수 있게 해줍니다.
Data Structure for Signal Handling
더보기
⭐️struct task_struct에서 signal 처리를 위하여 사용되는 자료구조를 모두 나열하고 설명하시오.
- struct sigpending (pending): 프로세스의 개별적인 대기중인 시그널들의 목록을 관리합니다. 이 구조체는 프로세스에게 전달된 하지만 아직 처리되지 않은 시그널들을 저장합니다
- struct signal_struct (*signal): 프로세스의 공유된 시그널 descriptor를 가리키는 포인터입니다. 이는 프로세스 그룹 간에 공유되는 시그널 정보를 관리
- struct sighand_struct (*sighand): 프로세스의 시그널 핸들러 디스크립터를 가리키는 포인터
- sigset_t (blocked): 차단된 시그널들의 비트마스크입니다. 이 필드는 프로세스가 특정 시그널을 받지 않도록 차단하는 데 사용됩니다.
Signal Action
Executing a signal handler is a complex task because of the need to change stacks carefully while switching between User mode and Kernel Mode.
Linux Solution:
- Copying the hardware context saved in the Kernel Mode stack onto the User Mode stack of the current process.
- The User Mode stack is also modified in such a way that, when the signal handler terminates, the sigreturn()system call is automatically invoked to copy the hardware context back on the Kernel Mode stack and restore the original content of the User Mode stack.
더보기
⭐️User defined signal handler를 사용하면 어떤 문제가 발생하고, Linux에서는 어떠한 해결 방안을 제시하였는지 쓰시오.
사용자 정의 신호 핸들러를 사용할 때 발생할 수 있는 문제는 다음과 같습니다:
- 사용자 정의 핸들러는 커널 모드와 사용자 모드 사이의 스택 전환이 복잡합니다. 이는 신호 핸들러 실행 과정에서 스택을 주의 깊게 변경해야 함을 의미합니다.
Linux에서는 이 문제를 다음과 같이 해결합니다:
- 커널 모드 스택에 저장된 하드웨어 컨텍스트를 현재 프로세스의 사용자 모드 스택으로 복사합니다. (Copying the hardware context saved in the Kernel Mode stack onto the User Mode stack of the current process.)
- 그러면 시그널 핸들러가 시그널을 처리해서 종료되면, 자동적으로 sigreturn() system을 호출하여 하드웨어 컨택스트를 커널 모드 스택에 복사하고 사용자 모드 스택을 원래 내용으로 복원합니다.
728x90