কখন একজনকে মুটেক্সের পরিবর্তে একটি স্পিনলক ব্যবহার করা উচিত?


294

আমি মনে করি উভয়ই একই কাজ করছে, আপনি কীভাবে সিঙ্ক্রোনাইজেশনের জন্য ব্যবহার করবেন তা সিদ্ধান্ত নেবেন?



11
মেটেক্স এবং সেম্যাফোর এক জিনিস নয়, তাই আমি মনে করি এটি কোনও সদৃশ নয়। রেফারেন্সযুক্ত নিবন্ধের উত্তর এটি সঠিকভাবে জানিয়েছে। আরও তথ্যের জন্য দেখুন ব্যারগ্রুপ.com
এম্বেডড-

উত্তর:


729

তত্ত্বটি

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

সমস্যাটি

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

সমাধান

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

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

অনুশীলন

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

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

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

সারসংক্ষেপ

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

আপডেট: আইওএসের জন্য একটি সতর্কতা

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

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

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


3
চমত্কার ব্যাখ্যা ... আমি স্পিনলক সম্পর্কে একটি সন্দেহ আছে আমি, এবং আমি আইএসআর একটি স্পিনলক ব্যবহার করতে পারি? যদি না হয় কেন
হ্যারিস

4
@ মেকি যদি আমার ভুল না হয় তবে আমি বিশ্বাস করি যে আপনি আপনার উত্তরে পরামর্শ দিয়েছিলেন যে স্লাইসিং কেবলমাত্র সিঙ্গল-প্রসেসর সিস্টেমে হয়। এটা ঠিক নয়! আপনি একটি একক-প্রসেসর সিস্টেমে একটি স্পিন লক ব্যবহার করতে পারেন এবং এটির সময় কোয়ান্টামের মেয়াদ শেষ না হওয়া অবধি এটি স্পিন করবে। তারপরে একই অগ্রাধিকারের অন্য একটি থ্রেড গ্রহণ করতে পারে (যেমনটি আপনি মাল্টি-প্রসেসর সিস্টেমগুলির জন্য বর্ণনা করেছেন)।
fumoboy007

7
@ fumoboy007 "এবং এটির সময় কোয়ান্টামের মেয়াদ শেষ না হওয়া অবধি এটি স্পিন করবে" // যার অর্থ আপনি কোনও একক সুবিধার জন্য সিপিইউ সময় / ব্যাটারি শক্তি নষ্ট করবেন না, যা কোনও একক সুবিধার জন্য, যা একেবারে মরোনিক। এবং না, আমি কোথাও বলিনি যে সময় কাটানোর বিষয়টি কেবলমাত্র একক মূল সিস্টেমে ঘটে থাকে, আমি একক কোর সিস্টেমে কেবলমাত্র সময় কাটানোর কথা বলেছিলাম , যখন সেখানে বাস্তব সমান্তরালতা ওম মাল্টিকোর সিস্টেম রয়েছে (এবং সময় কাটানোর পরেও আমি আমার লেখার জন্য অপ্রাসঙ্গিক) উত্তর); এছাড়াও আপনি একটি সংকর স্পিনলক কী এবং কেন এটি একক এবং মাল্টিকোর সিস্টেমে ভাল কাজ করে সে সম্পর্কে আপনি সম্পূর্ণরূপে বিন্দুটি মিস করেছেন।
মক্কি

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

2
যদি আপনি লিনাক্স কার্নেলে প্রয়োগ করা স্পিনলকস এবং মিউটেক্সগুলি সম্পর্কে আরও জানতে চান তবে আমি দুর্দান্ত লিনাক্স ডিভাইস ড্রাইভারগুলির তৃতীয় সংস্করণ (এলডিডি 3) ( মুটেক্সেস : পৃষ্ঠা 109; স্পিনলকস: পৃষ্ঠা 116) এর অধ্যায় 5 পড়ার পরামর্শ দিচ্ছি 5
patryk.beza

7

আলেকজান্ডার স্যান্ডলারের ব্লগে অ্যালেক্সের অ্যালেক্সে মেকির পরামর্শ অব্যাহত রেখে এই নিবন্ধে pthread mutex বনাম pthread স্পিনলক দেখায় যে কীভাবে #ifdef ব্যবহার করে আচরণ পরীক্ষা করার জন্য spinlock& mutexesপ্রয়োগ করা যেতে পারে।

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


6

দয়া করে নোট করুন যে নির্দিষ্ট পরিবেশ এবং শর্তে (যেমন প্রেরন স্তরের উইন্ডোজ চলমান> = DISPATCH স্তর), আপনি মুটেক্স ব্যবহার করতে পারবেন না বরং স্পিনলক ব্যবহার করতে পারবেন। ইউনিক্সে - একই জিনিস।

প্রতিযোগী স্ট্যাকেক্সচেঞ্জ ইউনিক্স সাইটে সমতুল্য প্রশ্ন এখানে রয়েছে: /unix/5107/why-are-spin-locks-good-choice-in-linux-kernel-design-instead-of-something- অধিক

উইন্ডোজ সিস্টেমে প্রেরণের তথ্য: http://download.microsoft.com/download/e/b/a/eba1050f-a31d-436b-9281-92cdfeae4b45/IRQL_thread.doc


6

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


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

3

স্পিনলক এবং মুটেক্স সিঙ্ক্রোনাইজেশন প্রক্রিয়াগুলি আজ দেখা যায় খুব সাধারণ।

প্রথমে স্পিনলক সম্পর্কে চিন্তা করা যাক।

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

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

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

উইন্ডোজে স্পিনলক ব্যবহার করে থ্রেডটি DISPATCH_LEVEL এ আপগ্রেড করবে, যা কিছু ক্ষেত্রে অনুমোদিত হতে পারে না, তাই এবার আমাদের একটি Mutex (APC_LEVEL) ব্যবহার করতে হয়েছিল।


-6

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

এটা ভুল. ইউনি প্রসেসর সিস্টেমে স্পিনলকগুলি ব্যবহারে সিপিইউ চক্রের কোনও অপচয় নেই, কারণ কোনও প্রক্রিয়া একবার স্পিন লক নিলে প্রিম্পেশন অক্ষম হয়ে যায়, সুতরাং আর কেউ স্পিনি করতে পারে না! এটি কেবল এটি ব্যবহার করে কোনও লাভ হয় না! সুতরাং, ইউএনআই সিস্টেমে স্পিনলকগুলি কার্নেল দ্বারা সংকলিত সময়ে প্রিমিপ_ডেজেবল দ্বারা প্রতিস্থাপিত হয়!


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

"একবার কোনও প্রক্রিয়া একটি স্পিন লক নিলে, প্রিম্পেশন অক্ষম হয়"। কোনও প্রক্রিয়া স্পিন নিলে प्रीিম্পশন অক্ষম থাকে না। যদি এমনটি হয় তবে একটি স্পিনলক প্রবেশ করে কখনও ছাড়বে না এমন একটি প্রক্রিয়া পুরো মেশিনটি নামিয়ে ফেলতে পারে। মনে রাখবেন যে আপনার থ্রেড যদি কার্নেল স্পেসে চলে যায় (ব্যবহারকারীর জায়গার পরিবর্তে), একটি স্পিন লক নেওয়া প্রকৃতপক্ষে নিষ্ক্রিয় করে তোলে, তবে আমি মনে করি না এটি এখানে আলোচনা করা হচ্ছে।
কনস্ট্যান্টিন ওয়েটিজ

সময় সঙ্কলন দ্বারা কার্নেল ?
শিয়েন

@ কনস্ট্যান্টিন এফওয়াইআই স্পিন লক কেবল কার্নেলের জায়গায় নেওয়া যেতে পারে। এবং যখন একটি স্পিন লক নেওয়া হয় স্থানীয় প্রসেসরের উপর প্রিম্পশন অক্ষম করা হয়।
নীলাংশ মিত্তাল

@ হাইড্রানিক্স আপনাকে পেলেন না? স্পষ্টতই আপনি কোনও কার্নেলের বিপরীতে একটি মডিউল সঙ্কলন করতে পারবেন না যেখানে CONFIG_SMP সক্ষম করা আছে এবং CONFIG_SMP অক্ষম থাকা কোনও কার্নেলে একই মডিউলটি চালাতে পারেন।
নীলাংশ মিত্তাল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.