ধ্রুবক সময় অপারেশন সহ চালাক মেমরি পরিচালনা?


18

আসুন একটি মেমরি বিভাগ (যার আকার বাড়তে বা সঙ্কুচিত করতে পারে কোনও ফাইলের মতো, যখন প্রয়োজন হয়) বিবেচনা করা যাক যার উপর আপনি দুটি আকারের মেমরি বরাদ্দকরণ ক্রিয়াকলাপ স্থির আকারের ব্লকগুলি জড়িত করতে পারেন:

  • একটি ব্লকের বরাদ্দ
  • পূর্বে বরাদ্দকৃত ব্লক মুক্ত করা যা আর ব্যবহার করা হয় না।

এছাড়াও, প্রয়োজন হিসাবে, মেমরি পরিচালনা ব্যবস্থা বর্তমানে বরাদ্দকৃত ব্লকগুলি ঘুরে দেখার অনুমতি নেই: তাদের সূচি / ঠিকানা অবশ্যই অপরিবর্তিত থাকতে হবে।

সর্বাধিক নিখুঁত মেমরি ম্যানেজমেন্ট অ্যালগরিদম একটি গ্লোবাল কাউন্টারকে বাড়িয়ে তুলবে (প্রাথমিক মান 0 সহ) এবং পরবর্তী বরাদ্দের জন্য ঠিকানা হিসাবে তার নতুন মানটি ব্যবহার করবে। তবে এটি কেবলমাত্র কয়েকটি বরাদ্দকৃত অবরুদ্ধ ব্লক থাকলেই সেগমেন্টটি সংক্ষিপ্ত করতে দেয় না।

আরও ভাল পদ্ধতির: কাউন্টারটি রাখুন, তবে অবনতিযুক্ত ব্লকগুলির একটি তালিকা বজায় রাখুন (যা ধ্রুব সময়ে করা যায়) এবং যতক্ষণ না এটি খালি না থাকে ততক্ষণ এটিকে নতুন বরাদ্দের উত্স হিসাবে ব্যবহার করুন।

এরপর কী? ধ্রুবক সময় বরাদ্দ এবং ক্ষয়ক্ষতি বাধা থাকা সত্ত্বেও কি এমন কিছু চালাক কাজ করা যায় যা মেমরি বিভাগটিকে যতটা সম্ভব সংক্ষিপ্ত রাখে?

(একটি লক্ষ্য হ'ল সামান্যতম ঠিকানা সহ বর্তমানে অ-বরাদ্দকৃত ব্লকটি ট্র্যাক করা হতে পারে তবে ধ্রুবক সময়ে এটি সম্ভবত সম্ভব হবে বলে মনে হয় না ...)


পূর্বে করা কিছু বরাদ্দ / বাতিলকরণের কারণে তালিকাটি বাড়ানো বা সঙ্কুচিত হওয়ার কারণে কোনও তালিকা চেক করা কি ধ্রুবক সময়ের জন্য হবে না?
সিম

@ সিম, আমি ধরে নিলাম এটি একটি লিঙ্কযুক্ত তালিকা এবং এটির সাথে অপারেশনগুলি , কারণ আপনি সর্বদা কেবল মাথা দিয়ে কাজ করেন। হে(এন)
এসভিচ

আমি মনে করি আপনার "আরও ভাল পদ্ধতির" ইতিমধ্যে মেমরির সর্বোত্তম পরিমাণ ব্যবহার করবে, অর্থাত্ যদি কোনও ফ্রি ব্লক থাকে তবে এটি কখনই অতিরিক্ত মেমরির বরাদ্দ করবে না। কীভাবে আপনি "চালাক" পদ্ধতির উন্নতি করতে পারবেন তা কল্পনা করেন? আপনি কি বোঝাতে চাইছেন যে এটির শুরুতে খুব কাছাকাছি বরাদ্দ করা উচিত যাতে আরও ভাল সম্ভাবনা থাকে যে আপনি বিলোপের পরে বিভাগটি সঙ্কুচিত করতে পারেন?
সোভিক

@ সিম: দুঃখিত, সম্ভবত আমার স্ট্যাক শব্দটি ব্যবহার করা উচিত ছিল (তবে আমি ভেবেছিলাম এটি বিভ্রান্তিকর হতে পারে), 'ডিএলোকট' ধাক্কা দেয় এবং 'বরাদ্দ' পপ হয়, বা ক্ষেত্রে এটি ব্যর্থ হয় তবে কাউন্টার বৃদ্ধির পিছনে ফিরে যায়। উভয়ই ধ্রুবক সময়।
স্টাফেন গিমেনেজ

আপনার কি বাস্তব সময়ের সীমাবদ্ধতা রয়েছে, না আপনি নিয়মিত ধীরে ধীরে সময় নিয়ে ভাল আছেন? উত্তরগুলি বেশ আলাদা হতে পারে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

উত্তর:


11

স্থির আকারের ব্লক সহ, আপনি যা বর্ণনা করেছেন তা একটি নিখরচায় তালিকা । নিম্নলিখিত মোচড় সহ এটি একটি খুব সাধারণ কৌশল: ফ্রি ব্লকগুলির তালিকা ফ্রি ব্লকগুলিতে নিজেরাই সংরক্ষণ করা হয়। সি কোডে, এটি দেখতে এটির মতো হবে:

static void *alloc_ptr = START_OF_BIG_SEGMENT;
static void *free_list_head = NULL;

static void *
allocate(void)
{
    void *x;

    if (free_list_head == NULL) {
        x = alloc_ptr;
        alloc_ptr = (char *)alloc_ptr + SIZE_OF_BLOCK;
    } else {
        x = free_list_head;
        free_list_head = *(void **)free_list_head;
    }
    return x;
}

static void
release(void *x)
{
    *(void **)x = free_list_head;
    free_list_head = x;
}

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

কমেএকটি মুক্তির পরে বরাদ্দ পয়েন্টারটি আরও জটিল হতে পারে, যেহেতু বিনামূল্যে ব্লকগুলি কেবলমাত্র নিখরচায় অনুসরণ করেই নির্ভরযোগ্যতার সাথে চিহ্নিত করা যায়, যা অবিশ্বাস্য ক্রমে তাদের মধ্য দিয়ে যায়। যদি সম্ভব হয় যখন বড় বিভাগের আকার হ্রাস করা আপনার পক্ষে গুরুত্বপূর্ণ, আপনি আরও ওভারহেড সহ একটি বিকল্প কৌশল ব্যবহার করতে চাইতে পারেন: যে কোনও দুটি বরাদ্দকৃত ব্লকের মধ্যে আপনি একটি "গর্ত" রেখেছেন। গর্তগুলি একটি দ্বিগুণ-লিঙ্কযুক্ত তালিকার সাথে মেমরি ক্রমে একত্রিত হয়। আপনার কোনও গর্তের জন্য একটি ডেটা ফর্ম্যাট প্রয়োজন যেমন আপনি গর্তের শুরু ঠিকানাটি কোথায় তা শেষ করে তা জানতে পেরে এবং গর্তের আকারটি যদি আপনি জানেন যে মেমরিতে গর্তটি কোথায় শুরু হয়। তারপরে, আপনি যখন কোনও ব্লক প্রকাশ করেন, আপনি একটি গর্ত তৈরি করেন যা আপনি পরবর্তী এবং পূর্ববর্তী গর্তগুলির সাথে একত্রিত হয়ে পুনরায় তৈরি করে (এখনও ধ্রুবক সময়ে) সমস্ত গর্তের আদেশযুক্ত তালিকা। ওভারহেড তখন বরাদ্দকৃত ব্লক প্রতি প্রায় দুটি পয়েন্টার আকারের শব্দ হয়; তবে, সেই দামে, আপনি একটি "চূড়ান্ত গর্ত" এর উপস্থিতিটি বিশ্বস্তভাবে সনাক্ত করতে পারেন, অর্থাত্ বড় অংশের আকার হ্রাস করার একটি উপলক্ষ।

সম্ভাব্য বিভিন্ন প্রকরণ রয়েছে। একটি ভাল প্রারম্ভিক কাগজ ডায়নামিক স্টোরেজ বরাদ্দ: উইলসন এট দ্বারা একটি জরিপ এবং সমালোচনা পর্যালোচনা


4
ধ্রুবক সময়ে আপনি কোনও deallocation সাইটের নিকটতম গর্তগুলি কীভাবে খুঁজে পাবেন?
রাফেল

1
দ্বিতীয় যে পদ্ধতিতে আমি বর্ণনা করছি তাতে শূন্যের জন্য শূন্যস্থান, এক বা একাধিক ডেটা ব্লক সহ একটি গর্ত একটি শিরোনাম (পয়েন্টারগুলির একটি জুড়ি, গর্তের তালিকার জন্য)। যে কোনও দুটি বরাদ্দকৃত ব্লকের মধ্যে সর্বদা একটি গর্ত থাকে, এমনকি যদি এটি কেবল একটি গর্ত শিরোনাম সমন্বিত একটি মাইক্রোহোল হয়। সুতরাং নিকটস্থ গর্তগুলি সনাক্ত করা সহজ: এগুলি স্লটের ঠিক আগে এবং ডানদিকে। অবশ্যই, মাইক্রো হোলগুলি নিখরচায় (বরাদ্দের জন্য যোগ্য গর্তের তালিকা) এর অংশ হিসাবে তৈরি করা হয় না। এটি দেখার আরেকটি উপায় হ'ল আপনি প্রতিটি ব্লক এবং প্রতিটি (নন-মাইক্রো) গর্তের জন্য একটি শিরোনাম যুক্ত করুন (16 বিট এমএস-ডসের অধীনে বরাদ্দ সেভাবে কাজ করেছিল)।
টমাস পর্নিন

4

এই উত্তরটি জেনেরিক মেমরি পরিচালনা কৌশল সম্পর্কে। আমি মিস করেছি যে প্রশ্নটি যেখানে সমস্ত ব্লকের একই আকারের (এবং প্রান্তিককরণ করা হয়) সেই ক্ষেত্রে সম্পর্কে জিজ্ঞাসা করে।


আপনার জানা উচিত এমন প্রাথমিক কৌশলগুলি হ'ল প্রথম ফিট, পরের-ফিট, সেরা-ফিট এবং বন্ধু সিস্টেম । আমি যে পাঠ্যক্রমটি শিখিয়েছিলাম তার জন্য আমি একবার সংক্ষিপ্তসার লিখেছিলাম , আমি আশা করি এটি পাঠযোগ্য। আমি সেখানে মোটামুটি পরিস্কার সমীক্ষার দিকে ইঙ্গিত করি ।

অনুশীলনে আপনি এই প্রাথমিক কৌশলগুলির বিভিন্ন পরিবর্তন দেখতে পাবেন। তবে এগুলির কোনওটিই আসলে ধ্রুবক সময় নয়! সীমাবদ্ধ পরিমাণ মেমরি ব্যবহার করার সময়, আমি সবচেয়ে খারাপ ক্ষেত্রে এটি সম্ভব বলে মনে করি না।


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

ঠিক। দুঃখিত, আমি আপনার প্রশ্নটি খুব দ্রুত পাঠ করেছি।
rgrig

O(lgn)
rgrig

s / ক্ষুদ্রতম ফ্রি ব্লক / নিখরচায় ছোট্ট ঠিকানায় ব্লক /
rgrig

2

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


2
এবং ডায়নামিক অ্যারে মেমরি বরাদ্দ করতে ঠিক কীভাবে সহায়তা করবে?
এসভিচ

আপনি (ডি) একই ধরণের অ্যালগরিদম ব্যবহার করে সামঞ্জস্যপূর্ণ কোষগুলির অংশগুলি বরাদ্দ করবেন? আপনার পুরো ফাইলটি বড় এবং বড় অংশগুলির একটি লিঙ্কযুক্ত তালিকা হবে।
গ্যালাইস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.