আবর্জনা সংগ্রহের ক্ষেত্রে হ্যাশ টেবিল ব্যবহার করা দুনিয়া এবং চিহ্নের বিশ্ব সমস্যার বন্ধ করে দেবে?


13

মার্ক-স্যুইপ-কমপ্যাক্ট আবর্জনা সংগ্রহের অ্যালগরিদমে আপনাকে বস্তুগুলি স্থানান্তরিত করার সময় দুনিয়া থামাতে হবে কারণ রেফারেন্স গ্রাফটি বেমানান হয়ে যায় এবং আপনাকে অবজেক্টের দিকে নির্দেশিত সমস্ত রেফারেন্সের মানগুলি প্রতিস্থাপন করতে হবে।

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

আমার চিন্তার লাইনে কোন ভুল আছে?

উত্তর:


19

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

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

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


ঠিক আছে আমাদের আজ অনেক স্মৃতি রয়েছে তাই আমরা বলতে পারি যে 50 এমবি টেবিল এবং হ্যাশ কেবলমাত্র একটি নির্দেশিকা হতে পারে সাধারণ মডিউল হতে পারে ...
এমপ্রিও

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

@ এমপ্রিপিও আপনার প্রতিটি বস্তুতে একটি প্রবেশ (আইডি -> বর্তমান ঠিকানা) প্রয়োজন, তাইনা? এবং কিভাবে সস্তা হ্যাশ ফাংশন নির্বিশেষে, আপনি হবে দুর্ঘটনায় তাদের সমাধান করতে প্রয়োজন আছে। এদিকে আমন কি বলেছে।

@amon এটা সিপিইউ আগে শুধুমাত্র সময়ের ব্যাপার 50MB আছে বা ক্যাশে আরো :)
Moz

1
@ Ӎσᶎ এতক্ষণে আমরা একটি চিপে 50 টি এমআইবি ট্রানজিস্টর রাখতে পারি এবং এটি এখনও এল 1 বা এল 2 ক্যাশে হিসাবে কাজ করার জন্য যথেষ্ট বিলম্ব করতে পারে (এল 3 ক্যাশে ইতিমধ্যে আকারে 15 এমআইবি অবধি রয়েছে তবে সাধারণত অফ-চিপ এএফআইকি এবং অনেকদূর L1 এবং L2 এর চেয়েও খারাপ লেটেন্সি), আমাদের সেই অনুসারে মূল পরিমাণে মেমরির প্রচুর পরিমাণে (এবং এতে রাখার জন্য ডেটা) থাকবে। টেবিলটি স্থির আকার নির্ধারণ করা যায় না, এটি গাদা দিয়ে বাড়তে হবে।

19

কম্পিউটার সায়েন্সের সমস্ত সমস্যা ইন্ডিয়ারেশনের অন্য স্তরের দ্বারা সমাধান করা যেতে পারে ... ইন্ডিরিশনের অনেকগুলি স্তরের সমস্যা বাদে

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

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

while (true) {
    Object garbage = new Object();
}

আমরা যদি প্রতিটি বস্তুর জন্য কেবলমাত্র আইডিকে আইক্রিমেন্ট বাড়িয়ে তুলি তবে আমরা কিছু সময় আইডি ছাড়িয়ে যাব। সুতরাং আমাদের খুঁজে বার করতে হবে যে কোন আইডি এখনও ব্যবহারে আছে এবং কোনটি নিখরচায় যাতে তাদের পুনরায় দাবি করা যেতে পারে। পরিচিত শব্দ? আমরা এখন স্কয়ার এক এ ফিরে এসেছি।


কেউ সম্ভবত আইডি ব্যবহার করতে পারবেন যা কেবলমাত্র 'যথেষ্ট পরিমাণে' 256 বিট বিগনাম বলে? আমি বলছি না এই ধারণাটি সামগ্রিকভাবে ভাল, তবে আপনি প্রায় অবশ্যই আইডিএস পুনরায় ব্যবহার করতে পারেন।
মান

@ ভ্যালালিটি বাস্তবিকভাবে হ্যাঁ - যতদূর আমরা দেখতে পাচ্ছি যে এটি আইডি পুনরায় ব্যবহারের বিষয়টি পেতে পারে। তবে এটি অন্য একটি "640K এর কারও পক্ষে যথেষ্ট হওয়া উচিত" যুক্তি, এবং সমস্যাটি আসলে সমাধান করে না। আরও বিপর্যয়কর দিকটি হ'ল এই বড় আকারের সিউডো-পয়েন্টারগুলিকে সামঞ্জস্য করার জন্য সমস্ত বস্তুর আকার (এবং হ্যাশ টেবিল) বাড়িয়ে তুলতে হবে এবং হ্যাশ অ্যাক্সেসের সময় আমাদের এই আইডিন্টটি অন্যান্য আইডির সাথে তুলনা করতে হবে যা সম্ভবত একাধিক নিবন্ধগুলিকে হগ করবে , এবং সম্পূর্ণ করার জন্য একাধিক নির্দেশনা নিন (bit৪ বিট: 8 × লোড, 4 × তুলনা, 3 × এবং এটি নেটিভ ইনটগুলির তুলনায় 5% বৃদ্ধি)।
আমন

হ্যাঁ, আপনি কিছু সময় পরে আইডি শেষ হয়ে যাবে এবং একটি বিরতি প্রয়োজন যা তাদের সমস্ত পরিবর্তন করতে হবে। তবে সম্ভবত এটি একটি বিরল ঘটনা হবে ...
mrpyo

@ আমন খুব সম্মত হয়েছেন, সেখানে খুব ভাল পয়েন্ট রয়েছে, আমি সম্মত সত্যিকারের টেকসই ব্যবস্থা রাখাই আরও ভাল is এটি অসহনীয়ভাবে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে। ব্যক্তিগতভাবে আমি যাইহোক যাইহোক কোনও বড় আবর্জনা সংগ্রহকারী অনুরাগী নই: পি
ভ্যালিটি

@ এমন: বিশ্বে এই কোডের চেয়ে আরও বেশি কোড রয়েছে যা একবার আপনি একবার 64৪ বিট আইডি (ন্যানোসেকেন্ডের ৫৮৪ বছর) মুড়িয়ে রাখলে ভুল হতে পারে এবং আপনি সম্ভবত গ্লোবাল কাউন্টারকে তীক্ষ্ণভাবে না দেখলে মেমরি বরাদ্দের ব্যবস্থা করতে পারেন 1ns যে আইডি ছিটিয়ে!)। তবে নিশ্চিত, যদি আপনার উপর নির্ভর করার প্রয়োজন না হয় তবে আপনি করবেন না।
স্টিভ জেসোপ

12

আপনার চিন্তার ধারায় কোনও ত্রুটি নেই, আপনি মূল জাভা আবর্জনা সংগ্রহকারী কীভাবে কাজ করেছিলেন তার খুব কাছাকাছি কিছু বর্ণনা করেছেন

আসল জাভা ভার্চুয়াল মেশিন []] এবং কিছু স্মলটাক ভার্চুয়াল মেশিনগুলি অপ্রত্যক্ষ পয়েন্টারগুলি ব্যবহার করে, যা হ্যান্ডলস নামে পরিচিত []] এ অবজেক্টগুলি উল্লেখ করে। হ্যান্ডলগুলি আবর্জনা সংগ্রহের সময় অবজেক্টগুলিকে সহজে স্থানান্তরিত করতে দেয়, হ্যান্ডেলগুলি সহ প্রতিটি বস্তুর জন্য কেবলমাত্র একটি সরাসরি পয়েন্টার থাকে: এটির হ্যান্ডেলের মধ্যে একটি। হান-ড্লে-এর মাধ্যমে অপ্রত্যক্ষের জন্য বস্তুর অন্যান্য সমস্ত উল্লেখ re এই জাতীয় হ্যান্ডেল-ভিত্তিক মেমরি সিস্টেমে অবজেক্টের ঠিকানাগুলি সামগ্রীর আজীবন পরিবর্তিত হয় এবং তাই হ্যাশিংয়ের জন্য ব্যবহার করা যায় না, হ্যান্ডেল ঠিকানাগুলি স্থির থাকে।

আবর্জনা-সংগৃহীত অবজেক্টগুলির স্থান এবং সময়-দক্ষ হ্যাশিং

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

জাভা ভার্চুয়াল মেশিন স্পেসিফিকেশন (1997)

সুতরাং এটি কাজ করে, এটি চেষ্টা করা হয়েছে এবং এর অদক্ষতার ফলে প্রজন্মের চিহ্ন এবং সুইপ সিস্টেমগুলির বিকাশ ঘটে।


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

@ স্টিভ জেসোপ হ্যাঁ, জিসি বাস্তবায়নে কোনও হ্যাশটেবল ছিল না, যদিও হ্যান্ডেলের মূল্যটিও ফিরে আসা মূল্য ছিলObject.getHashCode()
পিট কির্খাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.