উত্তর:
সেমফোর গণনা করা যেতে পারে, যখন নিঃশব্দটি কেবল 1 টি গণনা করতে পারে।
মনে করুন আপনার কাছে একটি থ্রেড চলছে যা ক্লায়েন্ট সংযোগগুলি গ্রহণ করে। এই থ্রেড একই সাথে 10 টি ক্লায়েন্টকে পরিচালনা করতে পারে। তারপরে প্রতিটি নতুন ক্লায়েন্ট সেমফোরটি 10 টি না হওয়া পর্যন্ত সেট করে When যখন সেম্যাফোরে 10 টি পতাকা রয়েছে, তখন আপনার থ্রেড নতুন সংযোগ গ্রহণ করবে না
Mutex সাধারণত প্রহরী স্টাফ জন্য ব্যবহৃত হয়। মনে করুন আপনার 10 ক্লায়েন্ট সিস্টেমের একাধিক অংশ অ্যাক্সেস করতে পারে। তারপরে আপনি মিটেক্সের সাহায্যে সিস্টেমের একটি অংশ সুরক্ষিত করতে পারেন তাই যখন 1 ক্লায়েন্ট sub উপ-সিস্টেমে সংযুক্ত থাকে তখন অন্য কারও অ্যাক্সেস না পাওয়া উচিত। আপনি এই উদ্দেশ্যেও একটি সেমফোর ব্যবহার করতে পারেন। একটি মিউটেক্স হ'ল "মিউচুয়াল এক্সক্লুশন সেম্যাফোর" ।
ReentrantLock
। এই সব পুনরাবৃত্তি। আমি পুনরাবৃত্তিযোগ্য মুটেক্সেসের কোনও "বাস্তব-বিশ্বের" উদাহরণ সম্পর্কে অবগত নই (আমি কেবল পাঠ্যপুস্তকগুলিতে সেগুলি দেখেছি) তাই আমি সেগুলি বিবেচনা করি নি।
দুর্ভাগ্যক্রমে সবাই সেমফোর এবং মিটেক্সের মধ্যে সবচেয়ে গুরুত্বপূর্ণ পার্থক্যটি মিস করেছেন; " মালিকানা " ধারণা ।
সেম্যাফোোরেসগুলির মালিকানার কোনও ধারণা নেই, এর অর্থ হ'ল যে কোনও থ্রেড একটি সেমফোর প্রকাশ করতে পারে (এটি নিজেই অনেক সমস্যার কারণ হতে পারে তবে "মৃত্যু সনাক্তকরণ" এর সাথে সহায়তা করতে পারে)। যেখানে কোনও মিটেক্সের মালিকানার ধারণা রয়েছে (যেমন আপনি কেবলমাত্র নিজেরাই অর্জন করেছেন এমন মিউটেক্স প্রকাশ করতে পারবেন)।
সমবর্তী সিস্টেমগুলির নিরাপদ প্রোগ্রামিংয়ের জন্য মালিকানা অবিশ্বাস্যভাবে গুরুত্বপূর্ণ। আমি সবসময় একটি semaphore অগ্রাধিকার হিসাবে mutex ব্যবহার করার পরামর্শ দিতে হবে (কিন্তু কর্মক্ষমতা জড়িত আছে)।
মৌলিকাগুলি অগ্রাধিকারের উত্তরাধিকারকেও সমর্থন করতে পারে (যা অগ্রাধিকার বিপরীতে সমস্যার সাথে সহায়তা করতে পারে) এবং পুনরাবৃত্তি (এক ধরণের অচলাবস্থা দূর করে)।
এটিও উল্লেখ করা উচিত যে এখানে "বাইনারি" সেমোফোর এবং "গণনা / সাধারণ" সেমোফোর রয়েছে। জাভার semaphore একটি গণনা semaphore এবং এইভাবে এটি একাধিক মান দিয়ে আরম্ভ করার মঞ্জুরি দেয় (যেখানে উল্লেখ করা হয়েছে যে, একটি মিটেক্স কেবলমাত্র একটি ধারণাগত গণনা করতে পারে)। অন্যান্য দরকারী পোস্টগুলির মধ্যে এর কার্যকারিতাটি চিহ্নিত করা হয়েছে।
সুতরাং সংক্ষিপ্তসার হিসাবে, আপনার পরিচালনার একাধিক সংস্থান না থাকলে, আমি সর্বদা semaphore এর উপর মিটেক্সকে সুপারিশ করব।
মূটেক্স মূলত পারস্পরিক বর্জন। কেবলমাত্র একটি থ্রেড একবারে সংস্থানটি অর্জন করতে পারে। যখন একটি থ্রেড রিসোর্সটি অর্জন করে, থ্রেডটি রিলিজের মালিকানা না পাওয়া পর্যন্ত অন্য কোনও থ্রেডকে রিসোর্স অর্জন করার অনুমতি দেওয়া হয় না। সম্পদ অর্জনের জন্য অপেক্ষা করা সমস্ত থ্রেড অবরুদ্ধ করা হবে।
চালানো থ্রেডের সংখ্যা নিয়ন্ত্রণ করতে সেম্যাফোর ব্যবহার করা হয়। সংস্থার নির্দিষ্ট সেট থাকবে। থ্রেডের মালিকানাধীন প্রতিবার সম্পদ গণনা হ্রাস পাবে। যখন semaphore গণনা 0 পৌঁছে যায় তখন অন্য কোনও থ্রেড সংস্থান গ্রহণের অনুমতি দেয় না। অন্যান্য থ্রেডগুলির রিসোর্স রিলিজের মালিক হওয়া পর্যন্ত থ্রেডগুলি অবরুদ্ধ হয়ে যায়।
সংক্ষেপে, মূল পার্থক্যটি হ'ল একসাথে কতগুলি থ্রেড সংস্থান গ্রহণ করার অনুমতি দেওয়া হয়?
একটি সেমফোর একটি গণনা সিঙ্ক্রোনাইজেশন প্রক্রিয়া, একটি মিউটেক্স নয় x
এই প্রশ্নের প্রাসঙ্গিক উত্তর এবং সরকারী জাভা নির্দেশিকার লিঙ্ক রয়েছে: জাভাতে কোনও শব্দের কী আছে?
সেমফোর :
একটি গণনা সেমফোর। ধারণাগতভাবে, একটি সেমফোর অনুমতিগুলির একটি সেট বজায় রাখে।
acquire()
পারমিট না পাওয়া পর্যন্ত প্রতিটি ব্লক প্রয়োজন হয় এবং তারপরে এটি গ্রহণ করে। প্রত্যেকেrelease()
সম্ভাব্যভাবে একটি ব্লককারী অর্জনকারীকে মুক্তি দিয়ে একটি অনুমতি যুক্ত করে। তবে, কোনও আসল অনুমতি বস্তু ব্যবহার করা হয় না; সেমাফোর কেবল উপলব্ধ সংখ্যার একটি গণনা রাখে এবং সে অনুযায়ী কাজ করে।
কিছু (শারীরিক বা যৌক্তিক) সংস্থান অ্যাক্সেস করার চেয়ে থিমগুলির সংখ্যা সীমিত করার জন্য প্রায়শই সেমোফোরগুলি ব্যবহৃত হয়
জাভাতে বিল্ট-ইন মিটেক্স এপিআই নেই। তবে এটি বাইনারি সেমফোর হিসাবে প্রয়োগ করা যেতে পারে।
একটি সেম্যাফোর একটিকে আরম্ভ করা হয়েছিল, এবং এটি এমনভাবে ব্যবহৃত হয় যে এটিতে সর্বাধিক একটির অনুমতি পাওয়া যায়, এটি পারস্পরিক বর্জনীয় লক হিসাবে পরিবেশন করতে পারে। এটি বাইনারি সেম্যাফোর হিসাবে বেশি পরিচিত, কারণ এটিতে কেবল দুটি স্টেট রয়েছে: একটি পারমিট পাওয়া যায়, বা শূন্য অনুমতি পাওয়া যায়।
এই উপায়ে ব্যবহার করা হলে, বাইনারি সেম্যাফোরে সম্পত্তি রয়েছে (অনেকগুলি লক প্রয়োগের বিপরীতে), যে "লক "টি মালিক ছাড়া অন্য কোনও থ্রেড দ্বারা প্রকাশ করা যেতে পারে (যেহেতু সেমফোর্ডগুলির মালিকানার কোনও ধারণা নেই) । এটি কয়েকটি বিশেষায়িত প্রসঙ্গে যেমন ডেডলক পুনরুদ্ধারের ক্ষেত্রে কার্যকর হতে পারে।
তাই সেমাফোর এবং মুটেক্সের মধ্যে মূল পার্থক্য :
একটি উত্স থ্রোহগ পারমিট অ্যাক্সেসের জন্য সেমফোর থ্রেডগুলির সংখ্যাকে সীমাবদ্ধ করে। Mutex কেবলমাত্র একটি থ্রেড সংস্থান অ্যাক্সেসের অনুমতি দেয়।
কোনও থ্রেড সেমাপোরের মালিক নয়। থ্রেডগুলি কলিং acquire()
এবং release()
পদ্ধতিগুলির মাধ্যমে অনুমতিপত্রের সংখ্যা আপডেট করতে পারে । তালিটি কেবল থ্রেডের সাহায্যে বন্ধ রাখা উচিত।
কন্ডিশন ভেরিয়েবলের সাথে যখন কোনও মিউটেক্স ব্যবহার করা হয়, সেখানে একটি অন্তর্নিহিত বন্ধনী হয় — এটি স্পষ্ট যে প্রোগ্রামটির কোন অংশটি প্রোটেকটি হচ্ছে । এটি সম্ভবত সমুদ্রতটের ক্ষেত্রে নয়, যাকে সমকালীন প্রোগ্রামিং-এর যেতে যেতে বলা যেতে পারে powerfulএটি শক্তিশালী তবে একটি কাঠামোগত, অনির্ধারিত উপায়ে ব্যবহার করা খুব সহজ।
মেটেক্স বাইনারি সেমফোর। এটি অবশ্যই 1 দিয়ে শুরু করা উচিত, যাতে ফার্স্ট কাম ফার্স্ট সার্ভ নীতিটি পূরণ হয়। এটি আমাদের প্রতিটি মিটেক্সের অন্যান্য বিশেষ সম্পত্তি এনে দেয়: যিনি নীচে নেমেছেন তিনি অবশ্যই সেই ব্যক্তি যা করতে হবে । আমরা কিছু সংস্থান থেকে পারস্পরিক বর্জন পেয়েছি।
এখন আপনি দেখতে পেলেন যে একটি মিটেক্সটি সাধারণ সেমোফোরের একটি বিশেষ ক্ষেত্রে।
সিঙ্ক্রোনাইজেশনের সেম্যাফোরের অবজেক্টএকটি শাস্ত্রীয় ট্র্যাফিক আলো প্রয়োগ করে। একটি ট্র্যাফিক লাইট কাউন্টার দ্বারা ভাগ করা কোনও সংস্থানটিতে অ্যাক্সেস নিয়ন্ত্রণ করে। যদি কাউন্টার শূন্যের চেয়ে বেশি হয় তবে অ্যাক্সেস দেওয়া হবে; এটি শূন্য হলে অ্যাক্সেস অস্বীকার করা হয়। কাউন্টারটি সেই অনুমতিগুলি গণনা করে যা ভাগ করা সংস্থানগুলিতে অ্যাক্সেসের অনুমতি দেয়। তারপরে, সংস্থানটি অ্যাক্সেস করতে একটি থ্রেড অবশ্যই ট্র্যাফিক লাইটের অনুমতি গ্রহণ করবে। সাধারণভাবে, ট্র্যাফিক লাইট ব্যবহার করতে, যে থ্রেডটি ভাগ করা সংস্থানগুলি অ্যাক্সেস করতে চায় সেগুলি অনুমতি গ্রহণের চেষ্টা করে। ট্র্যাফিক লাইটের গণনা যদি শূন্যের চেয়ে বেশি হয় তবে থ্রেডটি অনুমতি গ্রহণ করে এবং ট্রাফিক আলোর গণনা হ্রাস পায়। অন্যথায় থ্রেডটি অনুমতি না পাওয়া পর্যন্ত লক করা আছে। যখন থ্রেডটিকে আর ভাগ করা সংস্থান অ্যাক্সেস করার দরকার নেই, তখন এটি অনুমতিটি প্রকাশ করে, তাই ট্র্যাফিক লাইটের গণনা বাড়ানো হয়েছে। যদি অনুমতিটির অপেক্ষায় অন্য কোনও থ্রেড থাকে, এটি তখন অনুমতি গ্রহণ করে। জাভা এর সেমফোর বর্গ এই প্রক্রিয়াটি প্রয়োগ করে।
সেমাফোরে দু'জন নির্মাতা রয়েছে:
Semaphore(int num)
Semaphore(int num, boolean come)
num পারমিটের প্রাথমিক গণনা নির্দিষ্ট করে। তারপরে সংখ্যা নির্দিষ্ট সময়গুলিতে একটি ভাগ করা সংস্থান অ্যাক্সেস করতে পারে এমন থ্রেডের সংখ্যা নির্দিষ্ট করে। যদি নামটি একটি হয় তবে এটি একবারে এক থ্রেডে রিসোর্সটি অ্যাক্সেস করতে পারে। সেটিংস সত্য হিসাবে আসার মাধ্যমে আপনি গ্যারান্টি দিতে পারবেন যে আপনি যে থ্রেডগুলির জন্য অপেক্ষা করছেন তারা যে অনুরোধ করেছেন তার ক্রম অনুযায়ী অনুমতি দেওয়া হয়েছে।
আপনি অতুলনীয় তুলনা করুন, প্রযুক্তিগতভাবে কোনও সেমফোর এবং মিটেক্সের মধ্যে কোনও পার্থক্য নেই যা এটি বোঝায় না। আপনার অ্যাপ্লিকেশন লজিকের যে কোনও নামের মতো মিউটেক্স কেবল একটি উল্লেখযোগ্য নাম, এটির অর্থ হল যে আপনি "1" এ একটি সেমফোর শুরু করেছিলেন, এটি সাধারণত কোনও উত্স বা সুরক্ষিত পরিবর্তনশীলকে পারস্পরিক বর্জনীয়তা নিশ্চিত করতে সুরক্ষিত করতে ব্যবহৃত হয়।