Me enteré de que por defecto de e/S en los programas se almacenan en la memoria, yo.e que se sirven de almacenamiento temporal para el solicitante del programa.
Entiendo que el búfer de mejora IO rendimiento (tal vez por la reducción de las llamadas al sistema). He visto ejemplos de deshabilitar el almacenamiento en búfer, como setvbuf en C. ¿Cuál es la diferencia entre los dos modos y cuándo se debe usarse sobre el otro?

InformationsquelleAutor sud03r | 2009-09-20

2 Comentarios

  1. 108

    Desea sin búfer de salida cada vez que usted quiere asegurarse de que la salida ha sido escrito antes de continuar. Un ejemplo es el error estándar bajo una C runtime library – esto es generalmente sin búfer de forma predeterminada. Ya que los errores (esperemos) poco frecuentes, usted quiere saber acerca de ellos inmediatamente. Por otro lado, la salida estándar es búfer simplemente porque se supone que habrá mucho más datos que pasan a través de él.

    Otro ejemplo es una biblioteca de registro. Si sus mensajes de registro se llevan a cabo dentro de tampones en su proceso, y su proceso de volcados de núcleo, hay una muy buena probabilidad de que la salida nunca será escrito.

    Además, no es sólo el sistema de las llamadas que se reducen al mínimo, pero e/S de disco así. Supongamos un programa que lee un archivo de un byte a la vez. Con sin búfer de entrada, que saldrá a la (relativamente muy lento) de disco para cada byte a pesar de que probablemente tiene que leer en un bloque entero de todos modos (el hardware del disco en sí puede tener buffers pero usted todavía va a la controladora de disco, que va a ser más lento que el acceso a la memoria).

    Por el almacenamiento en búfer, el bloque entero se lee en el buffer a la vez, los bytes individuales que se entregarán a partir de la (in-memory, increíblemente rápido) área de amortiguamiento.

    Tenga en cuenta que el almacenamiento en búfer puede tomar muchas formas, tales como en el siguiente ejemplo:

    +-------------------+-------------------+
    | Process A         | Process B         |
    +-------------------+-------------------+
    | C runtime library | C runtime library | C RTL buffers
    +-------------------+-------------------+
    |               OS caches               | Operating system buffers
    +---------------------------------------+
    |      Disk controller hardware cache   | Disk hardware buffers
    +---------------------------------------+
    |                   Disk                |
    +---------------------------------------+
    
    • El gráfico es maravilloso. Una cosa a destacar es que un FILE objeto (un chorro)’s almacenar internamente es completamente diferente de un fgets de búfer necesario parámetro. Esto sólo me confundió durante horas antes de escribir algo de código para entenderlo. QAQ
  2. 28

    Desea sin búfer de salida cuando ya se tiene gran secuencia de bytes listo para escribir en el disco, y quiero evitar una copia extra en un segundo tampón en el medio.

    Búfer de salida de los flujos de acumular escribir los resultados en un búfer intermedio, el envío es para el sistema operativo sistema de archivos sólo cuando un número suficiente de datos se ha acumulado (o flush() se solicita). Esto reduce el número de llamadas de sistema de archivo. Desde llamadas de sistema de archivo puede ser costoso en la mayoría de plataformas (en comparación a corto memcpy), buffer de salida es una ganancia neta cuando se realiza un gran número de pequeñas escribe. Sin búfer de salida es generalmente mejor cuando usted ya tiene grandes buffers para enviar — copiar a un búfer intermedio, no reducirá el número de OS llama más, y presenta un trabajo adicional.

    Sin búfer de salida ha nada que ver con asegurar que sus datos alcanza el disco; que la funcionalidad es proporcionada por flush(), y funciona tanto en el búfer y sin corrientes. Sin búfer IO escribe no es garantía de que la información ha alcanzado el disco físico — el sistema operativo sistema de archivos es libre de mantener una copia de sus datos de forma indefinida, nunca escritura en el disco, si se quiere. Sólo es necesario comprometerse a disco cuando se invoca flush(). (Tenga en cuenta que close() se llame flush() en su nombre).

    • Va a llamar a flush() garantía está escrito en el disco? Pensé que sólo se la pasó junto a la disco del búfer.
    • Usted necesita O_SYNC para garantizar a la garantía escribe.

Dejar respuesta

Please enter your comment!
Please enter your name here