কোন লকের উপর কোনও জাতির অবস্থা বাধা দেয়?


24

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

তাহলে কি হয়? তা প্রতিরোধে কী করা হয়? এটা কি অসম্ভব, না কেবল অসম্ভব? অথবা এটি একটি হল বাস্তব race অবস্থা ঘটতে অপেক্ষা?


এই প্রশ্নটি এর আগে এসও তে জিজ্ঞাসা করা হয়েছিল: stackoverflow.com/questions/980521/…
ডক ব্রাউন

এবং একটি সম্পর্কিত প্রশ্ন এখানে পি.এসইতে: প্রোগ্রামারস.স্ট্যাকেক্সেঞ্জ
র‌্যাচেট ফ্রিক

আপনি লকটি অর্জনের জন্য একটি লক অর্জন করেন;) (অন্য কথায়, যদি আপনার লকের কোনও জাতির শর্ত থাকে তবে এটি সঠিকভাবে প্রয়োগ করা হয় না - লকটি পারস্পরিক বর্জনকে কার্যকর করে এমন একটি কনস্ট্রাক্ট হিসাবে অনেক বেশি সংজ্ঞায়িত হয়)
টাঙ্গারস

কীভাবে লকগুলি কাজ করে তার একটি গুরুত্বপূর্ণ বিষয় আপনি মিস করেছেন । এগুলি এমনভাবে তৈরি করা হয়েছে যে কোনও লকটিতে প্রতিযোগিতা রাখা সম্ভব নয়, অন্যথায় তারা সম্পূর্ণ অকেজো।
জেন

উত্তর:


36

এটা কি অসম্ভব, না কেবল অসম্ভব?

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


3
ধন্যবাদ ... God
শ্বর

2
@gdoward আমি এটি বিশ্বাস করতে পারি না ... এই উত্তরটি আমাকে 5 মিনিটেরও কম সময় নিয়েছে এবং এটি আমার চারশত উত্তর (মূলত এসও) এর মধ্যে তৃতীয় সর্বোচ্চ ভোট দিয়েছে। এবং সম্ভবত সংক্ষিপ্ততম এক।
maaartinus

1
@ মাআর্টিনাস - ছোট এবং মিষ্টি কখনও কখনও এটি করে।
ববসন

17

পারমাণবিক "টেস্ট এবং সেট" ক্রিয়াকলাপের ধারণাটি অধ্যয়ন করুন।

মূলত অপারেশনটি ভাগ করা যায় না - এটি একই সময়ে দুটি কাজ করা সম্ভব নয় not এটি কোনও মান যাচাই করবে, এটি পরিষ্কার হলে সেট করবে এবং পরীক্ষার সময় মানটি যেমনটি ফিরিয়েছিল তেমন করবে। একটি লক অপারেশনে, ফলাফলটি সর্বদা একটি পরীক্ষা-সেট-এর পরে "লক == সত্য" হবে, কেবলমাত্র পার্থক্যটি ছিল এটি শুরুতে সেট করা বা না।

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


2
মূলত, যদি হার্ডওয়্যারটি কোনও স্তরে স্বতন্ত্রভাবে অনুক্রমিক না হয় তবে এর একটি ব্যবস্থা থাকবে যা এটি অন্যথায় ঘটতে পারে এমন সম্পর্কগুলি ছিন্ন করতে দেয়।
বিল মিশেল

@ বিলমিচেল, আমার এটা ভেবে দেখা উচিত ছিল। আসলে, আমি করেছি; আমার অনুমানটি সঠিক ছিল কিনা তা আমি কেবল জানতাম না।
গ্যাভিন হাওয়ার্ড

2

সমালোচনামূলক বিভাগে প্রবেশের জন্য কোডটি বিশেষভাবে তৈরি করা হয়েছে যাতে একটি রেস শর্ত পারস্পরিক বর্জনকে লঙ্ঘন করে না।

বেশিরভাগ সময় পারমাণবিক তুলনা এবং সেট লুপ ব্যবহার করা হয় যা হার্ডওয়্যার স্তরে চালিত হয়

while(!CompareAndSet(&lock, false, true));//busy loop won't continue until THIS thread has set the lock to true
//critical section
CompareAndSet(&lock, true, false);

এর অভাবে পারস্পরিক বর্জনকে সক্ষম করার জন্য ভালভাবে অধ্যয়ন করা সফ্টওয়্যার সমাধান রয়েছে


1

দুটি (বা আরও বেশি) থ্রেড একই সময়ে লক অর্জন করা সম্ভব নয়। উদাহরণস্বরূপ কয়েকটি ধরণের সিঙ্ক্রোনাইজেশন পদ্ধতি রয়েছে:

সক্রিয় অপেক্ষার - স্পিন লক

pseudocode:

1. while ( xchg(lock, 1) == 1); - entry protocole

এক্সসিএইচজি হ'ল পারমাণবিক ক্রিয়াকলাপের একটি উদাহরণ (x86 আর্কিটেকচারে বিদ্যমান) যা প্রথমে একটি "লক" ভেরিয়েবলের জন্য নতুন মান নির্ধারণ করে এবং তারপরে পুরানো মান প্রদান করে। পারমাণবিক অর্থ এটি বাধাগ্রস্ত হতে পারে না - উপরের উদাহরণে নতুন মান সেট করা এবং পুরানো ফিরে আসার মধ্যে। পারমাণবিক - নির্ণায়ক ফলাফল যাই হোক না কেন।

2. Your code
3. lock = 0; - exit protocol

লক যখন 0 এর সমান হয় তখন অন্য থ্রেড সমালোচনামূলক বিভাগে প্রবেশ করতে পারে - যখন লুপ শেষ হয়।

থ্রেড স্থগিতকরণ - উদাহরণস্বরূপ সেমফোর গণনা করা

দুই পারমাণবিক অপারেশন বিদ্যমান .Wait()এবং .Signal()এবং পূর্ণসংখ্যা পরিবর্তনশীল সেটিতে কল করতে দেয় আমরা আছে int currentValue

Wait():
if (currentValue > 0) currentValue -= 1;
else suspend current thread;

Signal():
If there exists thread suspended by semaphore wake up one of them
Else currentValue += 1;

এখন সমালোচনামূলক বিভাগ সমস্যা সমাধান করা সত্যিই সহজ:

pseudocode:

mySemaphore.Wait();
do some operations - critical section
mySemaphore.Signal();

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

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