나는 인터럽트가 처리를 요청하는 커널로 전송되는 신호라는 것을 이해합니다. 어떤 경우에는 프로세스를 인터럽트(키 누르기)와 연결하는 드라이버가 있는 키보드와 같은 물리적 장치가 있습니다. 하지만 타이머나 물리적 장치가 없는 다른 것들은 어떻습니까? 어쩌면 내가 틀렸을 수도 있고 누군가 나를 고쳐준다면 기쁠 것입니다.
답변1
한 가지 관점에서 살펴보겠습니다. Linux 시스템에서 실행되는 모든 코드(마이크로코드 포함)는 다소 하드웨어 인터럽트의 직접적인 결과입니다.
반대 관점에서 보면 하드웨어 인터럽트는 하드웨어 인터럽트 핸들러에서 커널 내부 쿠킹 이외의 다른 것을 즉시 실행하지 않습니다. 이것흥미로운 부분(사용자 모드의 관점에서 이해)는연기하다커널 스레드에 의한 나중에 처리를 위해.
실행할 스레드를 선택하는 책임은 무엇입니까? : 스케줄러!
귀하의 질문에 대한 가능한 이해에 대한 첫 번째 대답은 다음과 같습니다. 스케줄러는 다음과 같은 이유로 프로세스를 인터럽트에 연결하는 구성 요소입니다.
- 결국 커널 스레드(ksoftirqd 또는 IRQ 전용 ktrhead는 시스템에서 시작된 IRQ 스레드임)를 시작하여 일부 보류 중인 이벤트를 표시하는 다양한 부분을 처리합니다.
- 그러면 결국 특정 이벤트를 기다리는 수면 작업이 시작됩니다.
답변2
사용자 공간 관점에서 보면 인터럽트는 신호와 도덕적으로 동일합니다. 프로세스는 인터럽트 핸들러와 매우 유사한 기능을 하는 신호 핸들러를 설정할 수 있습니다. 대부분의 타이머는 SIGALARM을 통해 처리됩니다. 역사적으로 sleep()은 경고나 대기 시스템 호출을 통해 구현될 수 있었습니다.
일부 키보드 I/O는 신호를 통해 처리됩니다. 예를 들어 ctrl-cSIGINT(2)가 생성되지만 대부분의 키보드 I/O는 이 방식으로 수행되지 않습니다.
키보드와 같은 대부분의 장치는 파일로 처리됩니다. 일반적으로 프로세스는 read() 호출을 통해 I/O가 완료될 때까지 기다리거나(그리고 본질적으로 커널 스케줄러가 I/O가 완료되었음을 확인하고 깨울 때까지 절전 모드로 전환됨) 열려 있는 파일을 폴링하여 장치가 수행하는 작업 다른 작업 사이에 커널에 파일 목록을 제공하고 poll()을 호출하거나 그 중 하나가 I/O를 완료하거나 시간 초과가 만료될 때까지 기다리는 것과 유사한 작업을 수행합니다.
또한 키보드(기술적으로는 tty) I/O는 termios 라이브러리를 사용하여 특별히 처리할 수 있습니다. 이 라이브러리는 커널이 사용자 입력을 버퍼링하는 방식을 조정하여 read()가 완전한 줄이나 단일 문자 또는 문자 블록을 시간 초과로 반환하도록 할 수 있습니다. (termios 및 stty는 3-4개의 키보드 생성 신호 생성을 조정하거나 비활성화할 수도 있습니다.)
프로세스 내에서 상호 작용하기 위한 몇 가지 유사한 메커니즘이 있습니다. 신호는 poll()을 중단할 수 있으며, poll() 및 read()와 같은 시스템 호출은 신호 처리기 이후에 중단하거나 재개할 수 있습니다.