1. Synchronisierung: Mein Client (C-seitiger Aufrufer) hat eine Funktion, bevor die Funktion endet.
2. Asynchron: Ich (der C-Seitenaufrufer) rufe eine Funktion auf und kenne das Ergebnis der Funktion nicht. Ich werde benachrichtigt, d. h. eine Rückrufbenachrichtigung 🎜>
3. Blockierung: Rufen Sie einfach I (den Angerufenen auf der s-Seite, Funktion) an, ich (der Angerufene auf der s-Seite, die Funktion) komme erst zurück, wenn ich die Daten vollständig akzeptiert oder das Ergebnis erhalten habe. 4. Nicht blockierend: Es bedeutet, dass ich (Angerufener auf s-Seite, Funktion) sofort zurückkehre und den Anrufer nach Erhalt des Ergebnisses benachrichtigeFünf E/A-Modelle
(1) Blockieren von E/A (Blockieren von E/A) Wenn der Benutzerprozess Wenn der Systemaufruf erfolgt, startet der Kernel die erste E/A-Phase und bereitet Daten in den Puffer vor. Wenn die Daten vorbereitet sind, werden die Daten aus dem Kernel-Puffer in den Speicher des Benutzerprozesses kopiert. der Benutzer Der Prozess wird aus dem Blockzustand freigegeben und läuft erneut. (2) Nicht blockierende E/A (Nicht blockierende E/A) Der Benutzerprozess wird erst in der zweiten Stufe blockiert und In der ersten Stufe gibt es keine Blockierung, aber in der ersten Stufe muss der Benutzerprozess nicht blind warten und fragt ständig den Kernel ab, um zu sehen, ob die Daten bereit sind, sodass dieses Modell mehr CPU verbraucht. (3) E/A-Multiplexing Beide Phasen der E/A-Ausführung werden durch Benutzerprozesse blockiert, aber die beiden Phasen sind unabhängig voneinander Nachdem der E/A-Vorgang abgeschlossen ist, initiiert der Benutzerprozess zwei Systemaufrufe. Der Unterschied zum Blockieren von E/A besteht darin, dass das erste Segment darauf warten kann, dass mehrere Deskriptoren bereit sind (4) Signalgesteuerte E/A (Signalgesteuerte E/A)In der zweiten Phase der E/A-Ausführung wird nur der Benutzerprozess blockiert, in der ersten Phase gibt es jedoch keine Blockierung. In der ersten Phase der E/A-Ausführung benachrichtigt dieses Modell den Benutzerprozess aktiv darüber, dass die Daten vorbereitet wurden, nachdem die Datenvorbereitung abgeschlossen ist, dh es wird ein Rückruf an den Benutzerprozess durchgeführt. Es gibt zwei Arten von Benachrichtigungen: Die eine ist die horizontale Auslösung, das heißt, die Benachrichtigung wird ständig gesendet, wenn der Benutzerprozess nicht antwortet, und die andere ist die Kantenauslösung, die nur einmal benachrichtigt wird. (5) Asynchrone E/A (Asynchrone E/A) Wenn der Benutzerprozess einen Systemaufruf initiiert, kann er sofort mit der Ausführung anderer Dinge beginnen Bis beide Phasen der E/A-Ausführung abgeschlossen sind, sendet der Kernel eine Benachrichtigung an den Benutzerprozess, um dem Benutzerprozess mitzuteilen, dass der Vorgang abgeschlossen ist.
I/O-Multiplexing-Technologie
select(1).select() stellt eine Datenstruktur von fd_set bereit. Jedes Element kann eine Verbindung herstellen mit einem offenen Dateihandle (sei es ein Socket-Handle, eine andere Datei oder ein benanntes Pipe- oder Gerätehandle). Wenn select() aufgerufen wird, bestimmt der Kernel die Verbindung IO Der Status ändert den Inhalt von fd_set und teilt dadurch dem Prozess, der select() ausgeführt hat, mit, welcher Socket oder welche Datei lesbar oder beschreibbar ist. Wird hauptsächlich für die Socket-Kommunikation verwendet. (2) Wenn nach der Ausführung von select keine Dateneingabe erfolgt, wartet das Programm (wenn es blockiert ist), bis Daten vorhanden sind, d. h. es besteht keine Notwendigkeit für Schleifen und Ruhezustand im Programm . (3). Bei jedem Aufruf von „select“ muss die fd_set-Sammlung vom Benutzermodus in den Kernelmodus kopiert werden. Dieser Overhead ist sehr groß, wenn es viele fd_sets gibt ). Gleichzeitig muss der Kernel bei jedem Aufruf von select alle übergebenen fd_sets durchlaufen. Dieser Overhead ist auch sehr groß, wenn viele fd_sets vorhanden sind(5) Die Anzahl der von select unterstützten Dateideskriptoren ist zu klein. Der Standardwert ist 1024poll
(1) Die Implementierung von poll ist der von select sehr ähnlich, mit der Ausnahme, dass die fd_set-Sammlung beschrieben wird ist anders. poll verwendet die pollfd-verknüpfte Listenstruktur anstelle der fd_set-Struktur von select.
(2) Keine Obergrenze für die Anzahl der Überwachungsdeskriptoren;epoll/kqueue
(1). Anzahl der Überwachungsdeskriptoren ;
(2) Die Effizienz wird verbessert, es handelt sich nicht um eine Abfragemethode und die Effizienz nimmt nicht ab, wenn die Anzahl der fd zunimmt. Nur aktive und verfügbare fds rufen die Rückruffunktion auf. Der größte Vorteil von epoll/kqueue besteht darin, dass es sich nur um Ihre „aktiven“ Verbindungen kümmert und nichts mit der Gesamtzahl der Verbindungen im tatsächlichen Netzwerk zu tun hat Umgebung ist die Effizienz von epoll/kqueue viel höher als die von select und poll. (3). Speicherkopie, Verwendung von mmap()-Dateizuordnungsspeicher, um die Nachrichtenübermittlung mit dem Kernelraum zu beschleunigen;Das obige ist der detaillierte Inhalt vonE/A-Modell der PHP7-Kernelanalyse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!