내가 아는 한, 프로세스가 파일에 쓸 때 시스템 호출이 시작됩니다. 필요한 정보 중 쓸 데이터가 채워진 사용자 공간의 버퍼에 대한 포인터가 필요합니다.
프로세스가 두 개의 스레드를 생성하는 시나리오를 생각해 보십시오. 하나의 스레드는 10MB를 쓰기 위해 시스템 호출을 실행합니다. 운영 체제가 IO 요청을 처리하는 동안 다른 스레드가 잘못된 메모리 액세스를 수행하여 분할 오류를 발생시킵니다. 이 경우 쓰기 요청은 어떻게 되나요? 특히, 프로세스 메모리가 해제되기 전에 쓰기 작업이 발생하지 않거나 완료되지 않는다고 보장할 수 있나요? io 요청이 단지 64비트 정수라면 대답이 바뀌나요?
답변1
현재 파일 시스템에서의 작업은 중단할 수 없습니다(네트워크 파일 시스템 제외).
바라보다TASK_KILLABLE
[LWN.net, 2008].
기존 블록 기반 파일 시스템을 사용하면 보증이 충족될 것이라고 예측할 수 있습니다. TASK_KILLABLE
네트워크 파일 시스템 외부에서는 널리 채택되지 않는다고 생각합니다 . 그러나 나는 이것이 항상 정당한 이유 없이 그렇다고 가정하고 싶지 않습니다.
애플리케이션이 네트워크 파일 시스템에서 실행될 수 있다면 강력한 보장이 있다고 말하기는 어렵습니다. (일반적으로 예를 들어 메모NFS3은 POSIX 파일 시스템의 모든 기대치를 따르지 않습니다.).
스토리지 기술은 계속 발전하고 있습니다. 예를 들어 파일 시스템이 Linux 블록 계층의 아키텍처를 기반으로 특정 방식으로 작동한다고 가정하면 향후 애플리케이션이 Linux에서 실행될 때 놀랄 수 있습니다.바이트 주소 지정 가능 메모리 기반 파일 시스템.