2011-12-05 2 views
0

블록 장치 쓰기 작업 방법을 이해하려고합니다. 나의 이해는 모든 글쓰기가 섹터 조정되어야한다는 것이다. 따라서 섹터 크기가 512 바이트이면 모든 쓰기 크기는 512 바이트입니다. 이제 파일을 만들고 순차적으로 쓰기 시작한다고 가정 해 보겠습니다 (응용 프로그램 쪽에서 버퍼링 없음). 이제 파일의 오프셋 0에 16 바이트를 쓰는 것으로 시작한다고 가정 해 보겠습니다. 이것이 블록 수준에서 어떻게 쓰이게됩니까? "섹터 크기"의 데이터 양을 쓴 다음 디스크에 푸시 할 때까지 버퍼링됩니까? fsync가 호출되면 남은 바이트가 채워진 다음 쓰여지는 것입니까? 이해가 정확합니까? 아니면 빠릅니다.블록 장치 쓰기

후속 질문은 다음과 같습니다. 파일 크기가 64K라고하면 우리가 오프셋 64에서 16 바이트의 랜덤 쓰기를 수행한다고 가정 해 보겠습니다. 그런 다음 512 바이트의 적절한 섹터가 읽히고 16 바이트가 버퍼에 64 바이트로 기록 된 다음 512 바이트가 디스크에 기록됩니다. 이해가 정확합니까?

답변

0

읽기 - 수정 - 쓰기라고합니다. 먼저 섹터를 읽고 요청한 바이트를 변경 한 다음 다시 써야합니다.
전체 섹터 쓰기의 경우에만이 단계를 무시할 수 있습니다.

리눅스에 대해서는 잘 모르지만 Windows의 경우 버퍼가 가득 차거나 (버퍼가 섹터 크기의 배수 일 가능성이 높음) 일반적으로 버퍼링을 수행하거나 버퍼링을 완전히 피하고 throw합니다 버퍼링을 요청했는지 여부에 따라 쓰기가 정렬되지 않았거나 전체 섹터가 아닌 경우 예외입니다.