2012-02-20 17 views
15

के रूप में चिह्नित करें, मैं वर्तमान में PostgreSql कोड पढ़ रहा हूं। यहाँ बफर प्रबंधक से एक अंश है:क्यों फ़ंक्शन तर्क को अस्थिर

static void WaitIO(volatile BufferDesc *buf); 
static bool StartBufferIO(volatile BufferDesc *buf, bool forInput); 
static void TerminateBufferIO(volatile BufferDesc *buf, bool clear_dirty, 

मैं जानता हूँ कि अस्थिर कीवर्ड आमतौर पर डिवाइस ड्राइवर के लिए और एम्बेडेड प्रणाली में प्रयोग किया जाता है। कीवर्ड का एक स्पष्टीकरण है।

जब कीवर्ड अस्थिरता प्रकार परिभाषा में उपयोग किया जाता है तो यह कंपाइलर को संकेत देता है कि यह चर को कैसे संभालना चाहिए। मुख्य रूप से यह संकलक को बता रहा है कि प्रोग्राम के बाहरी कार्यों या निष्पादन की वर्तमान पंक्ति के परिणामस्वरूप चर के मान किसी भी समय बदल सकते हैं। (Source)

तो क्यों कुछ समारोह तर्क अस्थिर रूप में घोषित कर रहे हैं? मुझे उम्मीद नहीं है कि डीएमए सूचक स्थान बदलता है। तो यहाँ क्या होता है?

+0

यह सुनिश्चित नहीं है कि यह एक और सवाल के लायक है, लेकिन यह जानने में रुचि है कि आप 'शून्य फनक (int volatile arg) क्यों लिख सकते हैं; ' – ideasman42

उत्तर

16

volatile BufferDesc *buf मतलब यह है कि डेटा को bufअंक अस्थिर है कि, ऐसा नहीं है कि सूचक buf द्वारा निहित अस्थिर है। (यह BufferDesc * volatile buf होगा।)

the page you linked to से:

दूसरी ओर, यदि आप एक सूचक चर जहां पता ही अस्थिर था, लेकिन याद करने के लिए तो हमारे पास नहीं था ओर इशारा किया है:

int * volatile x; 

अद्यतन:

: क्षमा करें, मैं आपके प्रश्न के इस भाग को याद किया

तो कुछ फ़ंक्शन तर्क क्यों अस्थिर घोषित किए गए हैं?

संभवतः क्योंकि डेटा जो इंगित करता है वह इस तरह से बदल सकता है कि संकलक को जरूरी नहीं पता होगा। volatile कीवर्ड संकलक लागू करने वाले अनुकूलन को रोकने के लिए है, जो मानते हैं कि डेटा उन तरीकों से नहीं बदलता है जिनके बारे में पता नहीं है।

+0

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

+0

क्या डाउनवॉटर कुछ उपयोगी प्रतिक्रिया साझा करना चाहते हैं? –

7

मुझे उम्मीद नहीं है कि डीएमए सूचक स्थान बदलता है।

स्थान नहीं, लेकिन शायद सामग्री। और वह वास्तव में क्या इसके बारे में है ...

0

डीएमए "अस्थिर" का उपयोग करने का एकमात्र कारण नहीं है। यह मल्टीथ्रेड और साझा मेमोरी अनुप्रयोगों के लिए भी उपयोगी है, जहां एक और थ्रेड इस कोड द्वारा संदर्भित स्मृति को बदल सकता है। मुझे यकीन है कि PostgreSql बहु थ्रेडेड है, इसलिए यह एक संभावित कारण है कि यहां अस्थिरता का उपयोग क्यों किया जा रहा है।

+0

थ्रेड मुद्दों के लिए अस्थिरता का उपयोग करना इसके लिए पूछ रहा है। आपको उस मामले में सिंक के लिए एक धागा आदिम का उपयोग करना चाहिए। –

+0

सिर्फ इसलिए कि आपने रेस स्थितियों से बचने के लिए एक म्यूटेक्स का उपयोग किया है, इसका मतलब यह नहीं है कि आपका कंपाइलर साझा चरों तक पहुंच को अनुकूलित करने का प्रयास नहीं करेगा। इसका अर्थ है कि सिंक पुरातन फ़ंक्शन कॉल कर रहे हैं, और संकलक एक समारोह कॉल के आसपास गैर स्थानीय चर में परिवर्तन के बारे में कोई अनुमान नहीं कर सकते। तो सामान्य में, आप सही हैं। –

+0

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

1

डेटाबेस कार्यान्वयन फ़ाइलों को एक्सेस करते समय ओएस बफर & कैश पर भरोसा नहीं करता है। वे अपने कैश सिस्टम को लागू करना पसंद करते हैं और भौतिक डिस्क पर फ़ाइल के लिए विश्वसनीयता तक पहुंच के लिए सीधे पहुंच प्राप्त करते हैं: डेटा को भौतिक डिस्क पर फ़्लश करना होगा। (वे भौतिक डिस्क तक सीधी पहुंच करने के लिए O_DIRECT विकल्प का उपयोग करते हैं।)

3 कार्यों आप हमें दिखा रहे हैं मुझे डिस्क से आने वाले डेटा की अतुल्यकालिक से निपटने के बारे में सोच सकते हैं। (StartBufferIO(), TerminatedBufferIO() और इतने पर)। ईमानदारी से मैं क्या अपने उद्देश्य है, लेकिन मैं क्या डेटाबेस कार्यान्वयन के बारे में उन फ़ंक्शन नाम जानते हैं, और के आधार पर के बारे में सुनिश्चित नहीं हूँ, मैं कहूँगा कि बफर सामग्री डिस्क पर फ़ाइल से डेटा के साथ "डिस्क" अपने आप में संशोधित किया जा सकता है (या जो भी डिवाइस), और इसलिए के रूप में अस्थिर flaged की जरूरत है।

यह परिकल्पना आपकी सामान्य व्याख्या में अस्थिर कीवर्ड का उपयोग आमतौर पर डिवाइस डिवाइस के लिए किया जाता है।

0

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

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