Z man select
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
nfds to deskryptor pliku o najwyższym numerze w dowolnym z trzech zestawów plus 1.
Jaki jest cel nfds
, kiedy już mamy readfds
, writefds
i na exceptfds
podstawie którego można określić deskryptory plików?
system-calls
file-descriptors
phunehehe
źródło
źródło
Odpowiedzi:
W „Advanced Programming in the UNIX Environment” W. Richard Stevens mówi, że jest to optymalizacja wydajności:
(1. wydanie, strona 399)
Jeśli wykonujesz programowanie w systemach UNIX, książka APUE jest wysoce zalecana.
AKTUALIZACJA
fd_set
Zazwyczaj jest w stanie śledzić do 1024 deskryptorów.Najbardziej efektywnym sposobem śledzenia, które
fds
są ustawione0
i które są ustawione,1
byłby zestaw bitów, więc każdyfd_set
składałby się z 1024 bitów.W systemie 32-bitowym długie int (lub „słowo”) ma 32 bity, co oznacza, że każde
fd_set
ma1024/32 = 32 słowa.
Jeśli
nfds
jest coś małego, takiego jak 8 lub 16, co byłoby w wielu aplikacjach, wystarczy zajrzeć do pierwszego słowa, które powinno być wyraźnie szybsze niż zajrzenie do wszystkich 32.(Zobacz
FD_SETSIZE
i__NFDBITS
od/usr/include/sys/select.h
wartości na twojej platformie.)AKTUALIZACJA 2
Co do tego, dlaczego podpis funkcji nie jest
Sądzę, że to dlatego, że kod próbuje zachować wszystkie argumenty w rejestrach , więc procesor może na nich pracować szybciej, a jeśli musiałby śledzić dodatkowe 2 zmienne, procesor może nie mieć wystarczającej liczby rejestrów.
Innymi słowy,
select
ujawnia szczegół implementacji, aby mógł być szybszy.źródło
Nie wiem na pewno, ponieważ nie jestem jednym z projektantów select (), ale powiedziałbym, że to optymalizacja wydajności. Funkcja wywołująca wie, ile deskryptorów plików umieściła w plikach odczytu, zapisu i oprócz FD, więc dlaczego jądro powinno to rozgryzać?
Pamiętaj, że na początku lat 80., kiedy wprowadzono select (), nie mieli wielu gigagherców i procesorów do pracy. VAX 25 MHz był dość szybki. Ponadto chciałeś, aby select () działał szybko, gdyby mógł: jeśli niektóre operacje wejścia / wyjścia czekały na proces, po co zmuszać proces do oczekiwania?
źródło
nreadfds
,nwritefds
anexceptfds
nie tylko jednegonfds
.nfds
można przejść do rejestru, aby uzyskać szybszy dostęp. Gdyby musiał śledzić trzy liczby wraz ze wszystkimi innymi argumentami, być może procesor nie miałby wystarczającej liczby rejestrów. Oczywiście jądro mogło stworzyć własnenfds
na podstawie 3 hipotetycznych zmiennych. Domyślam się, że ujawnia szczegół implementacji w celu zwiększenia wydajności.nfds
argumenty przyniosłyby bardzo niewielki zysk. W większości przypadków proces otworzył bardzo niewiele procesów w stosunku doFD_SETSIZE
. Typowy przypadek może mieć (4,4,2) z 1024; sprawdzenie jądra (4,4,4) to duża wygrana (1024,1024,1024), ale optymalizacja do (4,4,2) byłaby prawie bezużyteczna.nfds
, albo być leniwym i zadzwonićselect(FD_SETSIZE, ...)
, co byłoby wolniejsze.)