답변:
모든 I / O는 프로세스에 의해 호출 된 시스템 호출에 의해 처리됩니다. 결국 이러한 시스템 호출은 실제 I / O 작업을 수행하기 위해 적절한 저수준 장치 드라이버 기능으로 넘어갑니다.
I / O는 까다로울 수 있습니다. 실제로 장치 안팎으로 데이터를 가져 오려면 순서에 따라 타이밍 요구 사항에 따라 다양한 단계를 수행해야 할 수도 있습니다. 이러한 단계가 원자 적으로 완료되지 않으면 다음에 시도 할 때 장치가 응답하지 않거나 오작동 또는 시스템 잠금을 유발할 수 있습니다. 이 단계는 각 장치마다 다르고 고유 할 수 있으므로 장치 드라이버가 너무 많은 이유는 무엇입니까?
잘 작성된 장치 드라이버는 서비스하려는 장치를 처리하는 방법을 알고 있어야하므로 드라이버 버그가 없거나 장치에 잘못된 드라이버를 사용 중이거나 물리적 장치에 문제가없는 한 일반적으로 문제가 발생하지 않습니다.
이제 Maurice Bach의 "The Unix 운영 체제 디자인"을 읽었으므로이 질문에 스스로 대답하겠습니다.
요컨대, I / O를 인터럽트 불가능하게 만드는 것은 I / O 태스크가 신호에 의해 방해받지 않고 최대한 빨리 완료되도록하기위한 것입니다.
이 책에서 얻은 몇 가지 관련 지식 :
커널의 일부 코드 경로는 코드가 엄격한 타이밍 (장치에 응답하기 위해)을 준수해야하거나 간섭을 허용하지 않는 작업을 수행하기 때문에 인터럽트 불가능으로 표시됩니다. 리눅스의 경우, 전자의 대부분은 독립적 인 커널 트레드로 밀려 났고, 두 번째는 대부분 근절되었다 (현재 멀티 CPU 머신의 압력을 받고있는 것 같다). 즉, 무중단 수면 과정을 보지 못한 것은 이제 얼마 남지 않았습니다.
write(2)
실제로 리턴 된 실제 바이트 수를 리턴하여 3 번째 arg로 전달 된 버퍼 길이보다 작을 수 있습니다.