স্পিনলক কীভাবে ভোট দেওয়ার চেয়ে আলাদা?


41

স্পিনলক এবং পোলিং একই জিনিস?

উইকিপিডিয়া:

একটি স্পিনলক হ'ল এমন একটি লক যা বারবার লকটি উপলব্ধ কিনা তা পরীক্ষা করার সময় একটি থ্রেড কেবলমাত্র একটি লুপ ("স্পিন") এ অপেক্ষা করার জন্য এটি অর্জন করার চেষ্টা করে

এটি ভয়ঙ্করর মতো শোনাচ্ছে:

while(!ready);

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

উত্তর:


85

পোলিং বলতে কোনও উত্স ( কোনও ধরণের সংস্থান) প্রস্তুত কিনা তা বারবার যাচাই করা বোঝায় repeatedly

একটি স্পিনলক হ'ল যখন আপনি যে সংস্থানটি ভোট দিচ্ছেন এটি একটি লক।

নোট করুন যে পোলিং খারাপ নয় । বিশেষত, যখন ভোট দেওয়ার সময় সাধারণত ডেটা প্রস্তুত থাকে তখন ভোটদান কার্যকর। ভোটদানটি কেবলমাত্র অকার্যকর যদি আপনি তা না করে বিনিময়ে কোনও ডেটা না পেয়ে থাকেন।

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

আমি আমার নিজের অভিজ্ঞতা থেকে আপনাকে একটি বাস্তব জীবনের উদাহরণ দিতে পারি: 15 বছর আগে, প্রতিবার নতুন ইমেল আসার সময় আমাকে বাধা দেওয়ার জন্য আমার ইমেল প্রোগ্রাম সেটআপ করা হয়েছিল Which যা সপ্তাহে একবার বা দু'বার ঘটেছিল। অবিচ্ছিন্নভাবে আমার ইনবক্সটি চেক করা সময়ের প্রচুর অপচয় হয়ে যেত।

আজকাল, আমি সমস্ত বিজ্ঞপ্তি বন্ধ আছে। আমি জানি যে আমি যখনই আমার ইনবক্সটি সন্ধান করি তখন সেখানে নতুন ইমেল আসবে। পোলিং এখন অনেক বেশি দক্ষ।

স্পিনলকগুলি দক্ষ হয় যখন) ক) লকটি নেওয়ার সম্ভাবনা কম এবং খ) যদি লকটি নেওয়া হয় তবে এটি কেবল অল্প সময়ের জন্যই অনুষ্ঠিত হবে। অন্য কথায়: এটি বেশিরভাগ অপ্রচলিত সূক্ষ্ম দানযুক্ত লকগুলির জন্য দক্ষ তবে উচ্চতর বিতর্কিত মোটা দানাদার লকগুলির জন্য এটি অদক্ষ।

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


5
স্পিনলকস একটি সমবায় মাল্টিটাস্ক পরিবেশে পুরোপুরি বোধগম্য হতে পারে। আপনাকে কেবল নিশ্চিত করতে হবে যে আপনি লুপটিতে নিয়ন্ত্রণের ফলন করছেন।
কেভিন

4
ইমেল সহ দুর্দান্ত উদাহরণ। আপনার সম্পর্কে আমাকে স্মরণ করিয়ে দেয় সর্বদা ইমেল ...
পেটর পুডলিক

2
@ কেভিন: আমার কাছে স্পিনলকের খুব আধ্যাত্মিক ধারণা আছে, আক্ষরিকভাবে একটি লক যা খালি লুপে কেবল স্পিন করে। ( atomically_do { while (lock.is_locked?); lock.acquire! }) যদি এটির ফলন হয় তবে এটি খালি লুপ নয় এবং এইভাবে এই পবিত্রতাবাদী দৃষ্টিতে কোনও স্পিনলক নয় :- ডি তবে অবশ্যই কিছু সংকরকরণের সাথে অন্যান্য ধরণের তালা বা শিথিলকরণ / প্লাটোনিক আদর্শের সংযোজন বাস্তব বিশ্বে সঠিক ধারণা তৈরি করে।
জার্গ ডব্লু মিট্টাগ

3
@ বুবাকাজৌবা: একটি স্পিনলক শূন্য লুপটিতে আক্ষরিক "স্পিনিং" দিয়ে পরীক্ষা করে কাজ করে "লকটি কি এখনও প্রকাশিত হয়েছে? লকটি এখনও প্রকাশিত হয়েছে? লকটি এখনও প্রকাশিত হয়েছে? লকটি কি এখনও প্রকাশিত হয়েছে?" বারবার. যদি কোনও সমান্তরালতা না থাকে, তবে লকটি প্রকাশ করতে পারে এমন একই সময়ে অন্য কোনও থ্রেড চলছে না, যাতে আপনার কার্যকরভাবে অন্তহীন লুপ থাকে! মন্তব্য সরাসরি আপনার উপরে দেখুন।
Jörg ডব্লু মিট্টাগ

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

10

একটি স্পিনলক হ'ল একধরনের লক, বিশেষত, এটি ভোটের মাধ্যমে অর্জন করা ।

পোলিং কোনও কিছুর স্ট্যাটাস যাচাই করার একটি পদ্ধতি (স্ট্যাটাসটি জিজ্ঞাসা করার পরিবর্তে স্ট্যাটাস জিজ্ঞাসা করার মাধ্যমে)।

সমস্ত পোলিং একটি স্পিনলক নয়, উদাহরণস্বরূপ, কীবোর্ড কীগুলির স্থিতি পোলিং।


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


5

স্পিনলক ভোটদানের চেয়ে পৃথক কারণ এটি কয়েক মিলিসেকেন্ড বা তারও কমের অর্ডারে শুধুমাত্র খুব অল্প সময়ের জন্য ঘটে । ভোটগ্রহণ অনির্দিষ্টকালের জন্য চলতে পারে।

সমান্তরাল প্রোগ্রামিংয়ে, স্পিনিংয়ের একটি সংক্ষিপ্ত পর্ব প্রায়শই ব্লক করা ভাল, কারণ এটি প্রসঙ্গের স্যুইচিং এবং কার্নেল রূপান্তরের ব্যয়কে এড়িয়ে চলে।

আরো পড়ার
SpinLock এবং C # এ SpinWait
সি Spinlocks এবং read-write লক্স


আমি মনে করি আপনি মাইক্রোসেকেন্ড বলতে চেয়েছিলেন। একটি লক যা পুরো মিলিসেকেন্ডে স্থায়ী হয় তার জন্য আমাদের একটি লক প্রয়োগকরণ ব্যবহার করা উচিত যা বিতর্কটিতে কার্নেল কল করে।
পিটার

@ পিটার সম্ভবত আলবাহরির অর্থ এটিই ছিল। এটাই তার পাঠ্য বলে।
রবার্ট হার্ভে

4

পার্থক্যটি হ'ল একটি স্পিনলক শুধুমাত্র এমন পরিস্থিতিতে ব্যবহৃত হয় যেখানে এটি উপযুক্ত এবং এই পরিস্থিতিতে এটি খুব কার্যকরী।

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

কখনও কখনও উভয় একত্রিত হয়; আপনি স্বল্প সময়ের জন্য স্পিন লকটি চালান এবং স্পিনলকটি যদি কাজ না করে তবে একটি ভিন্ন কৌশলতে স্যুইচ করুন।


2

অতিরিক্ত ভোটদান এমন কিছু যা আপনার করা উচিত নয় কারণ এটি সিস্টেমের সংস্থানগুলি অপচয় করে। এটি অনুসরণ করে যে ভোটদানটি যদি সিস্টেমের সংস্থানগুলি নষ্ট না করে তবে তা ঠিক আছে

উদাহরণস্বরূপ, অতিরিক্ত ভোট দেওয়ার ক্ষেত্রে সিপিইউ লোড 100% হয়ে যাবে যেখানে প্রকৃত কাজের ফলে কেবলমাত্র 2% লোড হবে।

পোলিং ছাড়া অন্য জিনিসের জন্য ব্যবহার করা যেতে পারে while(!ready)। উদাহরণস্বরূপ এর অর্থ ব্যবহারকারী কোনও কী চাপলে নিয়মিত পরীক্ষা করা checking একটি বুদ্ধিমান বাস্তবায়ন প্রতি 15 মিলিসেকেন্ডে একবারে চেক করবে, সুতরাং এটি প্রতি 20 মিলিয়ন ডলার ক্লক চক্রের একবার চেক করে। এই ধরণের পোলিং দুর্দান্ত, কারণ এটি সিস্টেমের সংস্থান নষ্ট করে না।

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

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

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