বাইনারি semaphore এবং mutex মধ্যে কোন পার্থক্য আছে বা সেগুলি মূলত একই?
বাইনারি semaphore এবং mutex মধ্যে কোন পার্থক্য আছে বা সেগুলি মূলত একই?
উত্তর:
এইগুলি হল না একই জিনিস। এগুলি বিভিন্ন কাজে ব্যবহৃত হয়!
উভয় প্রকারের সেমফোরের সম্পূর্ণ / খালি অবস্থা রয়েছে এবং একই API ব্যবহার করা হয়, তবে তাদের ব্যবহার খুব আলাদা।
মিউচুয়াল এক্সক্লুশন সেম্যাফোরস
মিউচুয়াল এক্সক্লুশন সেমোফোরগুলি শেয়ারড রিসোর্সগুলি (ডেটা স্ট্রাকচার, ফাইল ইত্যাদি) রক্ষা করতে ব্যবহৃত হয়।
একটি Mutex semaphore এটি গ্রহণ করে এমন কাজটির দ্বারা "মালিকানাধীন"। যদি টাস্ক বি বর্তমানে টাস্ক এ দ্বারা আটকানো একটি মিটেক্সকে সেমজিভ করার চেষ্টা করে, টাস্ক বি এর কল একটি ত্রুটি ফিরিয়ে দেবে এবং ব্যর্থ হবে।
নিঃশব্দ সবসময় নিম্নলিখিত ক্রম ব্যবহার করে:
- সেমটেক - জটিল অংশ - সেমজিভ
এখানে একটি সহজ উদাহরণ:
থ্রেড একটি থ্রেড খ মুটেক্স নিন অ্যাক্সেস ডেটা ... Mutex নিন <== অবরুদ্ধ করবে ... Mutex অ্যাক্সেস ডেটা দিন <== অবরোধ মুক্ত করুন ... মিটেক্স দিন
বাইনারি সেম্যাফোর
বাইনারি সেম্যাফোর একেবারে পৃথক প্রশ্নের ঠিকানা দেয়:
Task A Task B
... Take BinSemaphore <== wait for something
Do Something Noteworthy
Give BinSemaphore do something <== unblocks
নোট করুন যে বাইনারি সেম্যাফোর সহ, বি এর পক্ষে সেমফোর নেওয়া ঠিক আছে এবং এটিকে এটি দেওয়া হবে।
আবার, একটি বাইনারি সেমফোর কোনও সংস্থান অ্যাক্সেস থেকে রক্ষা করছে না। গ্রাহক দেওয়া এবং সেমফোর গ্রহণের কাজটি মূলত উদ্দীপ্ত হয়।
এটি একই বাইনারি semaphore একটি উপহার এবং একটি গ্রহণ তাই একই টাস্ক জন্য সামান্য জ্ঞান করে।
সুতরাং উত্পাদক-ভোক্তার মতো কিছু সিঙ্ক্রোনাইজেশন সমস্যার জন্য সেমোফোরগুলি আরও উপযুক্ত।
উইন্ডোজে, বাইনারি সেমোফোরগুলি মিউটেক্সগুলির চেয়ে ইভেন্ট অবজেক্টের মতো।
Mutex can be released only by thread that had acquired it
- আমি কেবল একটি সাধারণ pthread_mutex ভিত্তিক প্রোগ্রাম দিয়ে চেষ্টা করেছি, একটি থ্রেড মূল থ্রেডে থাকা মূটেক্সকে আনলক করতে পারে
টয়লেট উদাহরণটি একটি উপভোগ্য উপমা:
mutex:
একটি টয়লেট জন্য চাবি। একটি ব্যক্তির চাবি থাকতে পারে - টয়লেটটি দখল করুন - সময়ে। শেষ হয়ে গেলে, ব্যক্তিটি কাতারে থাকা পরবর্তী ব্যক্তিকে চাবি (মুক্ত করে) দেয়।
আনুষ্ঠানিকভাবে: "মুটেক্সগুলি সাধারণত পুনরায় প্রবেশকারী কোডের একটি অংশে অ্যাক্সেস সিরিয়াল করতে ব্যবহৃত হয় যা একাধিক থ্রেড দ্বারা একযোগে কার্যকর করা যায় না A এই বিভাগটি থেকে প্রথম থ্রেডটি বের না হওয়া অবধি অপেক্ষা করতে হবে। রেফ: সিম্বিয়ান বিকাশকারী গ্রন্থাগার
(একটি মিটেক্সটি হ'ল মান 1 সহ একটি সেমফোর))
সেমফোর্:
বিনামূল্যে অভিন্ন শৌচাগার কীগুলির সংখ্যা। উদাহরণস্বরূপ, বলুন যে আমাদের কাছে অভিন্ন লক এবং কী সহ চারটি টয়লেট রয়েছে। সেমফোর গণনা - কীগুলির গণনা - শুরুতে 4 এ সেট করা হয় (চারটি শৌচাগার নিখরচায়), তারপরে লোকেরা আসার সাথে সাথে গণনা মান হ্রাস পাবে all কোনও নিখরচায় কী নেই, সেমফোর গণনা 0 এখন e এক ব্যক্তি টয়লেট ছেড়ে যায়, সেমফোর 1 টি (একটি ফ্রি কী) এ উন্নীত হয় এবং পরের ব্যক্তিকে সারিতে দেওয়া হয়।
আনুষ্ঠানিকভাবে: "একটি সেম্যাফোর একটি শেয়ার্ড রিসোর্সের যুগপত ব্যবহারকারীর সংখ্যা সর্বাধিক সংখ্যক পর্যন্ত সীমাবদ্ধ করে Th " রেফ: সিম্বিয়ান বিকাশকারী গ্রন্থাগার
বিষয়টিতে দুর্দান্ত নিবন্ধগুলি:
অংশ 2 থেকে:
মিউটেক্স বাইনারি সেমফোরের নীতির সাথে একই সাথে একটি উল্লেখযোগ্য পার্থক্য: মালিকানার নীতি। মালিকানা হ'ল এই সহজ ধারণাটি যখন কোনও টাস্ক একটি মুটেক্সকে লক করে (অর্জন করে) কেবল তখনই এটি আনলক করতে পারে (মুক্তি দিতে পারে)। কোনও কাজ যদি কোনও মিউটেক্সকে আনলক করার চেষ্টা করে তবে এটি লক হয়নি (সুতরাং এটি নিজস্ব নয়) তবে একটি ত্রুটির শর্তটি সম্মুখীন হয় এবং সর্বাগ্রে গুরুত্বপূর্ণ, মিউটেক্সটি আনলক করা হয় না। যদি মিউচুয়াল এক্সক্লুসিভ অবজেক্টটির মালিকানা না থাকে তবে যাকে বলা হয় তা অপ্রাসঙ্গিক, এটি কোনও মিটেক্স নয়।
যেহেতু উপরের উত্তরগুলির কোনওটিই বিভ্রান্তি পরিষ্কার করে না, তাই এখানে আমার বিভ্রান্তি পরিষ্কার করা হয়েছে।
কড়া কথায় বলতে গেলে, একটি মিউটেক্স একটি লকিং প্রক্রিয়া যা কোনও সংস্থার অ্যাক্সেসকে সিঙ্ক্রোনাইজ করতে ব্যবহৃত হয়। কেবলমাত্র একটি কাজ (ওএস বিমূর্তির উপর ভিত্তি করে একটি থ্রেড বা প্রক্রিয়া হতে পারে) মিউটেক্সটি অর্জন করতে পারে। এর অর্থ মিটেক্সের সাথে সম্পর্কিত মালিকানা থাকবে এবং কেবল মালিক লকটি (মুটেক্স) প্রকাশ করতে পারবেন।
Semaphore সংকেত প্রক্রিয়া করছে ("আমি সম্পন্ন হয়েছি, আপনি চালিয়ে নিতে পারেন" ধরনের সংকেত)। উদাহরণস্বরূপ, আপনি যদি নিজের মোবাইলে গান শুনছেন (এটি এক কাজ হিসাবে ধরে নিন) এবং একই সময়ে আপনার বন্ধু আপনাকে ডেকেছে, একটি বাধাপ্রাপ্ত হবে যা একটি বিঘ্নিত পরিষেবা রুটিন (আইএসআর) কল প্রসেসিং টাস্ককে জাগ্রত করতে সংকেত দেবে ।
তাদের সিঙ্ক্রোনাইজেশন শব্দার্থবিদ্যা খুব আলাদা:
যেহেতু একটি টুঙ্কনটি টাস্ক থেকে কার্যগুলিতে রূপান্তরিত হিসাবে একটি মুটেক্স এবং একটি সেমফোরকে ট্র্যাফিক রেডলাইট হিসাবে দেখতে পায় (এটি এমন কাউকে ইঙ্গিত দেয় যে এটি এগিয়ে যেতে পারে)।
তাত্ত্বিক স্তরে, তারা শব্দার্থগতভাবে আলাদা নয়। আপনি semaphores বা বিপরীতে ব্যবহার করে একটি মিটেক্স প্রয়োগ করতে পারেন ( উদাহরণের জন্য এখানে দেখুন )। অনুশীলনে, বাস্তবায়ন আলাদা এবং তারা কিছুটা আলাদা পরিষেবা দেয়।
ব্যবহারিক পার্থক্য (তাদের চারপাশের সিস্টেম পরিষেবাদির নিরিখে) হ'ল মিউটেক্সের বাস্তবায়নটি আরও বেশি লাইটওয়েটের সিঙ্ক্রোনাইজেশন প্রক্রিয়া হওয়ার লক্ষ্য। ওরাকল-কথা, mutexes হিসাবে পরিচিত হয় Latches এবং semaphores হিসাবে পরিচিত হয় অপেক্ষা করছে ।
নিম্নতম স্তরে, তারা কিছু ধরণের পারমাণবিক পরীক্ষা এবং সেট মেকানিজম ব্যবহার করে। এটি মেমরির অবস্থানের বর্তমান মানটি পড়ছে, কিছু শর্তসাপেক্ষ শর্ত গণনা করে এবং কোনও একক নির্দেশনায় সেই স্থানে একটি মান লিখে দেয় যা বাধা দেওয়া যায় না । এর অর্থ হল আপনার আগে অন্য কারও কাছে এটি আছে কিনা তা দেখতে আপনি একটি মুটেক্স এবং পরীক্ষা অর্জন করতে পারেন।
একটি সাধারণ মুউটেক্স প্রয়োগের একটি প্রক্রিয়া বা থ্রেড থাকে যা টেস্ট অ্যান্ড সেট নির্দেশনা কার্যকর করে এবং মূল্যায়ন করে যে অন্য কোনও কিছু মিটেক্স সেট করেছে কিনা। এখানে একটি মূল বিষয় হ'ল শিডিয়ুলারের সাথে কোনও কথোপকথন নেই , তাই লকটি সেট করেছেন এমন আমাদের ধারণা নেই (এবং যত্ন নেই)। তারপরে আমরা হয় আমাদের সময় স্লাইস ছেড়ে দিয়ে আবার চেষ্টা করি যখন টাস্কটি পুনরায় নির্ধারিত হয় বা কোনও স্পিন-লক কার্যকর করা হয় । একটি স্পিন লক একটি অ্যালগরিদম এর মতো:
Count down from 5000:
i. Execute the test-and-set instruction
ii. If the mutex is clear, we have acquired it in the previous instruction
so we can exit the loop
iii. When we get to zero, give up our time slice.
যখন আমরা আমাদের সুরক্ষিত কোডটি কার্যকর করি (একটি সমালোচনা বিভাগ হিসাবে পরিচিত ) আমরা কেবলমাত্র মিটেক্স মানটি শূন্য বা যে কোনও অর্থ 'ক্লিয়ার' তে সেট করি। যদি একাধিক টাস্ক মিউটেক্স অর্জনের চেষ্টা করে তবে তারা পরবর্তী কাজটি মুটেেক্স প্রকাশের পরে নির্ধারিত হওয়ার পরে সংস্থানটিতে অ্যাক্সেস পাবে। সাধারণত আপনি একটি সিঙ্ক্রোনাইজড রিসোর্স নিয়ন্ত্রণ করতে মুটিেক্স ব্যবহার করবেন যেখানে একচেটিয়া অ্যাক্সেস কেবলমাত্র খুব অল্প সময়ের জন্য প্রয়োজন, সাধারণত একটি শেয়ার্ড ডেটা কাঠামোতে আপডেট করার জন্য।
একটি সেম্যাফোর একটি সিঙ্ক্রোনাইজড ডেটা স্ট্রাকচার (সাধারণত মুটেক্স ব্যবহার করে) যা একটি গণনা এবং কিছু সিস্টেম কল র্যাপার যা মুটেক্স লাইব্রেরিগুলির তুলনায় কিছুটা গভীরতায় শিডিয়ুলারের সাথে যোগাযোগ করে। Semaphores বর্ধিত এবং হ্রাস করা হয় এবং অন্য কিছু প্রস্তুত না হওয়া পর্যন্ত কাজগুলিতে ব্লক করতে ব্যবহৃত হয় । এর একটি সাধারণ উদাহরণের জন্য প্রযোজক / গ্রাহক সমস্যা দেখুন । সেমোফোরগুলি কিছু মূল্যের সাথে সূচনা করা হয় - বাইনারি সেম্যাফোরটি কেবল একটি বিশেষ ক্ষেত্রে যেখানে সেমফোরটি সূচনা করা হয় 1 থেকে একটি সেমফোরে পোস্ট করা একটি ওয়েটিং প্রক্রিয়া জাগ্রত করার প্রভাব রাখে।
একটি মৌলিক সেমফোর অ্যালগরিদম এর মতো দেখাচ্ছে:
(somewhere in the program startup)
Initialise the semaphore to its start-up value.
Acquiring a semaphore
i. (synchronised) Attempt to decrement the semaphore value
ii. If the value would be less than zero, put the task on the tail of the list of tasks waiting on the semaphore and give up the time slice.
Posting a semaphore
i. (synchronised) Increment the semaphore value
ii. If the value is greater or equal to the amount requested in the post at the front of the queue, take that task off the queue and make it runnable.
iii. Repeat (ii) for all tasks until the posted value is exhausted or there are no more tasks waiting.
বাইনারি semaphore ক্ষেত্রে উভয়ের মধ্যে প্রধান ব্যবহারিক পার্থক্য হ'ল প্রকৃত ডেটা কাঠামোকে ঘিরে থাকা সিস্টেম পরিষেবাদির প্রকৃতি।
সম্পাদনা: ইয়ান যেমন সঠিকভাবে নির্দেশ করেছে, স্পিনলকগুলি একটি একক প্রসেসর মেশিনকে ধীর করবে। আপনি কেবল একটি মাল্টি-প্রসেসর বাক্সে একটি স্পিনলক ব্যবহার করবেন কারণ একটি একক প্রসেসরে মূটেক্স ধারণ প্রক্রিয়া কখনই এটি পুনরায় সেট করতে পারে না যখন অন্য কোনও কাজ চলছে। স্পিনলকগুলি কেবলমাত্র বহু-প্রসেসরের আর্কিটেকচারে কার্যকর।
futex
সিস্টেম কল সহায়তা করার বিদ্যমান কম লেটেন্সি ইউজার-স্পেস mutex / সেমফোর্ বাস্তবায়নের। en.wikipedia.org/wiki/Futex ) নো-বিবাদের ফাস্ট পথে, অথবা যদি রিসোর্স প্রাপ্তিসাধ্য শীঘ্রই হয়ে, তোমাদের মধ্যে ওভারহেড কখনও একটি সিস্টেম কল। তবে আপনি ব্যস্ত-অপেক্ষার (কাটনা) কয়েক মাইক্রো সেকেন্ডের বেশি ব্যয় করবেন না। স্পিন-লুপ ব্যাক অফের প্যারামিটারগুলি টিউন করা এবং অপেক্ষা করা হার্ডওয়ার এবং কাজের চাপ-নির্ভর, অবশ্যই, তবে স্ট্যান্ডার্ড লাইব্রেরিতে সাধারণত যুক্তিসঙ্গত পছন্দ থাকে।
যদিও মিটেক্স এবং সেমোফোরগুলি সিঙ্ক্রোনাইজেশন আদিম হিসাবে ব্যবহৃত হয়, তবে তাদের মধ্যে একটি বড় পার্থক্য রয়েছে। মুটেেক্সের ক্ষেত্রে কেবল যে থ্রেডটি মুটেক্সকে লক করেছে বা অর্জন করেছে তা এটিকে আনলক করতে পারে। একটি সেমফোরের ক্ষেত্রে, সেমফোরের অপেক্ষায় থাকা থ্রেডটি আলাদা থ্রেড দ্বারা সংকেত দেওয়া যেতে পারে। কিছু অপারেটিং সিস্টেম প্রক্রিয়াটির মধ্যে মিটেক্স এবং সেমফোরগুলি ব্যবহার করে। সাধারণত ব্যবহার ভাগ করা মেমরিতে তৈরি করা হয়।
নিঃশব্দ: ধরুন আমাদের কাছে সমালোচনামূলক বিভাগের থ্রেড টি 1 এটি অ্যাক্সেস করতে চায় তবে এটি নীচের পদক্ষেপগুলি অনুসরণ করে। T1 এর:
বাইনারি সেমফোর: এটি সংকেত অপেক্ষা এবং সংকেতের ভিত্তিতে কাজ করে। অপেক্ষা (গুলি) হ্রাস "s" মান একটি দ্বারা "s" মান সাধারণত "1" মান দিয়ে আরম্ভ করা হয়, সংকেত (গুলি) দ্বারা "s" মান বৃদ্ধি পায়। যদি "s" মান 1 এর অর্থ কেউই সমালোচনামূলক বিভাগ ব্যবহার করে না, যখন মান 0 হয় সমালোচনা বিভাগটি ব্যবহৃত হয়। ধরুন থ্রেড টি 2 সমালোচনা বিভাগটি ব্যবহার করছে তারপরে এটি নীচের পদক্ষেপগুলি অনুসরণ করে। টি 2:
মুটেক্স এবং বাইনারি সেমফোরের মধ্যে মূল পার্থক্যটি মুটেক্সটে হয় যদি থ্রেডটি সমালোচনামূলক বিভাগটি লক করে থাকে তবে এটি সমালোচনামূলক বিভাগটিকে আনলক করতে হবে অন্য কোনও থ্রেড এটি আনলক করতে পারে না, তবে বাইনারি সেমফোরের ক্ষেত্রে যদি একটি থ্রেড সমালোচনামূলক বিভাগটি ওয়েট (গুলি) ফাংশন ব্যবহার করে লক করে তবে মানটি s এর "0" হয়ে যায় এবং "s" এর মান 1 না হওয়া পর্যন্ত কেউ এটিকে অ্যাক্সেস করতে পারে না তবে মনে করুন যে অন্য কিছু থ্রেড কল সিগন্যাল (গুলি) এর পরে "s" এর মান 1 হয়ে যায় এবং এটি অন্যান্য ফাংশনটিকে সমালোচনা বিভাগটি ব্যবহার করার অনুমতি দেয়। সুতরাং বাইনারি semaphore থ্রেডের মালিকানা নেই।
উইন্ডোজে, মিউটেক্স এবং বাইনারি সেমোফোরে দুটি পার্থক্য রয়েছে:
একটি মুটেক্স কেবল সেই থ্রেড দ্বারা প্রকাশিত হতে পারে যার মালিকানা রয়েছে, অর্থাৎ থ্রেড যা আগে ওয়েট ফাংশন নামে পরিচিত, (বা এটি তৈরির সময় মালিকানা নিয়েছিল)। যে কোনও থ্রেড দ্বারা একটি সেমফোর প্রকাশ করা যেতে পারে।
কোনও থ্রেড কোনও অবরুদ্ধতা ছাড়াই একটি মিটেক্সে বারবার অপেক্ষা ফাংশন কল করতে পারে। যাইহোক, আপনি যদি বাইনারি সেম্যাফোরে দু'বার ওয়েম ফাংশনটি সেম্যাফোরটিকে মাঝখানে না ছাড়িয়ে কল করেন তবে থ্রেডটি ব্লক হয়ে যাবে।
আপনি একইভাবে অন্য থ্রেড দ্বারা অ্যাক্সেস পেয়ে একটি থ্রেডে কোনও ডেটা লক করার জন্য স্পষ্টতই মুটেক্স ব্যবহার করেন। ধরে নিন যে আপনি সবেমাত্র ডেকেছেন lock()
এবং ডেটা অ্যাক্সেসের প্রক্রিয়ায়। এর অর্থ হ'ল আপনি অন্য কোনও থ্রেড (বা একই থ্রেড-কোডের অন্য কোনও উদাহরণ) একই মুটেক্স দ্বারা লক করা একই ডেটা অ্যাক্সেস করার আশা করেন না। এটি হ'ল, যদি এটি একই থ্রেড-কোডটি একটি ভিন্ন থ্রেড ইভেন্টে সম্পাদিত হয়, লকটিকে আঘাত করে, তবেlock()
সেখানে নিয়ন্ত্রণ প্রবাহকে অবরুদ্ধ করা উচিত। এটি কোনও থ্রেডে প্রযোজ্য যা পৃথক থ্রেড-কোড ব্যবহার করে যা একই ডেটা অ্যাক্সেস করছে এবং যা একই মিটেক্স দ্বারা লক করা রয়েছে। এই ক্ষেত্রে, আপনি এখনও ডেটা অ্যাক্সেসের প্রক্রিয়ায় রয়েছেন এবং বলুন যে, মিটেক্স আনলকটিতে পৌঁছাতে আরও 15 সেকেন্ড নেবে (যাতে অন্য থ্রেড যা মুটেক্স লকটিতে ব্লক হয়ে যাচ্ছে তা অবরোধ মুক্ত করে দেবে এবং নিয়ন্ত্রণের অনুমতি দেবে) ডেটা অ্যাক্সেস করুন)। আপনি কি কোনও মূল্যে অন্য থ্রেডকে কেবল একই মুটেক্সটিকে আনলক করার অনুমতি দিচ্ছেন এবং ঘুরেফিরে, যে থ্রেডটি ইতিমধ্যে অপেক্ষায় থাকা (ব্লক করা) মুটেক্স লকটিতে ডেটা অবরোধ মুক্ত রাখতে এবং অ্যাক্সেস করার অনুমতি দেবে? আশা করি আমি এখানে যা বলছি তা পেয়েছ? হিসাবে হিসাবে, সর্বজনীন সংজ্ঞা উপর একমত !,
সুতরাং, আপনি যদি মুটেক্সের পরিবর্তে বাইনারি-সেমোফোর ব্যবহার সম্পর্কে খুব বিশেষভাবে অবগত হন তবে লক এবং আনলকগুলি আপনার "স্কোপিং" করতে খুব সতর্ক হওয়া উচিত। আমি বোঝাতে চাইছি যে প্রতিটি নিয়ন্ত্রণ-প্রবাহ যা প্রতিটি লককে আঘাত করে তা একটি আনলক কলকে আঘাত করা উচিত, সেখানে কোনও "প্রথম আনলক" থাকা উচিত নয়, বরং এটি সর্বদা "প্রথম লক" হওয়া উচিত।
Mutex "লকিং মেকানিজম" এর জন্য ব্যবহৃত হয়। একবারে একটি প্রক্রিয়া একটি ভাগ করা সংস্থান ব্যবহার করতে পারে
যেহেতু
"আমি সম্পন্ন হয়েছি, এখন চালিয়ে যেতে পারে" এর মতো "সিগন্যালিং মেকানিজম" এর জন্য সেমোফোরগুলি ব্যবহার করা হয়
শ্রুতি:
একাধিক নিবন্ধ বলে যে "বাইনারি সেম্যাফোর এবং মিটেক্স একই হয়" বা "সেমোফোর 1 সহ মানটি মুটেক্স" তবে মূল পার্থক্যটি মুটেক্স কেবলমাত্র থ্রেড দ্বারা প্রকাশ করা যেতে পারে যা এটি অর্জন করেছিল, যখন আপনি অন্য কোনও থ্রেড থেকে সেমফোরকে সংকেত দিতে পারবেন
গুরুত্বপূর্ণ দিক:
• একটি থ্রেড একাধিক লক (মুটেক্স) অর্জন করতে পারে।
• কোনও মিউটেক্স কেবল একবারের বেশি লক করা যায় যদি এটির পুনরাবৃত্তিকারী মুটেক্স, এখানে লক এবং আনলকটি মিটেক্সের জন্য একই থাকে
A যদি একটি থ্রেড যা ইতিমধ্যে একটি মিউটেক্সকে লক করে রেখেছিল, আবার মিউটেক্সটিকে লক করার চেষ্টা করে, এটি সেই মুটেক্সের অপেক্ষার তালিকায় প্রবেশ করবে, যার ফলস্বরূপ অচলাবস্থা রয়েছে।
• বাইনারি সেমফোর এবং মিটেক্স একই তবে একই নয়।
• মুটেক্স এর সাথে সম্পর্কিত সুরক্ষা প্রোটোকলের কারণে ব্যয়বহুল অপারেশন।
Ute মিটেক্সের মূল লক্ষ্য হ'ল পারমাণবিক অ্যাক্সেস অর্জন করা বা সংস্থানটিতে লক করা
একটি মিটেক্স একক ভাগ করা সংস্থানগুলিতে অ্যাক্সেস নিয়ন্ত্রণ করে। এটি সেই সংস্থানটিতে () অ্যাক্সেস অর্জনের জন্য অপারেশন সরবরাহ করে এবং হয়ে গেলে () প্রকাশ করে।
একটি সেমফোর সম্পদগুলির একটি ভাগ করা পুলটিতে অ্যাক্সেস নিয়ন্ত্রণ করে। এটি পুলের কোনও সংস্থান উপলব্ধ না হওয়া অবধি অপেক্ষারত () অপারেশন সরবরাহ করে এবং যখন পুলটিতে ফেরত দেওয়া হয় তখন সিগন্যাল () সরবরাহ করে।
যখন একটি সেমফোর সুরক্ষিত সংস্থানগুলির সংখ্যা 1 এর চেয়ে বেশি হয়, তখন তাকে একটি গণনা সেমফোর বলা হয় । যখন এটি একটি সংস্থান নিয়ন্ত্রণ করে, তখন এটি বুলিয়ান সেমফোর নামে পরিচিত । একটি বুলিয়ান সেমফোর একটি মিউটেক্সের সমতুল্য।
সুতরাং একটি Semaphore Mutex তুলনায় একটি উচ্চ স্তরের বিমূর্ততা। একটি Mutex একটি Semaphore ব্যবহার করে প্রয়োগ করা যেতে পারে তবে অন্যভাবে নয়।
পরিবর্তিত প্রশ্নটি হ'ল - "লিনাক্স" এ "মিটেক্স" এবং "বাইনারি" সেমফোরের মধ্যে পার্থক্য কী?
উত্তর: নীচের পার্থক্যগুলি নিম্নরূপ - i) ব্যাপ্তি - মিটেক্সের ব্যাপ্তি একটি প্রক্রিয়া ঠিকানার জায়গার মধ্যে রয়েছে যা এটি তৈরি করেছে এবং থ্রেডগুলির সমন্বয়সাধনের জন্য ব্যবহৃত হয়। যেখানে প্রক্রিয়া স্থান জুড়ে semaphore ব্যবহার করা যেতে পারে এবং তাই এটি ইন্টারপ্রসেস সিঙ্ক্রোনাইজেশনের জন্য ব্যবহার করা যেতে পারে।
ii) মেটেক্সটি সেমোফোরের চেয়ে হালকা ও দ্রুত। ফুটেক্স আরও দ্রুত।
iii) Mutex একই থ্রেডের মাধ্যমে একাধিকবার সফলভাবে অধিগ্রহণ করা যেতে পারে এই শর্তে যে এটি একই সংখ্যক বার প্রকাশ করতে পারে। অন্যান্য থ্রেড অর্জন করার চেষ্টা করা অবরুদ্ধ হবে। যদিও সেমফোরের ক্ষেত্রে যদি একই প্রক্রিয়া আবার এটি অর্জন করার চেষ্টা করে তবে এটি কেবল একবারেই অধিগ্রহণ করা যেতে পারে।
বাইনারি সেম্যাফোর এবং মুটেক্সের মধ্যে পার্থক্য: মালিকানা: সেমফোরগুলি কোনও বর্তমানের মালিকের কাছ থেকে এমনকি সিগন্যাল (পোস্ট) করা যেতে পারে। এর অর্থ হল আপনি অন্য কোনও থ্রেড থেকে কেবল পোস্ট করতে পারেন, যদিও আপনি মালিক নন।
সেমাফোর প্রক্রিয়াধীন একটি সর্বজনীন সম্পত্তি, এটি কেবল কোনও মালিকের থ্রেড দ্বারা পোস্ট করা যায় can এই পার্থক্যটি বোল্ড অক্ষরে চিহ্নিত করুন, এটির অর্থ অনেক বেশি।
মিটেক্স সমালোচনামূলক অঞ্চলকে অবরুদ্ধ করার কাজ করে, তবে সেমফোর গণনায় কাজ করে।
http://www.geeksforgeeks.org/archives/9102 বিস্তারিত আলোচনা করেছে।
Mutex
একটি সংস্থান অ্যাক্সেস সিঙ্ক্রোনাইজ করতে ব্যবহৃত লক মেকানিজম হয়।
Semaphore
সংকেত প্রক্রিয়া হয়।
প্রোগ্রামার অবধি যদি সে / সে মুটিেক্সের জায়গায় বাইনারি সেমফোর ব্যবহার করতে চায়।
মিটেক্সগুলির একটি মালিক রয়েছে এই বিষয়টি বাদে দুটি বস্তু বিভিন্ন ব্যবহারের জন্য অনুকূলিত হতে পারে। মিউটেক্সগুলি কেবল অল্প সময়ের জন্যই ডিজাইন করা হয়েছে; এটি লঙ্ঘন খারাপ কর্মক্ষমতা এবং অন্যায্য সময়সূচী কারণ হতে পারে। উদাহরণস্বরূপ, একটি চলমান থ্রেডটিকে একটি মুটেক্স অর্জনের অনুমতি দেওয়া যেতে পারে, যদিও এটিতে অন্য থ্রেড ইতিমধ্যে অবরুদ্ধ রয়েছে। Semaphores আরও ন্যায্যতা প্রদান করতে পারে, বা ন্যায্যতা বেশ কয়েকটি শর্ত ভেরিয়েবল ব্যবহার করে বাধ্য করা যেতে পারে।
sem_post()
জন্য SCHED_FIFO
এবং SCHED_RR
(এই উভয় ডিফল্ট নেই): সর্বোচ্চ অগ্রাধিকার থ্রেড, এবং যদি একই অগ্রাধিকার, থ্রেড করেছে যে দীর্ঘতম অপেক্ষা করা হয়েছে সঙ্গে একাধিক হয়। ওপেনসোলারিস এমনকি সাধারণ সময় নির্ধারণের জন্য এই ফিফোর নিয়মটিকে কিছুটা ডিগ্রি অনুসরণ করে। গ্লিবসি এবং ফ্রিবিএসডি-র জন্য, একটি সাধারণ মুটেক্স আনলক করা (যেমন অগ্রাধিকার রক্ষা বা অগ্রাধিকারের উত্তরাধিকার নয়) এবং সেমফোর পোস্ট করা মূলত একই, অবজেক্টটিকে আনলক করা হিসাবে চিহ্নিত করা হয় এবং তারপরে, যদি অপেক্ষা থ্রেড থাকতে পারে, জেগে উঠার জন্য কার্নেলকে কল করে।
উইন্ডোতে পার্থক্যটি নীচের মতো। মিউটেক্স: প্রক্রিয়া যা সাফল্যের সাথে অপেক্ষা করে তার জন্য একটি সিগন্যাল কার্যকর করতে হয় এবং বিপরীতে। বাইনারি SEMAPHORES: বিভিন্ন প্রসেস নির্বাহ করতে পারেন অপেক্ষার বা সংকেত একটি সেমফোর্ উপর অপারেশন।
বাইনারি সেমফোরটি একটি মুটেক্স হিসাবে ব্যবহার করা যেতে পারে, তবে একটি মুটেক্স আরও সুনির্দিষ্ট ব্যবহারের ক্ষেত্রে হয়, কেবলমাত্র সেই প্রক্রিয়াটি যে মুটেক্সটিকে লক করে রেখেছিল তা আনলক করার কথা। এই মালিকানার সীমাবদ্ধতা এর বিরুদ্ধে সুরক্ষা সরবরাহ করা সম্ভব করে তোলে:
এই সীমাবদ্ধতাগুলি সর্বদা উপস্থিত হয় না কারণ তারা গতি হ্রাস করে। আপনার কোডের বিকাশের সময় আপনি এই চেকগুলি সাময়িকভাবে সক্ষম করতে পারবেন।
যেমন আপনি নিজের মিটেক্সে ত্রুটি চেক বৈশিষ্ট্য সক্ষম করতে পারেন। EDEADLK
আপনি যদি একইটিকে দু'বার লক করার চেষ্টা করেন এবং EPERM
আপনি যদি এমন কোনও মিটেক্সকে আনলক করেন তবে মুটেক্সগুলি ফিরে আসার সময় ত্রুটি ।
pthread_mutex_t mutex;
pthread_mutexattr_t attr;
pthread_mutexattr_init (&attr);
pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_ERRORCHECK_NP);
pthread_mutex_init (&mutex, &attr);
একবার সূচনা করার পরে আমরা আমাদের কোডগুলিতে এই চেকগুলি রাখতে পারি:
if(pthread_mutex_unlock(&mutex)==EPERM)
printf("Unlock failed:Mutex not owned by this thread\n");
উপরের পোস্টগুলিতে যাওয়ার পরে ধারণাটি আমার কাছে পরিষ্কার ছিল। তবে কিছু দীর্ঘ প্রশ্ন ছিল। তো, আমি এই ছোট্ট কোডটি লিখেছি।
যখন আমরা এটি না নিয়ে সেমফোর দেওয়ার চেষ্টা করি তখন তা হয়ে যায়। কিন্তু, আপনি যখন এটি না নিয়ে একটি মুটেক্স দেওয়ার চেষ্টা করেন, এটি ব্যর্থ হয়। আমি এটি একটি উইন্ডোজ প্ল্যাটফর্মে পরীক্ষা করেছি। MUTEX ব্যবহার করে একই কোড চালানোর জন্য USE_MUTEX সক্ষম করুন।
#include <stdio.h>
#include <windows.h>
#define xUSE_MUTEX 1
#define MAX_SEM_COUNT 1
DWORD WINAPI Thread_no_1( LPVOID lpParam );
DWORD WINAPI Thread_no_2( LPVOID lpParam );
HANDLE Handle_Of_Thread_1 = 0;
HANDLE Handle_Of_Thread_2 = 0;
int Data_Of_Thread_1 = 1;
int Data_Of_Thread_2 = 2;
HANDLE ghMutex = NULL;
HANDLE ghSemaphore = NULL;
int main(void)
{
#ifdef USE_MUTEX
ghMutex = CreateMutex( NULL, FALSE, NULL);
if (ghMutex == NULL)
{
printf("CreateMutex error: %d\n", GetLastError());
return 1;
}
#else
// Create a semaphore with initial and max counts of MAX_SEM_COUNT
ghSemaphore = CreateSemaphore(NULL,MAX_SEM_COUNT,MAX_SEM_COUNT,NULL);
if (ghSemaphore == NULL)
{
printf("CreateSemaphore error: %d\n", GetLastError());
return 1;
}
#endif
// Create thread 1.
Handle_Of_Thread_1 = CreateThread( NULL, 0,Thread_no_1, &Data_Of_Thread_1, 0, NULL);
if ( Handle_Of_Thread_1 == NULL)
{
printf("Create first thread problem \n");
return 1;
}
/* sleep for 5 seconds **/
Sleep(5 * 1000);
/*Create thread 2 */
Handle_Of_Thread_2 = CreateThread( NULL, 0,Thread_no_2, &Data_Of_Thread_2, 0, NULL);
if ( Handle_Of_Thread_2 == NULL)
{
printf("Create second thread problem \n");
return 1;
}
// Sleep for 20 seconds
Sleep(20 * 1000);
printf("Out of the program \n");
return 0;
}
int my_critical_section_code(HANDLE thread_handle)
{
#ifdef USE_MUTEX
if(thread_handle == Handle_Of_Thread_1)
{
/* get the lock */
WaitForSingleObject(ghMutex, INFINITE);
printf("Thread 1 holding the mutex \n");
}
#else
/* get the semaphore */
if(thread_handle == Handle_Of_Thread_1)
{
WaitForSingleObject(ghSemaphore, INFINITE);
printf("Thread 1 holding semaphore \n");
}
#endif
if(thread_handle == Handle_Of_Thread_1)
{
/* sleep for 10 seconds */
Sleep(10 * 1000);
#ifdef USE_MUTEX
printf("Thread 1 about to release mutex \n");
#else
printf("Thread 1 about to release semaphore \n");
#endif
}
else
{
/* sleep for 3 secconds */
Sleep(3 * 1000);
}
#ifdef USE_MUTEX
/* release the lock*/
if(!ReleaseMutex(ghMutex))
{
printf("Release Mutex error in thread %d: error # %d\n", (thread_handle == Handle_Of_Thread_1 ? 1:2),GetLastError());
}
#else
if (!ReleaseSemaphore(ghSemaphore,1,NULL) )
{
printf("ReleaseSemaphore error in thread %d: error # %d\n",(thread_handle == Handle_Of_Thread_1 ? 1:2), GetLastError());
}
#endif
return 0;
}
DWORD WINAPI Thread_no_1( LPVOID lpParam )
{
my_critical_section_code(Handle_Of_Thread_1);
return 0;
}
DWORD WINAPI Thread_no_2( LPVOID lpParam )
{
my_critical_section_code(Handle_Of_Thread_2);
return 0;
}
যদিও সেমফোর আপনাকে "এটি একটি সংস্থান ব্যবহার করে সম্পন্ন করা হয়েছে" সংকেত দিতে দেয়, যদিও এটি কখনও সম্পদের মালিকানাধীন না, সেহেতু আমার মনে হয় যে সেমোফোরেসের মালিকানা এবং সংকেতের মধ্যে একটি খুব আলগা দম্পতি রয়েছে।
সংবেদনশীল কোড এবং ডেটা সুরক্ষিত করতে মেটেক্স ব্যবহার করা হয়, সিমফোরটি সিঙ্ক্রোনাইজেশনের জন্য ব্যবহৃত হয় the সংবেদনশীল কোডটি সুরক্ষিত করার জন্য আপনি ব্যবহারিক ব্যবহার করতে পারেন, তবে অপারেশন দ্বারা অন্য থ্রেড দ্বারা সুরক্ষা প্রকাশ করার ঝুঁকি থাকতে পারে ভি.এসো মূল দ্বি-সেম্যাফোর এবং মূটেক্সের মধ্যে পার্থক্য হল মালিকানা For উদাহরণস্বরূপ টয়লেট দ্বারা মুটেক্স এমনটি হয় যে কোনও ব্যক্তি টয়লেটে প্রবেশ করতে পারে এবং দরজাটি লক করতে পারে the টয়লেট এবং দরজাটি লক করে রাখলেও প্রশাসককে দরজা খোলার অনুরোধ করে অন্য কেউ প্রবেশ করতে পারে, এটি হাস্যকর।
mutex
মিউটেক্সগুলি সাধারণত পুনরায় প্রবেশকারী কোডের একটি অংশে অ্যাক্সেস সিরিয়াল করতে ব্যবহৃত হয় যা একাধিক থ্রেড দ্বারা একযোগে কার্যকর করা যায় না। কোনও মিউটেক্স অবজেক্টটি কেবল একটি থ্রেডকে নিয়ন্ত্রিত বিভাগে অনুমতি দেয়, অন্যান্য থ্রেডগুলিকে বাধ্য করে যা সেই বিভাগ থেকে অ্যাক্সেস অর্জনের চেষ্টা করে যা প্রথম থ্রেডটি সেই বিভাগ থেকে বের হওয়া অবধি অপেক্ষা করতে পারে a মিউটেক্সের ব্যবহারিক ব্যবহার একটি শেয়ার্ড রিসোর্সকে রক্ষা করা বিপজ্জনক হতে পারে অনিচ্ছাকৃত পার্শ্ব প্রতিক্রিয়া। যে কোনও দুটি আরটিওএস টাস্ক যা বিভিন্ন অগ্রাধিকারে পরিচালনা করে এবং একটি মিটেক্সের মাধ্যমে সমন্বয় করে, অগ্রাধিকার বিপরীতের সুযোগ তৈরি করে । Mutex ব্যবহারকারীর স্পেসে কাজ করে ।
সেমফোর্
Semaphore একটি সংকেত প্রক্রিয়া। সেমফোর একটি শেয়ারড রিসোর্সের একযোগে ব্যবহারকারীর সংখ্যা সর্বাধিক সংখ্যক পর্যন্ত সীমাবদ্ধ করে। থ্রেডগুলি রিসোর্সে অ্যাক্সেসের (সেমফোর হ্রাসকরণ) অনুরোধ করতে পারে এবং সংকেত দিতে পারে যে তারা সংস্থানটি ব্যবহার করে শেষ করেছেন (সেমফোর বাড়ানো)। এটি ভাগ করে নেওয়া সংস্থানগুলিতে অ্যাক্সেসের জন্য থ্রেডের সংখ্যাকে মঞ্জুরি দেয় a সেমফোরের সঠিক ব্যবহার হ'ল এক টাস্ক থেকে অন্য টাস্কে সিগন্যাল দেওয়ার জন্য se সেফেরগুলি কোনও কাজটিতে একটি বিঘ্নিত পরিষেবা রুটিন (আইএসআর) থেকে সিগন্যাল দেওয়ার জন্যও ব্যবহার করা যেতে পারে । একটি সেমফোর সিগন্যাল করা একটি অ-ব্লক করা আরটিওএস আচরণ এবং সুতরাং আইএসআর নিরাপদ। কারণ এই কৌশলটি ত্রুটি-প্রবণটিকে টাস্ক পর্যায়ে বাধা নিষ্ক্রিয় করার প্রয়োজনটি দূর করে his এটি কার্নেল স্পেসে কাজ করে ।
উত্তর লক্ষ্যযুক্ত ওএসের উপর নির্ভর করে। উদাহরণস্বরূপ, কমপক্ষে একটি আরটিওএস বাস্তবায়নের সাথে আমি পরিচিত যা একক ওএস মুটেক্সের বিরুদ্ধে একাধিক সিক্যুয়াল "পেতে" অপারেশনগুলিকে অনুমতি দেবে, যতক্ষণ না তারা সবাই একই থ্রেড প্রসঙ্গে থাকে। অন্য থ্রেডকে মিউটেক্স পাওয়ার অনুমতি দেওয়ার আগে একাধিক গেসগুলি সমান সংখ্যক পুট দ্বারা প্রতিস্থাপন করতে হবে। এটি বাইনারি আঞ্চলিক অঞ্চল থেকে পৃথক, যার জন্য থ্রেড প্রসঙ্গ নির্বিশেষে একবারে কেবলমাত্র একক প্রাপ্তির অনুমতি রয়েছে।
এই ধরণের মিটেক্সের পিছনে ধারণাটি হ'ল আপনি কেবল কোনও একক প্রসঙ্গে একবারে ডেটা পরিবর্তন করার অনুমতি দিয়ে কোনও বিষয় রক্ষা করেন। এমনকি যদি থ্রেডটি মিটেক্সটি পায় এবং তারপরে এমন কোনও ফাংশন কল করে যা বস্তুটিকে আরও সংশোধন করে (এবং প্রোটেক্টরকে তার নিজের অপারেশনগুলির আশেপাশে রাখে / রাখে), অপারেশনগুলি এখনও নিরাপদ থাকা উচিত কারণ এগুলি সবই একটি থ্রেডের অধীনে ঘটছে।
{
mutexGet(); // Other threads can no longer get the mutex.
// Make changes to the protected object.
// ...
objectModify(); // Also gets/puts the mutex. Only allowed from this thread context.
// Make more changes to the protected object.
// ...
mutexPut(); // Finally allows other threads to get the mutex.
}
অবশ্যই, এই বৈশিষ্ট্যটি ব্যবহার করার সময়, আপনাকে অবশ্যই নিশ্চিত হতে হবে যে একক থ্রেডের মধ্যে সমস্ত অ্যাক্সেসগুলি সত্যই নিরাপদ!
আমি নিশ্চিত নই যে এই পদ্ধতিটি কতটা সাধারণ, বা আমার পরিচিত সিস্টেমগুলির বাইরে এটি প্রযোজ্য কিনা। এই ধরণের মিটেক্সের উদাহরণের জন্য থ্রেডএক্স আরটিওএস দেখুন।
মেটেক্সগুলির মালিকানা রয়েছে, সেমফোরগুলি থেকে আলাদা। যদিও কোনও থ্রেড, একটি মুটেক্সের আওতায়, একটি আনলক করা মুটেক্স এবং কোডের একই সমালোচনামূলক বিভাগে লক অ্যাক্সেস পেতে পারে, কেবল কেবল সেই থ্রেড যা মুটেক্সকে লক করে রাখা উচিত এটি আনলক করা উচিত ।
এখানে যেমন অনেক লোক উল্লেখ করেছেন, একটি মুটেক্স ব্যবহার করা হয়েছে একটি সমালোচনামূলক কোডের সুরক্ষার জন্য (একা সমালোচনা বিভাগ।) আপনি মুটেক্স (লক) অর্জন করবেন, সমালোচনা বিভাগে প্রবেশ করবেন এবং মুটেক্স (আনলক) সমস্ত একই থ্রেডে ছেড়ে দেবেন ।
একটি সেমফোর ব্যবহার করার সময়, আপনি একটি থ্রেড একটি সেমফোরে অপেক্ষা করতে পারেন (থ্রেড এ বলুন), যতক্ষণ না অন্য থ্রেড (থ্রেড বি বলুন) যে কোনও কাজ সম্পন্ন না করে, এবং তারপরে থামা এটির জন্য সেমফোর সেট করে অপেক্ষাটি থামিয়ে দেয় এবং তার কাজটি চালিয়ে যায়।
সবচেয়ে ভালো সমাধান
পার্থক্য একটাই
1. মিউটেক্স -> লক এবং আনলকটি এমন থ্রেডের মালিকানাধীন যা মুটেক্সকে লক করে রাখে।
2.Semaphore -> মালিকানা নেই অর্থাৎ; যদি একটি থ্রেড সেমওয়েট (গুলি) কে কল করে অন্য কোনও থ্রেডটি লকটি সরাতে সেম্পস্ট (গুলি) কল করতে পারে।
mutex
সম্প্রতি অবধি, কার্নেলের একমাত্র স্লিপিং লকটি ছিল সেমফোর। সেমফোরসের বেশিরভাগ ব্যবহারকারী একটি জনের সাথে একটি সেমফোর ইনস্ট্যান্ট করেছিলেন এবং তাদেরকে মিউচুয়াল এক্সক্লুশন লক হিসাবে গণ্য করেছিলেন the স্পিন-লকের একটি ঘুমন্ত সংস্করণ। দুর্ভাগ্যক্রমে, semaphores বরং জেনেরিক এবং কোনও ব্যবহারের সীমাবদ্ধতা চাপায় না। এটি তাদেরকে অস্পষ্ট পরিস্থিতিতে একচেটিয়া অ্যাক্সেস পরিচালনার জন্য দরকারী করে যেমন কার্নেল এবং ইউজারস্পেসের মধ্যে জটিল নাচ। তবে এর অর্থ হ'ল সহজ লকিং করা আরও কঠিন, এবং প্রয়োগের নিয়মের অভাবে কোনও ধরণের স্বয়ংক্রিয় ডিবাগিং বা সীমাবদ্ধ প্রয়োগ কার্যকর করা অসম্ভব হয়ে পড়ে। একটি সহজ স্লিপিং লক খুঁজছেন, কার্নেল বিকাশকারীরা মিউটেক্সটি উপস্থাপন করলেন es হ্যাঁ, আপনি এখন যেমন অভ্যস্ত, এটি একটি বিভ্রান্তিকর নাম। আসুন আমরা স্পষ্ট করে বলি mutual "মুটেক্স" শব্দটি একটি সাধারণ নাম যা কোনও ঘুমের লককে বোঝায় যা পারস্পরিক বর্জনকে বাধ্য করে, যেমন একটি ব্যবহারের গণনা সহ সেমফোর। সাম্প্রতিক লিনাক্স কার্নেলগুলিতে, যথাযথ বিশেষ্য "মুটেক্স" এখন একটি নির্দিষ্ট ধরণের স্লিপিং লক যা পারস্পরিক বর্জনকে কার্যকর করে। এটি হ'ল একটি মিউেক্স একটি মিউটেক্স।
মুটেক্সের সরলতা এবং দক্ষতা সেমফোরের যা প্রয়োজন তার উপরে এবং তার উপরে তার ব্যবহারকারীদের উপর আরোপিত অতিরিক্ত বাধা থেকে আসে। একটি সেমফোরের বিপরীতে, যা ডিজকস্ট্রার মূল নকশা অনুসারে আচরণের সবচেয়ে মৌলিক আচরণকে বাস্তবায়িত করে, মিউটেক্সের আরও কঠোর, সংকীর্ণ ব্যবহারের ক্ষেত্রে রয়েছে: n একসময় কেবলমাত্র একটি কার্য মুটিেক্সকে ধরে রাখতে পারে। অর্থাত্, একটি মিটেক্সে ব্যবহারের সংখ্যা সর্বদা এক is
[1] লিনাক্স কার্নেল বিকাশ, তৃতীয় সংস্করণ রবার্ট লাভ
আমি মনে করি এখানে বেশিরভাগ উত্তরগুলি বিভ্রান্তিকর ছিল বিশেষত যারা বলেছিল যে মুটেেক্স কেবল এটির প্রক্রিয়া দ্বারা প্রকাশ করা যেতে পারে তবে সেমফোরটি অ্যায় প্রক্রিয়া দ্বারা সংকেত দেওয়া যেতে পারে। উপরের লাইনটি সেমফোরের ক্ষেত্রে এক ধরণের অস্পষ্ট। বোঝার জন্য আমাদের জানতে হবে যে দুটি ধরণের সেমফোর রয়েছে একটির নাম গণনা সেমফোর এবং অন্যটিকে বাইনারি সেমফোর বলা হয়। সেমফোর গণনায় n সংখ্যার সংস্থানগুলিতে অ্যাক্সেস পরিচালনা করে যেখানে n ব্যবহারের আগে সংজ্ঞায়িত করা যায়। প্রতিটি semaphore একটি গণনা ভেরিয়েবল রয়েছে, যা ব্যবহারে সংস্থান হিসাবে সংখ্যার গণনা রাখে, প্রাথমিকভাবে, এটি এন সেট করা হয়। প্রতিটি প্রক্রিয়া যা কোনও সংস্থান ব্যবহার করতে চায় সেমফোরে ওয়েট () অপারেশন করে (যার মাধ্যমে গণনা হ্রাস করা হয়)। যখন কোনও প্রক্রিয়া কোনও সংস্থান প্রকাশ করে, তখন এটি একটি রিলিজ () অপারেশন করে (গণনা বৃদ্ধি করে)। গণনা যখন 0 হয়, সমস্ত সংস্থান ব্যবহার করা হচ্ছে। এর পরে, প্রক্রিয়াটি গণনা 0 এর চেয়ে বেশি হয়ে ওঠার আগে পর্যন্ত অপেক্ষা করে Now এখন এখানে কেবল ক্যাচটিই কেবল প্রক্রিয়াটি সংস্থানকে বাড়িয়ে তুলতে পারে অন্য কোনও প্রক্রিয়া গণনা বাড়াতে পারে না কেবল কোনও উত্স ধারণকারী প্রক্রিয়াগুলি গণনা এবং প্রক্রিয়া বৃদ্ধি করতে পারে সেম্যাফোরের জন্য অপেক্ষা করে আবার চেক করে এবং যখন এটি উপলব্ধ সংস্থানটি দেখায় এটি আবার গণনা হ্রাস করে। সুতরাং বাইনারি সেমফোরের ক্ষেত্রে, কেবলমাত্র সেমফোরটি ধরে রাখার প্রক্রিয়াটি গণনা বাড়িয়ে তুলতে পারে এবং সেমফোরটি ব্যবহার বন্ধ না করা এবং গণনা বৃদ্ধি করা এবং অন্যান্য প্রক্রিয়াটি সেমফোর অ্যাক্সেস করার সুযোগ না পাওয়া পর্যন্ত গণনা শূন্য থেকে যায়। এখন এখানে ধরা কেবলমাত্র সেই প্রক্রিয়া যা সংস্থান বাড়িয়ে তুলতে পারে অন্য কোনও প্রক্রিয়া গণনা বাড়াতে পারে না কেবল কোনও উত্স ধারণকারী প্রক্রিয়াগুলি গণনা বাড়াতে পারে এবং সেমফোরের অপেক্ষায় থাকা প্রক্রিয়াটি আবার পরীক্ষা করে এবং যখন এটি উপলব্ধ সংস্থানটি উপলব্ধ দেখায় আবার গণনা হ্রাস। সুতরাং বাইনারি সেমফোরের ক্ষেত্রে, কেবলমাত্র সেমফোরটি ধরে রাখার প্রক্রিয়াটি গণনা বাড়িয়ে তুলতে পারে এবং সেমফোরটি ব্যবহার বন্ধ না করা এবং গণনা বৃদ্ধি করা এবং অন্যান্য প্রক্রিয়াটি সেমফোর অ্যাক্সেস করার সুযোগ না পাওয়া পর্যন্ত গণনা শূন্য থেকে যায়। এখন এখানে ধরা কেবলমাত্র সেই প্রক্রিয়া যা সংস্থান বাড়িয়ে তুলতে পারে অন্য কোনও প্রক্রিয়া গণনা বাড়াতে পারে না কেবল কোনও উত্স ধারণকারী প্রক্রিয়াগুলি গণনা বাড়াতে পারে এবং সেমফোরের অপেক্ষায় থাকা প্রক্রিয়াটি আবার পরীক্ষা করে এবং যখন এটি উপলব্ধ সংস্থানটি উপলব্ধ দেখায় আবার গণনা হ্রাস। সুতরাং বাইনারি সেমফোরের ক্ষেত্রে, কেবলমাত্র সেমফোরটি ধরে রাখার প্রক্রিয়াটি গণনা বাড়িয়ে তুলতে পারে এবং সেমফোরটি ব্যবহার বন্ধ না করা এবং গণনা বৃদ্ধি করা এবং অন্যান্য প্রক্রিয়াটি সেমফোর অ্যাক্সেস করার সুযোগ না পাওয়া পর্যন্ত গণনা শূন্য থেকে যায়।
বাইনারি সেম্যাফোর এবং মিটেক্সের মধ্যে প্রধান পার্থক্যটি হ'ল সেমফোর একটি সংকেত প্রক্রিয়া এবং মিউটেক্স একটি লকিং মেকানিজম, তবে বাইনারি সেম্যাফোরটি মুটেক্সের মতো কাজ করে যা বিভ্রান্তি সৃষ্টি করে, তবে উভয়ই বিভিন্ন ধরণের কাজের জন্য উপযুক্ত বিভিন্ন ধারণা।