सिस्टम कॉल का चयन करने के लिए पहले तर्क का उद्देश्य क्या है?


25

से man select

int select(int nfds, fd_set *readfds, fd_set *writefds,
           fd_set *exceptfds, struct timeval *timeout);

nfds तीन सेटों में से किसी 1 में प्लस-नंबर फ़ाइल डिस्क्रिप्टर है।

का उद्देश्य क्या है nfds, जब हम पहले से ही है readfds, writefdsऔर exceptfdsहै, जिसमें से फ़ाइल वर्णनकर्ता निर्धारित किया जा सकता?


मैं SO पर पूछने वाला था, लेकिन यह यहाँ अधिक केंद्रीकृत है, और C API कॉल को विषय पर माना जाता है
फुनेहे

जवाबों:


25

में "यूनिक्स पर्यावरण में उन्नत प्रोग्रामिंग" , डब्ल्यू रिचर्ड स्टीवंस कहते हैं कि यह एक प्रदर्शन के अनुकूलन है:

हम जिस उच्चतम विवरणक में रुचि रखते हैं, उसे निर्दिष्ट करके कर्नेल को तीन वर्णनात्मक सेटों में अप्रयुक्त बिट्स के माध्यम से जाने से बचा सकते हैं, उन बिट्स की तलाश कर रहे हैं जो चालू हैं।

(पहला संस्करण, पेज 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एक कार्यान्वयन विवरण को उजागर कर रहा है ताकि यह तेज हो सके।



APUE को हाल ही में अपडेट किया गया था। दूसरा संस्करण: amazon.com/gp/aw/d.html/ref=aw_d_detail?pd=1&a=0201433079
मिकेल

@chris मैं लिनक्स प्रोग्रामिंग इंटरफ़ेस की जाँच करूँगा। धन्यवाद।
मिकेल

जानकारी के लिए धन्यवाद, मैं पुस्तकों पर जाँच करूँगा जब मैं कुछ समय ले लूंगा।
फुनेहे

APUE 2nd Ed: 27 जून, 2005 (linux-2.4.22 को शामिल किया गया) TLPI: अक्टूबर 2010 (linux-2.6.35 को शामिल किया गया)
क्रिस

6

मुझे यकीन नहीं है, क्योंकि मैं चयन के डिजाइनरों में से एक नहीं हूं (), लेकिन मैं कहूंगा कि यह एक प्रदर्शन अनुकूलन है। कॉलिंग फ़ंक्शन जानता है कि उसने कितने फ़ाइल विवरणकों को रीड, राइट और एफडी को छोड़कर रखा है, इसलिए कर्नेल को इसे फिर से क्यों निकालना चाहिए?

याद रखें कि 80 के दशक की शुरुआत में, जब चयन () शुरू हुआ, तो उनके पास काम करने के लिए मल्टी-गीगाघर्ट्ज़, मल्टी-प्रोसेसर नहीं थे। एक 25 मेगाहर्ट्ज वैक्स काफी तेजी से डॉगगोन था। इसके अलावा, आप चाहते थे कि चयन () तेजी से काम करे अगर यह हो सकता है: यदि कुछ I / O प्रक्रिया की प्रतीक्षा कर रहे थे, तो प्रक्रिया को प्रतीक्षा क्यों करें?


आपके तर्क के लिए मैं कहूंगा कि हमें जरूरत है nreadfds, nwritefdsऔर nexceptfdsसिर्फ एक के बजाय nfds
फुनेहे

शायद यह इतना है कि nfdsतेजी से पहुंच के लिए एक रजिस्टर में जा सकता है। यदि उसे तीन नंबरों को ट्रैक करना पड़ता, तो अन्य सभी तर्कों के साथ, शायद सीपीयू में पर्याप्त रजिस्टर नहीं होते। बेशक, कर्नेल nfdsअपने काल्पनिक 3 चर के आधार पर अपना स्वयं का निर्माण कर सकता है । तो मेरा अनुमान है कि यह दक्षता हासिल करने के लिए एक कार्यान्वयन विवरण को उजागर कर रहा है।
मिकेल

@ मिकेल, फुनेहे: अलग nfdsतर्क बहुत कम लाभ लाते हैं। अधिकांश समय, इस प्रक्रिया के सापेक्ष बहुत कम प्रक्रियाएँ खोली हैं FD_SETSIZE। एक विशिष्ट मामला 1024 में से (4,4,2) हो सकता है; कर्नेल चेक (4,4,4) बनाना एक बड़ी जीत है (1024,1024,1024), लेकिन नीचे (4,4,2) का अनुकूलन करना बेकार होगा।
गिल्स एसओ- बुराई को रोकें '21

@ गिल्स: लाभ एक क्लीनर एपीआई होगा। (जैसा कि है, या तो प्रोग्रामर को गणना करने के लिए अतिरिक्त काम करना होगा nfds, या आलसी और कॉल select(FD_SETSIZE, ...)करना होगा, जो धीमा होगा।)
मिकेल

OTOH, केवल एक अधिकतम चर को ट्रैक करना प्रोग्रामर के लिए भी आसान हो सकता है।
मिकेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.