왜 I / O가 중단되지 않습니까? I / O를 처리하는 프로세스가 신호를 처리

I / O를 무중단 상태로 만드는 이유는 무엇입니까? I / O를 처리하는 프로세스가 신호를 처리 할 수 ​​있다면 부정적인 결과는 무엇입니까?



답변

모든 I / O는 프로세스에 의해 호출 된 시스템 호출에 의해 처리됩니다. 결국 이러한 시스템 호출은 실제 I / O 작업을 수행하기 위해 적절한 저수준 장치 드라이버 기능으로 넘어갑니다.

I / O는 까다로울 수 있습니다. 실제로 장치 안팎으로 데이터를 가져 오려면 순서에 따라 타이밍 요구 사항에 따라 다양한 단계를 수행해야 할 수도 있습니다. 이러한 단계가 원자 적으로 완료되지 않으면 다음에 시도 할 때 장치가 응답하지 않거나 오작동 또는 시스템 잠금을 유발할 수 있습니다. 이 단계는 각 장치마다 다르고 고유 할 수 있으므로 장치 드라이버가 너무 많은 이유는 무엇입니까?

잘 작성된 장치 드라이버는 서비스하려는 장치를 처리하는 방법을 알고 있어야하므로 드라이버 버그가 없거나 장치에 잘못된 드라이버를 사용 중이거나 물리적 장치에 문제가없는 한 일반적으로 문제가 발생하지 않습니다.


답변

이제 Maurice Bach의 “The Unix 운영 체제 디자인”을 읽었으므로이 질문에 스스로 대답하겠습니다.

요컨대, I / O를 인터럽트 불가능하게 만드는 것은 I / O 태스크가 신호에 의해 방해받지 않고 최대한 빨리 완료되도록하기위한 것입니다.

이 책에서 얻은 몇 가지 관련 지식 :

  1. “무정전”이라는 단어는 “무정전 수면”을 가리켜 야합니다. 프로세스가 중단 불가능한 휴면 상태 인 경우 신호로 깨우거나 신호를 처리 할 수 ​​없습니다.
  2. 프로세스는 다음과 같은 경우 신호를 처리합니다. 커널 모드에서 실행 중이며 사용자 모드로 돌아 가려고합니다. 비. 수면이 중단되면 수면 상태로 들어가거나 빠져 나옵니다.
  3. 수면 프로세스가 신호로 깨우면 어떻게됩니까? 기본 조치가 프로세스를 종료하면서 신호를 처리합니다. 프로세스가 I / O 완료를 기다리는 경우 물론 프로세스가 조기에 종료되는 것을 원하지 않습니다.

답변

커널의 일부 코드 경로는 코드가 엄격한 타이밍 (장치에 응답하기 위해)을 준수해야하거나 간섭을 허용하지 않는 작업을 수행하기 때문에 인터럽트 불가능으로 표시됩니다. 리눅스의 경우, 전자의 대부분은 독립적 인 커널 트레드로 밀려 났고, 두 번째는 대부분 근절되었다 (현재 멀티 CPU 머신의 압력을 받고있는 것 같다). 즉, 무중단 수면 과정을 보지 못한 것은 이제 얼마 남지 않았습니다.