Mover un archivo mientras está en uso: ¿cómo funciona?


31

Me di cuenta de que en sistemas operativos que no son de Windows ... es decir, Linux / Mac puedo hacer cosas como: - Enviar un zip a un amigo por sobre el objetivo - Eliminar el archivo mientras está en transferencia

Y la transferencia no falla.

O bien, puedo hacer operaciones como ... - iniciar una película - borrar el archivo - la película aún se reproduce hasta su finalización (leer desde el disco, no solo almacenada en la memoria intermedia)

Aunque los archivos se están "eliminando", como mencioné, en realidad se están moviendo a una ubicación diferente en el sistema de archivos ... es decir, un directorio de Papelera o algo así. Entonces, me parece que el sistema operativo usa un puntero @ el archivo que se actualiza cuando se mueve en lugar de acceder a los archivos directamente.

¿Alguien puede arrojar algo de luz sobre cómo se implementa esta capacidad IMPRESIONANTE? Ni siquiera estoy seguro de qué buscar en Google para obtener más información al respecto.

gracias.


1
En teoría, supongo que hay 2 formas en que podría suceder. Ambos son realidad. El archivo está en la memoria. O el sistema de archivos tiene referencias a los archivos y solo se elimina la referencia. Ambos son realidad. El hecho de las referencias es cómo los programas de recuperación pueden recuperar las cosas. La idea de que el archivo se elimine realmente cuando todos los programas acceden a cerrarlo, parece una tontería. Puede buscar listas vinculadas (una estructura de datos de programación, para comprender el concepto con mayor profundidad). O puede buscar sobre sistemas de archivos particulares.
barlop

Respuestas:


29

La entrada del directorio es solo un puntero a un inodo. El inodo contiene la metainformación sobre el archivo (que no sea el nombre) y apunta a los datos del archivo (si los hay). Cuando comienzas a copiar un archivo, obtienes un identificador para el inodo.

El sistema operativo mantiene un recuento de referencias al inodo. Mientras haya referencias al inodo, se conservan el inodo y los datos del archivo. Una vez que se eliminan todas las referencias al inodo, se elimina el inodo y se libera el espacio requerido por el archivo.

Como tiene el archivo abierto para copiar, se mantendrá hasta que su proceso cierre el archivo. Esto debería ocurrir cuando finalice la transferencia del archivo, y sucederá si falla el proceso de copia. Si la transferencia de archivos falla a mitad de camino y ha eliminado todos los enlaces duros al archivo, no podrá reiniciar con éxito la transferencia.

EDITAR: como otros han señalado, los movimientos de archivos en el mismo dispositivo se realizan sin mover los datos. En su lugar, se crea una nueva entrada de directorio en el directorio de destino y se elimina la entrada de directorio original.

Es posible tener múltiples entradas de directorio para el mismo archivo. Estos se llaman enlaces duros. Se crean al hacer una nueva entrada de directorio para el archivo sin eliminar la entrada original. El inodo del sistema de archivos tiene un recuento de referencia para registrar el número de entradas de directorio que apuntan al archivo.

EDIT2: si el proceso se bloquea o se cierra, el archivo se eliminará limpiamente ya que el recuento de acceso en memoria se reducirá a cero. Esta es la acción que ocurre cuando el programa finaliza normalmente.

En el caso de una falla de energía u otro apagado desordenado del sistema, el disco necesitará una fsck(verificación del sistema de archivos) antes de que pueda montarse completamente. Dependiendo del estado del inodo en el disco y las estructuras de directorio, el espacio se recuperará, el archivo permanecerá en el directorio o se realizará una nueva entrada en el lost+founddirectorio. Los resultados dependerán de qué cambios se hayan vaciado al disco o se hayan escrito en el diario de sistemas de archivos.


55
Exactamente. Yo no podría decirlo mejor. Por cierto, un truco común, si necesita un poco de almacenamiento de archivos reutilizables dentro de un programa, es crear un archivo /tmpe inmediatamente unlink(2). En ese momento, no hay ningún archivo en un directorio (por lo que no hay nada que limpiar al salir o bloquearse), pero su proceso aún tiene acceso al archivo, y ningún otro proceso puede alterarlo accidental o deliberadamente. Eso ilustra la propiedad de interés.
Norman Gray

¿Significa esto que si se elimina un archivo abierto mientras un programa lo está utilizando y se produce un corte de energía, los datos varados permanecerán en el disco ocupando espacio? ¿Qué pasa si el proceso que usa el archivo se bloquea o se mata?
Jason C

1
@JasonC He actualizado la respuesta para responder a sus preguntas.
BillThor

6

Como explicó Matt Jenkins, el sistema operativo (el sistema de archivos) realiza un seguimiento de los archivos que las aplicaciones mantienen abiertos. Mientras un proceso mantenga abierto un archivo, sus datos permanecerán en el disco (aunque se haya eliminado y otros programas ya no lo puedan ver ni acceder a él).

Tenga en cuenta que una consecuencia de esto es que el espacio ocupado por un archivo solo puede recuperarse una vez que el último proceso que lo usó lo ha cerrado. Esa es una pregunta frecuente para las operaciones del sistema de archivos Linux / Unix: "el comando 'df' dice que la partición está llena, mientras que 'du' informa el espacio libre" (véase, por ejemplo, http://batleth.sapienti-sat.org/projects/FAQs/ext3- faq.html ). Si necesita liberar espacio, no es suficiente eliminar archivos grandes (por ejemplo, archivos de registro), también debe asegurarse de que ningún proceso los mantenga abiertos (generalmente un problema con los archivos de registro).


No es cierto en el caso de OS X / HFS +: puede mover archivos, por ejemplo, a la Papelera, pero no a través de particiones o eliminarlos (es decir, vaciar la Papelera).
Daniel Beck

2

Es bastante simple en realidad. El archivo mantiene una lista de referencias: procesos que acceden al archivo. Cuando elimina el archivo, solo elimina la lista del directorio pero no el archivo en sí. Los programas que todavía tienen abierto el archivo aún pueden acceder a él. El archivo solo se elimina realmente cuando todos los programas que acceden a él lo cierran.

Además, al mover el archivo, si está dentro del mismo sistema de archivos, el archivo en realidad no se mueve como tal, solo cambia el puntero al directorio en el que se encuentra el archivo.


"El archivo mantiene una lista de referencias"?
Daniel Beck

Debe ser el "SO o Explorer" no archivo.
Moab

2
Ese sería realmente el sistema de archivos.
JRobert

El sistema operativo utiliza el sistema de archivos para almacenar las referencias en el archivo (nlinks en la estructura del encabezado del archivo) - ahí, estamos todos contentos;)
Majenko

1
Las "referencias" son procesos con un identificador abierto al archivo y enlaces duros (incluido el primer nombre de archivo) al archivo. Los bloques de datos no se marcan como libres y están disponibles para su reutilización hasta que el recuento de referencia llegue a cero.
mpez0

0

En sistemas de archivos unix, un archivo puede tener uno o más enlaces duros . El archivo vive mientras haya al menos uno. Cuando se elimina el último, se libera el espacio del archivo. el enlace anterior le dará un punto de partida para leer más; consulte especialmente la sección "Contador de enlaces".


1
Es cierto, pero eso no es lo que está sucediendo aquí. El punto es que incluso después de que se elimine el último enlace duro , el archivo permanece hasta que todos los procesos hayan cerrado sus controladores.
sleske
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.