Thread Vor kopieren warten bis Subroutine abgeschlossen (28 answers)
Opened by giordano at 2010-02-17 14:50

sid burn
 2010-02-22 16:00
#133427 #133427
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Hi, ist nicht schlimm das du nicht mitkommst, wahrscheinlich war dein Problem davon sowieso nicht betroffen.

Zur kurzen Erklärung. Wenn man in einer Programmiersprache I/O macht so gibt es aus Performance Gründen einige Puffer die im Spiel sind. Das bedeutet wenn du in Perl zum Beispiel etwas in einer Datei schreibst bedeutet es nicht das nach erfolgreichen ausführen des Perls befehls die Daten wirklich auf der Festplatte gelandet sind. Als Minimum gibt es folgende Puffer.

* PerlIO Puffer
* STDIO Puffer
* Evtl. weitere OS Puffer (Dateisystem etc.)
* Festplattencache Puffer

Die letzten beiden sind eher Transparent. Daher selbst wenn es noch nicht Physikalisches geschrieben wurden, wenn du liest beachtet dein Betriebssystem diese Puffer und gibt dir den Inhalt zurück so als wäre es schon physikalisches geschrieben. Probleme hast du hier nur bei Stromausfall. Den dann sind die Daten wirklich weg wenn sie noch nicht geschrieben werden konnten.

STDIO Puffer passiert auf C Ebene und ist eigentlich auch Fest mit dem OS verdrahtet. Zumindest bei Linux. Soweit ich in Erinnerung habe ist das aber nur ein Puffer der für die Performance da ist. Daher dieser wird immer schnellstmöglich geleert.

Und direkt auf Perl Ebene haben wir den PerlIO Puffer. Dieser Leert aber nicht sofort sondern wenn du ausgaben auf einem Terminal machst wartet es immer solange bis es eine zeile zusammen hat und erst dann sendet es die fertige zeile zum OS, dass dann wiederrum die unterschiedlichen Puffer durchläuft. Bei Dateihandles etc. ist es Blockorientert sprich es kann z.B. sein das er immer nur 4 KiB Blöcken daten sendet (den genauen wert kenne ich nicht). Mit "autoflush" schaltest du diesen PerlIO Puffer aus, bzw du aktivierst autoflush. Der Puffer ist immer noch da, nur wird er immer so oft/schnell geleert wie es möglich ist. Wenn also nur ein Zeichen im Puffer ist wird dieser schon geleert, und wartet nicht solange bis du wirklich eine Zeile oder die 4KiB zusammen hast.

Nur manchmal kann der PerlIO Puffer eben nachteilig sein. Wenn ich halt 300 zeichen in eine Datei schreibe aber kein Newline zeichen kommt, dann sind die 300 Zeichen auch noch nicht in der Datei gelandet. Und auch kein anderes Programm hat etwas davon mitbekommen, erst wenn der Puffer geleert wird, können andere Programme dort etwas mitbekommen. Am meisten tritt das aber eigentlich eher bei ausgaben auf der Shell auf. Wenn man beispielsweise eine Fortschrittanzeige macht und zum beispiel immer nur ein zeichen ausgeben möchte für einen Status etc.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread Vor kopieren warten bis Subroutine abgeschlossen