Der Inhalt dieses Artikels befasst sich mit dem I/O-Modell von PHP7 Kernel Analysis 2. Jetzt kann ich ihn mit Ihnen teilen.
1. Synchronisierung: Mein Client (C-Seite). ) Der Aufrufer) ist eine Funktion, die nicht endet, bevor ich sterbe und auf das Ergebnis warte.
2. Asynchron: Ich (der C-Seitenaufrufer) rufe eine Funktion auf und kenne das Ergebnis der Funktion nicht. Wenn die Funktion das Ergebnis hat, wird sie mich benachrichtigen, d. h. eine Rückrufbenachrichtigung.
3. Blockieren: Es bedeutet, dass ich (aufgerufene S-Seite (oder Funktion)) nicht zurückkehre, bis ich die Daten vollständig akzeptiert oder das Ergebnis erhalten habe.
4. Nicht blockierend: Rufen Sie mich einfach an (Angerufener auf s-Seite, Funktion), ich (Angerufener auf s-Seite, Funktion) werde sofort zurückkommen und den Anrufer benachrichtigen, nachdem ich das Ergebnis erhalten habe
Fünf I/O-Modelle
(1) Blockieren von I/O (Blockieren von I/O)
Wann Wenn der Benutzerprozess einen Systemaufruf durchführt, 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 Kernelpuffer in den Speicher des Benutzerprozesses kopiert Zu diesem Zeitpunkt wird der Benutzerprozess aus dem Blockzustand entlassen und läuft erneut.
(2) Nicht blockierende E/A
Der Benutzerprozess ist erst in der zweiten Phase blockiert, während Die erste Stufe ist nicht blockiert, 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 sind Beide Benutzerprozesse sind blockiert, aber die Bei einem vollständigen E/A-Vorgang 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)
Blockiert den Benutzerprozess nur in der zweiten Phase der E/A-Ausführung, wird jedoch in der ersten Phase nicht blockiert. 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, wird er Sofort Sie können mit anderen Dingen 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 1024
poll
(1). Die Implementierung von poll ist der von „select“ sehr ähnlich, außer dass die Methode zur Beschreibung der fd_set-Sammlung unterschiedlich ist pollfd-verknüpfte Listenstruktur anstelle der fd_set-Struktur von select. Alles andere ist ähnlich.
(2) Keine Obergrenze für die Anzahl der Überwachungsdeskriptoren;
epoll/kqueue
(1). 🎜>(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, verwenden Sie mmap()-Dateizuordnungsspeicher, um die Nachrichtenübermittlung mit Kernel-Speicherplatz zu beschleunigen.
Verwandte Empfehlungen:
PHP7 Kernel Analysis 1 CGI und FastCGI
Das obige ist der detaillierte Inhalt vonPHP7 Kernel Analysis 2 E/A-Modell. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!