শুরুতে মেমরির বিশাল অংশ বরাদ্দকরণ এবং মুক্ত করা কি "স্মৃতিশক্তি পরিষ্কার করে"?


18

বই খেলা কোডিং সম্পূর্ণ, ফোর্থ এডিসন , অধ্যায় 5 ( খেলা সূচনা এবং শাট-ডাউন ), সেকশন চেক করা হচ্ছে স্মৃতি এই আকর্ষণীয় কোড নমুনা রয়েছে:

bool CheckMemory(const DWORDLONG physicalRAMNeeded, const DWORDLONG virtualRAMNeeded)
{
    MEMORYSTATUSEX status; 
    GlobalMemoryStatusEx(&status);
    if (status.ullTotalPhys < physicalRAMNeeded) 
    {
        // you don’t have enough physical memory. Tell the player to go get a 
        // real computer and give this one to his mother. 
        GCC_ERROR("CheckMemory Failure: Not enough physical memory."); 
        return false;
    }
    // Check for enough free memory.
    if (status.ullAvailVirtual < virtualRAMNeeded) 
    {
        // you don’t have enough virtual memory available.
        // Tell the player to shut down the copy of Visual Studio running in the 
        // background, or whatever seems to be sucking the memory dry. 
        GCC_ERROR("CheckMemory Failure: Not enough virtual memory.");
        return false;
    }

    char *buff = GCC_NEW char[virtualRAMNeeded]; 
    if (buff)
    {
        delete[] buff;
    }
    else
    {
        // even though there is enough memory, it isn't available in one
        // block, which can be critical for games that manage their own memory 
        GCC_ERROR("CheckMemory Failure: Not enough contiguous memory."); 
        return false;
    }
}

এটি কিছু প্রশ্ন উত্থাপন করে।

প্রথম অংশটি কেবল ওএস (উইন্ডোজ) কে জিজ্ঞাসা করে যে কতটা শারীরিক র‌্যাম পাওয়া যায়। কৌতূহলী অংশটি দ্বিতীয়টি, যা একটি বিশাল পরিমাণ স্মৃতি বরাদ্দ করে এবং এখুনি তা মুক্ত করে দেয়:

char *buff = GCC_NEW char[virtualRAMNeeded]; 
if (buff)
{
    delete[] buff;
}

লেখক ব্যাখ্যা করতে চলেছেন:

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

তবে তাতে আমার রিজার্ভেশন রয়েছে।

"মেমরি ম্যানেজারে জমে থাকা আবর্জনা পরিষ্কার করা?" সত্যি? যদি খেলাটি এখনই শুরু হয়েছে, কোনও আবর্জনা থাকা উচিত নয়?

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

এছাড়াও, এটি কি ওএসকে সমস্ত মেমোরি করতে বাধ্য করে না এবং ফলস্বরূপ অদলবদল ডিস্কের জায়গাতে প্রচুর মেমরি সরিয়ে দেয়, আপনার অ্যাপ্লিকেশনটির প্রারম্ভকে অনেকটা ধীর করে দেয়?

এটি কি আসলেই একটি ভাল অনুশীলন?


3
বেশিরভাগ আধুনিক ওএসগুলি কিছুই করতে পারে না যখন কোনও অ্যাপ্লিকেশন মেমরির একটি বৃহত অঞ্চল বরাদ্দ করে, তারা আশাবাদী বরাদ্দ ব্যবহার করে এবং আপনি মেমরিটি পূরণ না করা পর্যন্ত আসলে কিছুই করেন না, আমি সম্ভাব্যভাবে ধীর গতিতে অপরিহার্য হয়ে ওঠার চেয়ে আরও কিছু করা কল্পনা করতে পারি না
মান

কাঠের জঙ্গলে দীর্ঘ রেখাচিত্রমালা পরিষ্কার করা, একটি রেডিও, হেডফোনস ইত্যাদি খোদাই করা বিমানের অবতরণ এবং সরবরাহ সরবরাহের ফলে তৈরি হয়?
ড্যান নীলি

10
খেলা সম্পূর্ণ কোডিং রয়েছে অনেক না বোঝার-সি ++ এবং C-যে-রূপ-একটি-বিট-C- এর মতো ++, (এছাড়াও, এই নমুনা প্রদর্শিত ফল পরীক্ষণ অনেক সঙ্গে যুক্ত করা আজেবাজে কথা operator newজন্য nullptr), যদি তুমি আমাকে অনুমতি দেয় বলতে. সেই বইটি দিয়ে আপনি সবচেয়ে ভাল জিনিসটি করতে পারেন তা হ'ল আপনার চিমনি হালকা। অবশ্যই মেমরির একটি বৃহত ব্লক বরাদ্দকরণ এবং মুক্ত করা স্মৃতিটিকে "ক্লিন আপ" করে না
দামন

@ ড্যামন, আমি যাচাই করিনি, তবে আমার সন্দেহ হয় যে তারা newনিক্ষেপের পরিবর্তে নাল ফিরে পেতে বিশ্বব্যাপী অপারেটরকে কমপক্ষে ওভারলোড করেছে bad_alloc। যদি তারা তা না করে তবে হ্যাঁ, এই কোডটি আরও
বোকামিযুক্ত

1
@ গ্ল্যাম্পার্ট: এমনকি এটি ধরে নিলে operator deleteতা গ্রহণ করা nullptrএবং এটিকে কোনও বিকল্প হিসাবে বিবেচনা করা প্রয়োজন । যে কোনও বিশ্বব্যাপী ওভারলোড এটি করে না তা নষ্ট হয়ে গেছে। যার অর্থ এটি কোনওভাবেই অযৌক্তিক। যেমন ধরে নেওয়া যেমন মেমরির একটি বিশাল ব্লক বরাদ্দ করা এবং এটি প্রকাশ করা "জাদুকরভাবে" ভাল কিছু করবে। সর্বোপরি, এটি কোনও ক্ষতি করবে না (সম্ভবত, যেহেতু পৃষ্ঠাগুলি এমনকি স্পর্শও করা হয়নি ... অন্যথায় এটি আপনার কার্যকারী সেট থেকে কিছু পৃষ্ঠা সরিয়ে নিতে পারে যা আপনাকে পরে পুনরায় লোড করতে হবে)।
দামন

উত্তর:


12

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

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

এটি বলেছে যে, এ জাতীয় স্ব্যাপ-টু-ডিস্ক জোর করা ঠিক 100% নির্ভরযোগ্য নয়:

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

    সুতরাং, আপনি যদি এই কোডটি "মেমরি ক্লিন আপ" করতে চান, তবে আপনাকে সম্ভবত এটি ছাড়ার আগে memset()অ্যারের প্রতিটি অংশে (বা কমপক্ষে physicalRAMNeededএটির প্রথম বাইটে) ডেটা লেখার জন্য একটি কল বা সমতুল্য যুক্ত করা উচিত ।

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

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

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

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


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

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

26

আমি জানি না যে লেখাটি কতটা পুরানো, তবে আমি বলতে পারি এটি বেশ পুরানো। আধুনিক উইন্ডোজ (এক্সপি এবং আরও নতুন, তবে বিশেষত -৪-বিট সংস্করণে), আমি বলব যে এরকম কিছু করা আপনার গেমের শুরুতে নেতিবাচক প্রভাব ফেলবে।

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

আসলে, শারীরিক স্মৃতিতে স্মৃতিটি সামঞ্জস্যপূর্ণ কিনা তা আপনার নিয়ন্ত্রণের কিছু নয় something ওএস শারীরিক ব্লকগুলি যেমন উপযুক্ত দেখায় কীভাবে বরাদ্দ করা যায় তা চয়ন করবে এবং আপনি অ্যাপ্লিকেশন স্তরে যা কিছু করবেন না তার সাথে সুসংগত শারীরিক স্মৃতিশক্তি থাকার সুবিধাগুলিতে (যদি থাকে) কোনও প্রভাব ফেলতে পারে।

আপনি যদি খুব দীর্ঘ সময়ের জন্য বিভিন্ন আকারের মেমরি বরাদ্দ এবং নিরস্ত করতে থাকেন তবে ভার্চুয়াল মেমরি খণ্ড সম্পর্কে আপনার যত্ন নেওয়া দরকার। এটি অবশ্যই একটি 64-বিট ঠিকানার জায়গার সাথে খুব কম প্রাসঙ্গিক। গেমগুলি সাধারণত কয়েক মাস ধরে চলে না, সুতরাং আমরা সম্ভবত চলমান গেম সার্ভারগুলির বিষয়ে কথা না বললে আপনার সম্ভবত এগুলির যত্ন নেওয়া উচিত নয়।

এমনকি যদি আপনি 32-বিট মেশিনে বুনো বিভিন্ন মাপের প্রচুর মেমরি বরাদ্দ করেন তবেও আধুনিক মেমরির বরাদ্দগুলি বেশ ভাল, তাই আপনি যদি সক্রিয়ভাবে সন্ধান না করেন তবে ভার্চুয়াল মেমরি খণ্ডিত সমস্যাগুলি পাওয়া সম্ভব না

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

আমি মনে করি এটি "এটি সত্যিকার অর্থে বুঝতে না পারার কারণেই এটি কাজ করেছিল, তাই এটি ব্যাখ্যা করার জন্য আমি কিছু তৈরি করেছি" এর একটি কেস।


10
র‌্যাম কোনও ঘোরানো হার্ড ডিস্কের মতো নয় যেখানে সংঘবদ্ধ ব্লকগুলি কোনও উপায়ে না হলেও "ভাল"। এটি সত্য নয়। সংক্ষিপ্ত র‌্যাম অ্যাক্সেস এলোমেলো অ্যাক্সেসের চেয়ে দ্রুততর মানের একটি ক্রম। র‌্যাম চিপগুলি এমন বিভাগগুলিতে বিভক্ত হয়ে গেছে যার জন্য স্যুইচ করার জন্য একটি নির্দিষ্ট পরিমাণ বিলম্ব রয়েছে এবং আরও বড় কথা, আপনার স্মৃতি বিচ্ছুরিত হওয়ার পরে এল 1 এবং এল 2 ক্যাশে মিসগুলি আপনার কর্মক্ষমতাটিকে মারাত্মকভাবে প্রভাবিত করবে।
ক্যাপ্টেন কোডম্যান

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

@ ক্যাপ্টেনকোডম্যান প্রকৃতপক্ষে সংক্ষিপ্ত ভার্চুয়াল ব্লকটি সামঞ্জস্যপূর্ণ মড 2 ^ এন-র ব্লকে থাকতে হবে ক্যাশে লাইন বরাদ্দের কারণে এটি গতি বাড়িয়ে দেবে
র‌্যাচেট ফ্রিক

8
@ ক্যাপ্টেন কোডম্যান হ্যাঁ, ক্রমযুক্ত ডিআরএএম এক্সেস দ্রুত, তবে আমরা 4 ভার্জুয়াল-> শারীরিক ম্যাপিংয়ের কথা বলছি যা 4 কেবি (বা আরও) এর পৃষ্ঠায় ঘটে যা ম্যাপিংটি ক্রমযুক্ত বা না হওয়া স্মৃতিতে খুব বেশি প্রভাব ফেলবে না গতি পড়ুন। প্লাস, ক্যাশে প্রিফেচিং এবং এর মতো স্টাফগুলি শারীরিক নয়, ভার্চুয়াল ঠিকানার জায়গায় চালিত হয়।
নাথান রিড

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