2008-12-29 9 views
20

मैं एक साझा स्मृति आवेदन के साथ काम कर रहा हूँ, और सेगमेंट मैं निम्न आदेश का उपयोग को नष्ट करने में ipcrm साथ साझा स्मृति इसे हटाने से:लिनक्स

ipcrm -M 0x0000162e (this is the key) 

लेकिन मैं अगर मैं सही चीजें कर रहा हूँ पता नहीं है , क्योंकि जब मैं ipcs चलाता हूं तो मुझे एक ही सेगमेंट दिखाई देता है लेकिन कुंजी 0x0000000 के साथ। तो क्या स्मृति खंड वास्तव में हटा दिया गया है? जब मैं अपने आवेदन में कई बार चलाने मैं कुंजी 0x000000 के साथ विभिन्न स्मृति खंडों देखते हैं, इस तरह:

key  shmid  owner  perms  bytes  nattch  status 
0x00000000 65538  me   666  27   2   dest 
0x00000000 98307  me   666  5   2   dest 
0x00000000 131076  me   666  5   1   dest 
0x00000000 163845  me   666  5   0 

वास्तव में क्या हो रहा है? क्या स्मृति खंड वास्तव में हटा दिया गया है?

संपादित करें: समस्या थी - जैसा कि स्वीकृत उत्तर में नीचे बताया गया था - साझा प्रक्रिया का उपयोग करके दो प्रक्रियाएं थीं, जब तक कि सभी प्रक्रिया बंद नहीं हो जाती थी, स्मृति खंड गायब होने वाला नहीं है।

उत्तर

21

मैं अपने यूनिक्स (एईक्स और एचपीयूएक्स, मैं स्वीकार करता हूं कि मैंने कभी भी लिनक्स में साझा स्मृति का उपयोग नहीं किया है) से याद रखें कि दिन हटाना ब्लॉक को केवल नए क्लाइंट द्वारा अनुलग्ननीय नहीं दिखाता है।

कुछ बिंदुओं पर इसे संलग्न करने के बाद ही इसे किसी बिंदु पर शारीरिक रूप से हटा दिया जाएगा।

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

आप अपने ipcs आउटपुट से देख सकते हैं कि 4 में से 3 अभी भी संलग्न प्रक्रियाएं हैं, इसलिए वे तब तक कहीं नहीं जायेंगे जब तक कि उन प्रक्रियाओं को साझा मेमोरी ब्लॉक से अलग नहीं किया जाता। दूसरा शायद इसे साफ़ करने के लिए कुछ 'स्वीप' फ़ंक्शन की प्रतीक्षा कर रहा है लेकिन यह निश्चित रूप से साझा स्मृति कार्यान्वयन पर निर्भर करेगा।

साझा स्मृति (या उस मामले के लिए लॉग फाइल) का एक अच्छी तरह से लिखित क्लाइंट समय-समय पर फिर से संलग्न (या रोल ओवर) होना चाहिए ताकि यह सुनिश्चित किया जा सके कि यह स्थिति क्षणिक है और सॉफ्टवेयर के संचालन को प्रभावित नहीं करती है।

12

आपने कहा कि आप ipcrm

-M shmkey 
     Mark the shared memory segment associated with key shmkey for 
     removal. This marked segment will be destroyed after the 
     last detach. 

तो -M विकल्पों में से व्यवहार के लिए आदमी पृष्ठ से निम्न आदेश

ipcrm -M 0x0000162e (this is the key)

इस्तेमाल किया करता है वास्तव में आपने जो देखा, यानी सीईजी सेट करें आखिरी अलगाव के बाद ही नष्ट हो जाएगा।