উত্তর:
লকগুলি পারস্পরিক বর্জনের জন্য ব্যবহৃত হয়। আপনি যখন কোনও কোডের টুকরোটি পারমাণবিক তা নিশ্চিত করতে চান, তার চারদিকে একটি লক রাখুন। এটি করার জন্য আপনি তাত্ত্বিকভাবে বাইনারি সেমফোর ব্যবহার করতে পারেন তবে এটি একটি বিশেষ ক্ষেত্রে।
সেমোফোরস এবং শর্ত ভেরিয়েবলগুলি লক দ্বারা সরবরাহিত পারস্পরিক বর্জনের শীর্ষে নির্মিত হয় এবং ভাগ করা সংস্থানগুলিতে সিঙ্ক্রোনাইজড অ্যাক্সেস সরবরাহ করতে ব্যবহৃত হয়। এগুলি একই উদ্দেশ্যে ব্যবহার করা যেতে পারে।
কোনও কন্ডিশন ভেরিয়েবল সাধারণত ব্যস্ততা এড়াতে ব্যবহৃত হয় (শর্ত পরীক্ষা করার সময় বারবার লুপিং করা) যখন কোনও সংস্থান উপলব্ধ হওয়ার অপেক্ষা করে থাকে। উদাহরণস্বরূপ, যদি আপনার কাছে একটি থ্রেড (বা একাধিক থ্রেড) থাকে যা একটি সারি খালি না হওয়া অবধি সামনে চালিয়ে যেতে না পারে, ব্যস্ততার অপেক্ষার পদ্ধতির মধ্যে কিছু থাকবে যেমন:
//pseudocode
while(!queue.empty())
{
sleep(1);
}
এটির সাথে সমস্যাটি হ'ল আপনি বারবার এই থ্রেডটি শর্তটি পরীক্ষা করে প্রসেসরের সময় নষ্ট করছেন। পরিবর্তে কেন একটি সিঙ্ক্রোনাইজেশন ভেরিয়েবল নেই যা থ্রেডটি সংস্থান করতে পারে যে সংস্থানটি পাওয়া যায়?
//pseudocode
syncVar.lock.acquire();
while(!queue.empty())
{
syncVar.wait();
}
//do stuff with queue
syncVar.lock.release();
সম্ভবতঃ, আপনার কাছে অন্য কোনও থ্রেড থাকবে যা জিনিসগুলিকে সারি থেকে সরিয়ে ফেলছে। যখন সারিটি খালি থাকে, তখন ঘুমোতে থাকা syncVar.signal()
এলোমেলো সুতাকে জাগিয়ে তোলার জন্য এটি কল করতে পারে syncVar.wait()
(অথবা সাধারণত অপেক্ষা করা সমস্ত থ্রেড জাগ্রত করার একটি উপায় signalAll()
বা broadcast()
পদ্ধতিও রয়েছে)।
আমি যখন সাধারণত একক নির্দিষ্ট শর্তের জন্য অপেক্ষা করি (যেমন সারিটি খালি থাকার জন্য) থাকে তখন আমি সাধারণত সিঙ্ক্রোনাইজেশন ভেরিয়েবলগুলি ব্যবহার করি।
সেমোফোরস একইভাবে ব্যবহার করা যেতে পারে, তবে আমি মনে করি যখন আপনার কাছে একটি শেয়ার্ড রিসোর্স থাকে যা কিছু সংখ্যক উপলভ্য জিনিসের উপর ভিত্তি করে উপলব্ধ এবং অনুপলব্ধ হতে পারে তখন সেগুলি আরও ভাল ব্যবহার করা হবে I উত্পাদক / ভোক্তাদের পরিস্থিতিতে সেমোফোরগুলি ভাল যেখানে উত্পাদকরা সম্পদ বরাদ্দ করছে এবং গ্রাহকরা সেগুলি গ্রাস করছেন।
আপনার যদি সোডা ভেন্ডিং মেশিন থাকে তবে চিন্তা করুন। এখানে কেবল একটি সোডা মেশিন রয়েছে এবং এটি একটি ভাগ করা সংস্থান। আপনার কাছে একটি থ্রেড রয়েছে যা একজন বিক্রেতা (প্রযোজক) যিনি মেশিনটিকে স্টক রাখার জন্য দায়বদ্ধ এবং এন থ্রেড যা ক্রেতা (গ্রাহক) যারা মেশিন থেকে সোডাস পেতে চান। মেশিনে সোডাসের সংখ্যাটি হল পূর্ণসংখ্যা মান যা আমাদের সেমোফোর চালিত করবে।
সোডা মেশিনে আসা প্রতিটি ক্রেতা (গ্রাহক) থ্রেড down()
একটি সোডা নিতে সেমফোর পদ্ধতিতে কল করে । এটি মেশিন থেকে একটি সোডা দখল করবে এবং উপলব্ধ সোডাসের সংখ্যা 1 দ্বারা হ্রাস করবে there যদি সেখানে সোডাস পাওয়া যায়, কোডটি down()
কোনও সমস্যা ছাড়াই কেবল বিবৃতি দিয়ে চলেছে । যদি কোনও সোডা উপলব্ধ না থাকে তবে সোডা আবার কখন উপলব্ধ হবে (যখন মেশিনে আরও সোডা থাকে) তার অবহিত হওয়ার জন্য অপেক্ষা করে থ্রেডটি এখানে ঘুমাবে।
বিক্রেতা (প্রযোজক) থ্রেড মূলত সোডা মেশিনটি খালি হওয়ার জন্য অপেক্ষা করবে waiting শেষ সোডাটি যখন মেশিন থেকে নেওয়া হয় তখন বিক্রেতাকে অবহিত করা হয় (এবং এক বা একাধিক গ্রাহক সম্ভবত সোডাস বের হওয়ার জন্য অপেক্ষা করছেন) waiting বিক্রেতারা সোডা মেশিনটি সেমফোর up()
পদ্ধতিতে পুনরায় চালু করবে , উপলব্ধ সোডাসের সংখ্যা প্রতিটি সময় বাড়ানো হবে এবং ততক্ষণে অপেক্ষাকৃত গ্রাহক থ্রেডকে অবহিত করা হবে যে আরও সোডা উপলব্ধ।
wait()
এবং signal()
একটি সমন্বয়সাধন পরিবর্তনশীল পদ্ধতি মধ্যে আড়াল করা থাকে down()
এবং up()
সেমফোর্ অভিযান।
অবশ্যই দুটি পছন্দের মধ্যে ওভারল্যাপ রয়েছে। অনেক দৃশ্য আছে যেখানে একটি সেমফোর বা শর্ত ভেরিয়েবল (বা শর্ত ভেরিয়েবলের সেট) উভয়ই আপনার উদ্দেশ্যগুলি পরিবেশন করতে পারে। উভয় semaphores এবং শর্ত ভেরিয়েবলগুলি একটি লক অবজেক্টের সাথে সম্পর্কিত যা তারা পারস্পরিক বর্জন বজায় রাখতে ব্যবহার করে তবে তারা থ্রেড এক্সিকিউশন সিঙ্ক্রোনাইজ করার জন্য লকের উপরে অতিরিক্ত কার্যকারিতা সরবরাহ করে। আপনার পরিস্থিতিটির জন্য কোনটি সর্বাধিক বোধ করে তা নির্ধারণ করা বেশিরভাগই আপনার উপর নির্ভর করে।
এটি অগত্যা সর্বাধিক প্রযুক্তিগত বিবরণ নয়, তবে এটি আমার মাথায় এটি কীভাবে উপলব্ধি করে।
হুডের নীচে কী রয়েছে তা প্রকাশ করা যাক।
শর্তাধীন পরিবর্তনশীল মূলত একটি অপেক্ষা-সারি , যা ব্লকিং-ওয়েট এবং ওয়েকআপ অপারেশনগুলিকে সমর্থন করে, অর্থাত আপনি ওয়েট-কাতারে একটি থ্রেড রেখে ব্লক-এ এটির স্টেট সেট করতে পারেন এবং এখান থেকে একটি থ্রেড বের করতে পারেন এবং এর রাজ্যটি প্রস্তুতের জন্য প্রস্তুত করতে পারেন।
নোট করুন যে একটি শর্তাধীন ভেরিয়েবল ব্যবহার করতে, অন্য দুটি উপাদান প্রয়োজন:
প্রোটোকলটি তখন হয়ে যায়,
সেমফোর মূলত একটি পাল্টা + একটি মিউটেক্স + একটি ওয়েট সারি। এটি এটি বাহ্যিক নির্ভরতা ছাড়াই যেমন ব্যবহার করা যায়। আপনি এটি মুটিেক্স বা শর্তসাপেক্ষ ভেরিয়েবল হিসাবে ব্যবহার করতে পারেন।
অতএব, semaphore শর্তযুক্ত ভেরিয়েবলের চেয়ে আরও পরিশীলিত কাঠামো হিসাবে বিবেচনা করা যেতে পারে, তবে উত্তরোত্তর আরও হালকা ও নমনীয়।
ভেরিয়েবলগুলির একচেটিয়া অ্যাক্সেস প্রয়োগ করতে সেমোফোরগুলি ব্যবহার করা যেতে পারে, তবে সেগুলি সিঙ্ক্রোনাইজেশনের জন্য ব্যবহৃত হয়। অন্যদিকে, মিউটেক্সগুলি একটি শব্দার্থবিজ্ঞান রয়েছে যা পারস্পরিক বর্জনের সাথে কঠোরভাবে সম্পর্কিত: কেবলমাত্র সেই প্রক্রিয়াটি যা সংস্থানটিকে লক করে রেখেছিল তা এটিকে আনলক করার অনুমতি দেয়।
দুর্ভাগ্যক্রমে আপনি মুটেক্সেসের সাথে সিঙ্ক্রোনাইজেশন প্রয়োগ করতে পারবেন না, এজন্য আমাদের শর্ত ভেরিয়েবল রয়েছে। এছাড়াও লক্ষ্য করুন যে কন্ডিশন ভেরিয়েবলের সাহায্যে আপনি ব্রডকাস্ট আনলকিং ব্যবহার করে একই তাত্ক্ষণীতে সমস্ত অপেক্ষার থ্রেডগুলি আনলক করতে পারেন। এটি semaphores দিয়ে করা যাবে না।
semaphore এবং শর্তের পরিবর্তনগুলি খুব অনুরূপ এবং বেশিরভাগ একই উদ্দেশ্যে ব্যবহৃত হয়। তবে, সামান্য পার্থক্য রয়েছে যা একটিকে পছন্দনীয় করে তুলতে পারে। উদাহরণস্বরূপ, বাধা সমন্বয় বাস্তবায়নের জন্য আপনি একটি সেমফোর ব্যবহার করতে সক্ষম হবেন না ut তবে একটি শর্ত পরিবর্তনশীল আদর্শ।
বাধা সমন্বয় হ'ল যখন আপনি সমস্ত থ্রেড ফাংশনের নির্দিষ্ট অংশে উপস্থিত না হওয়া পর্যন্ত আপনার সমস্ত থ্রেড অপেক্ষা করেন। এটি একটি স্থিতিশীল ভেরিয়েবল থাকার মাধ্যমে প্রয়োগ করা যেতে পারে যা প্রাথমিকভাবে প্রতিটি থ্রেডের দ্বারা অন্তর্ভুক্ত হওয়া মোট থ্রেডের মান যখন সেই বাধা পৌঁছে। এর অর্থ হ'ল আমরা প্রতিটি থ্রেডটি শেষটি না আসা পর্যন্ত ঘুমাতে চাই A একটি সেমফোর দিয়ে, প্রতিটি থ্রেড চলতে থাকবে এবং শেষ থ্রেড (যা সেমফোরের মানকে 0 তে নির্ধারণ করবে) ঘুমাতে যাবে।
অন্যদিকে শর্ত পরিবর্তনশীল, আদর্শ। যখন প্রতিটি থ্রেড বাধার দিকে যায় তখন আমরা আমাদের স্ট্যাটিক কাউন্টারটি শূন্য কিনা তা পরীক্ষা করে দেখি। যদি তা না হয় তবে আমরা কন্ডিশন ভেরিয়েবল ওয়েট ফাংশন সহ থ্রেডটিকে ঘুমাতে সেট করি। যখন শেষ থ্রেডটি বাধা আসবে, তখন পাল্টা মানটি শূন্যে কমে যাবে এবং এই শেষ থ্রেডটি শর্তটি পরিবর্তনশীল সংকেত ফাংশন বলবে যা অন্য সমস্ত থ্রেডকে জাগিয়ে তুলবে!
আমি মনিটর সিঙ্ক্রোনাইজেশনের অধীনে শর্ত ভেরিয়েবল ফাইল করি। আমি সাধারণত দুটি পৃথক সিঙ্ক্রোনাইজেশন শৈলী হিসাবে semaphores এবং মনিটর দেখেছি। রাষ্ট্রীয় ডেটা সহজাতভাবে কীভাবে রাখা হয় এবং আপনি কীভাবে কোডের মডেল বানাতে চান সে ক্ষেত্রে উভয়ের মধ্যে পার্থক্য রয়েছে - তবে সত্যিই এমন কোনও সমস্যা নেই যা একটি দ্বারা সমাধান করা যেতে পারে তবে অন্যটি নয়।
আমি মনিটর ফর্ম দিকে কোড প্রবণতা; বেশিরভাগ ভাষায় আমি যে ভাষায় কাজ করি তা নীচে নেমে আসে নিঃশব্দ, শর্ত ভেরিয়েবল এবং কিছু ব্যাকিং স্টেট ভেরিয়েবল। কিন্তু semaphores খুব কাজ করবে।
mutex
এবং conditional variables
সুত্রে প্রাপ্ত semaphore
।
mutex
, semaphore
ব্যবহার দুটি রাজ্য: 0, 1condition variables
semaphore
এগুলি সিনট্যাকটিক চিনির মতো