O_DIRECT
글쓴이: puresupe / 작성시간: 화, 2010/09/07 - 2:08오후
잘 이해가 안가서 글을 올립니다.
O_DIRECT는 .커널 내부 버퍼 (page cache)를 거치지 않고. 바로 해당 디바이스(블록 디바이스) 에 전달되는 것으로 알고있습니다.
DMA가. user space 에 존재하는 버퍼의 데이터를 바로 디바이스에 쓰는 것으로 알고있는데요.
open("filename",O_DIRECT|O_RDWR|O_CREAT, S_IRWXU|S_IRWXO|S_IRWXG)
를통해서. 파일을 O_DIRECT 플래그를 줘서 오픈했을때
write(fd,"hello",5);
연산을 했을때. 전혀 씌여지지 않았습니다. (fflush(),fsync()는 O_DIRECT때 무의미해서 안해줍니다)
O_DIRECT 없이 할땐 물론 당연히 되구요 :(
아 뭔가 제가 이해를 잘못하고있는것같네요요
Forums:
...
O_DIRECT는 블럭에 직접 쓰기 때문에 블럭 크기의 배수에 해당하는 read/write만 가능합니다.
그리고 buffer align
그리고 buffer align 하셨나요? 그 제약도 있었던 것 같네요.
그리고 stdio 버퍼와
그리고 stdio 버퍼와 page cache와 디스크 캐시는 모두 다르기 때문에 fflush/fsync 무의미 하지 않아요.
fflush 는 stdio
fflush 는 stdio 버퍼이고. fsync는 page cache에 대한것 이 아닌가요?
f[data]sync는 page cache와
f[data]sync는 page cache와 disk cache 모두 flush 합니다. O_DIRECT는 page cache만 건너뛰는 거구요. stdio는 상관이 없긴한데 O_DIRECT라서가 아니고 그냥 stdio를 안써서 그런거구요.
아. O_DIRECT로
아. O_DIRECT로 하더라도.
fsync가 disk cache에도 영향을 주기때문에. 의미없지 않다고 하신거군요 :)
실례지만. 디스크 케시라는게 하드디스크의 로컬 버퍼를 말씀하신건가요?
네, 하드 디스크
네, 하드 디스크 스팩에 캐시 몇메가라고 적혀 있는 거요.
댓글 달기