write(), fwrite(), buffer들에 대해서 개념 정리 좀 도와 주세요..

lucadi의 이미지

fwrite()함수와 write()함수, 그리고 physical memory에 직접 쓰여지는 과정에 대해서 궁금합니다..
제가 아는 내용은 아래와 같습니다. 그런데, 정확히 아는 것이 아니라 약간의 가정을 바탕으로 이해한 것이어서 확신이 들지가 않습니다.
제가 아는 것은 fwirte()함수는 user level의 함수이고, write()함수의 wrapper 함수이고, user level의 buffer를 가지고 있다는 것입니다.
그리고, write()함수는 system level의 함수이고, kernel level의 buffer를 가지고 있다는 것입니다.
**********************************************************************************************
fwrite() => |user lever buffer| => write() => |kernel level buffer| => physical disk storage
**********************************************************************************************

제가 알고 있는 것이 맞다면, 아래와 같은 시나리오 일 경우에 어떻게 동작하는 지 잘 모르겠습니다.

1) user level의 buffer의 크기가 1 Kbyte 라고 가정을 하며, user level의 buffer가 가득 차지 않으며 내부의
write 함수를 호출 시켜주지 않는다고 생각을 했습니다.
그렇다면, 3번의 fwirte()을 통해서 1 Kbyte가 채워졌다고 한다면, 그 때서야
wirte함수를 호출을 할텐데요. 이때, write 함수는 한번 호출 되는 건가요?
만약)
1) fwrite(, 256 byte , page number 1)
2) fwrite(, 512 byte , page number 2)
3) fwrite(, 256 byte , page number 3)
와 같을 경우에, 제 생각이 맞다면, 3번 fwrite()가 호출되었을 때, user level buffer가 1K가 되기
때문에, 이때, write()함수가 한번 발생하는 것 같습니다.
그렇다면, 이 때, user level에서의 buffer는 하나의 process가 소유하는 것인지, 여러 process가
동시에 접근 가능한것인지 궁금합니다.

2) write()함수가 가지고 있는 kernel level의 buffer를 통해서, 실제 디스크에 저장 될 경우에,
(1) user level buffer에 있는 데이터가 write()함수를 통해서 실제 디스크에 저장될 것으로
예상되어지는데요. 이 때, 위 예에서 user level buffer에 있던 서로 다른 페이지에 대한 데이터들
[(256, page 1),(512, page 2),(256, page 3)]이 한 번의 write()함수를 통해서
각 데이터들이 해당하는 물리 디스크에 어떻게 저장되는지 궁금합니다.

3) 그리고, 기본적을 세팅되어있는 user level buffer와 kernel level buffer에 대해서 알고 싶습니다..

지금 fwrite() 에 대해서, kernel 소스를 보고 있는데요... 개념이 정확하지 않고 대강의 내용만 알고 보려다 보니..공부할때마다 다르게 이해가 되네요... 정확한 개념을 알고 공부하고 싶습니다..

molla의 이미지

기본적으로는 제대로 알고 계신듯 합니다.
즉 write 는 kernel level의 cache를 사용하는데, fwrite는 그 위에 user level의 cache(buffer?)를 하나 더 사용하고 있는 것입니다.

1. fwrite 를 여러번 불러도 user level의 cache에 여유가 있다면 여러번의 fwrite가 한번의 write로 될 수 있겠지요.
user level의 cache는 file pointer (fp) 별로 관리를 합니다. 따라서 process별로 다르고, 같은 process라도 fp가 다르면 다르게 관리됩니다.

2. 여러 다른 위치에 write를 하게 된다면, write도 여러번 불리겠지요. 여러번 fwrite를 하였더라도, 실제 file 에서는 연속된 공간에 있었다면 (중간에 fseek을 사용하지 않았다면) 한번에 write로도 가능할 것입니다.

fwrite 쪽을 알고 싶으시다면, kernel 소스를 보시는 것 보다는 glibc 쪽 소스를 보시는게 낫지 않나 싶네요.

lucadi의 이미지

커널 소스만 보려고 했었는데...
glibc 코드도 같이 참고 하겠습니다...

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.