Woher weiß die Katze, welche Blockgröße optimal ist?

7

Aus dieser Lektüre geht hervor, dass cat beim Kopieren von Daten auf eine andere Festplatte automatisch die optimale Blockgröße (oder sehr nahe daran) verwendet.

Ich frage mich, wie es die optimale Blockgröße bestimmt und ob die Methode, die cat verwendet, irgendwie auf dd angewendet werden kann.

EmmaV
quelle

Antworten:

10

Die Hauptschleife von GNU cat ist im einfachsten Fall (Funktion simple_catvon cat.c):

while (true)
    {
        /* Read a block of input. */
        n_read = safe_read (input_desc, buf, bufsize);

        /* ... */
    }

Dann wird die Frage "Wie wird bufsizeeingestellt?" Die Antwort ist die Verwendung von io_blksize( insize = io_blksize (stat_buf)), die wie folgt definiert ist:

io_blksize (struct stat sb)
{
  return MAX (IO_BUFSIZE, ST_BLKSIZE (sb));
}

Dabei gibt ST_BLKSIZE die Vorstellung des Betriebssystems von der bevorzugten E / A-Blockgröße des Dateisystems (Zugriff über stat), und IO_BUFSIZE ist als 128 * 1024 (128 KB) definiert. Hier ist ein Auszug aus der Linux- statSyscall-Dokumentation:

blksize_t st_blksize; /* blocksize for file system I/O */ (...)

The st_blksize field gives the "preferred" blocksize for efficient
file system I/O.   (Writing to a file in smaller  chunks may cause
an inefficient read-modify-rewrite.)

Es scheint also, dass GNU cat Blöcke von 128 KB oder die vom Dateisystem empfohlene E / A-Blockgröße einliest, je nachdem, welcher Wert größer ist.

dhag
quelle
Für ein tieferes Verständnis sollten Sie vielleicht erwähnen, woher ST_BLKSIZE kommt - damit OP versteht, dass dies keine "Magie" ist, sondern eine Dateieigenschaft, die abgefragt werden kann stat(2).
Andreas Wiese
Guter Punkt, Andreas. Ich habe meine Antwort aktualisiert, um etwas mehr über st_blksize zu sagen.
Dhag
Also würde ich verwenden stat -f -c %s file, um die Blockgröße des Dateisystems zu finden, in dem sich die Eingabedatei befindet? Ist die Blockgröße des Dateisystems, in das die Ausgabedatei verschoben wird, nicht von Bedeutung? Und was ist mit dem Kopieren von zB / dev / zero auf ein Raw-Block-Gerät?
EmmaV
Ja, stat -f -c %s fileermöglicht Ihnen den Zugriff auf diesen Wert über die Befehlszeile. Die Blockgröße des Ausgabedateisystems wird berücksichtigt. Ich habe diesen Teil entfernt, werde aber meine Antwort erweitern (der größte Teil der Ausgabegröße, der Eingabegröße und des fest codierten Werts wird verwendet). Ich sehe nicht, dass Pseudodateien wie /dev/zeroauf besondere Weise behandelt werden: GNU cat wird auch einfach statauf diesen verwendet.
Dhag