উত্তর:
আপনি যখন নিয়মিত লক ব্যবহার করেন (মুটেক্সেস, সমালোচনা বিভাগ ইত্যাদি), অপারেটিং সিস্টেমটি আপনার থ্রেডটি ডাব্লুএআইআইটি অবস্থায় রাখে এবং একই কোরে অন্য থ্রেডগুলি নির্ধারিত করে প্রিম্প্ট করে। অপেক্ষা করার সময়টি যদি সত্যিই স্বল্প হয় তবে এটির পারফরম্যান্স পেনাল্টি রয়েছে, কারণ আপনার থ্রেডে এখন আবার সিপিইউ সময় পাওয়ার জন্য একটি প্রিম্পিশনের অপেক্ষা করতে হবে।
তদতিরিক্ত, কার্নেলের প্রতিটি জিনিস কার্নেলের প্রতিটি রাজ্যে উপলব্ধ হয় না, যেমন একটি বাধা হ্যান্ডলারের মধ্যে বা যখন পেজিং পাওয়া যায় না ইত্যাদি
স্পিনলকগুলি প্রিম্পেশন সৃষ্টি করে না তবে অন্য কোরটি লকটি প্রকাশ না হওয়া পর্যন্ত একটি লুপ ("স্পিন") এ অপেক্ষা করুন। এটি থ্রেডটিকে তার কোয়ান্টাম হারাতে বাধা দেয় এবং লকটি প্রকাশের সাথে সাথেই চালিয়ে যায়। স্পিনলকের সহজ পদ্ধতিটি কোনও কার্নেলটিকে প্রায় কোনও রাজ্যেই এটি ব্যবহার করতে দেয়।
একারণে একটি একক কোর মেশিনে একটি স্পিনলক হ'ল একটি "অক্ষম বাধা" বা "উত্থাপন আইআরকিউএল" যা থ্রেডের শিডিয়ুলিং পুরোপুরি প্রতিরোধ করে।
স্পিনলকগুলি শেষ পর্যন্ত কার্নেলগুলিকে "বিগ কার্নেল লক" গুলি এড়াতে দেয় (কর্নেল প্রবেশের সময় একটি লক অধিগ্রহণ করা হয় এবং প্রস্থানকালে প্রকাশিত হয়) এবং কার্নেল আদিমগুলির উপর দানাদার লক থাকে, ফলে মাল্টি-কোর মেশিনগুলিতে আরও ভাল কার্যকারিতা হয়।
সম্পাদনা : একটি প্রশ্ন এলো: "এর অর্থ কি আমি যেখানে সম্ভব সেখানে স্পিনলক ব্যবহার করব?" এবং আমি এর উত্তর দেওয়ার চেষ্টা করব:
আমি যেমন উল্লেখ করেছি, স্পিনলকগুলি কেবলমাত্র সেই জায়গাগুলিতেই কার্যকর যেখানে প্রত্যাশিত অপেক্ষার সময়টি কোয়ান্টামের চেয়ে কম (পড়ুন: মিলিসেকেন্ড) এবং প্রিম্পশন খুব বেশি অর্থবোধ করে না (যেমন কার্নেল সামগ্রীগুলি উপলভ্য নয়)।
অপেক্ষার সময়টি যদি অজানা থাকে বা আপনি ব্যবহারকারী মোডে থাকেন তবে স্পিনলকস দক্ষ নয়। কোনও স্পিনলক পাওয়া যায় কিনা তা পরীক্ষা করার সময় আপনি ওয়েটিং কোরটিতে 100% সিপিইউ সময় ব্যবহার করেন। আপনি আপনার কোয়ান্টামের মেয়াদ শেষ না হওয়া অবধি অন্য থ্রেডগুলিকে সেই কোরটিতে চলমান থেকে আটকাবেন। এই দৃশ্যটি কেবল কার্নেল স্তরে সংক্ষিপ্ত ফেটে ফেলা সম্ভব এবং ব্যবহারকারী-মোড অ্যাপ্লিকেশনটির অপছন্দের সম্ভাবনা নেই।
এখানে এসওকে উদ্দেশ্য করে একটি প্রশ্ন রয়েছে: স্পিনলকস, তারা কতটা দরকারী?
বলুন কোনও সংস্থান কোনও লক দ্বারা সুরক্ষিত আছে, একটি থ্রেড যা সংস্থানটিতে অ্যাক্সেস চায় তার জন্য প্রথমে লকটি অর্জন করা প্রয়োজন। যদি লকটি উপলভ্য না থাকে তবে থ্রেডটি বারবার এটি পরীক্ষা করতে পারে যে লকটি মুক্তি পেয়েছে কিনা। এই সময়ের মধ্যে থ্রেড ব্যস্ততা অপেক্ষা করে, লকটি পরীক্ষা করে, সিপিইউ ব্যবহার করে, তবে কোনও কার্যকর কাজ করে না। এ জাতীয় লকটিকে স্পিন লক হিসাবে আখ্যায়িত করা হয়।
এটি বেশিরভাগ লুপ যা নির্দিষ্ট শর্ত পূরণ না হওয়া অবধি চলতে থাকে:
while(cantGoOn) {};
sleep(0)
এটি রাখেন তবে এটি থ্রেডকে অগ্রাহ্য করবে এবং স্পিনলক ব্যবহারের উদ্দেশ্যটিকে প্রথমে হত্যা করবে। আপনার যদি অন্য থ্রেডে উত্পাদন করতে হয় তবে আপনার নিয়মিত লক ব্যবহার করা উচিত। (আমি জানি আপনার মন্তব্যটি খুব পুরানো তবে এটি পরামর্শ হিসাবে অন্যকে দেখতে বাধা দিতে চেয়েছিল)।
while(something != TRUE ){};
// it happend
move_on();
এটি এক ধরণের লক যা ব্যস্ততায় অপেক্ষা করে
এটিকে একটি অ্যান্টি-প্যাটার্ন হিসাবে বিবেচনা করা হয়, খুব নিম্ন স্তরের ড্রাইভার প্রোগ্রামিং ব্যতীত (যেখানে এটি ঘটতে পারে যে "সঠিক" ওয়েটিং ফাংশনটি কল করা কিছু চক্রের জন্য কেবল ব্যস্ততার চেয়ে বেশি তালাবন্ধের চেয়ে বেশি ওভারহেড থাকে)।
উদাহরণস্বরূপ লিনাক্স কার্নেলের স্পিনলকগুলি দেখুন ।
আপনি যখন কোনও ব্যস্ত ওয়েটিং লুপে প্রবেশ করা সস্তার বলে মনে করেন এবং রিসোর্সটি লক হয়ে থাকে তখন ব্লক করার পরিবর্তে কোনও সংস্থান তৈরি করতে আপনি একটি স্পিনলক ব্যবহার করতে চাইবেন।
লকগুলি সূক্ষ্ম দানাযুক্ত এবং সংখ্যায় বড় (যেমন উদাহরণস্বরূপ, লিঙ্কযুক্ত তালিকায় নোডের জন্য একটি লক) পাশাপাশি লক হোল্ডের সময়টি সর্বদা খুব কম থাকায় স্পিনিং উপকারী হতে পারে। সাধারণভাবে, একটি স্পিন লক ধরে রাখার সময়, যে কোনও কিছু নিজেই ব্লক করতে পারে এমন কল করা, একবারে একাধিক স্পিন লক ধরে রাখা, গতিশীলভাবে প্রেরণ করা কল (ইন্টারফেস এবং ভার্চুয়াল) করা, কোনও কোডে স্ট্যাটিকভাবে প্রেরণ করা কলগুলি করা উচিত নয় ' নিজস্ব নয়, বা মেমরি বরাদ্দ করা।
পারফরম্যান্সের কারণে স্পিনলক একটি মান ধরণের, তাও লক্ষ করা গুরুত্বপূর্ণ। এই হিসাবে, স্পিনলক উদাহরণটি অনুলিপি করে অনুলিপি না করার জন্য একজনকে অবশ্যই খুব সতর্ক থাকতে হবে, কারণ দুটি উদাহরণ (মূল এবং অনুলিপি) একে অপরের থেকে সম্পূর্ণ স্বতন্ত্র হবে, যা সম্ভবত অ্যাপ্লিকেশনটির ভ্রান্ত আচরণের দিকে পরিচালিত করবে। যদি একটি স্পিনলক উদাহরণটি অবশ্যই পাস করতে হয় তবে এটি মানের পরিবর্তে রেফারেন্স দিয়ে পাস করা উচিত।
সংক্ষেপে, স্পিনলক পারমাণবিক তুলনা এবং অদলবদল (সিএএস) বা টেস্ট-সেট-এর মতো লক ফ্রি বাস্তবায়নের জন্য নির্দেশনা নিখরচায়, মুক্ত থ্রেড নিরাপদ প্রতিমা নিয়োগ করে। এই ধরনের কাঠামো মাল্টি-কোর মেশিনগুলিতে ভাল স্কেল করে।
আচ্ছা, হ্যাঁ - স্পিন লকগুলির বিন্দু (বনাম একটি প্রচলিত সমালোচনা বিভাগগুলি ইত্যাদি) হ'ল তারা কিছু পরিস্থিতিতে (মাল্টিকোর সিস্টেম ..) এর অধীনে আরও ভাল পারফরম্যান্স সরবরাহ করে, কারণ তারা তাত্ক্ষণিকভাবে থ্রেডের বাকী পরিমাণটি দেয় না।
স্পিনলক হ'ল এক ধরণের লক, যা অ-ব্লকযোগ্য এবং অ-ঘুম-সক্ষম। যে কোনও থ্রেড যা কোনও অংশীদারি বা সমালোচনামূলক সংস্থানটির জন্য একটি স্পিনলক অর্জন করতে চায় তা ধারাবাহিকভাবে স্পিন করবে, নির্দিষ্ট উত্সের জন্য লকটি অর্জন না করা পর্যন্ত সিপিইউ প্রক্রিয়াকরণ চক্রকে নষ্ট করবে। একবার স্পিনলকটি অর্জিত হলে, এটি তার কোয়ান্টামে কাজটি সম্পূর্ণ করার চেষ্টা করে এবং পরে যথাক্রমে উত্সটি ছেড়ে দেয়। স্পিনলক হ'ল সর্বোচ্চ অগ্রাধিকারের ধরণের লক, সহজভাবে বলতে পারেন, এটি প্রাক-প্রিম্পটিভ ধরনের লক।