में "यूनिक्स पर्यावरण में उन्नत प्रोग्रामिंग" , डब्ल्यू रिचर्ड स्टीवंस कहते हैं कि यह एक प्रदर्शन के अनुकूलन है:
हम जिस उच्चतम विवरणक में रुचि रखते हैं, उसे निर्दिष्ट करके कर्नेल को तीन वर्णनात्मक सेटों में अप्रयुक्त बिट्स के माध्यम से जाने से बचा सकते हैं, उन बिट्स की तलाश कर रहे हैं जो चालू हैं।
(पहला संस्करण, पेज 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
एक कार्यान्वयन विवरण को उजागर कर रहा है ताकि यह तेज हो सके।