In "Advanced Programming in the UNIX Environment" beschreibt W. Richard Stevens dies als eine Leistungsoptimierung:
Durch die Angabe des höchsten Deskriptors, an dem wir interessiert sind, kann der Kernel vermeiden, Hunderte nicht verwendeter Bits in den drei Deskriptorsätzen zu durchlaufen und nach aktivierten Bits zu suchen.
(1. Auflage, Seite 399)
Wenn Sie UNIX-Systeme programmieren, wird das APUE-Buch dringend empfohlen.
AKTUALISIEREN
In der fd_set
Regel können bis zu 1024 Dateideskriptoren verfolgt werden.
Der effizienteste Weg zu verfolgen, auf welchen fds
eingestellt ist 0
und auf welche eingestellt ist, 1
wäre ein Bitsatz, also fd_set
würde jeder aus 1024 Bits bestehen.
Auf einem 32-Bit - System, ein long int (oder "Wort") beträgt 32 Bits, so dass jeder daß Mittel fd_set
ist
1024/32 = 32 Worte.
Wenn nfds
es sich bei etwas Kleinem wie 8 oder 16 handelt, wie es in vielen Anwendungen der Fall ist, muss nur das erste Wort gesucht werden, was eindeutig schneller sein sollte als alle 32.
(Siehe FD_SETSIZE
und __NFDBITS
von /usr/include/sys/select.h
für die Werte auf Ihrer Plattform.)
UPDATE 2
Warum ist die Funktionssignatur nicht
int select(fd_set *readfds, int nreadfds,
fd_set *writefds, int nwritefds,
fd_set *exceptfds, int nexceptfds,
struct timeval *timeout);
Ich vermute, es liegt daran, dass der Code versucht, alle Argumente in Registern zu speichern , damit die CPU schneller mit ihnen arbeiten kann. Wenn zwei zusätzliche Variablen nachverfolgt werden müssten, verfügt die CPU möglicherweise nicht über genügend Register.
Mit anderen Worten, select
wird ein Implementierungsdetail verfügbar gemacht, damit es schneller sein kann.