ব্যবহারকারী:Smlckz/বর্জ্য সংগ্রহ (কম্পিউটার বিজ্ঞান)

উইকিপিডিয়া, মুক্ত বিশ্বকোষ থেকে

কম্পিউটার বিজ্ঞানে বর্জ্য সংগ্রহ (ইংরেজি: Garbage Collection) একধরনের স্বয়ংক্রিয় স্মৃতি ব্যবস্থাপনা পদ্ধতি৷ বর্জ্য সংগ্রাহক একটি প্রোগ্রামকে বরাদ্দ করা স্মৃতির এমন অংশ যা ওই প্রোগ্রামটির আর দরকার নেই, তা পুনরুদ্ধার করার চেষ্টা করে৷ মার্কিন কম্পিউটার বিজ্ঞানী জন ম্যাকার্থি ১৯৫৯ সালে লিস্পের জন্য হাতে করে (manual) স্মৃতি ব্যবস্থাপনার বিকল্প হিসেবে এটির উদ্ভাবন করেন৷

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

স্মৃতি ছাড়া অন্যান্য সংস্থান, যেমন নেটওয়ার্ক সকেট, ডেটাবেস হাতল (handle), ব্যবহারকারীর সাথে মিথস্ক্রিয়ার জন্য উইন্ডো, ফাইল বা যন্ত্র বর্ণনাকারক (descriptor) ইত্যাদি সাধারণত বর্জ্য সংগ্রাহক তদারক করেনা। এই ধরনের সংস্থান সামলানোর প্রণালীগুলি, বিশেষত বিনাশকারকের (destructor), মাধ্যমে স্মৃতিরও ব্যবস্থাপনা করা যায়, তখন কিন্তু আর বর্জ্য সংগ্রহের কোনো দরকার নেই! আবার কিছু বর্জ্য সংগ্রাহক ব্যবস্থা এই রকম সংস্থানকে স্মৃতির একটা অংশের সাথে সংযুক্ত করে রাখতে পারে যাতে সেটি সংগ্রহ করার সময়ে সংস্থানটিকে খালাস করা যায়৷

মূলনীতি[সম্পাদনা]

এই বর্জ্য সংগ্রহের মূল নীতি হলো স্মৃতিতে থাকা এমন সব জিনিস খুঁজে বার করা যা ওই প্রোগ্রামটার দরকার নেই (সেই জিনিসগুলি প্রোগ্রামটি ব্যবহারও করতে পারবে না) এবং সেই জিনিসগুলির দখল করে রাখা স্মৃতির অংশগুলি পুনরুদ্ধার করা (যাতে স্মৃতির ওই অংশগুলিতে পরে অন্য জিনিস রাখা যায়)৷

অনেক প্রোগ্রামিং ভাষাতে বর্জ্য সংগ্রহ অনিবার্য হয়ে পড়ে: কখোনো ভাষাটির প্রমিত বিবরণীতে (specification) বলাই থাকে (যেমন জাভা, সি শার্প, ডি, গো, এবং অধিকাংশ স্ক্রিপ্টিং ভাষা), আবার কখোনো ভাষাটির কার্যকর বাস্তব রূপায়ণের জন্য আবশ্যক (যেমন ল্যামডা ক্যালকুলাস এর মতো নিয়মনিষ্ঠ ভাষা)। এ রকম ভাষাগুলিকে বর্জ্য সংগৃহীত ভাষা বলা হয়ে থাকে৷ অন্যান্য কিছু ভাষা যেমন সি বা সি++ যেগুলি বানানো হয়েছে হাতে করে স্মৃতি সামলানোর জন্য, সেগুলির জন্যেও বর্জ্য সংগ্রাহকের বেশ কিছু বাস্তবায়ন উপলব্ধ আছে৷ আবার অ্যাডা বা মডুলা-৩ এর মতো কিছু ভাষাও আছে যেখানে হাতে করে স্মৃতি ব্যবস্থাপনা ও বর্জ্য সংগ্রহ উভয়ই ব্যবহার করা যায় যেখানে উভয়ের জন্য আলাদা আলাদা ঢিপি (heap) এর বন্দোবস্ত আছে৷ আবার D এর মতো ভাষা আছে যাতে বেশি গতির জন্য বর্জ্য সংগ্রহ সাময়িকভাবে বন্ধ রাখা যায়৷

যদিও প্রোগ্রামিং ভাষাটির সংকলকে (compiler) এবং প্রোগ্রাম চলাকালীন পরিবেশে (runtime environment) বর্জ্য সংগ্রাহক উপলব্ধ থাকলে অনেক ধরনের বর্জ্য সংগ্রহ প্রনালী ব্যবহারের সুযোগ যাকে, স্বয়ংক্রিয় উল্লেখ গণনার মতো সংকলনোত্তর (post-hoc) বর্জ্য সংগ্রহের ব্যবস্থা রয়েছে৷ বর্জ্য সংগ্রাহকটি প্রায় সবক্ষেত্রেই স্মৃতি বরাদ্দকারীর সঙ্গে ওতপ্রোতভাবে জড়িয়ে থাকে৷

সুবিধা[সম্পাদনা]

স্বয়ংক্রিয় বর্জ্য সংগ্রহ প্রোগ্রামার বা বিধিকার এর হাতে করে স্মৃতি বরাদ্দ ও ফিরত দেওয়ার ঝঞ্জাট থেকে মুক্ত করে৷ এর ফলে বিশেষ কিছু ধরনের ত্রুটি নিবারণ বা হ্রাস পায়:

  • অপরিদৃশ্য নির্দেশক (dangling pointer) হল এমন কিছু নির্দেশক যা স্মৃতির এমন অংশকে নির্দেশ করে যা ফিরত দেওয়া হয়ে গেছে৷ এখন যদি অন্য কাজে সেই স্মৃতির অংশটি বরাদ্দ হয়ে যায় আর পুরোনো নির্দেশকের মাধ্যমে অধিগমন হয় তার ফলে প্রোগ্রামের অনিশ্চিতভাবে চলতে পারে৷
  • স্মৃতির একই অংশ একাধিকবার ফিরত দেওয়ার ত্রুটি হলে ওই স্থানে প্রথমবার ফিরত দেওয়ার পর অন্য কিছু বরাদ্দ হলে তা ফিরত চলে যায় যার ফলে অপরিদৃশ্য নির্দেশকের উদ্ভব হতে পারে৷
  • বিবিধ স্মৃতি অপচয় হয় যখন স্মৃতি ফিরত দিতে প্রোগ্রামার ভুলে যায় ফলে স্মৃতির সেই অংশটি বরাদ্দ থেকে যায়, যা থেকে অবশেষে বরাদ্দযোগ্য স্মৃতি ফুরিয়ে যেতে পারে৷

অসুবিধা[সম্পাদনা]