में परमाणु संचालन कार्यान्वयन को पढ़ें और लिखें हाल ही में मैंने एक परमाणु पढ़ने और लिखने के लिनक्स कर्नेल कार्यान्वयन में देखा है और कुछ प्रश्न उठ गए हैं।लिनक्स कर्नेल
पहले ia64 वास्तुकला से प्रासंगिक कोड:
typedef struct {
int counter;
} atomic_t;
#define atomic_read(v) (*(volatile int *)&(v)->counter)
#define atomic64_read(v) (*(volatile long *)&(v)->counter)
#define atomic_set(v,i) (((v)->counter) = (i))
#define atomic64_set(v,i) (((v)->counter) = (i))
दोनों पढ़ने और लिखने के संचालन के लिए, ऐसा लगता है कि प्रत्यक्ष दृष्टिकोण से पढ़ने के लिए या चर करने के लिए लिखने के लिए ले जाया गया। जब तक कोई और चाल नहीं है, मुझे समझ में नहीं आता कि गारंटी क्या है कि यह ऑपरेशन असेंबली डोमेन में परमाणु होगा। मुझे लगता है कि एक स्पष्ट उत्तर यह होगा कि ऐसा ऑपरेशन एक असेंबली ओपोड में अनुवाद करता है, लेकिन फिर भी, विभिन्न स्मृति कैश स्तर (या अन्य अनुकूलन) को ध्यान में रखते समय यह गारंटी कैसे दी जाती है?
पढ़ने मैक्रोज़ पर, अस्थिर प्रकार कास्टिंग कास्टिंग में उपयोग किया जाता है। किसी के पास एक सुराग है कि यह परमाणुता को कैसे प्रभावित करता है? (ध्यान दें कि इसका उपयोग लेखन ऑपरेशन में नहीं किया जाता है)
आधुनिक कर्नेल में, 'अस्थिर' का उपयोग 'READ_ONCE() '/' WRITE_ONCE' नामक मैक्रो के माध्यम से किया जाता है। मेरे सिर में व्याख्या यह है कि संकलक तकनीकी रूप से मूल्य * एकाधिक * बार पढ़ने/लिखने की अनुमति देते हैं। जैसे यदि कोड स्थानीय चर के लिए एक पढ़ा गया मान प्रतिलिपि बनाता है, जिसका उपयोग विभिन्न स्थानों पर किया जाता है। इसलिए हमें इसे स्थानीय रूप से कैश करने के लिए मूल्य को रोकने से थोड़ा अधिक वर्णन करना होगा। पूरा विवरण: https://lwn.net/Articles/508991/ – sourcejedi