fopen 할때 옵션으로 주는데...
O_DIRECT : 캐쉬를 거치지 않고 DMA로 바로 데이터 전송하고 리턴. 데이터가 모두 전송됬는지 보장하지 않는다.
O_SYNC : 데이터가 모두 (캐쉬로) 전송됬는지 보장하고 리턴. 그러나 아직 (하드 디스크 등 출력장치에 기록되지 않고) 캐쉬에 있을 수도 있다.
O_DIRECT | O_SYNC : 캐쉬를 거치지 않고 DMA로 바로 데이터 전송하고, 완전히 전송이 끝났을 때 리턴된다. 완전하게 데이터가 출력장치에 기록되는 것을 보장한다.
O_DIRECT | O_SYNC 를 쓰는 이유 : 임베디드에서 mmap를 이 옵션으로 열어서 하드웨어 핀(GPIO)를 제어할때 쓰면 응답의 신뢰성을 높일 수 있다. 이 옵션 없이 0.001초 간격으로 신호를 10000000번 주면 캐쉬에 씌여 있다가 안나가거나... 특정 조건이 되서 한방에 나가거나... 등등 어이없는 일이 생길 수 있다.
DB같은데서는 자기네들의 알고리즘이 OS보다 성능이 좋다고 요 옵션을 써서 스스로 제어하는 경우도 있다.
참고링크 :
http://stackoverflow.com/questions/5055859/how-are-the-o-sync-and-o-direct-flags-in-open2-different-alike
O_DIRECT : 캐쉬를 거치지 않고 DMA로 바로 데이터 전송하고 리턴. 데이터가 모두 전송됬는지 보장하지 않는다.
O_SYNC : 데이터가 모두 (캐쉬로) 전송됬는지 보장하고 리턴. 그러나 아직 (하드 디스크 등 출력장치에 기록되지 않고) 캐쉬에 있을 수도 있다.
O_DIRECT | O_SYNC : 캐쉬를 거치지 않고 DMA로 바로 데이터 전송하고, 완전히 전송이 끝났을 때 리턴된다. 완전하게 데이터가 출력장치에 기록되는 것을 보장한다.
O_DIRECT | O_SYNC 를 쓰는 이유 : 임베디드에서 mmap를 이 옵션으로 열어서 하드웨어 핀(GPIO)를 제어할때 쓰면 응답의 신뢰성을 높일 수 있다. 이 옵션 없이 0.001초 간격으로 신호를 10000000번 주면 캐쉬에 씌여 있다가 안나가거나... 특정 조건이 되서 한방에 나가거나... 등등 어이없는 일이 생길 수 있다.
DB같은데서는 자기네들의 알고리즘이 OS보다 성능이 좋다고 요 옵션을 써서 스스로 제어하는 경우도 있다.
참고링크 :
http://stackoverflow.com/questions/5055859/how-are-the-o-sync-and-o-direct-flags-in-open2-different-alike