2011-03-05 5 views
5
En referencia a this question sobre lectura() y escritura(), me pregunto si cada descripción de archivo abierto tiene sus propios almacenamientos intermedios de lectura y escritura o si quizás hay un solo búfer de lectura y escritura para un archivo cuando se abrió veces a la vez. Tengo curiosidad porque esto tendría un efecto sobre qué sucede exactamente con la superposición de escrituras en el mismo archivo. Tal vez esto es algo que varía entre Unixes?

(A mi entender, "descripción de archivo" se refiere a la información/opciones sobre un archivo abierto, como la posición actual del marcador. "Descriptor de archivo", en cambio, se refiere solo al número utilizado en un proceso para referirse a una descripción.)¿Cada descripción de archivo Unix tiene sus propios búferes de lectura/escritura?

+1

Creo que el nivel bajo de E/S de Unix está casi sin búfer. Pero si se abre como una secuencia (fopen, etc.), se crea un búfer para la estructura de ARCHIVO. – seand

+1

@seand A mi entender, la lectura/escritura se almacenan en el búfer por defecto a menos que el archivo se abra con O_DIRECT. La biblioteca de E/S basada en secuencias en realidad agrega una segunda capa de almacenamiento en búfer, esta vez en el proceso. – Jegschemesch

Respuesta

4

Esto depende un poco si usted está hablando de sockets o archivos reales.

Estrictamente hablando, un descriptor nunca tiene sus propios búferes; es solo un manejar a una abstracción más profunda.

Los objetos del sistema de archivos tienen sus propios "buffers", al menos cuando son necesarios. Es decir, si un programa escribe menos que el tamaño del bloque del sistema de archivos, el kernel no tiene otra opción que leer un bloque FS y fusionar la escritura con los datos existentes.

Este búfer se adjunta al vnode y en un nivel inferior, posiblemente un inodo. Es propiedad del archivo y no del descriptor. Puede mantenerse durante mucho tiempo si hay memoria disponible.

En el caso de un socket, un stream, pero no específicamente un solo descriptor, en realidad tiene buffers de su propiedad.

+0

Gracias. Como alguien más lo puso en la otra pregunta, esto puede variar entre los sistemas operativos, pero generalmente los bloques enteros del sistema de archivos subyacente se almacenan de forma individual, y cada bloque almacenado se comparte entre muchos lectores/escritores que accedan al archivo. Suena como un sistema de mini-paginación donde los buffers de bloques individuales se marcan como sucios cuando se escriben. Es bueno saber acerca de los sockets, aunque tenía curiosidad sobre los archivos 'regulares'. – Jegschemesch

0

Si los archivos se abrieron en modo bloqueo, entonces sí, solo debería haber un buffer. Apostaría que el valor predeterminado es no bloquear por razones de rendimiento.

Cuestiones relacionadas