Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Was ist der Unterschied zwischen poll und select unter Linux?

Was ist der Unterschied zwischen poll und select unter Linux?

WBOY
WBOYOriginal
2022-07-11 17:00:122166Durchsuche

Der Unterschied zwischen Poll und Select unter Linux besteht darin: Die maximale Anzahl von Verbindungen, die von einem einzelnen Select-Prozess geöffnet werden können, wird durch das Makro „FD_SETSIZE“ definiert und seine Größe beträgt 32 Ganzzahlen, während Poll den Speicher verknüpfter Listen verwendet Es gibt keine maximale Anzahl von Verbindungen.

Was ist der Unterschied zwischen poll und select unter Linux?

Die Betriebsumgebung dieses Tutorials: Linux7.3-System, Dell G3-Computer.

Was ist der Unterschied zwischen Poll und Select unter Linux?

Die von jedem Prozess verwendete Auswahl hat eine Begrenzung der maximalen Anzahl von Verbindungen, die nur FD_SETSIZE sein kann, während Poll keine solche Einschränkung hat (unter Verwendung der verknüpften Listenspeicherung);

epoll und select können beide als Lösung für Multiplex-I/O bereitgestellt werden. Alle können im aktuellen Linux-Kernel unterstützt werden, wobei epoll nur für Linux gilt, während select von POSIX festgelegt und in allgemeinen Betriebssystemen implementiert werden sollte.

select wird im Wesentlichen durch Einstellungen oder Überprüfungen gespeichert Die Datenstruktur des fd-Flag-Bits wird für den nächsten Verarbeitungsschritt verwendet. Die Nachteile davon sind:

1. Die Anzahl der FDS, die von einem einzelnen Prozess überwacht werden können, ist begrenzt, dh die Größe des Überwachungsports ist begrenzt.

Im Allgemeinen hängt diese Nummer eng mit dem Systemspeicher zusammen. Die spezifische Nummer kann unter cat /proc/sys/fs/file-max angezeigt werden. Der Standardwert für 32-Bit-Maschinen ist 1024. Der Standardwert für 64-Bit-Maschinen ist 2048.

2 Beim Scannen des Sockets handelt es sich um einen linearen Scan, dh es wird die Abfragemethode verwendet, die weniger effizient ist:

Wenn viele Sockets vorhanden sind, wählen Sie(). muss jedes Mal übergeben werden. Durchlaufen Sie FD_SETSIZE-Sockets, um die Planung abzuschließen. Unabhängig davon, welcher Socket aktiv ist, wird er einmal durchlaufen. Dadurch wird viel CPU-Zeit verschwendet. Wenn Sie eine Rückruffunktion für den Socket registrieren und die relevanten Vorgänge automatisch abschließen können, können Sie Abfragen vermeiden. Dies ist, was epoll und kqueue tun.

3. Es ist notwendig, eine Datenstruktur zum Speichern einer großen Anzahl von fd aufrechtzuerhalten, was beim Übertragen der Struktur zwischen Benutzerraum und Kernelraum einen hohen Kopieraufwand verursacht as select. Das vom Benutzer übergebene Array wird in den Kernelraum kopiert und dann wird der jedem fd entsprechende Gerätestatus abgefragt. Wenn das Gerät bereit ist, wird ein Element zur Gerätewarteschlange hinzugefügt und der Durchlauf fortgesetzt Wenn nach dem Durchlaufen aller FDS kein bereites Gerät gefunden wird, bleibt der aktuelle Prozess hängen, bis das Gerät bereit ist oder die Initiative abläuft, nachdem er aufgeweckt wurde. Dieser Prozess durchlief viele unnötige Durchläufe.

Es gibt keine Begrenzung der maximalen Anzahl von Verbindungen, da es auf einer verknüpften Liste basiert, aber es hat auch einen Nachteil:

1 Eine große Anzahl von fd-Arrays wird als Ganzes zwischen dem Benutzermodus und dem kopiert Kernel-Adressraum, unabhängig davon Ist eine solche Replikation sinnvoll?​​​​​​​​​

2. Eine weitere Funktion der Umfrage ist die „horizontale Auslösung“. Wenn ein fd gemeldet, aber nicht verarbeitet wird, wird der fd beim nächsten Mal erneut gemeldet.

epoll:

epoll verfügt über zwei Triggermodi: EPOLLLT und EPOLLET LT ist der Standardmodus und ET ist der „Hochgeschwindigkeits“-Modus. Im LT-Modus gibt epoll_wait jedes Mal sein Ereignis zurück, um das Benutzerprogramm an den Betrieb zu erinnern, solange der fd noch Daten zum Lesen hat. Im ET-Modus (Flankentrigger) wird nur einmal gefragt, bis die nächsten Daten vorliegen Vor dem Inflow erfolgen keine weiteren Eingabeaufforderungen, unabhängig davon, ob in fd noch lesbare Daten vorhanden sind. Daher muss im ET-Modus beim Lesen eines fd dessen Puffer ausgelesen werden, d. h. bis der Rückgabewert von read kleiner als der angeforderte Wert ist oder ein EAGAIN-Fehler auftritt. Eine weitere Funktion besteht darin, dass epoll die Bereitschaftsbenachrichtigungsmethode „event“ verwendet, um den fd über epoll_ctl zu registrieren. Sobald der fd bereit ist, verwendet der Kernel einen rückrufähnlichen Rückrufmechanismus, um den fd zu aktivieren, und epoll_wait kann die Benachrichtigung empfangen.

Warum verfügt Epoll über den EPOLLET-Triggermodus?

Wenn der EPOLLLT-Modus übernommen wird, werden diese bei jedem Aufruf von epoll_wait zurückgegeben, sobald eine große Anzahl fertiger Dateideskriptoren im System vorhanden ist, die nicht gelesen oder geschrieben werden müssen, was die Effizienz erheblich verringert Handler beim Abrufen der benötigten fertigen Dateideskriptoren. Wenn der Edge-Trigger-Modus von EPOLLET verwendet wird und ein lesbares und beschreibbares Ereignis im überwachten Dateideskriptor auftritt, benachrichtigt epoll_wait() den Handler zum Lesen und Schreiben. Wenn dieses Mal nicht alle Daten gelesen und geschrieben werden (z. B. weil der Lese-/Schreibpuffer zu klein ist), werden Sie beim nächsten Aufruf von epoll_wait() nicht benachrichtigt, d. h., Sie werden nur einmal benachrichtigt, bis Der Dateideskriptor lautet: Sie werden erst benachrichtigt, wenn das zweite Lese-/Schreibereignis eintritt! ! ! Dieser Modus ist effizienter als horizontales Triggern und das System wird nicht mit einer großen Anzahl fertiger Dateideskriptoren überflutet, die Sie nicht interessieren:

1 Es gibt keine Begrenzung für die maximale Anzahl gleichzeitiger Verbindungen , und die Obergrenze der FDs, die geöffnet werden können, ist viel größer als 1024 (1 GB Speicher kann etwa 100.000 Ports überwachen). Anzahl der FDs steigt. Nur aktive und verfügbare FDs rufen die Rückruffunktion auf.

Der größte Vorteil von Epoll besteht darin, dass es sich nur um Ihre „aktiven“ Verbindungen kümmert und nichts mit der Gesamtzahl der Verbindungen zu tun hat Die Effizienz von Epoll wird weitaus höher sein als bei Select und Poll. 3. Speicherkopie, Verwendung des Dateizuordnungsspeichers mmap() zur Beschleunigung der Nachrichtenweitergabe mit dem Kernelraum, d. h. epoll verwendet mmap, um den Kopieraufwand zu reduzieren.

Auswählen, abfragen, epoll Zusammenfassung der Unterschiede:

1 Unterstützt die maximale Anzahl von Verbindungen, die von einem Prozess geöffnet werden können.

Auswählen. Die maximale Anzahl von Verbindungen, die von einem einzelnen geöffnet werden können Der Prozess wird durch das FD_SETSIZE-Makro definiert und seine Größe beträgt 32 Ganzzahlen (auf einem 32-Bit-Computer beträgt die Größe 3232, und auf einem 64-Bit-Computer beträgt FD_SETSIZE natürlich 3264). Ändern Sie es und kompilieren Sie den Kernel neu. Die Leistung kann jedoch beeinträchtigt werden, was weitere Tests erfordert.

poll

poll ist im Wesentlichen dasselbe wie select, es gibt jedoch keine Begrenzung der maximalen Anzahl von Verbindungen, da die Speicherung auf einer verknüpften Liste basiert

epoll

Obwohl es eine Obergrenze für die Anzahl gibt Die Anzahl der Verbindungen ist sehr groß, eine Maschine mit 1G-Speicher kann etwa 100.000 Verbindungen öffnen, und eine Maschine mit 2G-Speicher kann etwa 200.000 Verbindungen öffnen

Da die Verbindung jedes Mal verarbeitet wird, wenn sie als lineare Durchquerung bezeichnet wird, führt dies bei zunehmender FD zu einem „Leistungsproblem mit linearem Rückgang“ und langsamer Durchquerungsgeschwindigkeit.

pollGleiches wie oben

epoll

Da die Implementierung im Epoll-Kernel auf der Rückruffunktion für jeden FD basiert, rufen nur aktive Sockets aktiv den Rückruf auf. Wenn also weniger aktive Sockets vorhanden sind, wird epoll nicht verwendet Es besteht das Problem des linearen Leistungsabfalls der beiden vorherigen, aber wenn alle Sockets aktiv sind, kann es zu Leistungsproblemen kommen.

3. Nachrichtenübermittlungsmethode

select

Der Kernel muss Nachrichten an den Benutzerbereich übermitteln, was eine Kernel-Kopieraktion erfordert der Kernel und der Benutzerbereich von.

Zusammenfassung:

Zusammenfassend lässt sich sagen, dass Sie bei der Auswahl von Select, Poll oder Epoll die spezifischen Verwendungszwecke und Eigenschaften dieser drei Methoden berücksichtigen sollten.

1. Oberflächlich betrachtet hat Epoll die beste Leistung, aber wenn die Anzahl der Verbindungen gering und die Verbindungen sehr aktiv sind, ist die Leistung von Select und Poll möglicherweise besser als die von Epoll. Schließlich erfordert der Benachrichtigungsmechanismus von Epoll viele Funktionen Rückrufe.

2. Select ist ineffizient, da es jedes Mal abgefragt werden muss. Aber Ineffizienz ist auch relativ, je nach Situation kann sie auch durch gutes Design verbessert werden

Lernempfehlung:

Linux-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen poll und select unter Linux?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn