কাস্টম হ্যাপ বরাদ্দকারী


9

বেশিরভাগ প্রোগ্রাম হিপ বরাদ্দ সম্পর্কে যথেষ্ট নৈমিত্তিক হতে পারে এমনকি কার্যকরী প্রোগ্রামিং ভাষাগুলি পুরানোগুলির পরিবর্তনের চেয়ে নতুন বস্তু বরাদ্দ করতে পছন্দ করে এবং আবর্জনা সংগ্রহকারীকে জিনিসপত্র মুক্ত করার বিষয়ে উদ্বিগ্ন হতে দেয়।

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

গেমস প্রোগ্রামিং (অন্তত সেই গেমগুলির সাথে যা হার্ডওয়্যারকে ধাক্কা দেওয়ার বিষয়ে উচ্চাভিলাষী) কখনও কখনও এর মধ্যে পড়ে: আপনি গতিশীল বরাদ্দ ব্যবহার করতে পারেন, তবে পর্যাপ্ত মেমরি এবং নরম রিয়েল-টাইম সীমাবদ্ধতা রয়েছে যা আপনি বরাদ্দকে একটি কালো বাক্স হিসাবে বিবেচনা করতে পারবেন না , একা আবর্জনা সংগ্রহ করতে দেওয়া যাক তাই আপনাকে কাস্টম বরাদ্দকারীদের ব্যবহার করতে হবে। গেমস ইন্ডাস্ট্রিতে সি ++ এখনও ব্যাপকভাবে ব্যবহৃত হয় এর একটি কারণ; এটি আপনাকে http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html এর মতো কাজ করতে দেয়

এই মধ্যবর্তী অঞ্চলে অন্য কোন ডোমেন রয়েছে? গেমগুলি বাদে, কাস্টম বরাদ্দকারীরা খুব বেশি ব্যবহৃত হয়?


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

উত্তর:


4

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

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

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

আমার বর্তমান চাকরিতে, আমি নজরদারি ভিডিও ডিজিটাল রেকর্ডার এবং বিশ্লেষণ প্যাকেজটিতে কাজ করি। 30 fps এ, প্রতিটি চ্যানেল প্রতি 33 মিলিসেকেন্ডে একটি ভিডিও ফ্রেম গ্রহণ করে। আমরা যে হার্ডওয়্যার বিক্রি করি তাতে আমরা সহজেই 100 টি চ্যানেল ভিডিও রেকর্ড করতে পারি। সুতরাং এটি সমালোচনামূলক পথে (নেটওয়ার্ক কল => ক্যাপচার উপাদানগুলি => রেকর্ডার পরিচালন সফ্টওয়্যার => স্টোরেজ উপাদানগুলি => ডিস্ক) কোনও গতিশীল মেমরি বরাদ্দ নেই তা নিশ্চিত করার জন্য এটি আর একটি ক্ষেত্রে। আমাদের কাছে একটি কাস্টম ফ্রেম বরাদ্দকারী রয়েছে, এতে বাফারের স্থির আকারের বালতি রয়েছে এবং পূর্বে বরাদ্দ করা বাফারগুলি পুনরায় ব্যবহার করতে LIFO ব্যবহার করে। আপনার যদি K০০ কেবি স্টোরেজ দরকার হয় তবে আপনার স্থানটি 1024 কেবি বাফারের সাথে শেষ হতে পারে, যা স্থান নষ্ট করে তবে এটি আমাদের ব্যবহারের জন্য বিশেষভাবে তৈরি করা হয়েছে যেখানে প্রতিটি বরাদ্দ খুব অল্প সময়ের জন্য, এটি খুব ভালভাবে কার্যকর হয় কারণ বাফারটি ব্যবহৃত হয়,

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


"আমরা একেবারে প্রয়োজনীয় না হলে ম্যালোক / ফ্রি কল না করা হয়েছে তা নিশ্চিত করার জন্য আমরা অনেক দীর্ঘ সময় পার করেছি ..." - আমি রাউটার তৈরির কিছু হার্ডওয়্যার ছেলেকে জানি। তারা এমনকি মাথা ঘামায় না malloc/free। তারা মেমরির একটি ব্লক সংরক্ষণ করে এবং এটি একটি কার্সার ডেটা স্ট্রাকচার হিসাবে ব্যবহার করে। তাদের কাজ সর্বাধিক হ্রাস সূচক ট্র্যাক রাখা।

4

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

উদাহরণস্বরূপ, এটি বৃহস্পতিবার থেকে অক্ট্রি থেকে দূরে দক্ষ বৃক্ষ নোড বরাদ্দকে বিভক্ত করতে এবং বহিরাগত বরাদ্দকারীকে নির্ভর করতে অনেকগুলি অতিরিক্ত জটিলতা প্রবর্তন করছে। এই দুটি উদ্বেগকে এক সাথে ফিউজ করা এবং একযোগে একযোগে অনেক নোড বরাদ্দ করা অষ্টির দায়িত্ব হিসাবে অগত্যা এসআরপির লঙ্ঘন নয়, কারণ এটি করার কারণে পরিবর্তনের কারণগুলি বৃদ্ধি হয় না। এটি, ব্যবহারিকভাবে বলতে গেলে, এটি হ্রাস করতে পারে।

উদাহরণস্বরূপ, সি ++ এ, কোনও বহিরাগত বরাদ্দকারীকে স্ট্যান্ডার্ড কনটেইনারগুলির উপর নির্ভর করে এমন এক প্রতিক্রিয়াশীল পার্শ্ব প্রতিক্রিয়া যা C ++ সম্প্রদায় দ্বারা লিঙ্কযুক্ত কাঠামো তৈরি করেছে std::mapএবং std::listপ্রায় অকেজো হিসাবে বিবেচনা করেছে, যেহেতু তারা তাদের বিরুদ্ধে বেঞ্চমার্ক করছে?std::allocatorযখন এই ডেটা স্ট্রাকচারগুলি একবারে একটি নোড বরাদ্দ করে। অবশ্যই আপনার লিঙ্কযুক্ত স্ট্রাকচারগুলি সেই ক্ষেত্রে খারাপ আচরণ করতে চলেছে, তবে লিঙ্কযুক্ত কাঠামোর জন্য নোডের দক্ষ বরাদ্দ যদি কোনও বরাদ্দকারীর পরিবর্তে কোনও ডেটা স্ট্রাকচারের দায়িত্ব হিসাবে বিবেচিত হত তবে জিনিসগুলি এতটাই আলাদা হয়ে যেত। তারা মেমোরি ট্র্যাকিং / প্রোফাইলিংয়ের মতো অন্যান্য কারণে এখনও কাস্টম বরাদ্দ ব্যবহার করতে পারে, তবে সংযোগ স্থাপনাগুলিকে দক্ষ করে তোলার ক্ষেত্রে বরাদ্দকারীর উপর নির্ভর করতে যখন একসাথে নোডগুলি বরাদ্দ করার চেষ্টা করে, সেগুলি ডিফল্টরূপে, অত্যন্ত অদক্ষ করে তোলে, যা ঠিক আছে যদি এটি একটি সুপরিচিত ক্যাভিয়েট নিয়ে আসে যা সংযুক্ত কাঠামোগুলিকে এখন নিখরচায় তালিকার মতো একটি কাস্টম বরাদ্দক প্রয়োজন, বাম এবং ডানদিকে ট্রিগার ট্রিগার এড়াতে এড়াতে। আরও বেশি ব্যবহারিকভাবে প্রয়োগযোগ্য এমন কিছু হতে পারেstd::list<T, BlockSize, Alloc>, যেখানে BlockSizeনিখরচায় তালিকার জন্য একবারে বরাদ্দ করার জন্য সংযোগযুক্ত নোডের সংখ্যা নির্দেশ করে (1 উল্লেখ করে যে এটি কার্যকরভাবে std::listএখন যেমন রয়েছে তেমন নেতৃত্ব দেয় )।

তবে এমন কোনও সতর্কীকরণ নেই, যা পরে ব্লকহেডগুলির একটি গোষ্ঠী সম্প্রদায়কে একটি কাল্ট মন্ত্র প্রতিধ্বনিত করে যে লিঙ্কযুক্ত তালিকাগুলি নিষ্ক্রিয়, যেমন


3

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

গেমগুলি বাদে, কাস্টম বরাদ্দকারীরা খুব বেশি ব্যবহৃত হয়?

ফেসবুক

পরীক্ষা করে দেখুন jemalloc যে ফেসবুক তাদের গাদা কর্মক্ষমতা এবং হ্রাস ফ্র্যাগমেন্টেশন উন্নত করার জন্য ব্যবহার শুরু হয়।


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