둘 다 cache/buffer를 비우는 역할을 하지만,
fflush는 stdio 라이브러리에서 IO를 처리할 때 user level에서 사용하는 버퍼를 비우는 역할이고, sync는 시스템에서 disk를 사용할 때 kernel level에서 사용하는 버퍼를 비우는 역할입니다.
disk IO(1) - system call(2) - stdio(3)
이렇게 세 layer가 있을 때, 1-2 사이의 버퍼를 비워주는 것이 sync, 2-3 사이의 버퍼를 비워주는 것이 fflush라 생각하면 됩니다.
The function fflush forces a write of all user-space buffered data
for the given output or update stream via the stream's underlying write
function. The open status of the system is unaffected.
sync() : 시스템(kernel) 차원
커널내부(kernel level)의 버퍼캐시(buffer cache)의
내용 중 저장이 필요한 블럭을 실제로 디스크에
write한다.
fflush() : 응용프로그램 차원
사용자 영역(user level)의 버퍼(라이브러리
수준에서 제공되는)의 내용을 커널로 보낸다.
* 참고
유닉스는 비동기 파일시스템을 가지고 있습니다.
만일 사용자가 A라는 파일을 수정 및 저장해도
실제로 하드디스크에 저장하는 것이 아니라,
커널내부의 버퍼캐시에다 저장하고 리턴합니다.
이후 일정시간이 지나면 버퍼캐시 운영알고리즘에
의해서 또는, 사용자가 강제로 sync를 호출해서
동기화(실제 디스크 저장)를 이루게 됩니다.
Re: sync() 함수와 fflush() 함수와의 차이점이 어떻게 되죠....
fflush는 libaray call이고, sync는 system call이죠.
둘 다 cache/buffer를 비우는 역할을 하지만,
fflush는 stdio 라이브러리에서 IO를 처리할 때 user level에서 사용하는 버퍼를 비우는 역할이고, sync는 시스템에서 disk를 사용할 때 kernel level에서 사용하는 버퍼를 비우는 역할입니다.
disk IO(1) - system call(2) - stdio(3)
이렇게 세 layer가 있을 때, 1-2 사이의 버퍼를 비워주는 것이 sync, 2-3 사이의 버퍼를 비워주는 것이 fflush라 생각하면 됩니다.
참고: write() 시스템 콜은 커널의 버퍼로 즉시 기록합니다.
참고:
write() 시스템 콜은 커널의 버퍼로 즉시 기록합니다.
커널의 버퍼로 기록한다고 해도 디스크에 즉시 기록하지는 않습니다.
-------------------------------------------------------------------------
fprintf, fwrite ,fputs 등의 함수는 사용자 라이브러리 함수로서
내부적으로 write 를 호출하도록 되어있습니다.
하지만 한번의 fprintf 가 반드시 write를 호출하는 것은 아닙니다.
fprintf 로 파일에 쓰는 경우 8192 바이트크기의 버퍼를 기본적으로
가지고 있으며 8192가 가득찬 이후에야 write를 호출합니다.
만약 fprintf로 터미널에 쓰는 경우는 개행문자를 만날때까지
버퍼에 채워두었다가 write를 합니다.
즉, 터미널이냐, 파일이냐 등의 기록 매체에 따라 버퍼의 크기와 동작에
약간의 차이가 있는 것입니다. setvbuf 함수의 맨페이지를 참고하세용
커널의 버퍼에만 기록이 되고, 아직 디스크에 기록이 안된 상태에서
전원이 나가면 문제가 될것입니다.
시스템의 커널데몬을 살펴보면..
updated 라는 것이 있는데
이것은 30분 간격으로 시스템의 커널버퍼를 디스크로 옮겨주는 기능을 합니다.
30분 간격으로 sync 를 호출해주는 것입니다.
fflush 는 사용자 영역의 버퍼를 커널의 버퍼로 이동시키는 역할을 하는 것입니다.
횡설수설 ...이었습니다.
fflush는 스트림 버퍼를 디스크로 강제 flush합니다. 명시적으로
fflush는 스트림 버퍼를 디스크로 강제 flush합니다. 명시적으로 stream을 지정하지 않으면 현재의 프로세스가 열고있는 모든 스트림의 buffer 내용을 디스크에 기록합니다.
반면 sync는 메모리 상에 있는 모든 버퍼화(?)된 데이터를 디스크에 기록합니다.
sync와 fflush의 차이점이라면 flush의 적용대상이 전역인가, 또 스트림에 국한되는가의 여부가 아닐지요...
The function fflush forces a write of al
The function fflush forces a write of all user-space buffered data
for the given output or update stream via the stream's underlying write
function. The open status of the system is unaffected.
매뉴얼에 보니깐.. 이렇게 나와있던데요
sync() : 시스템(kernel) 차원커널내부(kernel lev
sync() : 시스템(kernel) 차원
커널내부(kernel level)의 버퍼캐시(buffer cache)의
내용 중 저장이 필요한 블럭을 실제로 디스크에
write한다.
fflush() : 응용프로그램 차원
사용자 영역(user level)의 버퍼(라이브러리
수준에서 제공되는)의 내용을 커널로 보낸다.
* 참고
유닉스는 비동기 파일시스템을 가지고 있습니다.
만일 사용자가 A라는 파일을 수정 및 저장해도
실제로 하드디스크에 저장하는 것이 아니라,
커널내부의 버퍼캐시에다 저장하고 리턴합니다.
이후 일정시간이 지나면 버퍼캐시 운영알고리즘에
의해서 또는, 사용자가 강제로 sync를 호출해서
동기화(실제 디스크 저장)를 이루게 됩니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
댓글 달기