Die Formel: Was ist diese Zahl?
total int = Summe von (Physical_blocks_in_use) * Physical_block_size / ls_block_size) für jede Datei.
Wo:
ls_block_size
ist ein willkürlicher Umgebungsvariable ( in der Regel 512 oder 1024 Bytes) , die mit der frei modifizierbar ist
--block-size=<int>
Flagge auf ls
dem, POSIXLY_CORRECT=1
GNU - Umgebungsvariable (um 512-Byte - Einheiten) oder die -k
Markierung zu zwingen 1kB Einheiten.
physical_block_size
ist der betriebssystemabhängige Wert einer internen Blockschnittstelle, die mit der zugrunde liegenden Hardware verbunden sein kann oder nicht. Dieser Wert beträgt normalerweise 512b oder 1k, ist jedoch vollständig vom Betriebssystem abhängig. Es kann durch den %B
Wert auf stat
oder angezeigt werden fstat
. Beachten Sie, dass dieser Wert (fast immer) nicht mit der Anzahl der physischen Blöcke auf einem modernen Speichergerät zusammenhängt.
Warum so verwirrend?
Diese Zahl ist ziemlich weit von jeder physischen oder aussagekräftigen Metrik entfernt. Viele Junior-Programmierer haben keine Erfahrung mit Dateilöchern oder Hard / Sym-Links . Darüber hinaus ist die zu diesem speziellen Thema verfügbare Dokumentation praktisch nicht vorhanden.
Die Disjunktheit und Mehrdeutigkeit des Begriffs "Blockgröße" ist das Ergebnis zahlreicher verschiedener Maßnahmen, die leicht verwechselt werden können, und der relativ tiefen Abstraktionsebenen, die sich um den Festplattenzugriff drehen.
Beispiele für widersprüchliche Informationen: du
(oder ls -s
) vs.stat
Das Ausführen du *
in einem Projektordner führt zu folgenden Ergebnissen : (Hinweis: ls -s
Gibt dieselben Ergebnisse zurück.)
dactyl:~/p% du *
2 check.cc
2 check.h
1 DONE
3 Makefile
3 memory.cc
5 memory.h
26 p2
4 p2.cc
2 stack.cc
14 stack.h
Gesamt : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 Blöcke
Wenn man jedoch läuft stat
, sehen wir einen anderen Satz von Werten. Das Ausführen stat
im selben Verzeichnis ergibt:
dactyl:~/p% stat * --printf="%b\t(%B)\t%n: %s bytes\n"
3 (512) check.cc: 221 bytes
3 (512) check.h: 221 bytes
1 (512) DONE: 0 bytes
5 (512) Makefile: 980 bytes
6 (512) memory.cc: 2069 bytes
10 (512) memory.h: 4219 bytes
51 (512) p2: 24884 bytes
8 (512) p2.cc: 2586 bytes
3 (512) stack.cc: 334 bytes
28 (512) stack.h: 13028 bytes
Gesamt: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 Blöcke
Hinweis: Mit dem Befehl stat * --printf="%b\t(%B)\t%n: %s bytes\n"
> können Sie (in der Reihenfolge) die Anzahl der Blöcke, (in Parens) die Größe dieser Blöcke, den Namen der Datei und die Größe in Bytes ausgeben, wie oben gezeigt.
Es gibt zwei wichtige Dinge zum Mitnehmen:
stat
Berichte sowohl das physical_blocks_in_use
und physical_block_size
wie in der Formel oben. Beachten Sie, dass dies Werte sind, die auf Betriebssystemschnittstellen basieren.
du
liefert eine allgemein akzeptierte Schätzung der physischen Festplattenauslastung.
Als Referenz ist hier das ls -l
Verzeichnis von oben:
dactyl:~/p% ls -l
**total 59**
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.cc
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.h
-rw-r--r--. 1 dhs217 grad 0 Oct 16 2013 DONE
-rw-r--r--. 1 dhs217 grad 980 Oct 16 2013 Makefile
-rw-r--r--. 1 dhs217 grad 2069 Oct 16 2013 memory.cc
-rw-r--r--. 1 dhs217 grad 4219 Oct 16 2013 memory.h
-rwxr-xr-x. 1 dhs217 grad 24884 Oct 18 2013 p2
-rw-r--r--. 1 dhs217 grad 2586 Oct 16 2013 p2.cc
-rw-r--r--. 1 dhs217 grad 334 Oct 16 2013 stack.cc
-rw-r--r--. 1 dhs217 grad 13028 Oct 16 2013 stack.h
man ls
mein System diese Zeile nicht,info coreutils ls
tut es aber . Wie kommtman ls
undinfo coreutils ls
verschiedene Informationen über den gleichen Befehl hat? Warum wird nichtls
nur einmal dokumentiert? Zwei verschiedene Dokumentationen für denselben Befehl zu haben, scheint für einen Fehler eingerichtet zu sein.