सी प्रोग्रामर ने अक्सर इस बात को लेकर अस्थिरता बरती है कि चर को निष्पादन के मौजूदा धागे के बाहर बदला जा सकता है; परिणामस्वरूप, उन्हें कभी-कभी कर्नेल कोड में इसका उपयोग करने के लिए लुभाया जाता है जब साझा डेटा संरचनाओं का उपयोग किया जा रहा हो। दूसरे शब्दों में, उन्हें अस्थिर प्रकारों को एक आसान परमाणु चर के रूप में माना जाता है, जो वे नहीं हैं। कर्नेल कोड में वाष्पशील का उपयोग लगभग कभी सही नहीं होता है; यह दस्तावेज़ बताता है कि क्यों।
अस्थिरता के संबंध में समझने के लिए महत्वपूर्ण बिंदु यह है कि इसका उद्देश्य अनुकूलन को दबाने के लिए है, जो लगभग कभी नहीं होता है जो वास्तव में करना चाहता है। कर्नेल में, किसी को अवांछित समवर्ती पहुंच के खिलाफ साझा डेटा संरचनाओं की रक्षा करनी चाहिए, जो कि बहुत अलग काम है। अवांछित संगामिति के खिलाफ सुरक्षा की प्रक्रिया भी लगभग सभी अनुकूलन-संबंधित समस्याओं को अधिक कुशल तरीके से बचाएगी।
अस्थिर की तरह, कर्नेल प्राइमेटिव जो डेटा को सुरक्षित (स्पिनलॉक, म्यूटेक्स, मेमोरी बैरियर, आदि) के लिए समवर्ती पहुंच बनाते हैं, अवांछित अनुकूलन को रोकने के लिए डिज़ाइन किए गए हैं। यदि उनका सही उपयोग किया जा रहा है, तो वाष्पशील का भी उपयोग करने की आवश्यकता नहीं होगी। यदि अस्थिर अभी भी आवश्यक है, तो कोड में लगभग निश्चित रूप से एक बग है। ठीक से लिखे गए कर्नेल कोड में, अस्थिर केवल धीमी गति से काम कर सकता है।
कर्नेल कोड के एक विशिष्ट ब्लॉक पर विचार करें:
spin_lock(&the_lock);
do_something_on(&shared_data);
do_something_else_with(&shared_data);
spin_unlock(&the_lock);
यदि सभी कोड लॉकिंग नियमों का पालन करते हैं, तो साझा किए जाने के दौरान साझा_डेटा का मान अप्रत्याशित रूप से नहीं बदल सकता है। कोई अन्य कोड जो उस डेटा के साथ खेलना चाहेगा, वह लॉक पर प्रतीक्षा कर रहा होगा। स्पिनलॉक प्राइमिटिव मेमोरी बाधाओं के रूप में कार्य करते हैं - उन्हें स्पष्ट रूप से ऐसा करने के लिए लिखा जाता है - जिसका अर्थ है कि डेटा एक्सेस उन पर अनुकूलित नहीं किया जाएगा। तो कंपाइलर यह सोच सकता है कि यह जानता है कि शेयर्ड_डाटा में क्या होगा, लेकिन स्पिन_लॉक () कॉल, चूंकि यह मेमोरी बैरियर के रूप में काम करता है, इसलिए इसे कुछ भी जानने के लिए मजबूर कर देगा। उस डेटा तक पहुँच के साथ कोई अनुकूलन समस्याएँ नहीं होंगी।
यदि साझा_दाटा को अस्थिर घोषित किया गया था, तो लॉकिंग अभी भी आवश्यक होगी। लेकिन संकलक को महत्वपूर्ण खंड के भीतर share_data तक पहुंच को अनुकूलित करने से भी रोका जाएगा , जब हम जानते हैं कि कोई और इसके साथ काम नहीं कर सकता है। जबकि ताला लगा हुआ है, साझा_डाटा अस्थिर नहीं है। साझा डेटा के साथ काम करते समय, उचित लॉकिंग अस्थिर अनावश्यक बनाता है - और संभावित रूप से हानिकारक।
वाष्पशील भंडारण वर्ग मूल रूप से मेमोरी-मैप्ड I / O रजिस्टरों के लिए था। कर्नेल के भीतर, रजिस्टर एक्सेस, भी, ताले द्वारा संरक्षित किया जाना चाहिए, लेकिन एक भी नहीं चाहता है कि कंपाइलर "ऑप्टिमाइज़िंग" रजिस्टर एक महत्वपूर्ण सेक्शन के भीतर एक्सेस करे। लेकिन, कर्नेल के भीतर, I / O मेमोरी एक्सेस हमेशा एक्सेसर फ़ंक्शन के माध्यम से किया जाता है; पॉइंटर्स के माध्यम से I / O मेमोरी को सीधे एक्सेस करना, सभी आर्किटेक्चर पर काम नहीं करता है। उन एक्सेसरों को अवांछित अनुकूलन को रोकने के लिए लिखा गया है, इसलिए, एक बार फिर, अस्थिर अनावश्यक है।
एक और स्थिति जहां किसी को अस्थिरता का उपयोग करने के लिए लुभाया जा सकता है, जब प्रोसेसर एक चर के मूल्य पर व्यस्त है। व्यस्त प्रतीक्षा करने का सही तरीका है:
while (my_variable != what_i_want)
cpu_relax();
Cpu_relax () कॉल सीपीयू बिजली की खपत को कम कर सकता है या हाइपरथ्रेडेड ट्विन प्रोसेसर के लिए पैदावार कर सकता है; यह स्मृति अवरोधक के रूप में भी काम करता है, इसलिए, एक बार फिर, अस्थिर अनावश्यक है। बेशक, व्यस्त-प्रतीक्षा आम तौर पर एक असामाजिक कार्य है जिसके साथ शुरू करना है।
अभी भी कुछ दुर्लभ स्थितियाँ हैं जहाँ अस्थिर कर्नेल में समझ में आता है:
उपर्युक्त एक्सेसर फ़ंक्शंस आर्किटेक्चर पर अस्थिर का उपयोग कर सकते हैं जहां प्रत्यक्ष I / O मेमोरी एक्सेस काम करता है। अनिवार्य रूप से, प्रत्येक एक्सेसर कॉल अपने आप ही थोड़ा महत्वपूर्ण खंड बन जाता है और यह सुनिश्चित करता है कि एक्सेस प्रोग्रामर द्वारा अपेक्षित रूप से होता है।
इनलाइन असेंबली कोड जो मेमोरी को बदलता है, लेकिन जिसका कोई अन्य दृश्य दुष्प्रभाव नहीं है, जीसीसी द्वारा हटाए जा रहे जोखिम। अस्थिर कीवर्ड को asm स्टेटमेंट में जोड़ने से यह निष्कासन रोका जा सकेगा।
Jiffies वैरिएबल इस मायने में खास है कि इसे संदर्भित करने पर हर बार एक अलग मान हो सकता है, लेकिन इसे बिना किसी विशेष लॉकिंग के पढ़ा जा सकता है। इसलिए जिफ़ियाँ अस्थिर हो सकती हैं, लेकिन इस प्रकार के अन्य चर के जोड़ पर दृढ़ता से फेंक दिया जाता है। इस संबंध में जिफ़ी को एक "बेवकूफ विरासत" मुद्दा (लिनुस के शब्द) माना जाता है; इसे ठीक करने से ज्यादा परेशानी होती है।
सुसंगत स्मृति में डेटा संरचनाओं की ओर संकेत जो I / O उपकरणों द्वारा संशोधित किया जा सकता है, कभी-कभी, वैध रूप से अस्थिर हो सकते हैं। नेटवर्क एडेप्टर द्वारा उपयोग किया जाने वाला रिंग बफर, जहां वह एडेप्टर इंगित करता है कि यह इंगित करने के लिए कि कौन से डिस्क्रिप्टर संसाधित किए गए हैं, इस प्रकार की स्थिति का एक उदाहरण है।
अधिकांश कोड के लिए, वाष्पशील लागू करने के लिए उपरोक्त औचित्य में से कोई भी नहीं। नतीजतन, अस्थिर का उपयोग बग के रूप में देखा जा सकता है और कोड के लिए अतिरिक्त जांच लाएगा। जिन डेवलपर्स को अस्थिरता का उपयोग करने के लिए लुभाया जाता है, उन्हें एक कदम वापस लेना चाहिए और सोचना चाहिए कि वे वास्तव में क्या हासिल करने की कोशिश कर रहे हैं।