die beiden Implementierungen zu verstehen und ihre Vor/Nachteile, ich denke, es hier zu verallgemeinern nützlich ist:
- Generalize aus dem Datei Konzept zu betrachten wirklich jede erworbene Ressource; und
- Verallgemeinern, was das Betriebssystem bietet, was auch von der verwendeten Programmiersprache, Bibliotheken oder Frameworks zur Verfügung gestellt wird.
Wie, warum Systeme die erste Methode verwenden kann ...
Die Antwort würde in ähnlicher Weise anwenden, warum Sie kann wie RAII eine Programmierung Idiom verwenden. I.e. Möchten Sie Ihr eigenes Lebenszyklusmanagement der Ressource durchführen oder möchten, dass dies für Sie erledigt wird? Wenn wir Life Cycle Management für uns erledigen (wir als Programmierer), verlieren wir manchmal die Fähigkeit, Dinge zu tun, die wir wollen (Dinge, die sonst möglich wären, wenn wir das Life Cycle Management selbst implementieren würden). Manchmal ist es wichtiger, nicht in der Lage zu sein, eine Ressource zu verlieren, als in der Lage zu sein, auf jedes Klingeln und Pfeifen dafür zuzugreifen.
Nehmen Sie Speicherverwaltung in C++ zum Beispiel. Wir können Speicher vom System unter Verwendung new
zuweisen oder wir können stattdessen std::make_shared
aufrufen. Ersteres erfordert jedoch, dass wir auch delete
(am Ende seiner Verwendung) anrufen, wenn wir sicherstellen wollen, dass der Speicher nicht durchgesickert ist. In der Zwischenzeit gibt Java dem Programmierer keinen direkten Zugriff auf das Zuweisen von Speicher und verwendet stattdessen eine Speicherbereinigung, so dass "programmers can be spared the burden of having to perform manual memory management".
In Bezug auf Beispiele der ersten Methode ...
Viele Unix-artige Betriebssysteme stellen eine programmatische Schnittstelle zur syslog
Möglichkeiten. Während es hat öffnen und schließen wie Analogien in openlog
und closelog
, Aufruf dieser ist optional. Man kann einfach syslog
aufrufen, um den Systemprotokollierungstext zu starten.
Standard-Eingang und Ausgang wird ebenfalls für uns verwaltet. Wenn ein Programm gestartet wird, sind diese Konzepte normalerweise bereits geöffnet und verfügbar.Wenn es beendet wird, werden diese Ströme für uns geschlossen (wie notwendig). Programme müssen nicht fclose(stdout)
(noch etwas wie fopen("/dev/console")
) aufrufen. Programme können einfach fputs
oder fgets
mit stdout
oder stdin
aufrufen.
Bezeichnen IBM Mainframe-Systeme mit JCL, welche Dateien mit welcher Kanalnummer verbunden sind, als Beispiel für die erste Technik? –
Ich denke, dass das ist, was in # 1 bezeichnet wird. Von damals, als die alten FORTRAN und COBOL keine OPEN Statements hatten. – user3344003