সেমফোর কী?


349

একটি সেমফোর একটি প্রোগ্রামিং ধারণা যা ঘন ঘন মাল্টি থ্রেডিং সমস্যাগুলি সমাধান করার জন্য ব্যবহৃত হয়। সম্প্রদায়ের কাছে আমার প্রশ্ন:

একটি সেমফোর কী এবং আপনি কীভাবে এটি ব্যবহার করবেন?


14
একটি বুলিয়ান পতাকা যার মান পূর্ণসংখ্যার কাউন্টার তার নির্ধারিত উপরের সীমাতে পৌঁছেছে কিনা তার উপর ভিত্তি করে। সর্বাধিক অবরুদ্ধ!
স্যাম

উত্তর:


399

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

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

সি # :-) এ এখানে খুব শিক্ষাগত উদাহরণ রয়েছে

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace TheNightclub
{
    public class Program
    {
        public static Semaphore Bouncer { get; set; }

        public static void Main(string[] args)
        {
            // Create the semaphore with 3 slots, where 3 are available.
            Bouncer = new Semaphore(3, 3);

            // Open the nightclub.
            OpenNightclub();
        }

        public static void OpenNightclub()
        {
            for (int i = 1; i <= 50; i++)
            {
                // Let each guest enter on an own thread.
                Thread thread = new Thread(new ParameterizedThreadStart(Guest));
                thread.Start(i);
            }
        }

        public static void Guest(object args)
        {
            // Wait to enter the nightclub (a semaphore to be released).
            Console.WriteLine("Guest {0} is waiting to entering nightclub.", args);
            Bouncer.WaitOne();          

            // Do some dancing.
            Console.WriteLine("Guest {0} is doing some dancing.", args);
            Thread.Sleep(500);

            // Let one guest out (release one semaphore).
            Console.WriteLine("Guest {0} is leaving the nightclub.", args);
            Bouncer.Release(1);
        }
    }
}

6
যদি এটি কোনও নাইট ক্লাবে বাউন্সারের মতো হয় তবে এটি অতিথিকে ক্রমানুসারে যেতে দেওয়া উচিত, কিন্তু যখন আমি এটি চেষ্টা করে দেখি, তা এলোমেলো। যেমন। অতিথি 40 অতিথি 39 এর আগে প্রথম এসেছিল this এটি নিয়ন্ত্রণ করতে আমরা কী করতে পারি?
টিএনএ

2
@ টিএনএ: হ্যাঁ, এই উদাহরণটিতে নতুন থ্রেডগুলি যেভাবে শুরু করা হয়েছে তার সাথে এটি করা উচিত, এবং সত্যিকার অর্থে উত্তরের সুযোগে নয়।
প্যাট্রিক সোভেনসন

5
বাউন্সার উপমাটি সত্যই মহাকাব্য, তবে মজার বিষয় এটি ইতিমধ্যে ব্যবহার করা হয়েছে: albahari.com/threading/part2.aspx#_Semaphore
Igor

বিতরণ সিস্টেমে semaphores কোন মান অফার করে?
csandreas1

198

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

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

মুটেক্স এবং সেমফোরগুলির প্রয়োগের ক্ষেত্রে কিছু মিল রয়েছে তবে সেগুলি সর্বদা আলাদাভাবে ব্যবহার করা উচিত।

শীর্ষে উত্থাপিত প্রশ্নের সর্বাধিক সাধারণ (তবে তবুও ভুল) উত্তরটি হ'ল মিটেক্সেস এবং সেমোফোরগুলি একইরকম, একমাত্র উল্লেখযোগ্য পার্থক্য হ'ল যে সেমফোরগুলি একের চেয়ে বেশি গণনা করতে পারে। প্রায় সমস্ত ইঞ্জিনিয়াররা সঠিকভাবে বুঝতে পেরেছেন যে একটি মুটেক্স একটি বাইনারি পতাকা যা কোডের গুরুতর বিভাগগুলির মধ্যে পারস্পরিক বর্জন নিশ্চিত করে একটি ভাগ করা সংস্থান রক্ষা করতে ব্যবহৃত হয়। তবে কীভাবে "কাউন্টিং সেমফোর" ব্যবহার করার প্রসারণের বিষয়ে জিজ্ঞাসা করা হয়েছিল, সর্বাধিক ইঞ্জিনিয়াররা confidence কেবল তাদের আত্মবিশ্বাসের মাত্রায় ভিন্ন — পাঠ্যপুস্তকের মতামতের কিছু গন্ধ প্রকাশ করেন যে এগুলি বেশ কয়েকটি সমতুল্য সংস্থান রক্ষায় ব্যবহৃত হয়।

...

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

যদি একাধিক বাথরুম থাকে, তবে তাদের একসাথে চাবি দেওয়ার এবং একাধিক কী তৈরি করার প্রলোভন দেখাতে পারে - এটি একটি semaphore এর ভুল ব্যবহারের মতো। আপনার কাছে একবার কী কী থাকলে আপনি আসলে কোন বাথরুমটি উপলব্ধ তা জানেন না, এবং আপনি যদি এই পথে চলে যান তবে আপনি সম্ভবত সেই তথ্য সরবরাহের জন্য মিটেক্স ব্যবহার করে শেষ করে যাচ্ছেন এবং নিশ্চিত করেছেন যে আপনি কোনও বাথরুমটি ইতিমধ্যে দখল করেছেন না take ।

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

...

সেমফোরের সঠিক ব্যবহার হ'ল এক কাজ থেকে অন্য কাজে সংকেত দেওয়ার জন্য। একটি মিউটেক্সকে বোঝানো হয় এবং মুক্তি দেওয়া হয়, সর্বদা সেই ক্রমে, প্রতিটি কাজ যা ভাগ করে নেওয়া সংস্থান ব্যবহার করে এটি সুরক্ষিত করে। বিপরীতে, যে কাজগুলি সেমোফোরগুলি ব্যবহার করে তা হয় সিগন্যাল দেয় বা অপেক্ষা করে both দুটোই নয়। উদাহরণস্বরূপ, টাস্ক 1 এ "পাওয়ার" বোতাম টিপলে একটি নির্দিষ্ট সেমাপোর পোস্ট করার জন্য কোড (যেমন, সিগন্যাল বা ইনক্রিমেন্ট) থাকতে পারে এবং টাস্ক 2, যা প্রদর্শনটি জাগায়, একই সেমোফোরে পেন্ডিং করে। এই দৃশ্যে, একটি কাজ ইভেন্ট সংকেতের নির্মাতা; অন্য গ্রাহক।

...

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

...

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

তবে এটি পরে অপারেটিং সিস্টেম বিকাশকারীদের কাছে স্পষ্ট হয়ে ওঠে, অগ্রাধিকার ভিত্তিক প্রিপ্রিটিভ আরটিওএসের উপস্থিতির পরে (যেমন, ভিআরটিএক্স, সিএ। 1980), আরএমএ প্রতিষ্ঠা করে একাডেমিক গবেষণাগুলির প্রকাশ এবং অগ্রাধিকার বিপর্যয়ের কারণে সৃষ্ট সমস্যা এবং অগ্রাধিকার সংক্রান্ত একটি কাগজ 1990, 3 সালে উত্তরাধিকারের প্রোটোকলগুলি স্পষ্ট হয়ে উঠল যে মুউটেক্সগুলি বাইনারি কাউন্টার সহ কেবলমাত্র semaphores এর চেয়ে বেশি হওয়া উচিত।

নিঃশব্দ: সংস্থান ভাগ করে নেওয়া

সেমফোর: সিগন্যালিং

পার্শ্ব প্রতিক্রিয়াগুলির যত্ন সহকারে বিবেচনা না করে একে অপরের জন্য ব্যবহার করবেন না।


10
এই স্ট্যানফোর্ড সম্মতি পিডিএফ ডকুমেন্টটি দেখুন। পৃষ্ঠাগুলি 8 দেখুন। উপরোক্ত ব্যাখ্যাটি আরও তত্পর হয়ে উঠবে
ক্রিস সুব্রামনিয়ান

3
Semaphores সামান্য বই এই বিষয় সম্বন্ধে একটি মূল্যবান পঠিত।
জি। বাচ

লিংকটির জন্য ধন্যবাদ তবে, দস্তাবেজটি semaphores এবং Mutexes এ কিছুই সম্পর্কে আলোচনা করে। তবে, আপনি কি বোঝাতে চেয়েছেন যে উদাহরণটিতে ভাগ করা বাফারটি মুটেক্স ব্যবহার করে সুরক্ষিত করা যেতে পারে? 2 টি সেমফোর খালি বাফার এবং ফুলবার্ফারদের পরিবর্তে
টেক্কেস্কোবিডা

1
@ প্রমোদ ট্রু লিঙ্কটি কোনও মুটেক্স সম্পর্কিত নোট যুক্ত করে না। আমি লিঙ্কটি যুক্ত করেছি যাতে সেমফোরের জিনিসগুলির দিকটি পাঠকদের কাছে পরিষ্কার হয়ে যায়। :) মজার বিষয় হল এই ক্ষেত্রে বাফারটি কোনও লক ছাড়াই ব্যবহৃত হচ্ছে যেহেতু এটি ক্রমান্বয়ে এবং একটি বিজ্ঞপ্তি ফর্ম্যাটে অ্যাক্সেস করা হচ্ছে। অর্থাৎ রাইটার 0 এ লিখবে এবং পাঠককে 0 থেকে পড়তে সংকেত দেবে যদি পাঠক 0 থেকে না পড়ে এবং লেখককে সংকেত দেয় তবে লেখক ব্লক হয়ে যাবে। সুতরাং সাধারণ সংস্থানটি লক করতে কোনও মিটেক্স ব্যবহার করার দরকার নেই। উপরে বর্ণিত বাথরুমের উপমা থেকে এটি আলাদা।
ক্রিস সুব্রামনিয়ান

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

70

নীরবতা: একটি উত্স একচেটিয়া সদস্য অ্যাক্সেস

সেমফোর: কোনও সংস্থায় এন-সদস্য অ্যাক্সেস

অর্থাত্, একটি কাউন্টার, ফাইল, ডাটাবেস ইত্যাদির অ্যাক্সেসকে সিঙ্ক্রোনাইজ করতে একটি মুটেক্স ব্যবহার করা যায়

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


20
রিচার্ড ডাব্লু স্টিভেন্সের মতে, একটি মুটেক্স আসলে একটি দ্বৈত সেমফোর, যার দুটি মাত্র সম্ভাব্য মান রয়েছে: 0 এবং 1.
কিয়াং শি

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

3
বাসি থ্রেডে মন্তব্য করার ঝুঁকিতে, এটি সঠিক নয়। যেমন @ অ্যাডামডাভিস উপরে উল্লিখিত হয়েছে, সেমাফোরে কোনও সংস্থার এন-সদস্য অ্যাক্সেসের জন্য ব্যবহার করা উচিত নয় (যা এখনও করা উচিত) এটি একটি মুটেক্স ব্যবহার করে করা উচিত। কফিশপে বাথরুমের সাদৃশ্যটি একাধিক ব্যক্তির সাথে বাথরুমের অনুরূপ কী সহ একাধিক বাথরুমগুলি অ্যাক্সেসের জন্য অপেক্ষা করছে Consider বরং সেমাফোরটি কাজের মধ্যে সংকেত দেওয়ার জন্য ব্যবহার করা উচিত।
cspider

21

বিবেচনা করুন, এমন একটি ট্যাক্সি যা চালক সহ মোট 3 ( পিছন ) +2 ( সামনের ) ব্যক্তিদের সমন্বিত করতে পারে। সুতরাং, একটি semaphoreএকবারে গাড়ির ভিতরে কেবল 5 জনকে অনুমতি দেয়। এবং একটি mutexগাড়ির একক সিটে কেবল 1 জনকে অনুমতি দেয়।

অতএব, Mutex(ক রিসোর্সে একচেটিয়া ব্যবহারের অনুমতি দেওয়া হয় একটি অপারেটিং সিস্টেম থ্রেড মত ) কিছুদিনের Semaphoreজন্য অ্যাক্সেসের মঞ্জুরি দেওয়ার জন্য n একটি সময়ে সম্পদ সংখ্যা।


19

@Craig:

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

এটি কেবল একটি থ্রেডের মধ্যে সীমাবদ্ধ নয়। একটি সংস্থান অ্যাক্সেসের জন্য নির্দিষ্ট সংখ্যক থ্রেডকে অনুমতি দেওয়ার জন্য একটি সেমফোর কনফিগার করা যেতে পারে।


7
এটি একটি মন্তব্য নয়, কোনও উত্তর নয়।
ক্যাস্পস্কি

11
হ্যাঁ, তবে আমি মনে করি স্ট্যাক ওভারফ্লোতে মন্তব্য যুক্ত হওয়ার আগে আমি এটি লিখেছিলাম। বা আমি করিনি, সত্যিই মনে নেই। এবার যদিও আমি একটি মন্তব্যে উত্তর দিয়েছি। :-)
ম্যাট ফ্রেড্রিকসন

16

সেমফোর একটি ... সেমোফোর হিসাবেও ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, যদি আপনার একাধিক প্রক্রিয়া থাকে তবে একটি সারিতে ডেটা উত্সাহিত করা হয় এবং সারি থেকে কেবলমাত্র একটি টাস্ক গ্রহণ করা ডেটা। আপনি যদি না চান যে আপনার গ্রাহক টাস্কটি নিয়মিতভাবে উপলব্ধ ডেটার জন্য সারিটি পোল করে দেয় তবে আপনি সেমফোর ব্যবহার করতে পারেন।

এখানে সেমফোরটি বহির্গমন প্রক্রিয়া হিসাবে ব্যবহৃত হয় না, তবে সংকেত প্রক্রিয়া হিসাবে ব্যবহৃত হয়। উপভোগ টাস্কটি সেমফোরের জন্য অপেক্ষা করছে উত্পাদক টাস্কটি সেমোফোরে পোস্ট করছে।

এইভাবে গ্রাহক টাস্কটি চলছে যখন কেবল এবং যখন ডেটা শনাক্ত করার মতো থাকে


11

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

একটি সেমফোর একটি প্রোগ্রামিং কনস্ট্রাক্ট যা সিঙ্ক্রোনাইজেশন এবং পারস্পরিক বর্জন উভয়ই প্রয়োগ করে আমাদের সম্মতি অর্জনে সহায়তা করে। সেমফোরস দুটি ধরণের, বাইনারি এবং গণনা।

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

যেটি বোঝার জন্য গুরুত্বপূর্ণ তা হ'ল যে সেমফোর কাউন্টারটি যে কাজগুলিতে অবরুদ্ধ হতে হবে না তার সংখ্যা ট্র্যাক করে রাখে, অর্থাৎ তারা অগ্রগতি করতে পারে। কার্যগুলি অবরুদ্ধ করে এবং কেবলমাত্র কাউন্টার শূন্য হলে সেমফোরের তালিকায় নিজেকে যুক্ত করে themselves সুতরাং, কোনও কাজ P () রুটিনের তালিকায় যুক্ত হয়ে যায় যদি এটি অগ্রগতি করতে না পারে, এবং ভি () রুটিন ব্যবহার করে "মুক্তি"।

এখন, এটি দেখতে সুস্পষ্ট যে বাইনারি سيمফোরগুলি কীভাবে সিঙ্ক্রোনাইজেশন এবং পারস্পরিক বর্জন সমাধান করতে ব্যবহার করা যেতে পারে - সেগুলি মূলত লক।

প্রাক্তন। সিংক্রোনাইজ:

thread A{
semaphore &s; //locks/semaphores are passed by reference! think about why this is so.
A(semaphore &s): s(s){} //constructor
foo(){
...
s.P();
;// some block of code B2
...
}

//thread B{
semaphore &s;
B(semaphore &s): s(s){} //constructor
foo(){
...
...
// some block of code B1
s.V();
..
}

main(){
semaphore s(0); // we start the semaphore at 0 (closed)
A a(s);
B b(s);
}

উপরের উদাহরণে, বি 2 কেবলমাত্র 1 এর সম্পাদনা শেষ করার পরে কার্যকর করতে পারে। আসুন বলি যে থ্রেড এ আসে প্রথমে কার্যকর হয় - সেম.পি () পেয়ে যায় এবং অপেক্ষা করে, যেহেতু কাউন্টার 0 (বন্ধ) থাকে। থ্রেড বি পাশাপাশি আসে, বি 1 সমাপ্ত করে এবং তারপরে থ্রেড এটিকে মুক্ত করে - যা বি 2 সম্পূর্ণ করে comple সুতরাং আমরা সিঙ্ক্রোনাইজেশন অর্জন।

এখন আসুন বাইনারি সেমফোরের সাথে পারস্পরিক বর্জনটি দেখুন:

thread mutual_ex{
semaphore &s;
mutual_ex(semaphore &s): s(s){} //constructor
foo(){
...
s.P();
//critical section
s.V();
...
...
s.P();
//critical section
s.V();
...

}

main(){
semaphore s(1);
mutual_ex m1(s);
mutual_ex m2(s);
}

পারস্পরিক বর্জন পাশাপাশি বেশ সহজ - এম 1 এবং এম 2 একই সময়ে সমালোচনামূলক বিভাগে প্রবেশ করতে পারে না। সুতরাং প্রতিটি থ্রেড তার দুটি সমালোচনামূলক বিভাগের জন্য পারস্পরিক বর্জন দিতে একই সেমফোর ব্যবহার করছে। এখন, আরও বৃহত্তর একত্রিত হওয়া কি সম্ভব? সমালোচনা বিভাগগুলিতে নির্ভর করে। (পারস্পরিক বর্জনের জন্য অন্য কেউ কীভাবে سيمফোরগুলি ব্যবহার করতে পারে সে সম্পর্কে চিন্তা করুন .. ইঙ্গিত ইঙ্গিত: আমার কি কেবলমাত্র একটি সেমফোর ব্যবহার করা প্রয়োজন?)

সেমফোর গণনা: একাধিক মান সহ একটি সেমফোর। আসুন এটি কী বোঝায় তা দেখুন - একাধিক মানের একটি লক ?? তাই খোলা, বন্ধ, এবং ... হুঁ। পারস্পরিক বর্জন বা সিঙ্ক্রোনাইজেশনে কোন মাল্টি-স্টেজ-লকটি ব্যবহার করে?

আসুন দু'জনের মধ্যে আরও সহজ করা যাক:

একটি কাউন্টিং সেমোফোর ব্যবহার করে সিঙ্ক্রোনাইজেশন: আসুন ধরা যাক আপনার 3 টি কাজ রয়েছে - # 1 এবং 2 আপনি 3 পরে কার্যকর করতে চান তবে আপনি কীভাবে আপনার সিঙ্ক্রোনাইজেশন ডিজাইন করবেন?

thread t1{
...
s.P();
//block of code B1

thread t2{
...
s.P();
//block of code B2

thread t3{
...
//block of code B3
s.V();
s.V();
}

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

(সন্ধান করুন: ভি এর সংখ্যা পি এর সংখ্যার চেয়ে বেশি হলে কী হবে?)

মিউচুয়াল বর্ধন গণনা semaphores ব্যবহার করে: আমি চাই আপনি এটির জন্য নিজের সিউডোকোডটি তৈরি করুন (আপনি জিনিসগুলি আরও ভাল করে বুঝতে পারবেন!) - তবে মৌলিক ধারণাটি হ'ল: কাউন্টারের একটি গণনা সেমফোর এনকে নিরূপণভাবে সমালোচনামূলক বিভাগে প্রবেশ করতে দেয় । এর অর্থ কী আপনার এন টাস্কগুলি রয়েছে (বা থ্রেডগুলি, যদি আপনি চান) সমালোচনামূলক বিভাগে প্রবেশ করেন তবে এন +1 কাজটি ব্লক হয়ে যায় (আমাদের প্রিয় ব্লকড-টাস্ক তালিকায় যায়), এবং কেবল তখন কারও কারও ভি সিমাফোর হয়ে গেলে অন্তত একবার. সুতরাং সেমফোর কাউন্টার, 0 এবং 1 এর মধ্যে দোলের পরিবর্তে এখন 0 এবং N এর মধ্যে চলে যায়, এন কার্যগুলিকে অবাধে প্রবেশ করে এবং প্রস্থান করতে দেয়, কাউকে অবরুদ্ধ করে না!

এখন গোশ, আপনার কেন এমন বোকা জিনিস লাগবে? একাধিক লোককে কোনও সংস্থান অ্যাক্সেস না করার জন্য পারস্পরিক বর্জনীয়তার পুরো বিষয়টি কি নয় ?? (ইঙ্গিত ইঙ্গিত ... আপনার কম্পিউটারে সবসময় কেবল একটি ড্রাইভ থাকে না, আপনি কি ...?)

চিন্তাভাবনা করুন : একা একক গণনা সেমফোর করে পারস্পরিক বর্জনীয়তা অর্জন করা যায় কি? আপনার যদি কোনও সংস্থার 10 টি উদাহরণ রয়েছে এবং 10 টি থ্রেডগুলি (গণনা সেমফোরের মাধ্যমে) আসে এবং প্রথম দৃষ্টান্তটি ব্যবহার করার চেষ্টা করে?


7

একটি সেমফোর এমন একটি বস্তু যা একটি প্রাকৃতিক সংখ্যা (অর্থাত্ একটি পূর্ণসংখ্যা বৃহত্তর বা শূন্যের সমান) থাকে যার উপর দুটি সংশোধনকারী ক্রিয়া সংজ্ঞায়িত করা হয়। একটি অপারেশন, Vপ্রাকৃতিক 1 যোগ। অন্যান্য অপারেশন P, 1. প্রাকৃতিক সংখ্যা উভয় কার্যক্রম পারমাণবিক হয় (যেমন অন্য কোন অপারেশন একই সময়ে সম্পাদন করতে পারে কমে যায় Vবা P)।

যেহেতু প্রাকৃতিক সংখ্যা 0 হ্রাস করা যায় না, P0 যুক্ত একটি সেমফোরে কল করার ফলে কলিং প্রক্রিয়া (/ থ্রেড) কার্যকর হবে এমন কিছু মুহুর্তের মধ্যে যেখানে সংখ্যাটি আর 0 থাকে না এবং Pসফলভাবে (এবং পারমাণবিকভাবে) সম্পাদন করা যায়।

অন্যান্য উত্তরে যেমন উল্লেখ করা হয়েছে, সীমাবদ্ধগুলি নির্দিষ্ট সংস্থার সর্বাধিক (তবে পরিবর্তনশীল) সংখ্যক প্রক্রিয়াতে সীমাবদ্ধ রাখতে ব্যবহার করা যেতে পারে।


7

আমি ভিজ্যুয়ালাইজেশন তৈরি করেছি যা ধারণাটি বুঝতে সহায়তা করবে। একাধিক পাঠ্য পরিবেশে সেম্যাফোর একটি সাধারণ উত্সে অ্যাক্সেস নিয়ন্ত্রণ করে। এখানে চিত্র বর্ণনা লিখুন

ExecutorService executor = Executors.newFixedThreadPool(7);

Semaphore semaphore = new Semaphore(4);

Runnable longRunningTask = () -> {
    boolean permit = false;
    try {
        permit = semaphore.tryAcquire(1, TimeUnit.SECONDS);
        if (permit) {
            System.out.println("Semaphore acquired");
            Thread.sleep(5);
        } else {
            System.out.println("Could not acquire semaphore");
        }
    } catch (InterruptedException e) {
        throw new IllegalStateException(e);
    } finally {
        if (permit) {
            semaphore.release();
        }
    }
};

// execute tasks
for (int j = 0; j < 10; j++) {
    executor.submit(longRunningTask);
}
executor.shutdown();

আউটপুট

Semaphore acquired
Semaphore acquired
Semaphore acquired
Semaphore acquired
Could not acquire semaphore
Could not acquire semaphore
Could not acquire semaphore

নিবন্ধ থেকে নমুনা কোড


3

একটি হার্ডওয়্যার বা সফ্টওয়্যার পতাকা। মাল্টি টাস্কিং সিস্টেমে একটি সেমোফোর একটি মান সহ একটি পরিবর্তনশীল যা একটি সাধারণ উত্সের স্থিতি নির্দেশ করে A একটি প্রক্রিয়া সংস্থান প্রয়োজন সংস্থানগুলির স্থিতি নির্ধারণের জন্য সেমফোরটি পরীক্ষা করে এবং তারপরে কীভাবে এগিয়ে যেতে হবে তা সিদ্ধান্ত নেয়।


2

Semaphores থ্রেড সীমাবদ্ধ মত কাজ।

উদাহরণ: আপনার যদি 100 টি থ্রেডের পুল থাকে এবং আপনি কিছু ডিবি অপারেশন করতে চান। যদি 100 টি থ্রিজ নির্দিষ্ট সময়ে ডিবিতে অ্যাক্সেস করে তবে ডিবিতে লকিংয়ের সমস্যা থাকতে পারে তাই আমরা সেমফোর ব্যবহার করতে পারি যা একসাথে কেবল সীমিত থ্রেডকেই অনুমতি দেয় el নীচে উদাহরণে একবারে কেবলমাত্র একটি থ্রেড মঞ্জুরি দেয়। যখন কোনও থ্রেড acquire()পদ্ধতিতে কল করে তখন এটি অ্যাক্সেস পেয়ে যাবে এবং release()পদ্ধতিটি কল করার পরে , এটি প্রবেশটি ছেড়ে দেবে যাতে পরবর্তী থ্রেড অ্যাক্সেস পেতে পারে।

    package practice;
    import java.util.concurrent.Semaphore;

    public class SemaphoreExample {
        public static void main(String[] args) {
            Semaphore s = new Semaphore(1);
            semaphoreTask s1 = new semaphoreTask(s);
            semaphoreTask s2 = new semaphoreTask(s);
            semaphoreTask s3 = new semaphoreTask(s);
            semaphoreTask s4 = new semaphoreTask(s);
            semaphoreTask s5 = new semaphoreTask(s);
            s1.start();
            s2.start();
            s3.start();
            s4.start();
            s5.start();
        }
    }

    class semaphoreTask extends Thread {
        Semaphore s;
        public semaphoreTask(Semaphore s) {
            this.s = s;
        }
        @Override
        public void run() {
            try {
                s.acquire();
                Thread.sleep(1000);
                System.out.println(Thread.currentThread().getName()+" Going to perform some operation");
                s.release();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } 
    }

1

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

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

বাইনারি / মিটেক্স এবং গণনা সেমোফোরগুলির মধ্যেও পার্থক্য রয়েছে।

Http://www.cs.columbia.edu/~jae/4118/lect/L05-ipc.html এ বক্তৃতার নোটগুলি দেখুন


0

এটি একটি পুরানো প্রশ্ন তবে সেমফোরের অন্যতম আকর্ষণীয় ব্যবহার হ'ল একটি পঠন / লেখার লক এবং এটি স্পষ্টভাবে উল্লেখ করা হয়নি।

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

আরেকটি নেতিবাচকতাটি হ'ল লেখকরা বরং সহজেই শুরু করা যেতে পারে যতক্ষণ না সেমফোর ন্যায্য হয় বা লেখকরা একাধিক অনুরোধে পারমিট অর্জন করেন, যেমন তাদের নিজেদের মধ্যে একটি স্পষ্ট মিটেক্সের প্রয়োজন হয়।

আরও পড়ুন :


-3

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


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