Как df узнает, сколько места используется, не просматривая все файлы?

В документации GCC это объясняется так:

GCC позволяет использовать -g с -O. Сокращения, используемые оптимизированным кодом, могут иногда приводить к неожиданным результатам: некоторые объявленные вами переменные могут вообще не существовать; поток управления может ненадолго переместиться туда, куда вы не ожидали; некоторые операторы могут не выполняться, потому что они вычисляют постоянные результаты или их значения уже под рукой; некоторые операторы могут выполняться в разных местах, потому что они были перемещены из циклов.

В вашем случае переменные, которые вы не видите при отладке, вероятно, были оптимизированы.

Для отладки вашей программы вам следует использовать -Og вместо -O в командной строке g++. Это включает оптимизацию, которая никак не влияет на отладку.

1
24.05.2018, 17:23
2 ответа

dfutiliza la llamada al sistema statvfs()y solicita al sistema de archivos las estadísticas de espacio actuales. Por supuesto, esto es rápido ya que el sistema de archivos siempre realiza un seguimiento del espacio utilizado en el sistema de archivos mientras lo administra.

Entonces, la razón por la que dfes rápido es que usa valores almacenados en caché precalculados del sistema de archivos.

Aquí está la historia:

En la década de 1970, dfha sido un programa raíz suid que accedió al dispositivo de disco sin procesar y obtuvo las estadísticas del sistema de archivos del superbloque.

A mediados de la década de 1980,SunOS introdujo syscall statfs()junto con la primera implementación de VFS. Esta llamada ya no necesitaba privilegios. Esta interfaz se entregó a *BSD durante el último intercambio de código SunOS/BSD en la reunión de Tahoe.

En 1989, SVr4/Solaris introdujo una interfaz VFS mejorada que cambió el nombre de syscall a statvfs().Esta versión de syscall se agregó a POSIX desde donde varios sistemas operativos copiaron la interfaz.

Dado que los datos dfse obtienen indirectamente del superbloque que solo tiene valores para todo el sistema de archivos, no hay una forma rápida de obtener los números para un solo directorio.

3
27.01.2020, 23:16

Es probable que el sistema de archivos mantenga un recuento de los bloques de datos usados ​​y libres como parte del funcionamiento normal. dfutiliza esta información.

Incluso si el sistema de archivos no mantiene un contador de tiempo real -, necesita una forma rápida de encontrar bloques libres al escribir nuevos datos, y esos mismos datos también se pueden usar para encontrar la cantidad de bloques libres.


En teoría, algunos sistemas de archivos también podrían mantener un contador de espacio usado -por directorio. Sin embargo, hay algunos problemas.

Si el conteo se mantuviera recursivamente para todo el subárbol, el sistema de archivos necesitaría propagar los números de uso hacia arriba hasta una profundidad arbitraria. Eso podría ralentizar todas las operaciones de escritura. Si solo se mantuviera para los archivos inmediatamente dentro del directorio, todavía se requeriría un recorrido recursivo del árbol para encontrar el tamaño total de un árbol.

En Unix -como los sistemas de archivos, los enlaces duros son un obstáculo aún mayor. Cuando se puede vincular un archivo desde varios directorios (o varias veces desde el mismo directorio ), no tiene un directorio principal único. ¿Dónde se contaría el tamaño del archivo? Contarlo en todos los directorios que lo vinculan produciría un uso total inflado, ya que el archivo podría contarse varias veces. Contarlo en un solo directorio también sería obviamente incorrecto.

De hecho, los archivos (es decir, los inodos )en los sistemas de archivos tradicionales de Unix ni siquiera conocen los directorios en los que residen, solo la cantidad de enlaces a ellos (los nombres que tienen ). En la mayoría de los usos, esa información no es necesaria, ya que de todos modos se accede a los archivos principalmente por su nombre. Almacenarlo también requeriría una cantidad arbitraria de datos en el inodo, duplicando los datos en los directorios.

2
27.01.2020, 23:16

Теги

Похожие вопросы