私が読んでいるUnixプログラミング環境(1984).第7章(Unixシステムコール)では、著者は次のように言います。
読み書きするバイト数に制限はありませんが、最も一般的な値は1(一度に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ですか?これは実際には2つの異なるものですか?
答え1
その詩がどこから出てくるのかは分かりませんが、Unixプログラミング環境意味はありますが、BUFSIZ
ディスクブロックサイズとは何の関係もないと思います。不可能で一定で、BUFSIZ
ディスクごとに異なるブロックサイズを持つことができます(NVMeやNVDIMMなどの一部のデバイスはブロックサイズの変更もサポートしています)。
私はこの定義が好きですglibc ドキュメントもっと:
このマクロの値は、setvbufのサイズパラメータとして使用するのに適した整数定数式です。この値は少なくとも256が保証されます。 BUFSIZの値は、ストリーミングI / O効率を向上させるためにシステムごとに選択されます。したがって、setvbufを呼び出すときは、バッファサイズとしてBUFSIZを使用するのが最善です。
しかし、toに設定された定数だけがstdio.h
あり、なぜ文書が各システムに対して選択されたのかを知らない。BUFSIZ
8192
blockdev
ioctlを使用してBLKBSZGET
指定されたデバイスのブロックサイズを取得するので、これはディスクの実際のブロックサイズです。