Perché le stampe vengono stampate su buffer standard?

2

Sto cercando di capire qual è la motivazione per il buffering della stampa sullo standard output.

L'ho sperimentato in più linguaggi di programmazione, uno scenario in cui si tenta di tracciare un bug eseguendo output di stampa e le istruzioni di stampa non vengono stampate in tempo reale solo perché il buffer non è stato svuotato.

Quindi per ottenere che il comando venga effettivamente stampato dove viene chiamato e deve essere utilizzato flush aggiuntivo.

Qual è la motivazione per un simile comportamento?

    
posta TheMeaningfulEngineer 09.09.2016 - 19:49
fonte

2 risposte

3

Storicamente, per ridurre i ritardi nell'elaborazione.

Se si scriveva ad una stampante di linea, ad esempio, e ogni riga non era bufferizzata, bisognava aspettare fino a quando l'intera riga non veniva stampata prima che il controllo tornasse dalla funzione di stampa. Questo non solo ha ritardato l'ulteriore elaborazione nel tuo programma, ma ha anche rallentato la stampa perché la stampante ha dovuto attendere la sua elaborazione e inviarla una nuova linea per la stampa, dopo aver finito di stampare la precedente.

Avere un buffer significava che la stampante poteva essere stampata mentre si stava elaborando e preparando la riga successiva da stampare.

    
risposta data 09.09.2016 - 20:06
fonte
2

lo stdout viene in genere memorizzato nel buffer in modo orientato alla linea, tranne che per un'applicazione è disponibile un buffer personalizzato aggiuntivo. Il motivo sono le prestazioni e i terminali classici funzionano meglio in questo modo. Immaginate anche che qualcuno abbia usato una stampante per stdout e stdin fosse un qualche dispositivo di solo input (in genere aveva una sola riga per l'input). In questo caso è necessario un avanzamento di riga per vedere l'output su una stampante.

Ma lo stdout dovrebbe essere sempre cronologico (è un FIFO, il primo al primo posto). Ciò che forse vedi sono applicazioni che utilizzano thread o più processi. Alcuni sviluppatori di applicazioni sono troppo pigri per implementare meccanismi di blocco appropriati per lo stdout. stdout è come un multiplexer e può combinare le uscite con più uscite in un flusso che appare confuso.

    
risposta data 09.09.2016 - 20:14
fonte

Leggi altre domande sui tag