2011-01-21 20 views
6

मैं "लिनक्स डिवाइस ड्राइवर 3 संस्करण" पढ़ रहा हूं, समरूपता और दौड़ की स्थिति के बारे में अध्याय। एक उदाहरण है जिसे मैं पूरी तरह से समझ नहीं पा रहा हूं; वे कर्नेल प्रोग्रामिंग में एक सामान्य पैटर्न के बारे में बात कर रहे हैं, जब किसी को मौजूदा थ्रेड के बाहर गतिविधि शुरू करने की आवश्यकता होती है (fo rexample, new kernel thread या user process, मौजूदा प्रक्रिया के लिए अनुरोध, या हार्डवेयर आधारित क्रिया), उस गतिविधि के लिए प्रतीक्षा करें पूर्ण। बहुत प्रभावी नहीं समाधान का उदाहरण है:लिनक्स कर्नेल म्यूटेक्स

struct semaphore sem; 
init_MUTEX_LOCKED(&sem); 
start_external_task(&sem); 
down(&sem); 

तब वे बाहरी कार्य का सुझाव अप कॉल करने के लिए (& sem) जब अपना काम किया जाता है।

मुझे समझ नहीं आता क्यों हम इसे इस तरह नहीं कर सकते है:

struct semaphore sem; 
down(&sem); 
start_external_task(&sem); 

बंद कर दिया राज्य में म्युटेक्स बनाने और उसके बाद काम के बाद म्युटेक्स प्राप्त करने के लिए शुरू कर दिया गया के लिए आवश्यक है क्यों है?

आप से सुनने के लिए उत्सुक खोज रहे हैं! धन्यवाद।

उत्तर

10

जब आप नीचे() कहते हैं, अपने धागा जब तक एक और धागा सेमाफोर का संकेत रोकेंगे। चूंकि अन्य धागा अभी तक शुरू नहीं हुआ है, इसलिए थ्रेड अनिश्चित काल तक अवरुद्ध होगा। यही कारण है कि आपको पहले धागे को शुरू करने की आवश्यकता है, और तब थ्रेड समाप्त होने तक ब्लॉक करने के लिए() को कॉल करें।

धागा खत्म तो इससे पहले कि आप नीचे फोन(), कि, ठीक है क्योंकि सेमाफोर का संकेत किया जाएगा और नीचे() बस संकेत स्पष्ट और वापस आ जाएगी।

+6

+1, लेकिन मैं इस शब्द का इस्तेमाल करना बेहतर होगा लगता है '' बजाय mutex' की semaphore'। सेमपुर: किसी भी धागे से ऊपर/नीचे हो सकता है। MUTEX: स्वामित्व है, केवल मालिक धागा लॉक mutex कर सकते हैं। इस मामले में हमें सेमफोर का उपयोग करने की आवश्यकता है, क्योंकि इसका उद्देश्य धागे के बीच संचार है ... – Vojta

+0

@Vojita: मैं सहमत हूं। मैंने म्यूटेक्स शब्द का प्रयोग किया क्योंकि सवाल सैमफोर को म्यूटेक्स के रूप में संदर्भित करता है। –

3

पहले उदाहरण में नीचे (सेम) बाहरी_टास्क को कॉल करने के लिए प्रतीक्षा करेगा (सेम) और कार्य पूर्ण होने तक प्रभावी रूप से मुख्य धागे को रोक दें। अपने कोड में नीचे() हमेशा के लिए मुख्य थ्रेड लॉक हो जाएगा के बाद से वहाँ कोई काम अभी बाकी है फोन करने के लिए()

1

कॉल:

init_MUTEX_LOCKED(&sem); 

"म्युटेक्स मोड" 0 के लिए initialised में एक नया सेमाफोर बनाता है। इसका मतलब है कि down() पर कॉल अवरुद्ध होगा। एक इसी कॉल:

init_MUTEX(&sem); 

एक सेमाफोर को 1.

initialised पहला उदाहरण आप 0 सेमाफोर आरंभ में बनाने हैं, तो आप अपने external_task बना सकते हैं और आप down() जब तक अपने कार्य को कॉल up() अवरुद्ध कहते हैं।

दूसरे उदाहरण में आप अपने सेमफोर को प्रारंभ नहीं करते हैं, down() को निष्पादन अवरुद्ध करें, और कोई बाहरी_टस्क चलाना नहीं है जो आपको अनवरोधित करने के लिए up() पर कॉल कर सकता है। बाहरी_टास्क बनाने के लिए कॉल इस प्रकार कभी नहीं पहुंचा है।

संयोग से, init_MUTEX_LOCKED साथ सेमाफोर initialising की प्रक्रिया कर्नेल संस्करण 2.6.37 में हटा दिया गया है।

संबंधित मुद्दे