Der Unterschied und die Verbindung zwischen Linux-Standard-E / A und Datei-E / A.

Vorwort:

      Der Hauptinhalt dieses Artikels wird aus dem Internet extrahiert, und die gefundenen verstreuten Informationen werden verdaut und zur späteren Bezugnahme zusammengefasst.

      Lesen Sie die folgenden Artikel, danke für das Teilen:

      Linux Quest E / A-Effizienz

      https://cloud.tencent.com/developer/article/1018033

      Grundlegende Grundlagen der Linux-Systemprogrammierung (4): Der Unterschied zwischen dem E / A-Puffer der C-Standardbibliothek und dem Kernel-Puffer     

      https://cloud.tencent.com/developer/article/1012299

Konzept:


       Standard-E / A: Bezieht sich auf die Standard-E / A-Bibliothek, auch als E / A mit Puffer bezeichnet. Dies wird durch den ANSI C-Standard festgelegt. Die Standard-E / A-Bibliothek ersetzt den Benutzer, um viele Details wie Cache-Zuordnung, E / A-Ausführung mit optimierter Länge usw. zu verarbeiten. Der Zweck der Bereitstellung des Cache besteht darin, die Anzahl der Lese- und Schreibaufrufe zu minimieren.
Allgemeine Funktionen: fopen, fread, fwrite, fclose, printf, fprintf, scanf, sscanf usw.
Datei-E / A: Auch als ungepufferte E / A bezeichnet. Dies bedeutet, dass jedes Lesen und Schreiben ein Systemaufruf im Kernel ist. Diese ungepufferten Datei-E / A-Funktionen sind nicht Teil von ISO C. Sie sind Teil der POSIX.1- und Single UNIX-Spezifikation. Allgemeine Funktionen: Öffnen, Lesen, Schreiben, Suchen, Schließen usw.

Kontakt:


      Das Benutzerprogramm ruft die C-Standard-E / A-Bibliotheksfunktionen auf, um normale Dateien oder Geräte zu lesen und zu schreiben, und diese Bibliotheksfunktionen leiten die Lese- und Schreibanforderungen über Systemaufrufe an den Kernel weiter, und der Kernel steuert die Festplatte oder das Gerät, um den E / A-Vorgang abzuschließen. Die C-Standardbibliothek weist jeder geöffneten Datei einen E / A-Puffer zu, um Lese- und Schreibvorgänge zu beschleunigen. Dieser Puffer kann über die FILE-Struktur der Datei gefunden werden. Der Benutzer ruft die Lese- und Schreibfunktionen die meiste Zeit im E / A-Puffer auf. Lesen und Schreiben, nur wenige Male muss die Lese- und Schreibanforderung an den Kernel übergeben werden. Am Beispiel von fgetc / fputc kann die Funktion fgetc, wenn das Anwenderprogramm zum ersten Mal fgetc aufruft, um ein Byte zu lesen, über einen Systemaufruf in den Kernel eintreten, um 1 KByte in den E / A-Puffer zu lesen, und dann den Wert im E / A-Puffer zurückgeben. Das erste Byte wird dem Benutzer übergeben, und die Lese- und Schreibposition zeigt auf das zweite Zeichen im E / A-Puffer. Später passt der Benutzer fgetc an und liest es direkt aus dem E / A-Puffer, ohne den Kernel zu betreten. Wenn der Benutzer alle 1-KByte-Bytes gelesen hat und fgetc erneut aufruft, gibt die fgetc-Funktion den Kernel erneut ein, um 1-KByte-Bytes in den E / A-Puffer zu lesen. In diesem Szenario entspricht die Beziehung zwischen dem Benutzerprogramm, der C-Standardbibliothek und dem Kernel genau der Beziehung zwischen CPU, Cache und Speicher in der "Speicherhierarchie". Der Grund, warum die C-Standardbibliothek einige Daten aus dem Kernel vorliest, befindet sich in I. Im E / A-Puffer wird gehofft, dass das Benutzerprogramm diese Daten später verwendet. Der E / A-Puffer der C-Standardbibliothek befindet sich ebenfalls im Benutzerbereich. Das Lesen von Daten direkt aus dem Benutzerbereich ist viel schneller als das Einlesen von Daten in den Kernel. Andererseits wird das Benutzerprogramm, das fputc aufruft, normalerweise nur in den E / A-Puffer geschrieben, so dass die fputc-Funktion schnell zurückkehren kann. Wenn der E / A-Puffer voll ist, fügt fputc den E / A-Puffer in den Systemaufruf ein Die Daten werden an den Kernel übergeben, und der Kernel schreibt die Daten schließlich zurück auf die Festplatte oder das Gerät. Manchmal möchte das Anwenderprogramm die Daten im E / A-Puffer sofort in den Kernel übertragen, damit der Kernel sie auf das Gerät oder die Festplatte zurückschreibt. Dies wird als Flush-Operation bezeichnet. Die entsprechende Bibliotheksfunktion ist fflush. Die fclose-Funktion führt vor dem Schließen der Datei auch Flush aus. Betriebs.


der Unterschied:


1. Der Unterschied im Puffermechanismus:
      Wie wir alle wissen, ist der Datenaustausch zwischen CPU und Speicher viel größer als der Festplattenbetrieb. Durch den Caching-Mechanismus kann die Anzahl der Lese- und Schreibvorgänge auf der Festplatte verringert und die Effizienz gleichzeitiger Verarbeitungsprogramme verbessert werden. Daher ist das Caching eine Möglichkeit, die Speicherung und Verarbeitung von Aufgaben zu verbessern. Effektive Effizienzmethode.
Aus makroökonomischer Sicht ist das Linux-Betriebssystem in den Benutzermodus und den Kernelmodus unterteilt, die beide Caches bei der Verarbeitung von E / A-Vorgängen bereitstellen. Der Benutzermodus wird als Standard-E / A-Cache, auch als Benutzerbereichs-Cache bezeichnet, und der Kernel-Modus wird als Puffer-Cache, auch als Seiten-Cache bezeichnet, bezeichnet. Da Caches bereitgestellt werden, wird dieses Buch in Caches ohne E / A und Caches mit E / A unterteilt. Der Grund dafür ist, dass "ohne E / A-Cache" bedeutet, dass diese E / A nicht im Benutzerbereich verfügbar sind. / O-Operationen werden gepuffert und der Kernel wird gepuffert.

2. Die Flussdifferenz des E / A-Betriebs:


  Wie in der obigen Abbildung gezeigt, müssen die Lese- und Schreibvorgänge des Benutzerprozessbereichs und des Kernelprozessbereichs den Puffercache durchlaufen. Die Funktion des Caches wurde bereits erwähnt, um die Anzahl der Lese- und Schreibvorgänge auf der Festplatte zu verringern und die Effizienz der E / A zu verbessern. Sehen Sie sich beim Lesen und Schreiben einer Datei zunächst den Betriebsablauf der System-E / A an.
2.1 Datei-E / A:

Es gehört zum Systemaufruf des Kernels und beinhaltet keine Teilnahme am Benutzermodus. Nehmen Sie das Etikett in der Abbildung als Beispiel:
      (3) Rufen Sie die Schreibfunktion auf, um Daten in die Datei zu schreiben. Die zu schreibenden Daten werden in buf gespeichert, z. B. write (fd, 'abc', 3). BUFFSIZE muss vor dem Aufruf festgelegt werden. Unterschiedliche BUFFSIZE wirken sich auf die E / A-Effizienz aus. Lassen Sie mich noch einmal auf dieses Problem eingehen.
      (5) Verzögertes Schreiben: Wenn der Cache-Bereich voll ist oder der Kernel den Puffer neu schreiben muss, werden die Daten in die Ausgabewarteschlange geschrieben. Wenn die Daten den Kopf der Warteschlange erreichen, wird der Plattenschreibvorgang tatsächlich ausgelöst.
      (6) Vorlesen: Wenn festgestellt wird, dass ein sequentielles Lesen durchgeführt wird, versucht der Kernel, mehr Daten zu lesen, als die Anwendung benötigt, und geht davon aus, dass die Anwendung diese Daten bald lesen wird. Auf diese Weise können die Daten, die beim nächsten Mal gelesen werden sollen, schnell gefüllt werden, wenn sich keine Daten im Puffer befinden.
      (4) Rufen Sie read auf, um die erforderlichen Daten aus dem Puffercache zur Verarbeitung in die Logikeinheit zu lesen.
Das Obige ist die vierstufige Operation, die an der System-E / A beteiligt ist.

2.2 Standard-E / A:

      Es gehört zu den von ISO C implementierten Standardbibliotheksfunktionen und ruft die zugrunde liegenden Systemaufrufe auf.
      (1) Schreiben Sie die Daten in der Logikeinheit in die Datei. Je nach Bedarf können drei Arten von Funktionen aufgerufen werden. Nehmen Sie als Beispiele fputc, fputs und fwrite. Diese Funktionen müssen die Größe des Puffers nicht künstlich steuern, sondern werden vom System automatisch angewendet. Nachdem der Benutzer die entsprechende E / A-Funktion gemäß verschiedenen Cache-Typen (ob voller Puffer, Zeilenpuffer oder ohne Puffer) definiert hat, ruft das System automatisch malloc und andere Funktionen auf, um einen Puffer, dh einen Standard-E / A-Puffer, zu beantragen.
      (3) (5) Wenn der Benutzerpuffer voll ist, wie bei System-E / A-Operationen, rufen Sie zu diesem Zeitpunkt write auf, um Daten aus dem Standard-E / A-Puffer in den Kernel-Puffer zu kopieren, und schreiben Sie sie dann auf die Festplatte.
      (4) (6) Rufen Sie wie bei der System-E / A-Operation das Lesen aus dem Kernel-Puffer auf, um es in den Benutzerpuffer einzulesen.
      (2) Es gibt auch drei Arten von Funktionen, die aufgerufen werden können: Nehmen Sie als Beispiele fgetc, fgets und fread und lesen Sie sie zur späteren Verarbeitung in die Logikeinheit ein.
Es ist ersichtlich, dass der Implementierungsmechanismus von Standard-E / A auf System-E / A basiert. Auf diese Weise ist Standard-E / A definitiv nicht so effizient wie System-E / A, aber die Tatsache ist, dass Standard-E / A nicht mit System-E / A verglichen wird. Es ist viel langsamer und es gibt viele andere Vorteile.

2.3 Verwenden Sie den Datenfluss, um den Unterschied zwischen den beiden zu beschreiben: Datenfluss für
      nicht gepufferte E / A-Operationen: Daten -> Kernel-Puffer ->
      Datenfluss für Platten- Standard-E / A-Operationen: Daten -> Stream-Puffer -> Kernel-Puffer -> Festplatte

2.4 Vor- und Nachteile von Standard-E / A:
      1) Ein Vorteil der Verwendung von Standard-E / A-Routinen besteht darin, dass die Auswahl des Caches und die beste E / A-Länge nicht berücksichtigt werden müssen und sie nicht viel langsamer sind als das direkte Aufrufen von Lesen und Schreiben.
      2) In In der Standard-E / A-Bibliothek ist ein ineffizienter Mangel die Datenmenge, die kopiert werden muss. Wenn Sie die Funktionen fgets und fputs zeilenweise verwenden, müssen Sie die Daten normalerweise zweimal kopieren: einmal zwischen dem Kernel und dem Standard-E / A-Cache (beim Aufrufen von Lesen und Schreiben) und das zweite Mal im Standard-E / A-Cache ( Normalerweise ordnet und verwaltet das System) und den Zeilencache im Benutzerprogramm (der Parameter von fgets erfordert einen Benutzerzeilen-Cache-Zeiger).

3. Klassische Antwort:
      Ersteres ist Low-Level-IO und letzteres ist High-Level-IO.
      Ersteres gibt einen Dateideskriptor (im Benutzerprogrammbereich) zurück, und letzteres gibt einen Dateizeiger zurück.
      Ersteres hat keinen Puffer, letzteres hat Puffer.
      Ersteres wird in Verbindung mit Lesen und Schreiben verwendet, und letzteres wird in Verbindung mit fread und fwrite verwendet.
      Letzteres basiert auf Ersterem, und in den meisten Fällen wird Letzteres verwendet.
     Das Obige ist die Einführung des Unterschieds zwischen offen und offen. Der Unterschied zwischen den beiden ist hauptsächlich der Unterschied in der Pufferung. Fopen hat Pufferung, aber nicht offen, und ihre Ebenen sind ebenfalls unterschiedlich. Fopen ist portabel, aber offen kann nicht.
 

Ich denke du magst

Origin blog.csdn.net/the_wan/article/details/108309703
Empfohlen
Rangfolge