"স্পিন-লকস" আসলে কী?


108

আমি সর্বদা ভাবতাম: এগুলি কী: আমি যখনই তাদের সম্পর্কে শুনি তখনই ভবিষ্যতের উড়ানের মতো ডিভাইসের চিত্রগুলি আমার মনের মধ্যে দিয়ে নাচতে (ঘূর্ণায়মান?) যায় ...

তারা কি?

উত্তর:


125

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

তদতিরিক্ত, কার্নেলের প্রতিটি জিনিস কার্নেলের প্রতিটি রাজ্যে উপলব্ধ হয় না, যেমন একটি বাধা হ্যান্ডলারের মধ্যে বা যখন পেজিং পাওয়া যায় না ইত্যাদি

স্পিনলকগুলি প্রিম্পেশন সৃষ্টি করে না তবে অন্য কোরটি লকটি প্রকাশ না হওয়া পর্যন্ত একটি লুপ ("স্পিন") এ অপেক্ষা করুন। এটি থ্রেডটিকে তার কোয়ান্টাম হারাতে বাধা দেয় এবং লকটি প্রকাশের সাথে সাথেই চালিয়ে যায়। স্পিনলকের সহজ পদ্ধতিটি কোনও কার্নেলটিকে প্রায় কোনও রাজ্যেই এটি ব্যবহার করতে দেয়।

একারণে একটি একক কোর মেশিনে একটি স্পিনলক হ'ল একটি "অক্ষম বাধা" বা "উত্থাপন আইআরকিউএল" যা থ্রেডের শিডিয়ুলিং পুরোপুরি প্রতিরোধ করে।

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

সম্পাদনা : একটি প্রশ্ন এলো: "এর অর্থ কি আমি যেখানে সম্ভব সেখানে স্পিনলক ব্যবহার করব?" এবং আমি এর উত্তর দেওয়ার চেষ্টা করব:

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

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

এখানে এসওকে উদ্দেশ্য করে একটি প্রশ্ন রয়েছে: স্পিনলকস, তারা কতটা দরকারী?


এর অর্থ কি এই যে যেখানেই সম্ভব আমার স্পিন-লকগুলি করা উচিত (মুটেক্স, সমালোচনা বিভাগের পরিবর্তে)?

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

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

1
আপনি এ সম্পর্কে ঠিকই আছেন (এটিও দেখুন: linuxj Journal.com/article/5833 ), তবে সত্য যে একটি রিসোর্স লক করা এবং বাধা নিষ্ক্রিয় করা, যদিও যৌথভাবে সম্পাদন করা কার্যকর, অন্যথায় সম্পর্কযুক্ত ধারণা নয়। আপনি মূলত এটি নিশ্চিত হতে চান যে আপনি কোনও অসঙ্গতিপূর্ণ অবস্থায় পাওয়া কোনও উত্স ব্যবহার করছেন না এবং এই কারণেই আপনি এর লকটি পরীক্ষা করেন। বাধা নিষ্ক্রিয় করা (প্রিম্পশনও) নিশ্চিত করে যে হ্যাঁ, আপনি যখন এটি মোকাবেলা করছেন তখন কেউ আপনার পুনরুত্থানের সাথে বিচলিত হবে না। তবে, তার জন্য আপনাকে অবশ্যই নিশ্চিত হতে হবে যে আপনি যখন এটি অর্জন করছেন তখন এটি সংস্থানটি মুক্ত।
ব্যবহারকারী 1284631

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

25

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


2
চমৎকার উত্তর! +1
জয়েশ ভোই

18

এটি বেশিরভাগ লুপ যা নির্দিষ্ট শর্ত পূরণ না হওয়া অবধি চলতে থাকে:

while(cantGoOn) {};

1
এবং / বা যখন (ক্যান্টগন) {ঘুম (0)};
জিমিনিয়ন

@ জিমিনিয়ন যদি আপনি sleep(0)এটি রাখেন তবে এটি থ্রেডকে অগ্রাহ্য করবে এবং স্পিনলক ব্যবহারের উদ্দেশ্যটিকে প্রথমে হত্যা করবে। আপনার যদি অন্য থ্রেডে উত্পাদন করতে হয় তবে আপনার নিয়মিত লক ব্যবহার করা উচিত। (আমি জানি আপনার মন্তব্যটি খুব পুরানো তবে এটি পরামর্শ হিসাবে অন্যকে দেখতে বাধা দিতে চেয়েছিল)।
শেদাত কাপানোগলু

"শূন্যের একটি মান চলার জন্য প্রস্তুত যে কোনও থ্রেডে তার সময়ের বাকী অংশটি থ্রেড ছেড়ে দেয়। যদি অন্য কোনও থ্রেড চালানোর জন্য প্রস্তুত না হয় তবে ফাংশনটি তত্ক্ষণাত্ ফিরে আসে এবং থ্রেডটি কার্যকর হয়।"
জিমিনিয়ন


5

এটি এক ধরণের লক যা ব্যস্ততায় অপেক্ষা করে

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

উদাহরণস্বরূপ লিনাক্স কার্নেলের স্পিনলকগুলি দেখুন ।


3

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

উদা:

While(SpinCount-- && Kernel Object is not free)
{}

try acquiring Kernel object

3

আপনি যখন কোনও ব্যস্ত ওয়েটিং লুপে প্রবেশ করা সস্তার বলে মনে করেন এবং রিসোর্সটি লক হয়ে থাকে তখন ব্লক করার পরিবর্তে কোনও সংস্থান তৈরি করতে আপনি একটি স্পিনলক ব্যবহার করতে চাইবেন।

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

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


1

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


খুব সংজ্ঞা দ্বারা, একটি স্পিনলক কোনও লক ফ্রি প্রয়োগ বা বিনামূল্যে অপেক্ষা করতে প্রয়োগ করা হয় না।
rdb

0

এটি একটি লুপ যা কোনও শর্ত পূরণ না হওয়া অবধি প্রায় স্পিন করে।


0

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


0

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

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