write(), fwrite(), buffer들에 대해서 개념 정리 좀 도와 주세요..
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 소스를 보고 있는데요... 개념이 정확하지 않고 대강의 내용만 알고 보려다 보니..공부할때마다 다르게 이해가 되네요... 정확한 개념을 알고 공부하고 싶습니다..
뭐 저도 정확히는 모릅니다만...
기본적으로는 제대로 알고 계신듯 합니다.
즉 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 쪽 소스를 보시는게 낫지 않나 싶네요.
감사합니다..
커널 소스만 보려고 했었는데...
glibc 코드도 같이 참고 하겠습니다...
댓글 달기