Region-based memory management
কম্পিউটার বিজ্ঞানে, অঞ্চল-ভিত্তিক মেমরি ম্যানেজমেন্ট হল এক ধরনের মেমরি ম্যানেজমেন্ট যেখানে প্রতিটি বরাদ্দকৃত বস্তু একটি অঞ্চলে বরাদ্দ করা হয়। একটি অঞ্চল, যাকে একটি অঞ্চল, ক্ষেত্র, অঞ্চল বা স্মৃতি প্রসঙ্গও বলা হয়, বরাদ্দকৃত বস্তুর একটি সংগ্রহ যা একবারে দক্ষতার সাথে পুনরায় বরাদ্দ বা বিচ্ছিন্ন করা যেতে পারে। স্ট্যাক বরাদ্দের মতো, অঞ্চলগুলি কম ওভারহেড সহ মেমরির বরাদ্দ এবং বিচ্ছিন্নকরণকে সহজতর করে; তবে এগুলি আরও নমনীয়, যা বস্তুগুলিকে বরাদ্দ করা স্ট্যাক ফ্রেমের চেয়ে বেশি দিন বাঁচতে দেয়। সাধারণ বাস্তবায়নে, একটি অঞ্চলের সমস্ত বস্তু মেমরি ঠিকানাগুলির একক সংলগ্ন পরিসরে বরাদ্দ করা হয়, একইভাবে স্ট্যাক ফ্রেমগুলি সাধারণত কিভাবে বরাদ্দ করা হয়। উদাহরণস্বরূপ, নিম্নলিখিত সি কোডটি বিবেচনা করুন যা একটি সংযুক্ত তালিকা তথ্য কাঠামো বরাদ্দ করে এবং তারপর বাতিল করে দেয়ঃ অঞ্চল * r = অঞ্চল তৈরি করুন (); লিস্টনোড * হেড = এনইউএলএল; (int i = 1; i <= 1000; i + +) {লিস্টনোড * নিউনোড = অঞ্চল থেকে বরাদ্দ করুন (r, সাইজোফ (লিস্টনোড)); নিউনোড-> পরবর্তী = হেড; হেড = নিউনোড;}///(এখানে তালিকা ব্যবহার করুন)//। অঞ্চল ধ্বংস করুন (r); যদিও সংযুক্ত তালিকাটি তৈরি করতে অনেক ক্রিয়াকলাপের প্রয়োজন হয়, তবে এটি একটি একক ক্রিয়াকলাপে অঞ্চলটি ধ্বংস করে দ্রুত বাতিল করা যেতে পারে। তালিকাটি অতিক্রম করার কোনও প্রয়োজন নেই। বাস্তবায়ন সহজ সুস্পষ্ট অঞ্চলগুলি বাস্তবায়িত করা সোজা; নিম্নলিখিত বর্ণনাটি হ্যানসনের কাজের উপর ভিত্তি করে। প্রতিটি অঞ্চল স্মৃতির বড় ব্লকের একটি সংযুক্ত তালিকা হিসাবে প্রয়োগ করা হয়; প্রতিটি ব্লক অনেক বরাদ্দ পরিবেশন করার জন্য যথেষ্ট বড় হওয়া উচিত। বর্তমান ব্লকটি ব্লকের পরবর্তী মুক্ত অবস্থানে একটি পয়েন্টার বজায় রাখে এবং যদি ব্লকটি পূরণ করা হয় তবে একটি নতুন বরাদ্দ করা হয় এবং তালিকায় যুক্ত করা হয়। যখন অঞ্চলটি বিচ্ছিন্ন করা হয়, তখন পরবর্তী-মুক্ত-অবস্থান পয়েন্টারটি প্রথম ব্লকের শুরুতে পুনরায় সেট করা হয় এবং ব্লকের তালিকাটি পরবর্তী বরাদ্দকৃত অঞ্চলের জন্য পুনরায় ব্যবহার করা যেতে পারে। বিকল্পভাবে, যখন কোনও অঞ্চল বাতিল করা হয়, তখন তার ব্লকের তালিকা একটি বিশ্বব্যাপী ফ্রিলিস্টের সাথে যুক্ত করা যেতে পারে যা থেকে অন্যান্য অঞ্চলগুলি পরে নতুন ব্লক বরাদ্দ করতে পারে। এই সহজ পরিকল্পনার উভয় ক্ষেত্রেই, অঞ্চলগুলিতে পৃথক পৃথক বস্তু বিচ্ছিন্ন করা সম্ভব নয়। এই প্রকল্পের বরাদ্দকৃত বাইটে সামগ্রিক খরচ খুব কম; প্রায় সমস্ত বরাদ্দের মধ্যে কেবল একটি তুলনা এবং পরবর্তী-মুক্ত-অবস্থান পয়েন্টারের একটি আপডেট জড়িত। একটি অঞ্চল বরাদ্দকরণ একটি ধ্রুবক-সময় অপারেশন, এবং খুব কমই করা হয়। সাধারণ আবর্জনা সংগ্রহ ব্যবস্থার বিপরীতে, তথ্যকে তার প্রকারের সাথে ট্যাগ করার প্রয়োজন নেই। ইতিহাস এবং ধারণাগুলি অঞ্চলগুলির মৌলিক ধারণাটি খুব পুরানো, 1967 সালের গোড়ার দিকে ডগলাস টি. রসের এইডি ফ্রি স্টোরেজ প্যাকেজে প্রথম আবির্ভূত হয়েছিল, যেখানে স্মৃতিকে অঞ্চলগুলির শ্রেণিবিন্যাসে বিভক্ত করা হয়েছিল; প্রতিটি অঞ্চলের নিজস্ব বরাদ্দকারী ছিল এবং একটি অঞ্চলকে একবারে মুক্ত করা যেতে পারে, যা অঞ্চলগুলিকে অঞ্চল হিসাবে ব্যবহারযোগ্য করে তোলে। 1976 সালে, পি. এল/আই মানটি এ. আর. ই. এ তথ্য প্রকারকে অন্তর্ভুক্ত করে। 1990 সালে, হ্যানসন দেখিয়েছিলেন যে সি-তে সুস্পষ্ট অঞ্চলগুলি (যাকে তিনি অ্যারেনা বলে অভিহিত করেছিলেন) বরাদ্দকৃত প্রতি বাইটে সময়ের কার্যকারিতা অর্জন করতে পারে এমনকি দ্রুততম-পরিচিত হিপ বরাদ্দ ব্যবস্থার চেয়েও উচ্চতর। স্পষ্ট অঞ্চলগুলি কিছু প্রাথমিক সি-ভিত্তিক সফ্টওয়্যার প্রকল্পের নকশায় সহায়ক ছিল, যার মধ্যে রয়েছে অ্যাপাচি এইচটিটিপি সার্ভার, যা তাদের পুল বলে এবং পোস্টগ্রেএসকিউএল ডাটাবেস ম্যানেজমেন্ট সিস্টেম, যা তাদের মেমরি প্রসঙ্গ বলে। ঐতিহ্যবাহী হিপ বরাদ্দের মতো, এই স্কিমগুলি মেমরি নিরাপত্তা প্রদান করে না; কোনও প্রোগ্রামারের পক্ষে কোনও ঝুলন্ত পয়েন্টারের মাধ্যমে বিচ্ছিন্ন হওয়ার পরে কোনও অঞ্চলে প্রবেশ করা বা কোনও অঞ্চল বিচ্ছিন্ন করতে ভুলে যাওয়া সম্ভব, যার ফলে মেমরি লিক হয়। অঞ্চল অনুমান 1988 সালে, গবেষকরা অঞ্চল অনুমানের ধারণাটি প্রবর্তন করে নিরাপদ স্মৃতি বরাদ্দের জন্য অঞ্চলগুলি কীভাবে ব্যবহার করতে হয় তা তদন্ত শুরু করেন, যেখানে অঞ্চলগুলির সৃষ্টি এবং বিচ্ছিন্নকরণের পাশাপাশি নির্দিষ্ট অঞ্চলে পৃথক স্ট্যাটিক বরাদ্দ অভিব্যক্তিগুলির বরাদ্দ, সংকলক দ্বারা সংকলন-সময়ে সন্নিবেশ করা হয়। সংকলক এটি এমনভাবে করতে সক্ষম যে এটি নিশ্চিত করতে পারে যে ঝুলন্ত পয়েন্টার এবং ফুটো ঘটবে না। রুগিয়েরি এবং মুরতাঘের একটি প্রাথমিক রচনায়, প্রতিটি ফাংশনের শুরুতে একটি অঞ্চল তৈরি করা হয় এবং শেষে বিচ্ছিন্ন করা হয়। তারপরে তারা প্রতিটি স্থির বরাদ্দের অভিব্যক্তিটির জন্য একটি জীবনকাল নির্ধারণ করতে ডেটা প্রবাহ বিশ্লেষণ ব্যবহার করে এবং এটি সর্বকনিষ্ঠ অঞ্চলে বরাদ্দ করে যা তার পুরো জীবনকাল ধারণ করে। 1994 সালে, এই কাজটি টফ্টে এবং তালপিনের একটি মৌলিক কাজে সাধারণীকরণ করা হয়েছিল, যা স্ট্যান্ডার্ড এমএল-এ টাইপ পলিমরফিজম এবং উচ্চতর-অর্ডার ফাংশনগুলিকে সমর্থন করে, একটি কার্যকরী প্রোগ্রামিং ভাষা, টাইপ অনুমান এবং পলিমরফিক অঞ্চলের ধরণের তাত্ত্বিক ধারণার উপর ভিত্তি করে একটি ভিন্ন অ্যালগরিদম ব্যবহার করে এবং অঞ্চল ক্যালকুলাস। তাদের কাজ অঞ্চলগুলি সহ ল্যাম্বডা ক্যালকুলাসের একটি সম্প্রসারণ প্রবর্তন করেছে, দুটি গঠন যোগ করেঃ ρ এ e1: অভিব্যক্তি e1 এর ফলাফল গণনা করুন এবং এটি অঞ্চলে সংরক্ষণ করুন; e2 প্রান্তে অঞ্চল ρ: একটি অঞ্চল তৈরি করুন এবং এটি ρ এর সাথে আবদ্ধ করুন; e2 মূল্যায়ন করুন; তারপর অঞ্চলটি বিচ্ছিন্ন করুন। এই বাক্যবিন্যাস কাঠামোর কারণে, অঞ্চলগুলি নেস্টেড হয়, যার অর্থ হল যে যদি r1-এর পরে r2 তৈরি করা হয়, তবে এটি অবশ্যই r1-এর আগে বিচ্ছিন্ন করা আবশ্যক; ফলাফল হল অঞ্চলগুলির একটি স্ট্যাক। উপরন্তু, অঞ্চলগুলিকে অবশ্যই সেই একই ফাংশনে বিচ্ছিন্ন করতে হবে যেখানে সেগুলি তৈরি করা হয়েছে। এই বিধিনিষেধগুলি আইকেন ও অন্যান্যরা শিথিল করেছিলেন। এই বর্ধিত ল্যাম্বডা ক্যালকুলাসটি মেশিন কোডে স্ট্যান্ডার্ড এমএল প্রোগ্রামগুলি সংকলনের জন্য একটি প্রমাণযোগ্য মেমরি-নিরাপদ মধ্যবর্তী উপস্থাপনা হিসাবে কাজ করার উদ্দেশ্যে করা হয়েছিল, তবে এমন একটি অনুবাদক তৈরি করা যা বড় প্রোগ্রামগুলিতে ভাল ফলাফল তৈরি করবে যা বেশ কয়েকটি ব্যবহারিক সীমাবদ্ধতার মুখোমুখি হয়েছিল যা নতুন বিশ্লেষণের মাধ্যমে সমাধান করতে হয়েছিল, যার মধ্যে পুনরাবৃত্তিমূলক কল, টেল কল এবং কেবলমাত্র একটি মান ধারণকারী অঞ্চলগুলি বাদ দেওয়া সহ। এই কাজটি 1995 সালে সম্পন্ন হয় এবং আবর্জনা সংগ্রহের পরিবর্তে অঞ্চল বরাদ্দের উপর ভিত্তি করে এমএল-এর একটি সংস্করণ এমএল কিটে একীভূত করা হয়। এটি মাঝারি আকারের পরীক্ষা কর্মসূচিতে দুটির মধ্যে সরাসরি তুলনা করার অনুমতি দেয়, যা প্রোগ্রামটি কতটা "অঞ্চল-বান্ধব" ছিল তার উপর নির্ভর করে ব্যাপকভাবে পরিবর্তিত ফলাফল ("10 গুণ দ্রুত এবং চার গুণ ধীর") দেয়; তবে, সংকলনের সময় মিনিটের ক্রমানুসারে ছিল। এম. এল কিটটি শেষ পর্যন্ত দুটি সংযোজন সহ বড় প্রয়োগগুলিতে স্কেল করা হয়েছিলঃ মডিউলগুলির পৃথক সংকলনের জন্য একটি প্রকল্প এবং আবর্জনা সংগ্রহের সন্ধানের সাথে অঞ্চল অনুমানের সংমিশ্রণ একটি হাইব্রিড কৌশল। নতুন ভাষার পরিবেশে সাধারণীকরণ এমএল কিটের বিকাশের পরে, অঞ্চলগুলিকে অন্যান্য ভাষার পরিবেশে সাধারণীকরণ করা শুরু হয়ঃ সি প্রোগ্রামিং ভাষার বিভিন্ন সম্প্রসারণঃ নিরাপদ সি উপভাষা ঘূর্ণিঝড়, যা অন্যান্য অনেক বৈশিষ্ট্যের মধ্যে সুস্পষ্ট অঞ্চলের জন্য সমর্থন যোগ করে এবং তাদের ব্যবহারের জন্য বিদ্যমান সি অ্যাপ্লিকেশনগুলি স্থানান্তর করার প্রভাব মূল্যায়ন করে। আরসি নামে সি-এর একটি এক্সটেনশন প্রয়োগ করা হয়েছিল যা স্পষ্টভাবে পরিচালিত অঞ্চলগুলি ব্যবহার করে, তবে কোনও অঞ্চল অকালে মুক্ত না হয় তা নিশ্চিত করে মেমরি সুরক্ষার নিশ্চয়তা দেওয়ার জন্য অঞ্চলগুলিতে রেফারেন্স গণনাও ব্যবহার করে। অঞ্চলগুলি রেফারেন্স গণনার ওভারহেড হ্রাস করে, কারণ অঞ্চলগুলির অভ্যন্তরীণ রেফারেন্সগুলি সংশোধন করার সময় গণনাগুলি আপডেট করার প্রয়োজন হয় না। আরসি-তে অঞ্চলগুলির জন্য একটি স্পষ্ট স্ট্যাটিক টাইপ সিস্টেম অন্তর্ভুক্ত রয়েছে যা কিছু রেফারেন্স গণনা আপডেটগুলি বাদ দেওয়ার অনুমতি দেয়। কন্ট্রোল-সি নামে পরিচিত সি-এর একটি সীমাবদ্ধতা মেমরি নিরাপত্তা স্থিতিশীলভাবে নিশ্চিত করার জন্য এর নকশার অংশ হিসাবে অঞ্চলগুলি (এবং একবারে শুধুমাত্র একটি অঞ্চল) ব্যবহার করার জন্য প্রোগ্রামগুলিকে সীমাবদ্ধ করে। অঞ্চলগুলি জাভার একটি উপসেটের জন্য প্রয়োগ করা হয়েছিল এবং রিয়েল টাইম জাভাতে মেমরি পরিচালনার একটি গুরুত্বপূর্ণ উপাদান হয়ে ওঠে, যা অবজেক্ট এনক্যাপসুলেশন প্রদর্শন করতে এবং অঞ্চল বিচ্ছিন্নকরণের উপর রানটাইম চেকগুলি নির্মূল করতে মালিকানা প্রকারের সাথে তাদের একত্রিত করে। আরও সম্প্রতি, এমবেডেড রিয়েল-টাইম জাভা অ্যাপ্লিকেশনগুলিতে অঞ্চলগুলি অনুমান করার জন্য একটি আধা-স্বয়ংক্রিয় সিস্টেমের প্রস্তাব দেওয়া হয়েছিল, একটি সংকলন-সময় স্থির বিশ্লেষণ, একটি রানটাইম অঞ্চল বরাদ্দ নীতি এবং প্রোগ্রামার ইঙ্গিতগুলির সংমিশ্রণে। অঞ্চলগুলি রিয়েল-টাইম কম্পিউটিংয়ের জন্য উপযুক্ত কারণ ক্রমবর্ধমান আবর্জনা সংগ্রহের জটিলতা ছাড়াই তাদের ওভারহেড সময় স্থিতিশীলভাবে অনুমানযোগ্য। এগুলি ব্যাকট্র্যাকিং এবং কাটগুলিকে সমর্থন করার জন্য টফ্টে এবং তালপিনের অঞ্চল অনুমান মডেলকে প্রসারিত করে লজিক প্রোগ্রামিং ভাষা প্রোলগ এবং মার্কারির জন্য প্রয়োগ করা হয়েছিল। অঞ্চল-ভিত্তিক সঞ্চয় ব্যবস্থাপনা সমান্তরাল প্রোগ্রামিং ভাষা প্যারাসেল জুড়ে ব্যবহৃত হয়। প্যারাসেলে স্পষ্ট নির্দেশকের অভাবের কারণে, রেফারেন্স গণনার প্রয়োজন নেই। অসুবিধাগুলি অঞ্চলগুলি ব্যবহারকারী ব্যবস্থাগুলি এমন সমস্যাগুলির সম্মুখীন হতে পারে যেখানে অঞ্চলগুলি বিচ্ছিন্ন হওয়ার আগে খুব বড় হয়ে যায় এবং মৃত তথ্যের একটি বড় অনুপাত থাকে; এগুলিকে সাধারণত "লিক" বলা হয় (যদিও তারা শেষ পর্যন্ত মুক্ত হয়)। সাধারণত নতুন, স্বল্প-জীবনকালের অঞ্চলগুলি প্রবর্তনের মাধ্যমে ফাঁকগুলি নির্মূল করার সাথে প্রোগ্রামটির পুনর্গঠন জড়িত থাকতে পারে। অঞ্চল অনুমান ব্যবহার করে সিস্টেমে এই ধরনের সমস্যা ডিবাগ করা বিশেষভাবে কঠিন, যেখানে প্রোগ্রামারকে অবশ্যই অন্তর্নিহিত অনুমান অ্যালগরিদম বুঝতে হবে, বা সমস্যা নির্ণয়ের জন্য শব্দগত মধ্যবর্তী উপস্থাপনা পরীক্ষা করতে হবে। আবর্জনা সংগ্রহকারীদের সন্ধান করা প্রোগ্রাম পরিবর্তন ছাড়াই সময়মতো এই ধরনের ডেটা বরাদ্দ করার ক্ষেত্রে আরও কার্যকর; এটি হাইব্রিড অঞ্চল/জিসি সিস্টেমের জন্য একটি যৌক্তিকতা ছিল। অন্যদিকে, আবর্জনা সংগ্রহকারীদের সন্ধান করা সূক্ষ্ম ফুটোও প্রদর্শন করতে পারে, যদি তথ্যের রেফারেন্সগুলি ধরে রাখা হয় যা আর কখনও ব্যবহার করা হবে না। অঞ্চল-ভিত্তিক স্মৃতি ব্যবস্থাপনা সবচেয়ে ভাল কাজ করে যখন অঞ্চলের সংখ্যা তুলনামূলকভাবে কম হয় এবং প্রতিটিতে অনেকগুলি বস্তু থাকে; যে প্রোগ্রামগুলিতে অনেকগুলি বিরল অঞ্চল থাকে সেগুলি অভ্যন্তরীণ বিভাজন প্রদর্শন করবে, যার ফলে স্মৃতি নষ্ট হবে এবং অঞ্চল পরিচালনার জন্য একটি সময় ওভারহেড হবে। আবার, আঞ্চলিক অনুমানের উপস্থিতিতে এই সমস্যাটি নির্ণয় করা আরও কঠিন হতে পারে। হাইব্রিড পদ্ধতি যেমন উপরে উল্লেখ করা হয়েছে, আরসি অঞ্চল এবং রেফারেন্স গণনার একটি হাইব্রিড ব্যবহার করে, রেফারেন্স গণনার ওভারহেডকে সীমাবদ্ধ করে কারণ অঞ্চলগুলির অভ্যন্তরীণ রেফারেন্সগুলি সংশোধন করার সময় গণনাগুলি আপডেট করার প্রয়োজন হয় না। একইভাবে, কিছু চিহ্ন-অঞ্চল সংকর পদ্ধতি অঞ্চলগুলির সাথে আবর্জনা সংগ্রহের সন্ধানকে একত্রিত করে; এই ফাংশনগুলি স্তূপকে অঞ্চলে বিভক্ত করে, একটি চিহ্ন-সুইপ পাস সম্পাদন করে যেখানে জীবন্ত বস্তুযুক্ত যে কোনও অঞ্চল চিহ্নিত করা হয় এবং তারপরে যে কোনও অচিহ্নিত অঞ্চল মুক্ত করে। এগুলির কার্যকর থাকার জন্য ক্রমাগত ডিফ্র্যাগমেন্টেশন প্রয়োজন। তথ্যসূত্র স্মৃতি ব্যবস্থাপনা