अलग-अलग प्रोसेस के बीच मेमोरी का बंटवारा

Android प्लैटफ़ॉर्म इस आधार पर काम करता है कि खाली मेमोरी का इस्तेमाल नहीं किया जाना चाहिए. यह हर समय, उपलब्ध सभी मेमोरी का इस्तेमाल करने की कोशिश करता है. उदाहरण के लिए, सिस्टम ऐप्लिकेशन को बंद करने के बाद भी उन्हें मेमोरी में सेव रखता है, ताकि उपयोगकर्ता तुरंत उन पर वापस स्विच कर सके. इस वजह से, Android डिवाइसों में अक्सर बहुत कम स्टोरेज बचता है. मेमोरी मैनेजमेंट, सिस्टम की अहम प्रोसेस और कई उपयोगकर्ता ऐप्लिकेशन के बीच मेमोरी को सही तरीके से बांटने के लिए ज़रूरी है.

इस पेज पर, Android के सिस्टम और उपयोगकर्ता के ऐप्लिकेशन के लिए मेमोरी को डिस्ट्रिब्यूट करने के तरीके के बारे में बुनियादी जानकारी दी गई है. इसमें यह भी बताया गया है कि कम मेमोरी होने पर, ऑपरेटिंग सिस्टम कैसे काम करता है.

अलग-अलग तरह की पुरानी तस्वीरें

Android डिवाइसों में तीन तरह की मेमोरी होती है: रैम, zRAM, और स्टोरेज. ध्यान दें कि सीपीयू और जीपीयू, दोनों एक ही रैम का इस्तेमाल करते हैं.

अलग-अलग तरह की पुरानी तस्वीरें

पहली इमेज. मेमोरी के टाइप - रैम, zRAM, और स्टोरेज

  • RAM सबसे तेज़ मेमोरी होती है, लेकिन आम तौर पर इसका साइज़ सीमित होता है. आम तौर पर, बेहतरीन डिवाइसों में सबसे ज़्यादा रैम होती है.

  • zRAM, RAM का एक सेगमेंट है. इसका इस्तेमाल, स्वैप स्पेस के लिए किया जाता है. zRAM में डालने पर, सभी डेटा को संकुचित किया जाता है. इसके बाद, zRAM से कॉपी करने पर, उसे डिकंप्रेस किया जाता है. जब पेजों को zRAM में ले जाया जाता है या उससे बाहर निकाला जाता है, तो रैम का यह हिस्सा बढ़ता या घटता है. डिवाइस बनाने वाली कंपनियां, ज़्यादा से ज़्यादा साइज़ सेट कर सकती हैं.

  • स्टोरेज में, हमेशा से मौजूद डेटा होता है. जैसे, फ़ाइल सिस्टम और सभी ऐप्लिकेशन, लाइब्रेरी, और प्लैटफ़ॉर्म के लिए शामिल ऑब्जेक्ट कोड. स्टोरेज की क्षमता, दूसरी दो तरह की मेमोरी की तुलना में काफ़ी ज़्यादा होती है. Android पर, स्टोरेज का इस्तेमाल, स्कल्प स्पेस के लिए नहीं किया जाता, जैसा कि Linux के अन्य वर्शन में किया जाता है. ऐसा इसलिए, क्योंकि बार-बार डेटा लिखने से इस मेमोरी पर असर पड़ सकता है और स्टोरेज का लाइफ़ कम हो सकता है.

मेमोरी पेज

रैम को पेजों में बांटा गया है. आम तौर पर, हर पेज में 4 केबी मेमोरी होती है.

पेजों को मुफ़्त या इस्तेमाल किया गया माना जाता है. फ़्री पेज, इस्तेमाल न हुई रैम होती है. इस्तेमाल किए गए पेज, वह रैम होती है जिसका सिस्टम फ़िलहाल इस्तेमाल कर रहा है. इन्हें इन कैटगरी में बांटा जाता है:

  • कैश मेमोरी: स्टोरेज में मौजूद किसी फ़ाइल का बैक अप लिया गया मेमोरी (उदाहरण के लिए, कोड या मेमोरी-मैप की गई फ़ाइलें). कैश मेमोरी दो तरह की होती है:
    • निजी: किसी एक प्रोसेस का मालिकाना हक होता है और उसे शेयर नहीं किया जाता
      • साफ़ करें: स्टोरेज में मौजूद किसी फ़ाइल की ऐसी कॉपी जिसे बदला नहीं गया है. स्टोरेज खाली करने के लिए, kswapd का इस्तेमाल करके इसे मिटाया जा सकता है
      • बदली गई: स्टोरेज में मौजूद फ़ाइल की बदली गई कॉपी; kswapd की मदद से, zRAM में ले जाया जा सकता है या उसमें संकुचित किया जा सकता है, ताकि खाली मेमोरी बढ़ाई जा सके
    • शेयर किया गया: कई प्रोसेस इसका इस्तेमाल करती हैं
      • क्लीन: स्टोरेज में मौजूद फ़ाइल की ऐसी कॉपी जिसमें कोई बदलाव नहीं किया गया है. kswapd का इस्तेमाल करके, इसे मिटाया जा सकता है, ताकि स्टोरेज में जगह खाली की जा सके
      • बदली गई: स्टोरेज में मौजूद फ़ाइल की बदली गई कॉपी. इससे, kswapd का इस्तेमाल करके या msync() या munmap() का साफ़ तौर पर इस्तेमाल करके, स्टोरेज में मौजूद फ़ाइल में बदलावों को फिर से लिखा जा सकता है, ताकि खाली मेमोरी बढ़ाई जा सके
  • पहचान छिपाकर: स्टोरेज में मौजूद किसी फ़ाइल का बैकअप, मेमोरी में नहीं लिया गया है. उदाहरण के लिए, MAP_ANONYMOUS फ़्लैग सेट करके mmap() से ऐलोकेट की गई मेमोरी
    • गंदा: kswapd की मदद से, zRAM में ले जाया जा सकता है/कंप्रेस किया जा सकता है, ताकि खाली मेमोरी बढ़ाई जा सके

सिस्टम, रैम को लगातार मैनेज करता रहता है. इसलिए, समय के साथ खाली और इस्तेमाल किए जा रहे पेजों का अनुपात अलग-अलग होता रहता है. इस सेक्शन में बताए गए कॉन्सेप्ट, कम मेमोरी वाली स्थितियों को मैनेज करने के लिए ज़रूरी हैं. इस दस्तावेज़ के अगले सेक्शन में, इनके बारे में ज़्यादा जानकारी दी गई है.

मेमोरी मैनेज करने की सुविधा कम है

कम मेमोरी की समस्याओं से निपटने के लिए, Android में दो मुख्य तरीके हैं: kernel swap daemon और low-memory killer.

kernel swap daemon

kernel swap daemon (kswapd), Linux kernel का हिस्सा है. यह इस्तेमाल की गई मेमोरी को खाली मेमोरी में बदलता है. डिवाइस में खाली मेमोरी कम होने पर, डेमन चालू हो जाता है. Linux kernel, कम और ज़्यादा फ़्री मेमोरी थ्रेशोल्ड को मैनेज करता है. जब खाली मेमोरी, तय सीमा से कम हो जाती है, तो kswapd, मेमोरी फिर से हासिल करना शुरू कर देता है. जब खाली मेमोरी तय सीमा तक पहुंच जाती है, तो kswapd, मेमोरी फिर से हासिल करना बंद कर देता है.

kswapd, मिटाए गए पेजों को वापस पा सकता है, क्योंकि उनका बैकअप स्टोरेज में होता है और उनमें बदलाव नहीं किया गया होता. अगर कोई प्रोसेस मिटाए गए किसी ऐसे पेज को ऐक्सेस करने की कोशिश करती है जिस पर कोई डेटा नहीं है, तो सिस्टम उस पेज को स्टोरेज से रैम में कॉपी कर देता है. इस प्रोसेस को डिमांड पेजिंग कहा जाता है.

स्टोरेज का इस्तेमाल करके बनाया गया क्लीन पेज मिटा दिया गया

दूसरी इमेज. स्टोरेज में सेव किया गया क्लीन पेज मिटाया गया

kswapd, कैश मेमोरी में सेव किए गए निजी और अनाम डेटा वाले पेजों को zRAM में ले जा सकता है. यहां उन्हें कंप्रेस किया जाता है. ऐसा करने से, रैम (फ़्री पेज) में उपलब्ध मेमोरी खाली हो जाती है. अगर कोई प्रोसेस, zRAM में मौजूद किसी ऐसे पेज को ऐक्सेस करने की कोशिश करती है जिसे अपडेट नहीं किया गया है, तो उस पेज को फिर से कंप्रेस किया जाता है और उसे RAM में वापस ले जाया जाता है. अगर किसी संकुचित किए गए पेज से जुड़ी प्रोसेस को बंद कर दिया जाता है, तो पेज को zRAM से मिटा दिया जाता है.

अगर खाली मेमोरी की संख्या किसी थ्रेशोल्ड से कम हो जाती है, तो सिस्टम प्रोसेस को बंद करना शुरू कर देता है.

गलत पेज को zRAM में ले जाया गया और उसे कंप्रेस किया गया

तीसरी इमेज. गलत पेज को zRAM में ले जाया गया और उसे कंप्रेस किया गया

कम मेमोरी वाला किलर

कई बार, kswapd सिस्टम के लिए ज़रूरत के मुताबिक मेमोरी खाली नहीं कर पाता. इस मामले में, सिस्टम किसी ऐप्लिकेशन को यह सूचना देने के लिए onTrimMemory() का इस्तेमाल करता है कि मेमोरी कम हो रही है और उसे अपने ऐलोकेशन कम करने चाहिए. अगर यह मेमोरी ज़रूरत के मुताबिक नहीं है, तो कर्नेल मेमोरी खाली करने के लिए प्रोसेस को बंद करना शुरू कर देता है. ऐसा करने के लिए, यह कम मेमोरी वाला किलर (एलएमके) का इस्तेमाल करता है.

यह तय करने के लिए कि कौनसी प्रोसेस बंद करनी है, LMK "मेमोरी खत्म हो गई" स्कोर का इस्तेमाल करता है. इसे oom_adj_score कहा जाता है. इस स्कोर की मदद से, चल रही प्रोसेस को प्राथमिकता दी जाती है. सबसे ज़्यादा स्कोर वाली प्रोसेस को सबसे पहले बंद किया जाता है. बैकग्राउंड में चल रहे ऐप्लिकेशन को सबसे पहले बंद किया जाता है और सिस्टम प्रोसेस को सबसे आखिर में बंद किया जाता है. यहां दी गई टेबल में, एलएमके स्कोरिंग की कैटगरी को सबसे ज़्यादा से सबसे कम तक की सूची में दिखाया गया है. सबसे ज़्यादा स्कोर वाली कैटगरी के आइटम, पहली पंक्ति में सबसे पहले हटा दिए जाएंगे:

Android प्रोसेस, सबसे ऊपर हाई स्कोर

चौथी इमेज. Android प्रोसेस, जिनमें सबसे ऊपर ज़्यादा स्कोर और सबसे नीचे कम स्कोर हैं

ऊपर दी गई टेबल में मौजूद अलग-अलग कैटगरी के बारे में यहां बताया गया है:

  • बैकग्राउंड ऐप्लिकेशन: ऐसे ऐप्लिकेशन जो पहले चलाए गए थे और फ़िलहाल चालू नहीं हैं. LMK सबसे पहले बैकग्राउंड में चल रहे उन ऐप्लिकेशन को बंद कर देगा जिनका oom_adj_score सबसे ज़्यादा है.

  • पिछला ऐप्लिकेशन: बैकग्राउंड में सबसे हाल ही में इस्तेमाल किया गया ऐप्लिकेशन. पिछले ऐप्लिकेशन को बैकग्राउंड में चल रहे ऐप्लिकेशन के मुकाबले ज़्यादा प्राथमिकता (कम स्कोर) दी जाती है, क्योंकि उपयोगकर्ता किसी बैकग्राउंड ऐप्लिकेशन के मुकाबले उस पर स्विच कर सकता है.

  • Home ऐप्लिकेशन: यह लॉन्चर ऐप्लिकेशन है. इसे बंद करने पर, वॉलपेपर गायब हो जाएगा.

  • सेवाएं: सेवाएं ऐप्लिकेशन से शुरू की जाती हैं. इनमें, क्लाउड पर सिंक करना या अपलोड करना शामिल हो सकता है.

  • उपयोगकर्ता को दिखने वाले ऐप्लिकेशन: ऐसे ऐप्लिकेशन जो फ़ोरग्राउंड में नहीं होते, लेकिन उपयोगकर्ता को किसी तरह से दिखते हैं. जैसे, खोज की प्रोसेस चलाना, जो छोटा यूज़र इंटरफ़ेस (यूआई) दिखाती है या संगीत सुनना.

  • फ़ोरग्राउंड ऐप्लिकेशन: वह ऐप्लिकेशन जिसका फ़िलहाल इस्तेमाल किया जा रहा है. फ़ोरग्राउंड ऐप्लिकेशन को बंद करने पर, ऐसा लगता है कि ऐप्लिकेशन क्रैश हो गया है. इससे उपयोगकर्ता को यह लग सकता है कि डिवाइस में कोई गड़बड़ी हो रही है.

  • हमेशा चालू रहने वाली (सेवाएं): ये डिवाइस की मुख्य सेवाएं होती हैं. जैसे, टेलीफ़ोन और वाई-फ़ाई.

  • सिस्टम: सिस्टम की प्रोसेस. इन प्रोसेस को बंद करने पर, फ़ोन रीबूट हो सकता है.

  • नेटिव: सिस्टम के लिए इस्तेमाल की जाने वाली बहुत कम लेवल की प्रोसेस (उदाहरण के लिए, kswapd).

डिवाइस बनाने वाली कंपनियां, LMK के काम करने के तरीके में बदलाव कर सकती हैं.

मेमोरी फ़ुटप्रिंट का हिसाब लगाना

कर्नेल, सिस्टम में मौजूद सभी मेमोरी पेजों को ट्रैक करता है.

अलग-अलग प्रोसेस के लिए इस्तेमाल किए जाने वाले पेज

पांचवीं इमेज. अलग-अलग प्रोसेस के लिए इस्तेमाल किए जाने वाले पेज

यह तय करते समय कि किसी ऐप्लिकेशन में कितनी मेमोरी का इस्तेमाल किया जा रहा है, सिस्टम को शेयर किए गए पेजों को ध्यान में रखना चाहिए. एक ही सेवा या लाइब्रेरी को ऐक्सेस करने वाले ऐप्लिकेशन, मेमोरी पेज शेयर करेंगे. उदाहरण के लिए, हो सकता है कि Google Play services और कोई गेम ऐप्लिकेशन, जगह की जानकारी की सेवा शेयर कर रहे हों. इससे यह तय करना मुश्किल हो जाता है कि हर ऐप्लिकेशन के मुकाबले, सेवा के लिए कितनी मेमोरी का इस्तेमाल किया जा रहा है.

दो ऐप्लिकेशन के बीच शेयर किए गए पेज

छठी इमेज. दो ऐप्लिकेशन के बीच शेयर किए गए पेज (बीच में)

किसी ऐप्लिकेशन के मेमोरी फ़ुटप्रिंट का पता लगाने के लिए, इनमें से किसी भी मेट्रिक का इस्तेमाल किया जा सकता है:

  • रेज़िडेंट सेट साइज़ (आरएसएस): ऐप्लिकेशन के इस्तेमाल किए गए शेयर किए गए और शेयर नहीं किए गए पेजों की संख्या
  • प्रॉपोर्टनल सेट साइज़ (पीएसएस): ऐप्लिकेशन के इस्तेमाल किए गए ऐसे पेजों की संख्या जो शेयर नहीं किए गए हैं और शेयर किए गए पेजों का बराबर बंटवारा. उदाहरण के लिए, अगर तीन प्रोसेस 3 एमबी शेयर कर रही हैं, तो हर प्रोसेस को पीएसएस में 1 एमबी मिलता है
  • यूनीक सेट साइज़ (यूएसएस): ऐप्लिकेशन के इस्तेमाल किए गए ऐसे पेजों की संख्या जिन्हें शेयर नहीं किया गया है (शेयर किए गए पेजों को शामिल नहीं किया जाता)

ऑपरेटिंग सिस्टम के लिए पीएसएस तब काम का होता है, जब उसे यह जानना हो कि सभी प्रोसेस में कितनी मेमोरी का इस्तेमाल किया जाता है. ऐसा इसलिए, क्योंकि पेजों की गिनती एक से ज़्यादा बार नहीं की जाती. पीएसएस का हिसाब लगाने में काफ़ी समय लगता है, क्योंकि सिस्टम को यह तय करना होता है कि कौनसे पेज शेयर किए गए हैं और कितनी प्रोसेस के ज़रिए. आरएसएस, शेयर किए गए और शेयर नहीं किए गए पेजों के बीच फ़र्क़ नहीं करता. इससे हिसाब लगाने में कम समय लगता है. साथ ही, यह मेमोरी के ऐलोकेशन में हुए बदलावों को ट्रैक करने के लिए बेहतर है.

अन्य संसाधन