GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was sind Linux-Systemaufrufe und Bibliotheksfunktionen?

Computersoftware wird entwickelt, um entweder einige Aufgaben zu automatisieren oder einige Probleme zu lösen. In jedem Fall erreicht eine Software das Ziel mit Hilfe der Logik, die der Entwickler dieser Software schreibt. Jede Logik erfordert einige Dienste wie das Berechnen der Länge eines Strings, das Öffnen einer Datei usw. Standarddienste werden von einigen Funktionen oder Aufrufen versorgt, die nur für diesen Zweck bereitgestellt werden.

Wie zum Berechnen der Stringlänge dort Es gibt eine Standardfunktion wie strlen(), zum Öffnen einer Datei gibt es Funktionen wie open() und fopen(). Wir bezeichnen diese Funktionen als Standardfunktionen, da jede Anwendung sie verwenden kann.

Diese Standardfunktionen können in zwei Hauptkategorien eingeteilt werden:

  1. Bibliotheksfunktionsaufrufe.
  2. Systemfunktionsaufrufe.

In diesem Artikel werden wir versuchen, das Konzept hinter den System- und Bibliotheksaufrufen in Form verschiedener Punkte zu diskutieren, und wo immer erforderlich, werde ich den Unterschied zwischen den beiden erläutern.

1. Bibliotheksfunktionen vs. Systemaufrufe

Die Funktionen, die Teil der Standard-C-Bibliothek sind, werden als Bibliotheksfunktionen bezeichnet. Zum Beispiel sind die Standard-String-Manipulationsfunktionen wie strcmp(), strlen() usw. alle Bibliotheksfunktionen.

Die Funktionen, die den Ausführungsmodus des Programms vom Benutzermodus in den Kernelmodus ändern, werden als Systemaufrufe bezeichnet. Diese Aufrufe sind erforderlich, falls einige Dienste vom Kernelprogramm benötigt werden. Wenn wir beispielsweise das Datum und die Uhrzeit des Systems ändern oder einen Netzwerk-Socket erstellen möchten, können diese Dienste nur vom Kernel bereitgestellt werden und erfordern daher in diesen Fällen Systemaufrufe. Beispielsweise ist socket() ein Systemaufruf.

2. Warum brauchen wir Systemaufrufe?

Systemaufrufe fungieren als Einstiegspunkt zum Betriebssystemkern. Bestimmte Aufgaben können nur ausgeführt werden, wenn ein Prozess im Kernelmodus ausgeführt wird. Beispiele für diese Aufgaben können die Interaktion mit Hardware usw. sein. Wenn also ein Prozess eine solche Aufgabe ausführen möchte, müsste er selbst im Kernelmodus laufen, was durch Systemaufrufe ermöglicht wird.

3. Arten von Bibliotheksfunktionen

Bibliotheksfunktionen können von zwei Arten sein:

  • Funktionen, die keinen Systemaufruf aufrufen.
  • Funktionen, die einen Systemaufruf tätigen.

Es gibt Bibliotheksfunktionen, die keinen Systemaufruf machen. Unter diese Kategorie fallen beispielsweise die String-Manipulationsfunktionen wie strlen() usw. Außerdem gibt es Bibliotheksfunktionen, die weitere Systemaufrufe durchführen, zum Beispiel die fopen()-Funktion, die eine Standardbibliotheksfunktion ist, aber intern den open()-Systemaufruf verwendet.

4. Interaktion zwischen Komponenten

Das folgende Diagramm zeigt, wie Bibliotheksfunktionen, Systemaufrufe und Anwendungscode miteinander interagieren.


Das obige Diagramm macht deutlich, dass der Anwendungscode mit Bibliotheksfunktionen oder Systemaufrufen interagieren kann. Außerdem kann eine Bibliotheksfunktion auch Systemfunktionen von innen aufrufen. Aber nur Systemaufrufe haben Zugriff auf den Kernel, der weiter auf Computerhardware zugreifen kann.

5. fopen() vs. open()

Einige von uns mögen argumentieren, warum wir zwei Funktionen für dieselbe Operation haben, dh das Öffnen einer Datei?

Nun, die Antwort darauf ist die Tatsache, dass fopen() eine Bibliotheksfunktion ist, die gepufferte E/A-Dienste zum Öffnen einer Datei bereitstellt, während open() ein Systemaufruf ist, der nicht gepufferte E/A-Dienste bereitstellt. Obwohl die open()-Funktion auch für Anwendungen verfügbar ist, sollte die Anwendung es vermeiden, sie direkt zu verwenden.

Wenn eine Bibliotheksfunktion vorhanden ist, die einem Systemaufruf entspricht, sollten Anwendungen im Allgemeinen die Bibliotheksfunktion verwenden, weil :

  • Bibliotheksfunktionen sind portabel, was bedeutet, dass eine Anwendung, die Standardbibliotheksfunktionen verwendet, auf allen Systemen ausgeführt werden kann. Andererseits läuft eine Anwendung, die auf den entsprechenden Systemaufruf angewiesen ist, möglicherweise nicht auf jedem System, da die Systemaufrufschnittstelle von System zu System variieren kann.
  • Manchmal verringert die entsprechende Bibliotheksfunktion die Belastung des Systemaufrufs, was zu nicht häufigen Wechseln vom Benutzermodus in den Kernelmodus führt. Wenn es beispielsweise eine Anwendung gibt, die sehr häufig Daten aus einer Datei liest, würde die Verwendung von fread() anstelle von read() gepufferte E/A bereitstellen, was bedeutet, dass nicht jeder Aufruf von fread() zu einem Aufruf des Systemaufrufs read führen würde (). fread() kann größere Datenmengen (als vom Benutzer benötigt) auf einmal lesen, und daher erfordert nachfolgendes fread() keinen Aufruf der Systemfunktion read().

6. Ist malloc() ein Systemaufruf?

Dies ist eines der sehr verbreiteten Missverständnisse, die Menschen haben. Lassen Sie uns klarstellen, dass malloc() kein Systemaufruf ist. Der Funktionsaufruf malloc() ist ein Bibliotheksfunktionsaufruf, der weiterhin den Systemaufruf brk() oder sbrk() zur Speicherzuordnung verwendet.

7. Systemaufrufe:Umschalten des Ausführungsmodus

Traditionell wurde der Mechanismus zum Auslösen eines Interrupts von „int $0x80“ zum Kernel verwendet. Nach dem Abfangen des Interrupts verarbeitet der Kernel ihn und ändert den Ausführungsmodus vom Benutzer- in den Kernelmodus. Heute werden die systenter/sysexit-Anweisungen zum Umschalten des Ausführungsmodus verwendet.

8. Einige andere Unterschiede

Neben all dem oben Gesagten sind hier noch ein paar weitere Unterschiede zwischen einem System- und einem Bibliotheksaufruf:

  • Eine Bibliotheksfunktion ist mit dem Benutzerprogramm verknüpft und wird im Benutzerbereich ausgeführt, während ein Systemaufruf nicht mit einem Benutzerprogramm verknüpft ist und im Kernelbereich ausgeführt wird.
  • Die Ausführungszeit einer Bibliotheksfunktion wird in der Zeit auf Benutzerebene gezählt, während die Ausführungszeit eines Systemaufrufs als Teil der Systemzeit gezählt wird.
  • Bibliotheksfunktionen können einfach mit einem Debugger debuggt werden, während Systemaufrufe nicht debuggt werden können, da sie vom Kernel ausgeführt werden.

Linux
  1. Systemaufrufe unter Linux mit strace verstehen

  2. Was ist der aktuelle Runlevel des Linux-Systems?

  3. Was sind die nativen Betriebssystem-/Systemaufrufe von Windows und Linux, die von malloc() ausgeführt werden?

  4. Was sind vdso und vsyscall?

  5. Was ist der Unterschied zwischen den Funktionen der exec-Familie von Systemaufrufen wie exec und execve?

Linux-Kernel und seine Funktionen

Unix- und Linux-Geschichte

Was ist das Linux-Dateisystem? Einfache Anleitung

Was sind die Aufrufkonventionen für UNIX- und Linux-Systemaufrufe (und User-Space-Funktionen) auf i386 und x86-64

Was ist der Unterschied zwischen Systemaufruf und Bibliotheksaufruf?

Was ist ein Linux-Container und ein Linux-Hypervisor?