Wenn Sie nicht wissen, was sie sind Systemaufrufe, auch bekannt als SyscallsHier erkläre ich Ihnen alles, was Sie über sie und ihre Funktionsweise wissen müssen, sowie die Gründe, warum diese Betriebssystemmechanismen existieren und warum sie so nützlich sind, damit Anwendungen ordnungsgemäß funktionieren.
Was ist der Kernel eines Betriebssystems?
Um besser zu verstehen, was ein Systemaufruf ist, müssen Sie zunächst Folgendes wissen: Was ist ein Kernel? des Betriebssystems. Der Kernel ist der Kern des Betriebssystems, also der wichtigste Teil, der die grundlegenden Dienste bereitstellt, die von den anderen Teilen des Betriebssystems, einschließlich der Anwendungen, benötigt werden.
Der Kernel ist die unterste Schicht, die am eng an die Hardware gebunden und die Verwaltung seiner Ressourcen. Beispielsweise kann es die Prozesse verwalten, die in den RAM geladen werden, Auslagerungen im virtuellen Speicher durchführen, verschiedene Geräte steuern, die Erstellung und Bearbeitung von Dateien auf dem Speicherlaufwerk ermöglichen usw.
Wenn ein Computer hochfährt, startet er zuerst die BIOS/UEFI-Firmware oder ähnliches und prüft nach einigen vorbereitenden Schritten, auf welchem Medium das Betriebssystem installiert ist, um die Kontrolle zu übergeben. Sobald dies erledigt ist, lädt der Bootloader den Betriebssystemkern in den RAM, sodass alles funktioniert, und übergibt auch die Kontrolle an diesen Kernel.
Okay, das ist also das Grundlegende, was Sie über einen Kernel wissen müssen.
Kernelfunktionen
Was nun die Funktionen des Betriebssystemkerns betrifft, so muss dieser eine Reihe von Schnittstellen bereitstellen auch für den Benutzer und die Anwendungen notwendig kann auch die von ihm verwalteten Hardwareressourcen nutzen. Zusammenfassend sind die wesentlichen Funktionen des Kerns wie folgt:
Alle Betriebssysteme haben einen Kernel, z. B. haben GNU/Linux-Distributionen den Linux-Kernel, Windows 11 hat Windows NT, macOS hat XNU usw.
- Lädt Gerätetreiber und Firmware. Diese sind für die Kommunikation und Nutzung der Hardware notwendig.
- Verwalten Sie die Prozesse und Unterprozesse (Threads), die von den verschiedenen laufenden Programmen generiert werden.
- Er ist außerdem für die Überwachung und Steuerung des Zugriffs auf Anwendungen verantwortlich, mit allem, was dazugehört, wie etwa die Zuweisung des Speichers, der dem Benutzerbereich zur Verfügung steht. Zu diesem Zweck arbeitet der Kernel im Supervisor-Modus oder Kernel-Modus, wie wir später sehen werden.
- Behandelt Konflikte und Fehler aufgrund der Zuweisung von Hardwareressourcen.
- Neben der CPU und dem Speicher kann es auch E/A-Geräte verwalten und darauf zugreifen.
- Und, was am wichtigsten ist, es verfügt über eine Schnittstelle, die die getätigten Systemaufrufe oder Syscalls verarbeitet.
Natürlich ist der Kernel nicht allein. Er wird oft von anderen Elementen begleitet, die das komplette Betriebssystem bilden. Eines davon ist eine Schnittstelle für die Interaktion des Benutzers mit dem Computer. Dazu gehört zum Beispiel die Verwendung von eine CLI oder eine GUI.
Gerätetreiber
Ein weiterer grundlegender Teil des Kernels sind die Gerätetreiber oder Treiber, wie sie allgemein genannt werden. Treiber können in den Kernel selbst eingebettet, als Module behandelt oder eigenständig sein. Auf dieser Grundlage lässt sich der Kerneltyp klassifizieren, worauf wir hier jedoch nicht näher eingehen.
Treiber sind ein grundlegender Bestandteil, da sie Code oder Programme sind, die für die direkte Interaktion mit der Hardware auf niedriger Ebene verantwortlich sind. Auf diese Weise kann der Kernel mit der Hardware kommunizieren über den Treiber. Das heißt, der Zweck eines Treibers besteht lediglich darin, dem Kernel Unterstützung für ein bestimmtes Gerät hinzuzufügen, z. B. eine GPU, eine Tastatur, einen Drucker usw.
Viele dieser Treiber sind bereits im Betriebssystem selbst enthalten, damit die Hardware ordnungsgemäß funktioniert ab dem Zeitpunkt der Installation des Betriebssystems. Andere müssen jedoch nach der Installation des Betriebssystems installiert werden, um die Vorteile der von ihnen gesteuerten Komponenten voll auszunutzen, wie z. B. GPU-Treiber.
Andererseits kann man sagen, dass es verschiedene Arten von Gerätetreibern gibt, die jeweils unterschiedliche Methoden zur Informationsübertragung haben. Zum Beispiel:
- Charakter: Diese Gerätetreiber können Daten öffnen, schließen, lesen oder schreiben, um diese Fähigkeit auch dem Benutzerbereich zu gewähren.
- Block: Diese ermöglichen den Zugriff auf Speichergeräte oder Geräte, die feste Informationsblöcke verwenden.
- Netzwerk: Diese verwalten Netzwerkdatenpakete. Das heißt, sie ermöglichen die Kommunikation zwischen Netzwerkschnittstellen.
Dies sieht auf Unix-ähnlichen Systemen wie Linux recht gut aus, da diese Art der Trennung von Gerätetypen weiterhin beibehalten wird.
Andererseits ist es auch wichtig, zwischen Treibern zu unterscheiden, die im Kernel- bzw. privilegierten Modus und im Benutzer- bzw. nicht-privilegierten Modus arbeiten:
- Kernelmodus: Dies ist ein generischer Treiber, der mit dem Betriebssystem geladen wird und kritische Boot-Hardwaregeräte wie CPU, Motherboard, RAM usw. steuert.
- Benutzermodus: Dies sind Controller, die eine Vielzahl von Peripheriegeräten und Zubehör aller Art ad hoc steuern können, z. B. Drucker, Mäuse, Tastaturen, Soundsysteme und andere Plug-and-Play-Geräte. Dies sind Geräte, die für den Start des Computers nicht unbedingt erforderlich sind.
Auch auf Systemen wie Linux ist dies sehr deutlich bei Treibern zu sehen, die dem monolithischen Kernel hinzugefügt werden, oder bei Treibern, die als Module extrahiert werden, um beim Anschließen des Geräts oder bei Bedarf dynamisch geladen zu werden.
Okay, nach und nach beginnen wir, die Funktionen des Kernels und der Treiber zu verstehen, und jetzt gehen wir zu dem über, was wir über den Kernel- oder privilegierten Modus und den Benutzermodus gesagt haben. Dies ist auch sehr wichtig, damit Sie verstehen, was ein Systemaufruf ist und wofür er verwendet wird ...
Modi
Was ist der Kernel- oder privilegierte Modus?
Computerdesigner haben, abhängig von der Architektur, eine Reihe von Schichten oder Sicherungsringe die sehr wichtig sind. Wenn wir vom Kernelmodus oder privilegierten Modus sprechen, meinen wir den mittleren Ring im obigen Bild, also den roten. Ring 0 hat vollen Zugriff auf alle kritischen Aspekte wie Hardware-Ressourcenverwaltung, Dateisystemsteuerung (FS) usw. Das heißt, diese Berechtigungsstufe ist notwendig, um jedem Programm, das Sie ausführen möchten, Speicherplatz im RAM zuzuweisen, sogar zum Erstellen einer Datei auf dem Speicherlaufwerk, für alle E/A-Aufgaben, die Sie ausführen, einschließlich Netzwerkfunktionen usw.
Obwohl Treiber in anderen, weniger privilegierten Ringen als der Kernel erscheinen, sollte, wie ich bereits erwähnt habe, beachtet werden, dass auch einige kritische Treiber in den Kernel integriert sind.
Was ist der Benutzermodus?
El Der Benutzermodus ist ein nicht privilegierter Modus Wie im Bild zu sehen ist, handelt es sich um den grünen Ring (Ring 3), der von allen Anwendungen und dem Benutzerbereich verwendet wird. Da ihm die entsprechenden Berechtigungen fehlen, kann er wichtige Aufgaben wie die Hardwareverwaltung nicht steuern.
Sie fragen sich vielleicht, wie ein Videospiel die GPU nutzen oder ausführen kann oder wie ein Textverarbeitungsprogramm eine Datei speichern kann, wenn es nicht über die entsprechenden Berechtigungen verfügt. Nun, hier ist die Antwort. der Schlüssel des Syscalls oder Systemaufrufs.
Was ist eine SCI?
Wie Sie im Bild oben sehen können, ist die unterste Schicht die Hardware. Darüber befindet sich der Betriebssystemkernel, in diesem Fall LinuxUnd darin sind unter anderem die Treiber enthalten, die in der Lage sind, direkt mit dieser Hardware zu interagieren.
Dann hat der Kernel sozusagen eine "Oberflächenschicht", die Es wird SCI oder System Call Interface genannt. Eine Systemaufrufschnittstelle Es handelt sich lediglich um die Schnittstelle, die dem Benutzer Raum für Aufrufe bietet, die der Kernel verarbeiten muss, damit Apps auf irgendeine Weise, auch indirekt, auf die Ressourcen zugreifen können, auf die nur mit Berechtigungen zugegriffen werden kann.
Auf dem SCI befinden sich, wie im Bild zu sehen, die elementaren Bibliotheken des Betriebssystems, die von Betriebssystem zu Betriebssystem unterschiedlich sein können. Diese Bibliotheken oder APIs Sie dienen dazu, alles bereitzustellen, was Benutzeranwendungen oder -programme benötigen. Dies ist hier jedoch nicht unser Anliegen. Wichtig ist lediglich, dass sich darüber hinaus der Anwendungs- bzw. Benutzerbereich befindet, also der nicht privilegierte Modus.
Was ist ein Systemaufruf?

Und jetzt kommen wir zum wirklich wichtigen Teil, und zwar, was ist das der Systemaufruf oder Systemaufruf die wir bereits erwähnt haben. Ein Systemaufruf ist einfach eine Funktion, die das SCI bereitstellt, damit Apps oder User-Space-Code Zugriff auf Instanzen anfordern können, die aufgrund fehlender Berechtigungen eingeschränkt sind. Mit anderen Worten: Es ist eine Möglichkeit, die Sicherheit zu verbessern, sodass eine App nicht direkt auf diese Ressourcen zugreifen kann.
Damit diese Aufrufe tatsächlich ausgeführt werden können, muss natürlich etwas geschehen, und zwar im Betriebssystem, damit sie beantwortet werden. Genau das erklären wir in den folgenden Abschnitten ...
Wie funktioniert der Systemaufruf?
Nun, Stellen Sie sich vor, Sie verwenden einen TexteditorSie öffnen den Texteditor. Sobald Sie ihn öffnen, läuft er. Das heißt, das Betriebssystem hat den Prozess, der ihn beendet hat, in den RAM geladen, und die CPU hat auf diesen Prozess zugegriffen, um die darin gefundenen Anweisungen und Daten auszuführen, damit der Texteditor funktionieren kann.
Sie geben nun etwas in den Texteditor ein und möchten die Datei speichern. Sie geben ihr einen Namen und speichern sie. Die Datei wurde als example.txt gespeichert. Aber wenn der Texteditor eine User-Space-Anwendung ohne Berechtigungen ist, wie konnte er dann auf das Dateisystem des Speicherlaufwerks zugreifen, um die Textdatei zu speichern? Nun, er tat dies über einen Systemaufruf, einen Syscall, den er an das SCI schickte, und der Kernel führte spezifischen Code aus, um die Dateierstellung und -speicherung zu ermöglichen.
Dies werde ich im Folgenden versuchen, etwas technischer zu erklären.
Systemaufruftypen
Es gibt nicht nur einen Art des Systemaufrufs oder Syscall, aber es gibt mehrere. Einige der wichtigsten Arten von Systemaufrufen sind:
- Prozesssteuerung: Dies sind die Aufrufe, mit denen Sie Prozesse erstellen, löschen, ihre Priorität ändern, anhalten usw. können. In diesem Fall sind sie eng mit dem Scheduler des Betriebssystems und der Verwaltung der Speicher- und CPU-Auslastung verbunden.
- Dateiverwaltung: In diesem Fall handelt es sich um Systemaufrufe, die speziell der Dateimanipulation dienen, wie z. B. dem Erstellen, Lesen, Schreiben, Löschen einer neuen Datei usw. In diesem Fall stehen sie in engem Zusammenhang mit der Steuerung der Dateisysteme (FS) der verschiedenen verfügbaren Speichereinheiten, sowohl interner als auch externer oder entfernbarer.
- Geräteverwaltung: Dies sind Systemaufrufe, die für die Verwaltung von Geräten und deren Verwendung zuständig sind, z. B. zum Verbinden, Trennen, Freigeben usw. Sie sind eng mit den Peripheriegeräten oder Geräten verknüpft, die verwaltet werden können.
- Informationspflege: ist eine Art Systemaufruf, der zum Verwalten grundlegender Informationen über das Betriebssystem verwendet wird, wie z. B. Uhrzeit, Datum usw., die für einige Anwendungen wichtig sind.
- Kommunikation: Diese Systemaufrufe sind, wie der Name schon sagt, für die Kommunikation zwischen Prozessen verantwortlich. Das heißt, sie verwalten die Nachrichten oder Signale, die Prozesse einander senden, um Informationen zu übermitteln.
Nachdem wir die grundlegenden Arten von Systemaufrufen behandelt haben, ist es an der Zeit zu lernen, wie und was diese Systemaufrufe in Betriebssystemen sind, da sie nicht bei allen Betriebssystemen gleich sind. Hier ist beispielsweise eine Tabelle mit einigen Beispielen für Windows NT und Linux (gilt auch für Unix):
| Systemaufruftypen | Windows | Linux |
|---|---|---|
| CreateProcess () | Gabel() | |
| Prozesssteuerung | ExitProcess() | Ausfahrt() |
| WaitForSingleObject() | warten() | |
| CreateFile () | öffnen() | |
| ReadFile() | lesen() | |
| Dateiverwaltung | WriteFile() | schreibe () |
| CloseHandle() | schließen() | |
| SetConsoleMode() | ioctl() | |
| Geräteverwaltung | ReadConsole() | lesen() |
| WriteConsole() | schreibe () | |
| GetCurrentProcessID() | getpid() | |
| Informationspflege | SetTimer() | Alarm() |
| Schlaf () | schlaf () | |
| CreatePipe() | Rohr() | |
| Kommunikation | CreateFileMapping () | shmget() |
| MapViewOfFile() | mmap () |
Wie du sehen kannst, Sie sind nicht gleich auf einem System anders als auf einem anderen, selbst wenn sie die gleichen Funktionen haben. Dies muss bei der Programmierung für die eine oder andere Plattform berücksichtigt werden. Das heißt, Sie müssen mit der ABI und den Bibliotheken des Betriebssystems, für das Sie den Code schreiben, vertraut sein. Wenn Sie einen dieser Systemaufrufe verwenden müssen, müssen Sie diese kennen und dürfen nicht die eines anderen Betriebssystems verwenden.
von ejemploStellen Sie sich den Linux-Aufruf read() vor, der, wie der Name schon vermuten lässt, ein Dateiverwaltungsaufruf ist und zum Lesen einer Datei verwendet wird. Stellen Sie sich beispielsweise ein Programm vor, das den Inhalt einer Datei liest, wie diesen C-Quellcode:
#enthalten #enthalten #enthalten int main() { FILE* ptr; char ch; // Datei im Lesemodus öffnen ptr = fopen("example.txt", "r"); if (NULL == ptr) { printf("Die Datei kann nicht geöffnet werden \n"); } printf("Der Inhalt dieser Datei ist: \n"); // Inhalt anzeigen do { ch = fgetc(ptr); printf("%c", ch); // Auf EOF prüfen und stoppen } while (ch != EOF); // Datei schließen fclose(ptr); return 0; }
Dieser Quellcode verwendet auch andere Systemaufrufe, wie z. B. das Schließen der Datei, in diesem Fall ein close(). Konzentrieren wir uns aber nur auf die read()-Funktion. Wenn dieser Quellcode kompiliert und ausgeführt wird, würde folgender Ablauf ablaufen:
- Dieses kleine Programm hat keine Berechtigungen; es läuft im Benutzerbereich. Es muss jedoch eine Datei öffnen, lesen und schließen. Daher führt es einen Systemaufruf aus, der in diesem Fall die SCI des Linux-Kernels erreicht.
- Der Kernel verarbeitet diesen Aufruf im privilegierten Bereich und startet eine Routine, die dem angeforderten Aufruf entspricht, in diesem Fall dem Leseaufruf. Das heißt, er lädt den zur Ausführung des Aufrufs verwendeten Prozess in den Speicher, der dann von der CPU verarbeitet wird.
- Bei der Ausführung der Routine wird die Steuerung über einen Trap oder Interrupt an den Kernel übergeben. Dem Aufruf wird im Protokoll ein eindeutiger Code zur Identifizierung zugewiesen, da gleichzeitig viele andere, auch identische (gelesene) Aufrufe abgearbeitet werden können.
- Der Kernel führt durch seine Kontrolle über das Dateisystem das Lesen der angeforderten Datei durch.
- Sobald diese read()-Routine abgeschlossen ist, gibt der Kernel die Steuerung an den Benutzermodus zurück. Außerdem gibt er die Ausgabe des Prozesses an das Programm zurück, das ihn aufgerufen hat, in diesem Fall unser Beispielprogramm.
- Nach Erhalt der Ausgabe wird der Programmprozess dort fortgesetzt, wo er unterbrochen wurde.
Das Ergebnis wäre, dass unser Programm diese Aufgabe trotz fehlender Zugriffsberechtigungen auf die Dateisystemsteuerung problemlos ausführen und den Inhalt der angeforderten Datei abrufen könnte. In diesem Beispielcode wäre dies eine Datei mit dem Namen example.txt.
In diesem Fall ist die Funktion „fopen“ im Quellcode der Programmiersprache C für das Auslösen all dessen verantwortlich. Diese Funktion verwendet die C-Bibliothek. Wie Sie sehen, ist es deshalb wichtig, alles zu wissen, was ich oben über Kernel, Bibliotheken, Modi usw. erwähnt habe. Andernfalls würden Sie das nicht verstehen.
Und woher weiß der Kernel, was zu tun ist? Nun, in diesem Fall verfügt Linux über eine entsprechende Lesefunktion. Hier ist beispielsweise der Quellcode für read() in Linux, in diesem Fall implementiert in der GNU C-Bibliothek:
/* Linux-Lese-Systemaufrufimplementierung. Copyright (C) 2017–2022 Free Software Foundation, Inc. Diese Datei ist Teil der GNU C Library. Die GNU C Library ist freie Software; Sie können sie unter den Bedingungen der GNU Lesser General Public License, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren; entweder gemäß Version 2.1 der Lizenz oder (nach Ihrer Wahl) jeder späteren Version. Die GNU C Library wird in der Hoffnung verbreitet, dass sie nützlich sein wird, jedoch OHNE JEGLICHE GARANTIE; sogar ohne die implizite Garantie der MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Weitere Informationen finden Sie in der GNU Lesser General Public License. Sie sollten zusammen mit der GNU C Library eine Kopie der GNU Lesser General Public License erhalten haben; falls nicht, siehe . */ #enthalten #enthalten /* Lies NBYTES von FD in BUF. Gib die gelesene Zahl oder -1 zurück. */ ssize_t __libc_read (int fd, void *buf, size_t nbytes) { return SYSCALL_CANCEL (read, fd, buf, nbytes); } libc_hidden_def (__libc_read) libc_hidden_def (__read) weak_alias (__libc_read, __read) libc_hidden_def (read) weak_alias (__libc_read, read)
Es ist auch erwähnenswert, dass der Interrupt je nach verwendeter Architektur oder ISA unterschiedlich behandelt wird. In ASM oder x86-Assembler würde der resultierende Code aus dem obigen C-Programm beispielsweise lauten:
.LC0: .string "r" .LC1: .string "example.txt" .LC2: .string "Die Datei kann nicht geöffnet werden" .LC3: .string "Der Inhalt dieser Datei ist:" main: push rbp mov rbp, rsp sub rsp, 16 mov esi, OFFSET FLAT:.LC0 mov edi, OFFSET FLAT:.LC1
Anruf fopen
mov QWORD PTR [rbp-8], rax cmp QWORD PTR [rbp-8], 0 jne .L2 mov edi, OFFSET FLAT:.LC2 call puts .L2: mov edi, OFFSET FLAT:.LC3 call puts .L3: mov rax, QWORD PTR [rbp-8] mov rdi, rax call fgetc mov BYTE PTR [rbp-9], al movsx eax, BYTE PTR [rbp-9] mov edi, eax call putchar cmp BYTE PTR [rbp-9], -1 jne .L3 mov rax, QWORD PTR [rbp-8] mov rdi, rax call fclose mov eax, 0 leave ret
Wie Sie sehen, habe ich die Zeile „call fopen“ hervorgehoben, da dies die Anweisung ist, die auf der CPU ausgeführt wird, um diesen Systemaufruf durchzuführen. In diesem Fall ist „call“ eine Anweisung, die in der x86-64 ISA vorhanden ist und genau diesem Zweck dient.
Wichtigste Anrufe
Es ist auch notwendig, einige wichtige Aufrufe hervorzuheben, die für die Ausführung von Programmen in Computersystemen wesentlich sind, und diese Aufrufe sind:
- Warten(): Mit diesem Aufruf kann ein Prozess angehalten werden, damit ein anderer Prozess mit höherer Priorität zuerst abgeschlossen werden kann. Nach der Verarbeitung kann dieser Prozess zur Ausführung zurückkehren. In diesem Fall können mehrere Dinge passieren:
- Wenn sich der Prozess im RAM befand und noch nicht gestartet wurde, im RAM jedoch genügend Speicherplatz für den anderen Prioritätsprozess vorhanden ist, wird der Prioritätsprozess ebenfalls in den RAM geladen, jedoch zuerst zur Ausführung durch die CPU in die Warteschlange gestellt.
- Wenn das gleiche Szenario wie oben vorliegt, aber nicht genügend RAM zum Laden des Prioritätsprozesses vorhanden ist, verwendet das Betriebssystem den virtuellen Speicher und verschiebt den wartenden Prozess auf das Festplattenlaufwerk und den Prioritätsprozess in den RAM.
- Wenn der Prozess in der Warteschlange bereits mit der Verarbeitung durch die CPU begonnen hat, wird der Kontext gewechselt und ein PCB gespeichert. Der Prioritätsprozess wird dann ausgeführt und dieser PCB mit den Details aus dem Speicher abgerufen, um festzustellen, wo der vorherige Prozess ausgeführt wurde.
- Gabel(): Dieser Systemaufruf erstellt eine Abzweigung oder Ableitung des Hauptprozesses. Das bedeutet, dass ein Programm eine Kopie von sich selbst erstellt, die dann als „Kindprozess“ des ursprünglichen Prozesses fungiert, der nun als „Elternprozess“ bezeichnet wird.
- exec(): Dieser Systemaufruf wird verwendet, wenn der laufende Prozess eine andere ausführbare Datei ausführen möchte. Die Prozess-ID bleibt unverändert, während die anderen vom Prozess verwendeten Ressourcen durch den neu erstellten Prozess ersetzt werden.
- töten(): Manchmal beenden wir während der Arbeit einen bestimmten Prozess. Dann wird der Systemaufruf kill() aufgerufen, der das Beendigungssignal an den Prozess sendet. Mit anderen Worten: Er wird beendet. Dies zeigt sich beispielsweise beim Beenden eines Programms unter Linux mit dem Befehl kill.
- Ausfahrt(): Wenn wir das Programm wirklich beenden müssen, verwenden wir einen Exit-Systemaufruf. Vom Prozess belegte Ressourcen werden nach dem Aufruf des Exit-Systemaufrufs freigegeben.
Obwohl dies ein anderes Thema wäre, kann es jedoch vorkommen, dass ein Prozess nicht ordnungsgemäß beendet wird und als Zombie zurückbleibt ..., ohne die Ressourcen freizugeben, die er „entführt“ hat, ohne sie jedoch wirklich zu benötigen, da er „tot“ ist.
Übrigens können Sie beim Programmieren auch die berühmten Threads, also Unterprozesse, erstellen. In diesem Fall kann ein Prozess in mehrere grundlegendere Aufgaben, sogenannte Unterprozesse, unterteilt werden. Daher kann die CPU diese unabhängig voneinander verarbeiten, als wären sie unabhängige Prozesse. In C können Sie beispielsweise die Funktion pthread_create um diese Threads zu erstellen. Bis alle Threads in einem Prozess beendet sind, wird der Prozess nicht beendet.
Fazit
Was würden wir ohne Systemaufrufe oder Syscalls tun? Anwendungen könnten nicht ordnungsgemäß funktionieren, und das würde bedeuten, Apps in privilegierten Bereichen zu schreiben, was ein erhebliches Sicherheitsrisiko darstellen würde.
Ich hoffe, dieser Artikel war hilfreich und Sie haben jetzt ein gutes Verständnis davon, was ein Systemaufruf ist …