में "यूनिक्स पर्यावरण में उन्नत प्रोग्रामिंग" , डब्ल्यू रिचर्ड स्टीवंस कहते हैं कि यह एक प्रदर्शन के अनुकूलन है:
हम जिस उच्चतम विवरणक में रुचि रखते हैं, उसे निर्दिष्ट करके कर्नेल को तीन वर्णनात्मक सेटों में अप्रयुक्त बिट्स के माध्यम से जाने से बचा सकते हैं, उन बिट्स की तलाश कर रहे हैं जो चालू हैं।
(पहला संस्करण, पेज 399)
यदि आप किसी भी प्रकार की UNIX सिस्टम प्रोग्रामिंग कर रहे हैं, तो APUE पुस्तक अत्यधिक अनुशंसित है।
अद्यतन करें
एक fd_setआमतौर पर 1024 फ़ाइल डिस्क्रिप्टर तक ट्रैक करने में सक्षम होता है।
ट्रैक करने के लिए सबसे कुशल तरीका जो fdsसेट किया गया है 0और जो 1एक बिटसेट के लिए सेट है , इसलिए प्रत्येक fd_setमें 1024 बिट्स होंगे।
32-बिट सिस्टम पर, एक लंबा int (या "शब्द") 32 बिट्स है, इसलिए इसका मतलब है कि प्रत्येक fd_setहै
1024/32 = 32 शब्द।
यदि nfdsकुछ छोटा है, जैसे कि 8 या 16, जो कि कई अनुप्रयोगों में होगा, तो उसे केवल 1 शब्द के अंदर देखना होगा, जो स्पष्ट रूप से सभी 32 के अंदर देखने की तुलना में तेज़ होना चाहिए।
(देखें FD_SETSIZEऔर __NFDBITSसे /usr/include/sys/select.hअपने मंच पर मूल्यों के लिए।)
अद्यतन २
फ़ंक्शन हस्ताक्षर क्यों नहीं है
int select(fd_set *readfds, int nreadfds,
fd_set *writefds, int nwritefds,
fd_set *exceptfds, int nexceptfds,
struct timeval *timeout);
मेरा अनुमान है कि यह इसलिए है क्योंकि कोड सभी तर्कों को रजिस्टरों में रखने की कोशिश करता है , इसलिए सीपीयू उन पर तेजी से काम कर सकता है, और अगर उसे अतिरिक्त 2 चर ट्रैक करना था, तो सीपीयू में पर्याप्त रजिस्टर नहीं हो सकता है।
इसलिए दूसरे शब्दों में, selectएक कार्यान्वयन विवरण को उजागर कर रहा है ताकि यह तेज हो सके।