내가 읽고있다유닉스 프로그래밍 환경(1984). 7장(유닉스 시스템 호출)에서 저자는 다음과 같이 말합니다.
읽거나 쓰는 바이트 수에는 제한이 없지만 가장 일반적인 값은 1(한 번에 한 문자)이고... 디스크의 블록 크기는 가장 일반적으로 512 또는 512입니다. 1024바이트.(<stdio.h>의 BUFSIZ 매개변수에 이 값이 있습니다.)
나는 이것을 확인하기 위해 간단한 프로그램을 작성했습니다.
#include <stdio.h>
int main()
{
printf("The BUFSIZ is %d\n", BUFSIZ);
return 0;
}
내 시스템에서 반환(Linux Mint)8192. 책에서 언급한 '512나 1024'보다 훨씬 많은 숫자다. 나는 이것이 역사적 상황의 차이에 기초해야 한다고 생각합니다.
호기심 때문에 나는 C 프로그램을 직접 작성하지 않고 이 블록 크기를 찾는 다른 방법을 찾았고 다음과 같은 내용을 발견했습니다 blockdev
.
me@mint:~/src/c/unixprogenvbk$ sudo blockdev --getbsz /dev/sda1
4096
BUFSIZ 값이 8192인데 왜 4096인가요? 이것은 실제로 두 가지 다른 것입니까?
답변1
그 구절이 어디서 나오는지는 잘 모르겠지만유닉스 프로그래밍 환경의미는 있지만 BUFSIZ
디스크 블록 크기와는 아무 관련이 없다고 생각합니다. 불가능하고 BUFSIZ
일정하며 디스크마다 다른 블록 크기를 가질 수 있습니다(NVMe 및 NVDIMM과 같은 일부 장치는 블록 크기 변경도 지원합니다).
나는 이 정의를 좋아한다glibc 문서더:
이 매크로의 값은 setvbuf의 크기 매개변수로 사용하기에 적합한 정수 상수 표현식입니다. 이 값은 최소 256이 보장됩니다. BUFSIZ의 값은 스트리밍 I/O 효율성을 향상시키기 위해 시스템별로 선택됩니다. 따라서 setvbuf를 호출할 때 버퍼 크기로 BUFSIZ를 사용하는 것이 가장 좋습니다.
하지만 to로 설정된 상수만 stdio.h
있고 왜 문서에 각 시스템에 대해 선택되었다고 나와 있는지 잘 모르겠습니다.BUFSIZ
8192
blockdev
ioctl을 사용하여 BLKBSZGET
지정된 장치의 블록 크기를 얻으므로 이것이 디스크의 실제 블록 크기입니다.