প্রসেসের মধ্যে মেমরি বরাদ্দ

অ্যান্ড্রয়েড প্ল্যাটফর্ম এই ধারণার উপর ভিত্তি করে চলে যে, খালি মেমরি মানেই অপচয় হওয়া মেমরি। এটি সব সময় উপলব্ধ সমস্ত মেমরি ব্যবহার করার চেষ্টা করে। উদাহরণস্বরূপ, সিস্টেম অ্যাপগুলোকে বন্ধ করার পরেও মেমরিতে রেখে দেয়, যাতে ব্যবহারকারী দ্রুত সেগুলোতে ফিরে যেতে পারে। এই কারণে, অ্যান্ড্রয়েড ডিভাইসগুলো প্রায়শই খুব কম খালি মেমরি নিয়ে চলে। গুরুত্বপূর্ণ সিস্টেম প্রসেস এবং অনেক ইউজার অ্যাপ্লিকেশনের মধ্যে সঠিকভাবে মেমরি বণ্টন করার জন্য মেমরি ম্যানেজমেন্ট অত্যন্ত জরুরি।

এই পৃষ্ঠায় অ্যান্ড্রয়েড কীভাবে সিস্টেম এবং ব্যবহারকারী অ্যাপ্লিকেশনগুলির জন্য মেমরি বরাদ্দ করে তার প্রাথমিক বিষয়গুলি আলোচনা করা হয়েছে। এছাড়াও, মেমরি কম থাকলে অপারেটিং সিস্টেম কীভাবে প্রতিক্রিয়া দেখায় তাও ব্যাখ্যা করা হয়েছে।

স্মৃতির প্রকারভেদ

অ্যান্ড্রয়েড ডিভাইসগুলিতে তিন ধরনের মেমরি থাকে: র‍্যাম (RAM), জেডর‍্যাম (zRAM) এবং স্টোরেজ। উল্লেখ্য যে, সিপিইউ (CPU) এবং জিপিইউ (GPU) উভয়ই একই র‍্যাম ব্যবহার করে।

স্মৃতির প্রকারভেদ

চিত্র ১. মেমরির প্রকারভেদ - র‍্যাম, জেডর‍্যাম, এবং স্টোরেজ

  • র‍্যাম হলো সবচেয়ে দ্রুতগতির মেমরি, কিন্তু এর আকার সাধারণত সীমিত থাকে। উচ্চমানের ডিভাইসগুলোতে সাধারণত সবচেয়ে বেশি র‍্যাম থাকে।

  • zRAM হলো র‍্যামের একটি অংশ যা সোয়াপ স্পেসের জন্য ব্যবহৃত হয়। zRAM-এ রাখার সময় সবকিছু সংকুচিত করা হয় এবং zRAM থেকে কপি করার সময় তা আবার অসংকুচিত করা হয়। zRAM-এ পেজ আনা বা বের করার সাথে সাথে র‍্যামের এই অংশের আকার বাড়ে বা কমে। ডিভাইস নির্মাতারা এর সর্বোচ্চ আকার নির্ধারণ করতে পারেন।

  • স্টোরেজে সমস্ত স্থায়ী ডেটা থাকে, যেমন ফাইল সিস্টেম এবং সমস্ত অ্যাপ, লাইব্রেরি ও প্ল্যাটফর্মের অন্তর্ভুক্ত অবজেক্ট কোড। অন্য দুই ধরনের মেমরির তুলনায় স্টোরেজের ধারণক্ষমতা অনেক বেশি। অ্যান্ড্রয়েডে, অন্যান্য লিনাক্স সিস্টেমের মতো স্টোরেজকে সোয়াপ স্পেস হিসেবে ব্যবহার করা হয় না, কারণ ঘন ঘন লেখার ফলে এই মেমরির ক্ষয় হতে পারে এবং স্টোরেজ মিডিয়ামের আয়ু কমে যেতে পারে।

স্মৃতি পৃষ্ঠা

র‍্যামকে পেজে বিভক্ত করা হয়। সাধারণত প্রতিটি পেজ ৪ কিলোবাইট মেমরির হয়ে থাকে।

পেজগুলোকে হয় ফ্রি অথবা ব্যবহৃত হিসেবে বিবেচনা করা হয়। ফ্রি পেজ হলো অব্যবহৃত র‍্যাম। ব্যবহৃত পেজ হলো সেই র‍্যাম যা সিস্টেম সক্রিয়ভাবে ব্যবহার করছে, এবং এগুলোকে নিম্নলিখিত বিভাগগুলিতে ভাগ করা হয়:

  • ক্যাশড: স্টোরেজে থাকা কোনো ফাইল দ্বারা সমর্থিত মেমরি (যেমন, কোড বা মেমরি-ম্যাপড ফাইল)। ক্যাশড মেমরি দুই প্রকারের হয়:
    • ব্যক্তিগত: একটি প্রক্রিয়ার মালিকানাধীন এবং ভাগ করা হয় না
      • ক্লিন: স্টোরেজে থাকা কোনো ফাইলের অপরিবর্তিত কপি, যা kswapd ব্যবহার করে মুছে ফেলে ফ্রি মেমোরি বাড়ানো যায়।
      • ডার্টি: স্টোরেজে থাকা ফাইলটির একটি পরিবর্তিত কপি; ফ্রি মেমোরি বাড়ানোর জন্য kswapd এর মাধ্যমে এটিকে zRAM-এ সরানো বা কম্প্রেস করা যেতে পারে।
    • ভাগ করা: একাধিক প্রক্রিয়া দ্বারা ব্যবহৃত
      • ক্লিন: স্টোরেজে থাকা ফাইলটির অপরিবর্তিত কপি, যা kswapd ব্যবহার করে মুছে ফেলে ফ্রি মেমোরি বাড়ানো যায়।
      • ডার্টি: স্টোরেজে থাকা ফাইলটির একটি পরিবর্তিত কপি; kswapd ব্যবহার করে, অথবা স্পষ্টভাবে msync() বা munmap() ব্যবহার করে, স্টোরেজে থাকা ফাইলটিতে পরিবর্তনগুলো পুনরায় লিখে ফ্রি মেমোরি বাড়ানো যায়।
  • অ্যানোনিমাস: স্টোরেজে থাকা কোনো ফাইল দ্বারা সমর্থিত নয় এমন মেমরি (উদাহরণস্বরূপ, MAP_ANONYMOUS ফ্ল্যাগ সেট করে mmap() দ্বারা বরাদ্দকৃত)।
    • ডার্টি: ফ্রি মেমোরি বাড়ানোর জন্য kswapd দ্বারা zRAM-এ সরানো/সংকুচিত করা যেতে পারে।

সিস্টেম সক্রিয়ভাবে র‍্যাম পরিচালনা করার কারণে সময়ের সাথে সাথে খালি এবং ব্যবহৃত পেজের অনুপাত পরিবর্তিত হয়। এই বিভাগে উপস্থাপিত ধারণাগুলো স্বল্প-মেমরি পরিস্থিতি সামাল দেওয়ার জন্য অত্যন্ত গুরুত্বপূর্ণ। এই ডকুমেন্টের পরবর্তী বিভাগে সেগুলো আরও বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে।

নিম্ন মেমরি ব্যবস্থাপনা

অ্যান্ড্রয়েডে মেমোরি স্বল্পতার পরিস্থিতি মোকাবেলার জন্য দুটি প্রধান পদ্ধতি রয়েছে: কার্নেল সোয়াপ ডেমন এবং লো-মেমোরি কিলার।

কার্নেল সোয়াপ ডেমন

কার্নেল সোয়াপ ডেমন ( kswapd ) লিনাক্স কার্নেলের একটি অংশ, এবং এটি ব্যবহৃত মেমরিকে খালি মেমরিতে রূপান্তরিত করে। ডিভাইসে খালি মেমরি কমে গেলে এই ডেমনটি সক্রিয় হয়। লিনাক্স কার্নেল খালি মেমরির জন্য একটি নিম্ন এবং একটি উচ্চ সীমা নির্ধারণ করে রাখে। যখন খালি মেমরি নিম্ন সীমার নিচে নেমে যায়, তখন kswapd মেমরি পুনরুদ্ধার করা শুরু করে। খালি মেমরি উচ্চ সীমায় পৌঁছালে, kswapd মেমরি পুনরুদ্ধার করা বন্ধ করে দেয়।

kswapd ক্লিন পেজগুলোকে ডিলিট করার মাধ্যমে পুনরুদ্ধার করতে পারে, কারণ সেগুলো স্টোরেজে সংরক্ষিত থাকে এবং পরিবর্তিত হয়নি। যদি কোনো প্রসেস ডিলিট হয়ে যাওয়া কোনো ক্লিন পেজকে অ্যাক্সেস করার চেষ্টা করে, তবে সিস্টেম পেজটিকে স্টোরেজ থেকে র‍্যামে কপি করে। এই অপারেশনটি ডিমান্ড পেজিং নামে পরিচিত।

স্টোরেজ দ্বারা সমর্থিত পরিষ্কার পৃষ্ঠা মুছে ফেলা হয়েছে

চিত্র ২. স্টোরেজ দ্বারা সমর্থিত পরিষ্কার পৃষ্ঠা, মুছে ফেলা হয়েছে।

kswapd ক্যাশ করা প্রাইভেট ডার্টি পেজ এবং অ্যানোনিমাস ডার্টি পেজগুলোকে zRAM-এ স্থানান্তর করতে পারে, যেখানে সেগুলোকে কম্প্রেস করা হয়। এর ফলে RAM-এ উপলব্ধ মেমোরি (ফ্রি পেজ) খালি হয়। যদি কোনো প্রসেস zRAM-এ থাকা কোনো ডার্টি পেজ অ্যাক্সেস করার চেষ্টা করে, তবে পেজটিকে আনকম্প্রেস করে আবার RAM-এ ফিরিয়ে আনা হয়। যদি কোনো কম্প্রেসড পেজের সাথে যুক্ত প্রসেসটিকে কিল করা হয়, তবে পেজটি zRAM থেকে ডিলিট হয়ে যায়।

যদি খালি মেমরির পরিমাণ একটি নির্দিষ্ট সীমার নিচে নেমে যায়, তাহলে সিস্টেম প্রসেসগুলো বন্ধ করে দিতে শুরু করে।

ডার্টি পেজ zRAM-এ স্থানান্তরিত এবং সংকুচিত করা হয়েছে।

চিত্র ৩. ত্রুটিপূর্ণ পৃষ্ঠা zRAM-এ স্থানান্তরিত ও সংকুচিত করা হয়েছে।

কম স্মৃতিশক্তির হত্যাকারী

অনেক সময়, kswapd সিস্টেমের জন্য পর্যাপ্ত মেমরি খালি করতে পারে না। এক্ষেত্রে, সিস্টেম onTrimMemory() ব্যবহার করে কোনো অ্যাপকে জানিয়ে দেয় যে মেমরি কমে আসছে এবং তার অ্যালোকেশন কমানো উচিত। যদি এটি যথেষ্ট না হয়, তবে কার্নেল মেমরি খালি করার জন্য প্রসেস কিল করা শুরু করে। এই কাজটি করার জন্য এটি লো-মেমরি কিলার (LMK) ব্যবহার করে।

কোন প্রসেসটি বন্ধ করা হবে তা নির্ধারণ করতে, LMK চলমান প্রসেসগুলোকে অগ্রাধিকার দেওয়ার জন্য oom_adj_score নামক একটি "আউট অফ মেমোরি" স্কোর ব্যবহার করে। উচ্চ স্কোরযুক্ত প্রসেসগুলো প্রথমে বন্ধ করা হয়। ব্যাকগ্রাউন্ড অ্যাপগুলো প্রথমে বন্ধ করা হয় এবং সিস্টেম প্রসেসগুলো সবশেষে বন্ধ করা হয়। নিচের সারণিতে উচ্চ থেকে নিম্ন ক্রমে LMK স্কোরিং বিভাগগুলো তালিকাভুক্ত করা হয়েছে। প্রথম সারিতে থাকা সর্বোচ্চ-স্কোরিং বিভাগের আইটেমগুলো প্রথমে বন্ধ করা হবে:

অ্যান্ড্রয়েড প্রসেস, শীর্ষে উচ্চ স্কোর

চিত্র ৪. অ্যান্ড্রয়েড প্রসেসসমূহ, যেখানে উচ্চ স্কোরগুলো উপরে এবং নিম্ন স্কোরগুলো নিচে রয়েছে।

উপরের সারণিতে থাকা বিভিন্ন ক্যাটাগরিগুলোর বিবরণ নিচে দেওয়া হলো:

  • ব্যাকগ্রাউন্ড অ্যাপস: যে অ্যাপগুলো আগে চালানো হয়েছিল এবং বর্তমানে সক্রিয় নেই। LMK প্রথমে সর্বোচ্চ oom_adj_score থাকা অ্যাপটি থেকে শুরু করে ব্যাকগ্রাউন্ড অ্যাপগুলোকে বন্ধ করবে।

  • পূর্ববর্তী অ্যাপ: সবচেয়ে সম্প্রতি ব্যবহৃত ব্যাকগ্রাউন্ড অ্যাপ। ব্যাকগ্রাউন্ড অ্যাপগুলোর তুলনায় পূর্ববর্তী অ্যাপটির অগ্রাধিকার বেশি (স্কোর কম), কারণ ব্যবহারকারীর ব্যাকগ্রাউন্ড অ্যাপগুলোর কোনো একটিতে না গিয়ে এটিতে সুইচ করার সম্ভাবনা বেশি।

  • হোম অ্যাপ: এটি হলো লঞ্চার অ্যাপ। এটি বন্ধ করলে ওয়ালপেপারটি অদৃশ্য হয়ে যাবে।

  • পরিষেবাসমূহ: পরিষেবাগুলো অ্যাপ্লিকেশন দ্বারা চালু করা হয় এবং এর মধ্যে ক্লাউডে সিঙ্কিং বা আপলোড করা অন্তর্ভুক্ত থাকতে পারে।

  • উপলব্ধিযোগ্য অ্যাপ: নন-ফোরগ্রাউন্ড অ্যাপ যা ব্যবহারকারীর কাছে কোনো না কোনোভাবে উপলব্ধিযোগ্য, যেমন একটি সার্চ প্রক্রিয়া চালানো যা একটি ছোট UI প্রদর্শন করে অথবা গান শোনা।

  • ফোরগ্রাউন্ড অ্যাপ: যে অ্যাপটি বর্তমানে ব্যবহৃত হচ্ছে। ফোরগ্রাউন্ড অ্যাপ বন্ধ করে দিলে তা অ্যাপ্লিকেশন ক্র্যাশের মতো দেখায়, যা ব্যবহারকারীকে ইঙ্গিত দিতে পারে যে ডিভাইসে কোনো সমস্যা হচ্ছে।

  • স্থায়ী (পরিষেবা): এগুলো হলো ডিভাইসের মূল পরিষেবা, যেমন টেলিফোনি এবং ওয়াইফাই।

  • সিস্টেম: সিস্টেম প্রসেসসমূহ। এই প্রসেসগুলো বন্ধ করা হলে, ফোনটি রিবুট হচ্ছে বলে মনে হতে পারে।

  • নেটিভ: সিস্টেম দ্বারা ব্যবহৃত খুব নিম্ন-স্তরের প্রসেস (উদাহরণস্বরূপ, kswapd )।

ডিভাইস নির্মাতারা LMK-এর আচরণ পরিবর্তন করতে পারেন।

মেমরি ফুটপ্রিন্ট গণনা করা হচ্ছে

কার্নেল সিস্টেমের সমস্ত মেমরি পেজের হিসাব রাখে।

বিভিন্ন প্রক্রিয়া দ্বারা ব্যবহৃত পৃষ্ঠাগুলি

চিত্র ৫. বিভিন্ন প্রক্রিয়া দ্বারা ব্যবহৃত পৃষ্ঠাসমূহ

কোনো অ্যাপ কী পরিমাণ মেমরি ব্যবহার করছে তা নির্ধারণ করার সময়, সিস্টেমকে অবশ্যই শেয়ার করা পেজগুলো বিবেচনায় নিতে হয়। যে অ্যাপগুলো একই সার্ভিস বা লাইব্রেরি অ্যাক্সেস করে, তারা মেমরি পেজ শেয়ার করে থাকে। উদাহরণস্বরূপ, গুগল প্লে সার্ভিসেস এবং একটি গেম অ্যাপ একটি লোকেশন সার্ভিস শেয়ার করতে পারে। এর ফলে, সামগ্রিকভাবে সার্ভিসটির এবং প্রতিটি অ্যাপ্লিকেশনের জন্য ঠিক কতটা মেমরি ব্যবহৃত হচ্ছে, তা নির্ধারণ করা কঠিন হয়ে পড়ে।

দুটি অ্যাপ দ্বারা শেয়ার করা পৃষ্ঠাগুলি

চিত্র ৬. দুটি অ্যাপের মধ্যে শেয়ার করা পেজ (মাঝেরটি)

কোনো অ্যাপ্লিকেশনের মেমরি ফুটপ্রিন্ট নির্ধারণ করতে নিম্নলিখিত মেট্রিকগুলোর যেকোনো একটি ব্যবহার করা যেতে পারে:

  • রেসিডেন্ট সেট সাইজ (RSS): অ্যাপটি দ্বারা ব্যবহৃত শেয়ার করা এবং শেয়ার না করা পেজের সংখ্যা।
  • আনুপাতিক সেট সাইজ (PSS): অ্যাপ দ্বারা ব্যবহৃত অ-শেয়ার করা পেজের সংখ্যা এবং শেয়ার করা পেজগুলোর সুষম বন্টন (উদাহরণস্বরূপ, যদি তিনটি প্রসেস ৩ মেগাবাইট শেয়ার করে, তবে প্রতিটি প্রসেস PSS-এ ১ মেগাবাইট পাবে)।
  • ইউনিক সেট সাইজ (ইউএসএস): অ্যাপ দ্বারা ব্যবহৃত নন-শেয়ার করা পেজের সংখ্যা (শেয়ার করা পেজ অন্তর্ভুক্ত নয়)

অপারেটিং সিস্টেম যখন জানতে চায় যে সমস্ত প্রসেস মিলে কী পরিমাণ মেমরি ব্যবহার করছে, তখন PSS কার্যকর, কারণ এক্ষেত্রে পেজগুলো একাধিকবার গণনা করা হয় না। PSS গণনা করতে অনেক সময় লাগে, কারণ সিস্টেমকে নির্ধারণ করতে হয় কোন পেজগুলো শেয়ার করা হয়েছে এবং কতগুলো প্রসেস সেগুলো ব্যবহার করছে। RSS শেয়ার করা এবং শেয়ার না করা পেজগুলোর মধ্যে কোনো পার্থক্য করে না (যার ফলে এটি দ্রুত গণনা করা যায়) এবং মেমরি বরাদ্দের পরিবর্তন ট্র্যাক করার জন্য এটি বেশি উপযোগী।

অতিরিক্ত সম্পদ

{% হুবহু %} {% endverbatim %}
  • দ্রষ্টব্য: জাভাস্ক্রিপ্ট বন্ধ থাকলেও লিঙ্কের লেখা প্রদর্শিত হয়।
  • অ্যাপ চালুর সময়
{% হুবহু %}
{% endverbatim %}