운영 체제 개념(Abraham Silberschatz 저, 2012년 9월 9일에 작성)
원시 입력/출력모든 파일 시스템 서비스 우회, 파일 I/O 요구 사항 페이징, 파일 잠금, 프리패치, 공간 할당, 파일 이름 및 디렉터리 등이 있습니다.
...
안타깝게도,운영 체제 서비스 없음그런 다음 이 장치에서 실행하십시오.
원시 I/O도 드라이버가 제공하는 서비스의 일부 또는 대부분을 우회합니까?
원시 I/O에서는 드라이버가 제공하는 서비스 유형을 우회합니까? 내가 스티븐을 이해한다면여기그리고여기정확하게 말하자면, 원시 I/O는 순차적으로만 주소를 지정할 수 있는 장치에 대해 드라이버가 제공하는 임의 액세스를 우회하지 않고 대신 드라이버가 제공하는 버퍼/캐시를 우회합니다.
장치 드라이버를 보다 원시적이고 서비스가 덜 제공되는 드라이버로 변경합니까?
open()
를 통해 원시 I/O를 수행할 수 있습니다 O_DIRECT
.
감사해요.
답변1
나는 그가 O_DIRECT와 같은 것을 의미한다고 생각하지 않습니다. 내 생각에 그는 /dev/sda와 같은 블록 장치에 액세스한다는 것을 의미합니다. /dev/sda를 열면 "파일 잠금, 미리 가져오기, 공간 할당, 파일 이름 및 디렉터리"가 우회됩니다. 따라서 파일 시스템은 우회하지만 블록 장치 드라이버는 우회하지 않습니다.
답변2
O_DIRECT
캐싱을 우회합니다. 드라이버를 우회하지 않습니다.
블록 장치에서 사용하면 O_DIRECT
커널 "버퍼 캐시"를 우회합니다. "버퍼 캐시"는 드라이버의 일부가 아닙니다.
O_DIRECT
일반 파일(예: 장치 특수 파일이 아닌 파일)에 사용하는 것은 커널 "페이지 캐시"를 우회하는 요청입니다. "페이지 캐시"는 파일 시스템의 일부가 아니지만 드라이버의 일부도 아닙니다.
이전 운영 체제에서는 파일 IO가 페이지 캐시와 버퍼 캐시라는 두 위치에 캐시될 수 있습니다. 이 경우 O_DIRECT
두 캐시를 모두 우회해야 합니다.
Linux 및 기타 많은 최신 Unix 계열 시스템에서 버퍼 캐시는 실제로 페이지 캐시에 의존할 수 있습니다. 이는 통합 버퍼 캐시를 갖는 것으로 설명됩니다. 중요한 기능은 서로 다른 두 위치에서 파일 IO를 캐싱하지 않는다는 것입니다. 따라서 메모리를 더 효율적으로 사용합니다. 사람들마다 서로 상충되는 정의를 사용하는 것 같습니다. 어떤 사람들은 버퍼캐시가 없고 페이지캐시만 있다고 말합니다.
운영 체제가 서로 다른 두 위치에서 파일 IO를 캐싱하는 것을 방지하더라도 파일 IO에 사용되는 캐시가 블록 장치 파일에 액세스할 때 사용되는 캐시와 일치한다는 것을 보장하지 못할 수 있습니다.
( 페이지 캐시와 디렉토리 캐시를 둘러싼 래퍼에 불과 하므로 O_DIRECT
Linux에서는 작동하지 않습니다 . 더 나은 호환성을 위해 성공이 허용되고 단순히 무시될 수 있다고 제안되었습니다 . 따라서 이것이 페이지 캐시 우회를 보장한다고 는 말할 수 없습니다 .)tmpfs
tmpfs
tmpfs
O_DIRECT
O_DIRECT