2010-06-23 16 views
5

हाल ही में मैं एक दिलचस्प ब्लॉग म्युटेक्स और सेमाफोर की तुलना पढ़ें:
"
http://www.feabhas.com/blog/2009/09/mutex-vs-semaphores-%E2%80%93-part-1-semaphores/
" यह सेक्या एक महत्वपूर्ण खंड में संदर्भ स्विच हो सकता है?

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

यदि यह सैमफोर के लिए सच है, तो क्या यह म्यूटेक्स के लिए भी सच है? मुझे नहीं लगता कि यह सही है जैसे कि कोड का एक ब्लॉक लॉक है, यह" परमाणु "होना चाहिए जिसे संदर्भित नहीं किया जा सकता है या बाधित नहीं किया जा सकता क्या मैं सही हूँ?

उत्तर

10

नहीं, एक संदर्भ स्विच लगभग कहीं भी हो सकता है। हालांकि आम तौर पर एक बार जितना संभव हो सके ताले रखने के लिए एक अच्छा विचार है, आप नहीं चाहते हैं कि आपकी पूरी मशीन लॉक हो जाए क्योंकि एक प्रक्रिया कोर के रूप में ताले रखने वाले कई धागे थे, कुछ होने की प्रतीक्षा कर रहे थे, क्या आप?

लॉक का बिंदु कोड को रोकने के लिए है जो लॉक में कोड को निष्पादित करने में हस्तक्षेप कर सकता है - सिस्टम में हर प्रक्रिया में सभी अन्य कोड निष्पादित होने से रोकने के लिए नहीं है। (एक अलग प्रक्रिया में एक संदर्भ स्विच अभी भी एक संदर्भ स्विच है।)

5

यह इस बात पर निर्भर करता है कि आप किस "महत्वपूर्ण खंड" के साथ काम कर रहे हैं। उदाहरण के लिए, ओएस/2 (मौजूदा विंडोज़ के पूर्ववर्ती जो पहले महत्वपूर्ण वर्गों को शामिल करते थे) में एक महत्वपूर्ण खंड में प्रवेश करने से उसी प्रक्रिया में एक अलग थ्रेड पर स्विचिंग को रोक दिया गया था। विंडोज एनटी में, उन्होंने बदल दिया कि थ्रेड स्विचिंग की अनुमति है, इसलिए अन्य धागे केवल तभी अवरुद्ध किए जाएंगे जब वे एक ही महत्वपूर्ण खंड में प्रवेश करने का प्रयास करते हैं।

इन दोनों मामलों में, एक महत्वपूर्ण अनुभाग एक प्रक्रिया के लिए स्थानीय है, इसलिए एक अलग प्रक्रिया में धागा एक ही महत्वपूर्ण खंड में प्रवेश करने का प्रयास नहीं कर सकता है।

अन्य प्रणालियों पर, आपको यह देखना होगा कि यह एक महत्वपूर्ण खंड (इसे मानते हुए) को यह जानने के लिए निर्दिष्ट किया जाता है कि यह क्या अनुमति देता है/प्रतिबंधित करता है। कोई सार्वभौमिक परिभाषा नहीं है।

0

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

सबूत:
इस कोड को चलाएं और फिर आप फिर से एफ से आउटपुट देखेंगे। समय की

#include <stdio.h> 
#include <pthread.h> 
#include <semaphore.h> 

int global=0; 
sem_t sem; 
void* f(void *a){ 
    sem_wait(&sem); 
    printf("Inside a critical section: %d\n",global++); 
    ++global; 
    sem_post(&sem); 
    return a ; 
} 

void* g(void *a){ 
    printf("Function call to g.\n"); 
    return a ; 
} 

int main(void){ 
    pthread_t tids[10]; 
    sem_init(&sem, 0, 1); 
    int i; 
    pthread_t new_thread; 
    for (i=0; i < 10 ; ++i){ 
    if (i == 8) 
     pthread_create(&new_thread, NULL, g, NULL); 
    pthread_create(&tids[i], NULL, f, NULL); 
    } 
    for (i=0; i < 10 ; ++i){ 
    pthread_join(tids[i], NULL); 
    } 
    pthread_join(new_thread, NULL); 
} 
-1

अधिकांश, एक धागा या प्रक्रिया किसी भी समय अनुसूचक द्वारा बाहर स्विच किया जा सकता है, यहां तक ​​कि यह महत्वपूर्ण खंड में है। गंभीर अनुभाग केवल कोड का एक विशेष हिस्सा है जिसे अन्य धागे द्वारा निष्पादित करने के लिए साझा नहीं किया जाना चाहिए। यह परमाणु पहुंच नहीं है। केवल semaphore या mutex यह स्वयं परमाणु पहुंच है। यदि आप चाहते हैं कि आप महत्वपूर्ण अनुभाग कोड निष्पादन परमाणु हैं, तो केवल एक थ्रेड एसएमपी में भी इन कोड को चला सकता है, आप बाधित अक्षमता के साथ स्पिनलॉक का उपयोग कर सकते हैं। यदि प्रोसेसर पर बाधा अक्षम है, तो शेड्यूलर काम करना बंद कर देता है, कोई आईएसआर रन नहीं होता है। थ्रेड रिलीज स्पिनलॉक तक बस अपने थ्रेड रन को महत्वपूर्ण सेकियन में चलाएं।यह उच्चतम कोड संरक्षण है जो केवल कर्नेल में प्रयोग किया जाता है, क्योंकि इंटरप्ट और कर्नेल थ्रेड के बीच संघर्ष केवल कर्नेल में होता है। उदाहरण के लिए, एक आईएसआर डिवाइस से डेटा प्राप्त करता है, और एक कर्नेल थ्रेड इस डेटा को पढ़ता है। फिर स्पिनलॉक काम करता है।

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