warum ist es so ineffizient den Buffer weg zu lassen?
Naja, weil eben nicht nur Move-/Kopieroperationen im RAM-Speicher stattfinden müssen, sondern noch viele andere Dinge:
- Aufruf einer Systemfunktion wie etwa
WriteFile (Win32)
- Diese wiederum benutzt den für den FILE-Descriptor zuständigen Treiber des Laufwerkes, und führt dort auch Funktionen aus
- Der Treiber wiederum muss mit dem Speicherbus des Systems (z.B.
SCSI) reden, um ihn anzuweisen, Daten von einer physischen Arbeitsspeicher-Adresse zum Laufwerk zu senden
- Das Laufwerk wiederum hat einen Controller, der die Daten entgegennimmt und dann entsprechend die Hardware instruiert, diese zu speichern oder erstmal in einem internen flüchtigen Cache abzulegen. Davor kommt auch noch das Warten auf noch vorher auszuführende I/O Schreibe-/Leseoperationen. Dann das Alloziieren (falls noch nicht alloziiert) eines entsprechenden Bereiches auf der Festplatte und dann das Warten, dass die Hardware bereit ist, diesen Bereich zu schreiben (z.B. bei HDD Warten, dass die Scheibe sich an der entsprechenden Stelle befindet).
- Dann das physische Schreiben der Daten
- Dann dem SCSI Controller Bescheid sagen, dass alles geschrieben wurde, oder zumindest, dass die Daten im Cache des Festplattencontrollers angekommen sind
- Dann muss der SCSI Controller dem auf die I/O Operation wartenden Thread der CPU Bescheid sagen (z.B. per Hardware-Interrupt)
Es gibt zudem noch mehrere Möglichkeiten, wie eine Datei für ein Programm aussehen kann. Einmal eben als abstrakter FILE Descriptor mit System-Operationen wie fwrite/fread, etc. oder als Memory-Mapped File. In letzterem Fall sieht dann für das Programm die Datei tatsächlich so aus wie virtueller Arbeitsspeicher und man kann mit Speicherschreib-/leseoperationen darauf zugreifen. Für diesen Fall lese z.B.
https://ayende.com/blog/162791/on-memory-mapped-files
Es sind also seeeehr viel mehr Operationen beteiligt, wenn man auf eine externe Festplatte speichern möchte, als wenn du einfach nur Arbeitsspeicher hinundherkopierst.