কম্পিউটার টিউটোরিয়াল

রুবির গার্বেজ কালেকশনে গভীরতর বাড়ুন: MRI ইমপ্লিমেন্টেশন ব্যাখ্যা

পূর্বের রুবি ম্যাজিক পর্বে আমরা গার্বেজ কালেকশন (GC) কেন দরকার এবং এটি সাধারণত কীভাবে কাজ করে তা আলোচনা করেছিলাম। এই পোস্টে আমরা রুবিতে এটি কীভাবে ইমপ্লিমেন্ট করা হয়েছে সেটি কিছুটা গভীরে জানব।

বিভিন্ন রুবি ইমপ্লিমেন্টেশন

রুবির বেশ কিছু ইমপ্লিমেন্টেশন আছে। তিনটি জনপ্রিয়টি হলো: MRI (Matz's Ruby Interpreter), Rubinius এবং JRuby। বিভিন্ন রুবি ইমপ্লিমেন্টেশন GC-এর বিভিন্ন পদ্ধতি ব্যবহার করে। এই আর্টিকেলে আমরা MRI-র ওপর ফোকাস করব, যা অধিকাংশ রুবি ডেভেলপার ব্যবহার করে।

রুবির হিপ (Heap)

একটি কম্পিউটারের দুটি ধরনের মেমরি থাকে: স্ট্যাক (Stack) এবং হিপ (Heap)। স্ট্যাক খুব দ্রুত এবং একটি ফাংশন কলের কনটেক্সটের লোকাল। এর মানে স্ট্যাকে ডিক্লেয়ার করা প্রতিটি ভেরিয়েবল ফাংশন শেষ होतेই সাথে সাথে মুক্ত হয়। স্ট্যাকের আকার খুব সীমিত, তাই বড় অবজেক্ট (যেমন ছবি বা ফাইলের ডেটা) সেখানে সংরক্ষণ করা সম্ভব নয়।

রুবি অবজেক্ট সংরক্ষণের জন্য এটি খুব খারাপ ফিট। এই অবজেক্টগুলো প্রায়শই একটি মেথড কলের চেয়ে বেশি সময় টিকে থাকে। অপরipes, কোন অবজেক্ট স্ট্যাকের জন্য খুব বড় হবে কিনা তা প্রায় অসম্ভব অনুমান করা।

তাই রুবি অন্য মেমরি টাইপ ব্যবহার করে: হিপ। হিপে একটি প্রোগ্রাম কিছু মেমরি দাবি করতে পারে এবং সেটি শেষ হলে ক্লিন-আপের দায়িত্ব তার ওপর থাকে। রুবি একটি একক স্ল্যাব মেমরি দাবি করে রুবি অবজেক্ট সংরক্ষণের জন্য। এটিকে রুবির হিপ বলা হয়।

স্ট্যাক ও হিপ সারসংক্ষেপ
স্ট্যাক মেমরিখুব দ্রুত
ব্যবহৃত মেমরি ফাংশন কল শেষ হলে স্বয়ংক্রিয়ভাবে মুক্ত হয়
খুব সীমিত আকার
হিপ মেমরিস্ট্যাক চেয়ে কিছুটা ধীর
কোনো স্বয়ংক্রিয় ক্লিন-আপ নেই
আকার শুধু কম্পিউটারের উপলব্ধ মেমরি দ্বারা সীমাবদ্ধ

সুতরাং রুবি অবজেক্টগুলো সবসময় রুবির হিপে alokেট হয়। যদি সেগুলো ৪০ বাইটের চেয়ে ছোট হয় তবে তাদের কন্টেন্ট সরাসরি অবজেক্টে এম্বেড করা যাবে। অন্যথায় অবজেক্টটি রুবির হিপের আলাদা একটি মেমরি সেগমেন্টে পয়েন্ট করে। তাই আপনার রুবি অবজেক্ট মেমরির দুটি সম্পূর্ণ ভিন্ন লোকেশনে সংরক্ষিত হয়ে থাকে। একবার রুবির হিপ ফুল হলে এটি একটি নতুন হিপ তৈরি করে, যা নতুন অবজেক্টের জন্য ব্যবহার হয়।

марк অ্যান্ড স্যাপ (Mark and Sweep)

MRI মার্ক অ্যান্ড স্যাপ নামক একটি GC অ্যালগরিদম ব্যবহার করে। এটি প্রথমে একটি মার্ক ফেজ করে। মার্ক ফেজে গার্বেজ কালেক্টর বর্তমানে বিদ্যমান সকল অবজেক্ট স্ক্যান করে এবং যেসব অবজেক্টকে সেটি মনে করে ক্লিন-আপ করা যাবে সেগুলোর ওপর একটি মার্কড ফ্ল্যাগ সেট করে।

মার্ক ফেজ আপনার কোড এক্সিকিউশন বন্ধ করে দেয়। কারণ গার্বেজ কালেক্টরকে বিদ্যমান সকল অবজেক্টের পারস্পরিক সম্পর্ক বুঝতে হয়। যদি প্রোগ্রাম مارك প্রসেস চলাকালীন চলত থাকত তবে rzeczগুলো পরিবর্তন হতে পারে এবং গার্বেজ কালেক্টর অবজেক্টের বর্তমান অবস্থা নিশ্চিত করতে পারত না।

দ্বিতীয়ভাবে স্যাপ ফেজ শুরু হয়। এটি রুবি ১.৯ এবং তার উপরের ভার্সনে ব্যাকগ্রাউন্ডে চলে। গার্বেজ কালেক্টর মার্ক ফেজে মার্ক করা অবজেক্টগুলো শান্তভাবে মুক্ত করে। মেমরি স্যাপ hoàn হলে tekrar উপলব্ধ হয়।

যেহেতু মার্ক ফেজ কোড এক্সিকিউশন বন্ধ করে দেয়, প্রোডাকশনে সমস্যা সেটি থেকেই হতে পারে। স্যাপ ফেজ তুলনামূলকভাবে নিরাপদ।

মার্ক অ্যান্ড স্যাপ সারসংক্ষেপ
মার্ক ফেজবিদ্যমান অবজেক্ট স্ক্যান করে
অবজেক্ট ক্লিন-আপ যোগ্য হলে মার্ক ফ্ল্যাগ সেট করে
কোড এক্সিকিউশন বন্ধ করে দেয়
স্যাপ ফেজব্যাকগ্রাউন্ডে চলে
মার্ক করা অবজেক্ট ক্লিন-আপ করে
স্যাপ সম্পূর্ণ হলে মেমরি পুনঃউপলব্ধ হয়

মেজর এবং মাইনর GC রান

রুবি ২.১+ এ গার্বেজ কালেক্টর মেজর এবং মাইনর রান করে। এটি ট্র্যাক রাখে কোন অবজেক্টগুলো নতুন। যদি একটি অবজেক্ট কয়েকটি GC রান টিকি দিয়ে থাকতে পারে তবে সেটিকে পুরানো (old) হিসেবে মার্ক করা হয়। পুরানো অবজেক্টগুলো মাইনর রানগুলিতে উপেক্ষা করা হয়। এতে মাইনর রানগুলো অনেক কম ইন্ট্রুসিভ হয় কারণ গার্বেজ কালেক্টরকে শুধু νεয়া alokেট করা অবজেক্টগুলো স্ক্যান করতে হয়।

এটি উপকারী কারণ প্রায়শই আপনার মেমরির একটি অংশ কখনো ক্লিন-আপ করা উচিত নয়। যখন আপনি রেইলস বুট করেন, এটি পুরো রেইলস ফ্রেমওয়ার্ক মেমরিতে লোড করে। সেটি প্রোগ্রামের পুরো লাইফটাইম থাকবে, তাই প্রতিবার এই অবজেক্টগুলো চেক করা রিসোর্সের অপচয়।

মেজর এবং মাইনর রান
মেজর রানকম বেশি ঘটে
চালাতে বেশি ইন্টেনসিভ
মাইনর রানপুরানো অবজেক্ট উপেক্ষা করে
বেশি ঘন ঘন ঘটে
চালাতে কম ইন্ট্রুসিভ

আরও গভীরে যেতে চাইলে

আমরা আমান গুপ্তার ব্লগ থেকে অনেক কিছু শিখেছি। আপনি যদি এই বিষয়ে আরও গভীরে যেতে চান তবে সেটি চেক আউট করুন।

পরবর্তী: প্র্যাক্টিক্যাল গার্বেজ কালেকশন টিউনিং

অনেক মেট্রিক্স আছে যেগুলো পরিমাপ করা যায় এবং কনফিগারেশন পরিবর্তন করা যায় যাতে গার্বেজ কালেক্টর কীভাবে অপারেট করে সেটি টিউন করা যায়। এই GC সিরিজের পরের পর্বে আমরা এই মেট্রিক্স এবং কনফিগারেশন প্যারামিটারগুলো আলোচনা করব।


  1. রুবিতে নিউরাল নেটওয়ার্ক ডিমিস্টিফাই: শুরুকারীদের গাইড

  2. রুবি ইন্টারপ্রেটার তৈরি: পার্ট ২ – একটি কাস্টম প্রোগ্রামিং ভাষা তৈরি

  3. গুগল TCMalloc দিয়ে রুবির মেমরি অ্যালোকেশন প্রোফাইলিং

  4. রুবি ইন্টারনালস উন্মোচন: অবজেক্ট মেমরি লেআউট বোঝা