sync() 함수와 fflush() 함수와의 차이점이 어떻게 되죠....

koonpal의 이미지

sync() 함수와 fflush() 함수와의 차이점이 어떻게 되죠....

man page를 보아도 하는 일이 비슷한 거 같은데...

차이점 좀 가르쳐 주실래요...

eungkyu의 이미지

koonpal wrote:
sync() 함수와 fflush() 함수와의 차이점이 어떻게 되죠....

man page를 보아도 하는 일이 비슷한 거 같은데...

차이점 좀 가르쳐 주실래요...

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라 생각하면 됩니다.

bw001730의 이미지

참고:
write() 시스템 콜은 커널의 버퍼로 즉시 기록합니다.
커널의 버퍼로 기록한다고 해도 디스크에 즉시 기록하지는 않습니다.
-------------------------------------------------------------------------

fprintf, fwrite ,fputs 등의 함수는 사용자 라이브러리 함수로서
내부적으로 write 를 호출하도록 되어있습니다.
하지만 한번의 fprintf 가 반드시 write를 호출하는 것은 아닙니다.

fprintf 로 파일에 쓰는 경우 8192 바이트크기의 버퍼를 기본적으로
가지고 있으며 8192가 가득찬 이후에야 write를 호출합니다.

만약 fprintf로 터미널에 쓰는 경우는 개행문자를 만날때까지
버퍼에 채워두었다가 write를 합니다.

즉, 터미널이냐, 파일이냐 등의 기록 매체에 따라 버퍼의 크기와 동작에
약간의 차이가 있는 것입니다. setvbuf 함수의 맨페이지를 참고하세용

커널의 버퍼에만 기록이 되고, 아직 디스크에 기록이 안된 상태에서
전원이 나가면 문제가 될것입니다.

시스템의 커널데몬을 살펴보면..
updated 라는 것이 있는데
이것은 30분 간격으로 시스템의 커널버퍼를 디스크로 옮겨주는 기능을 합니다.

30분 간격으로 sync 를 호출해주는 것입니다.
fflush 는 사용자 영역의 버퍼를 커널의 버퍼로 이동시키는 역할을 하는 것입니다.

횡설수설 ...이었습니다.

isinji의 이미지

fflush는 스트림 버퍼를 디스크로 강제 flush합니다. 명시적으로 stream을 지정하지 않으면 현재의 프로세스가 열고있는 모든 스트림의 buffer 내용을 디스크에 기록합니다.
반면 sync는 메모리 상에 있는 모든 버퍼화(?)된 데이터를 디스크에 기록합니다.

sync와 fflush의 차이점이라면 flush의 적용대상이 전역인가, 또 스트림에 국한되는가의 여부가 아닐지요...

bw001730의 이미지

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.

매뉴얼에 보니깐.. 이렇게 나와있던데요

mach의 이미지

sync() : 시스템(kernel) 차원
커널내부(kernel level)의 버퍼캐시(buffer cache)의
내용 중 저장이 필요한 블럭을 실제로 디스크에
write한다.

fflush() : 응용프로그램 차원
사용자 영역(user level)의 버퍼(라이브러리
수준에서 제공되는)의 내용을 커널로 보낸다.

* 참고
유닉스는 비동기 파일시스템을 가지고 있습니다.
만일 사용자가 A라는 파일을 수정 및 저장해도
실제로 하드디스크에 저장하는 것이 아니라,
커널내부의 버퍼캐시에다 저장하고 리턴합니다.
이후 일정시간이 지나면 버퍼캐시 운영알고리즘에
의해서 또는, 사용자가 강제로 sync를 호출해서
동기화(실제 디스크 저장)를 이루게 됩니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.