আমি সমকালীন প্রোগ্রামিং সম্পর্কিত এই শব্দগুলি শুনেছি, তবে তাদের মধ্যে পার্থক্য কী?
আমি সমকালীন প্রোগ্রামিং সম্পর্কিত এই শব্দগুলি শুনেছি, তবে তাদের মধ্যে পার্থক্য কী?
উত্তর:
একটি লক লক করা অংশটিতে কেবল একটি থ্রেড প্রবেশ করতে দেয় এবং লকটি অন্য কোনও প্রক্রিয়ার সাথে ভাগ করা হয় না।
একটি মিউটেক্সটি লকের মতো একই তবে এটি সিস্টেমের প্রশস্ত হতে পারে (একাধিক প্রক্রিয়া দ্বারা ভাগ করা)।
একটি সেমফোর মিউটেক্সের মতো একই কাজ করে তবে এক্স সংখ্যায় থ্রেড প্রবেশ করতে দেয়, উদাহরণস্বরূপ একই সময়ে চলমান সিপিইউ, আইও বা র্যাম নিবিড় কাজগুলিকে সীমাবদ্ধ করতে ব্যবহার করা যেতে পারে।
মিটেক্স এবং সেমফোরের পার্থক্য সম্পর্কে আরও বিস্তারিত পোস্টের জন্য এখানে পড়ুন ।
আপনার কাছে পঠন / লিখনের তালিকাগুলিও রয়েছে যা সীমিত সীমাহীন পাঠকদের বা যেকোন সময় 1 জন লেখককে অনুমতি দেয়।
এই শব্দগুলি সম্পর্কে প্রচুর ভুল ধারণা রয়েছে।
এটি পূর্ববর্তী পোস্টের ( https://stackoverflow.com/a/24582076/3163691 ) যা এখানে চমত্কার মানায়:
1) সমালোচনামূলক বিভাগ = ব্যবহারকারীর অবজেক্ট একই প্রক্রিয়াতে অন্য অনেকের কাছ থেকে মাত্র একটি সক্রিয় থ্রেড কার্যকর করতে দেয় । অন্যান্য অ নির্বাচিত থ্রেডগুলি (@ এই বস্তুটি অর্জন করে) ঘুমিয়ে দেওয়া হয়েছে ।
[কোনও আন্তঃক্রিয়া ক্ষমতা, খুব আদিম বস্তু নয়]।
২) মুটেক্স সেম্যাফোর (ওরফে মুটেক্স) = কার্নেল অবজেক্টটি বিভিন্ন প্রক্রিয়াগুলির মধ্যে , অন্য অনেকের থেকে কেবলমাত্র একটি সক্রিয় থ্রেড কার্যকর করার অনুমতি দেওয়ার জন্য ব্যবহৃত হয় । অন্যান্য অ নির্বাচিত থ্রেডগুলি (@ এই বস্তুটি অর্জন করে) ঘুমিয়ে দেওয়া হয়েছে । এই অবজেক্টটি থ্রেডের মালিকানা, থ্রেড সমাপ্তি বিজ্ঞপ্তি, পুনরাবৃত্তি (একই থ্রেড থেকে একাধিক 'অর্জন' কল) এবং 'অগ্রাধিকার বিপরীতমুখী পরিহার' সমর্থন করে।
[আন্তঃসম্পূর্ণ ক্ষমতা, ব্যবহার করা খুব নিরাপদ, এক ধরণের 'উচ্চ স্তরের' সিঙ্ক্রোনাইজেশন অবজেক্ট]।
3) সেমাফোর গণনা করা (ওরফে সেমাফোর) = কার্নেল অবজেক্ট যা অন্য অনেকের কাছ থেকে সক্রিয় থ্রেডগুলির একটি গোষ্ঠী কার্যকর করার অনুমতি দেয়। অন্যান্য অ নির্বাচিত থ্রেডগুলি (@ এই বস্তুটি অর্জন করে) ঘুমিয়ে দেওয়া হয়েছে ।
[ইন্টারপ্রেসেস সক্ষমতা তবে ব্যবহারের পক্ষে খুব বেশি নিরাপদ নয় কারণ এতে 'মিটেক্স' বৈশিষ্ট্যগুলির অভাব রয়েছে: থ্রেড সমাপ্তি বিজ্ঞপ্তি, পুনরাবৃত্তি ?, 'অগ্রাধিকার বিপর্যয় এড়ানো' ?, ইত্যাদি]]
৪) এবং এখন 'স্পিনলকস' নিয়ে কথা বলছি, প্রথমে কিছু সংজ্ঞা:
সমালোচনামূলক অঞ্চল = 2 বা ততোধিক প্রক্রিয়া দ্বারা ভাগ করা মেমরির একটি অঞ্চল।
লক = একটি পরিবর্তনশীল যার মান 'জটিল অঞ্চলে' প্রবেশের অনুমতি দেয় বা অস্বীকার করে। (এটি সাধারণ 'বুলিয়ান পতাকা' হিসাবে প্রয়োগ করা যেতে পারে)।
ব্যস্ত ওয়েটিং = কিছু মান উপস্থিত না হওয়া পর্যন্ত একটি চলকটির ধারাবাহিকভাবে পরীক্ষা করা।
অবশেষে:
স্পিন-লক (ওরফে স্পিনলক) = একটি লক যা ব্যস্ততার জন্য অপেক্ষা করে । ( লকটি অর্জন এক্সএইচজি বা অনুরূপ পারমাণবিক ক্রিয়াকলাপ দ্বারা তৈরি করা হয় )।
[কোনও থ্রেড ঘুমন্ত নয়, বেশিরভাগ ক্ষেত্রে কেবল কার্নেল স্তরে ব্যবহৃত হয়। ব্যবহারকারী স্তরের কোডের জন্য অজ্ঞাত]।
একটি সর্বশেষ মন্তব্য হিসাবে, আমি নিশ্চিত নই তবে আমি আপনাকে কয়েকটি বড় টাকা বাজি ধরতে পারি যে উপরের প্রথম 3 টি সিঙ্ক্রোনাইজ করা অবজেক্ট (# 1, # 2 এবং # 3) তাদের বাস্তবায়নের অংশ হিসাবে এই সাধারণ জানোয়ার (# 4) ব্যবহার করে।
আপনার দিনটি শুভ হোক!.
তথ্যসূত্র:
ক্যারলিন ইয়াও (সিএমপি বুকস) সহ কিং লি দ্বারা এমবেডড সিস্টেমগুলির জন্য রিয়েল-টাইম ধারণাগুলি।
-অর্ড্রু টেনেনবাউম (পিয়ারসন এডুকেশন ইন্টারন্যাশনাল) দ্বারা মোডার্ন অপারেটিং সিস্টেম (3 য়)
জেফ্রি রিচার (মাইক্রোসফ্ট প্রোগ্রামিং সিরিজ) দ্বারা মাইক্রোসফ্ট উইন্ডোজ (4 র্থ) এর জন্য প্রোগ্রামিং অ্যাপ্লিকেশন।
এছাড়াও, আপনি এটিকে একবার দেখে নিতে পারেন: https://stackoverflow.com/a/24586803/3163691
বেশিরভাগ সমস্যা সমাধান করা যেতে পারে (i) কেবল তালা, (ii) কেবলমাত্র সেমফোরস, ..., বা (iii) উভয়ের সংমিশ্রণ! যেমন আপনি আবিষ্কার করেছেন, সেগুলি খুব একইরকম: উভয়ই বর্ণের অবস্থার প্রতিরোধ করে , উভয়ই acquire()
/ release()
অপারেশন করে, উভয়ই শূন্য বা ততোধিক থ্রেডকে অবরুদ্ধ / সন্দেহযুক্ত করে তোলে ... সত্যই, গুরুত্বপূর্ণ পার্থক্য কেবলমাত্র তারা কীভাবে লক এবং আনলক করে তাতেই থাকে ।
উভয় লক / সেমফোরের জন্য, acquire()
আদিম 0 টি অবস্থায় থাকাকালীন কল করার চেষ্টা করার ফলে আহ্বানকারী থ্রেড স্থগিত হয়ে যায়। লকগুলির জন্য - লকটি অর্জনের প্রচেষ্টা 1 রাজ্যে রয়েছে সফল। সেমোফোরগুলির জন্য - 1 টি লকটি অর্জনের প্রচেষ্টা {1, 2, 3, ...। সফল।
রাজ্যের রাজ্যে 0 টি তালার জন্য, যদি একই থ্রেড আগে acquire()
কল করেছিল, এখন রিলিজ কল করে, তবে মুক্তিটি সফল। কোনও ভিন্ন থ্রেড যদি এটি চেষ্টা করে - তবে তা ঘটে যা বাস্তবায়নের / গ্রন্থাগারের নীচে (সাধারণত চেষ্টাটিকে উপেক্ষা করা হয় বা কোনও ত্রুটি নিক্ষেপ করা হয়)। রাজ্যে ০ টি সেমফোরের জন্য, যে কোনও থ্রেড রিলিজ কল করতে পারে এবং এটি সফল হবে (পূর্ববর্তী কোন থ্রেডটি সেমফোরকে রাজ্যে 0 স্থাপন করার জন্য নির্বিশেষে)।
পূর্ববর্তী আলোচনা থেকে, আমরা দেখতে পাচ্ছি যে তালার মালিকের ধারণা রয়েছে (একমাত্র থ্রেড যা রিলিজ বলতে পারে সেই মালিক তার মালিক), যদিও সেমফোরগুলির কোনও মালিক নেই (কোনও থ্রেড একটি সেমফোরে রিলিজ কল করতে পারে)।
যে কারণে প্রচুর বিভ্রান্তির সৃষ্টি হয় তা হ'ল, বাস্তবে তারা এই উচ্চ-স্তরের সংজ্ঞাটির অনেকগুলি প্রকরণ ।
বিবেচনা করার জন্য গুরুত্বপূর্ণ বৈচিত্রগুলি :
acquire()
/ release()
বলা যেতে? - [ ব্যাপকভাবে পরিবর্তিত হয় ]এগুলি আপনার বই / প্রভাষক / ভাষা / গ্রন্থাগার / পরিবেশের উপর নির্ভর করে।
কিছু ভাষা কীভাবে এই বিবরণগুলির জবাব দেয় তা এখানে লক্ষ করার জন্য এখানে একটি দ্রুত সফর tour
pthread_mutex_t
। ডিফল্টরূপে, এগুলি অন্য কোনও প্রক্রিয়া ( PTHREAD_PROCESS_PRIVATE
) এর সাথে ভাগ করা যায় না , তবে মিটেক্সের pharered বলে একটি বৈশিষ্ট্য রয়েছে । সেট করা থাকলে, তাই মিটেক্সগুলি প্রক্রিয়াগুলির ( PTHREAD_PROCESS_SHARED
) মধ্যে ভাগ করা হয় ।sem_t
। মিউটেক্সেসের মতো, সেমোফোরগুলি অনেকগুলি প্রক্রিয়া ত্রিশাদের মধ্যে ভাগ করা যায় বা একক প্রক্রিয়ার থ্রেডগুলিতে ব্যক্তিগত রাখা যেতে পারে। এটি প্রদত্ত pshared যুক্তির উপর নির্ভর করে sem_init
।threading.RLock
) বেশিরভাগ সি / সি ++ pthread_mutex_t
এর সমান । দু'জনেই প্রেরণকারী । এর অর্থ তারা কেবল একই থ্রেড দ্বারা তালাবদ্ধ হয়ে থাকতে পারে যা এটি লক করে। এটি sem_t
সেমফোরস, threading.Semaphore
সেমফোরস এবং theading.Lock
লকগুলি পুনরায় প্রেরণকারী নয় - এটি কোনও ক্ষেত্রে থ্রেডটি আনলকটি সম্পাদন করতে পারে / সেমফোরের নিচে।threading.Semaphore
) বেশিরভাগ হিসাবে একই sem_t
। যদিও এর সাথে sem_t
, থ্রেড আইডগুলির একটি সারিটি ক্রমটি মনে করতে ব্যবহৃত হয় যাতে লক করার সময় থ্রেডগুলি লক করার চেষ্টা করার সময় এটি ব্লক হয়ে গিয়েছিল। যখন কোনও থ্রেড একটি সেমফোর আনলক করে, কাতারে প্রথম থ্রেড (যদি সেখানে থাকে) নতুন মালিক হিসাবে বেছে নেওয়া হয়। থ্রেড আইডেন্টিফায়ারটিকে কাতারে নেওয়া হয় এবং সেমফোরটি আবার লক হয়ে যায়। তবে, এর সাথে threading.Semaphore
একটি কাতারের পরিবর্তে একটি সেট ব্যবহৃত হয়, সুতরাং যে ক্রমে থ্রেডগুলি ব্লক হয়ে গেছে সেটিকে সংরক্ষণ করা হয় না - সেটের কোনও থ্রেড পরবর্তী মালিক হিসাবে বেছে নেওয়া যেতে পারে।java.util.concurrent.ReentrantLock
) বেশিরভাগই সি / সি ++ pthread_mutex_t
এর মতো এবং পাইথন এর threading.RLock
মধ্যে এটি একটি প্রবর্তক লকটি প্রয়োগ করে। জাভিতে মধ্যস্থতাকারী হিসাবে অভিনয় করার কারণে জাভাতে প্রক্রিয়াগুলির মধ্যে লকগুলি ভাগ করা আরও শক্ত। যদি কোনও থ্রেড কোনও লকটি আনলক করার চেষ্টা করে তবে এটি নিজস্ব নয়, একটি IllegalMonitorStateException
নিক্ষেপ করা হয়।java.util.concurrent.Semaphore
) বেশিরভাগ হিসাবে sem_t
এবং একই threading.Semaphore
। জাভা সেমোফোরস এর কনস্ট্রাক্টর একটি ফেয়ারনেস বুলিয়ান প্যারামিটার গ্রহণ করে যা ওয়েটিং থ্রেডগুলি স্টোর করার জন্য কোনও সেট (মিথ্যা) বা একটি সারি (সত্য) ব্যবহার করবে কিনা তা নিয়ন্ত্রণ করে। তত্ত্বের ক্ষেত্রে, সেমোফোরগুলি প্রায়শই আলোচিত হয়, তবে বাস্তবে সেমফোরগুলি এত বেশি ব্যবহৃত হয় না। একটি সেমফোর কেবল একটি পূর্ণসংখ্যার অবস্থাকে ধরে রাখে , তাই প্রায়শই এটি বরং জটিল হয় এবং অনেকগুলি একবারে প্রয়োজন হয় - কোড বোঝার ক্ষেত্রে অসুবিধা সৃষ্টি করে। এছাড়াও, যে কোনও থ্রেড একটি সেমফোর প্রকাশ করতে পারে তা কখনও কখনও অনাকাঙ্ক্ষিত হয়। পরিবর্তে "কন্ডিশন ভেরিয়েবল" এবং "মনিটর" এর মতো আরও অবজেক্ট-ওরিয়েন্টেড / উচ্চ-স্তরের সিঙ্ক্রোনাইজেশন আদিম / বিমূর্ততা ব্যবহৃত হয়।
জন কোপলিনের মাল্টিথ্রেডিং টিউটোরিয়ালটি একবার দেখুন ।
থ্রেডগুলির মধ্যে সিনক্রোনাইজেশন বিভাগে তিনি ইভেন্ট, লক, মিটেক্স, সেমফোর, অপেক্ষারত টাইমারের মধ্যে পার্থক্য বর্ণনা করেছেন
একটি মিউটেক্স একবারে কেবল একটি থ্রেডের মালিকানাধীন হতে পারে, থ্রেডগুলিকে একটি অংশীদারি সংস্থানটিতে পারস্পরিক একচেটিয়া অ্যাক্সেসের সমন্বয় করতে সক্ষম করে
সমালোচনামূলক বিভাগের অবজেক্টগুলি মিউটেক্স অবজেক্টের সরবরাহিত সমতুল্য সিঙ্ক্রোনাইজেশন সরবরাহ করে, সমালোচনামূলক বিভাগের অবজেক্টগুলি কেবল একটি একক প্রক্রিয়ার থ্রেড দ্বারা ব্যবহৃত হতে পারে can
একটি মিউটেক্স এবং একটি সমালোচনামূলক বিভাগের মধ্যে আরেকটি পার্থক্য হ'ল যদি সমালোচনামূলক বিভাগের অবজেক্টটি অন্য থ্রেডের
EnterCriticalSection()
মালিকানাধীন থাকে তবে মালিকানার জন্য অনির্দিষ্টকালের জন্য অপেক্ষা করেWaitForSingleObject()
, যেখানে একটি মিউেক্সের সাথে ব্যবহৃত হয়, আপনাকে একটি সময়সীমা নির্দিষ্ট করার অনুমতি দেয়একটি সেমফোর শূন্য এবং কিছু সর্বাধিক মানের মধ্যে একটি গণনা বজায় রাখে, একসাথে একটি ভাগ করা সংস্থান অ্যাক্সেস করছে এমন থ্রেডের সংখ্যা সীমাবদ্ধ করে।
আমি উদাহরণ সহ এটি আবরণ করার চেষ্টা করব:
লক: আপনি যেখানে ব্যবহার lock
করবেন তার একটি উদাহরণ হ'ল কোন অংশীদারি অভিধান হবে কোন আইটেমগুলিতে (এর জন্য অবশ্যই অনন্য কী থাকতে হবে) যুক্ত করা হবে।
লকটি নিশ্চিত করবে যে একটি থ্রেড কোডের পদ্ধতিতে প্রবেশ করছে না যা আইটেমটি অভিধানে রয়েছে তা পরীক্ষা করছে এবং অন্য থ্রেড (যা সমালোচনামূলক বিভাগে রয়েছে) ইতিমধ্যে এই চেকটি পাস করেছে এবং আইটেমটি যুক্ত করছে। যদি অন্য থ্রেড কোনও লকড কোড প্রবেশ করানোর চেষ্টা করে তবে অবজেক্টটি প্রকাশ না হওয়া পর্যন্ত এটি অপেক্ষা করা হবে (অবরুদ্ধ করা হবে)।
private static readonly Object obj = new Object();
lock (obj) //after object is locked no thread can come in and insert item into dictionary on a different thread right before other thread passed the check...
{
if (!sharedDict.ContainsKey(key))
{
sharedDict.Add(item);
}
}
সেমফোর: ধরা যাক আপনার সংযোগের একটি পুল রয়েছে, তবে একটি একক থ্রেড সংযোগ পেতে সেমফোরের জন্য অপেক্ষা করে পুলের মধ্যে একটি উপাদান সংরক্ষণ করতে পারে। এরপরে এটি সংযোগটি ব্যবহার করে এবং কাজ শেষ হয়ে গেলে سيمফোরটি ছেড়ে দিয়ে সংযোগটি প্রকাশ করে।
কোড উদাহরণ যে আমি পছন্দ করি তা @ পেট্রিকের দেওয়া বাউন্সারগুলির মধ্যে একটি - এটি এখানে যায়:
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);
}
}
}
নিরীক্ষণ এটি বেশ পরিমাণে Semaphore(1,1)
এবং প্রায়শই বিশ্বব্যাপী ব্যবহৃত হয় (অ্যাপ্লিকেশন প্রশস্ত অন্যথায় তর্কযুক্তভাবেlock
আরও উপযুক্ত)। Mutex
বিশ্বব্যাপী অ্যাক্সেসযোগ্য তালিকা থেকে নোড মোছার সময় কেউ বৈশ্বিক ব্যবহার করবে (নোডটি মোছার সময় আপনি অন্য থ্রেডটি কিছু করতে চান)। যখন আপনি অর্জন করেন যে Mutex
যদি বিভিন্ন থ্রেড একই অর্জন করার চেষ্টা করে তবে Mutex
এটি একই থ্রেড পর্যন্ত Mutex
প্রকাশিত হবে যা এটি প্রকাশ করেছে put
বিশ্বব্যাপী মিটেক্স তৈরির জন্য ভাল উদাহরণটি হ'ল @ ডিপি
class SingleGlobalInstance : IDisposable
{
public bool hasHandle = false;
Mutex mutex;
private void InitMutex()
{
string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), false).GetValue(0)).Value.ToString();
string mutexId = string.Format("Global\\{{{0}}}", appGuid);
mutex = new Mutex(false, mutexId);
var allowEveryoneRule = new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow);
var securitySettings = new MutexSecurity();
securitySettings.AddAccessRule(allowEveryoneRule);
mutex.SetAccessControl(securitySettings);
}
public SingleGlobalInstance(int timeOut)
{
InitMutex();
try
{
if(timeOut < 0)
hasHandle = mutex.WaitOne(Timeout.Infinite, false);
else
hasHandle = mutex.WaitOne(timeOut, false);
if (hasHandle == false)
throw new TimeoutException("Timeout waiting for exclusive access on SingleInstance");
}
catch (AbandonedMutexException)
{
hasHandle = true;
}
}
public void Dispose()
{
if (mutex != null)
{
if (hasHandle)
mutex.ReleaseMutex();
mutex.Dispose();
}
}
}
তারপরে ব্যবহার করুন:
using (new SingleGlobalInstance(1000)) //1000ms timeout on global lock
{
//Only 1 of these runs at a time
GlobalNodeList.Remove(node)
}
আশা করি এটি আপনার কিছুটা সময় সাশ্রয় করবে।
Semaphores এবং Mutexes এর মধ্যে পার্থক্য সম্পর্কে উইকিপিডিয়ায় একটি দুর্দান্ত বিভাগ রয়েছে :
একটি মিউটেক্স মূলত বাইনারি সেমফোর হিসাবে একই জিনিস এবং কখনও কখনও একই বেসিক বাস্তবায়ন ব্যবহার করে। তাদের মধ্যে পার্থক্যগুলি হ'ল:
মুটেক্সগুলির একটি মালিকের ধারণা রয়েছে, যা প্রক্রিয়াটি মিটেক্সকে লক করে দেয়। কেবলমাত্র প্রক্রিয়াটি যা মিটেক্সকে লক করেছে এটিই আনলক করতে পারে। বিপরীতে, একটি semaphore মালিক সম্পর্কে কোন ধারণা আছে। যে কোনও প্রক্রিয়া একটি সেমফোর আনলক করতে পারে।
সেমোফোরগুলির বিপরীতে, মিউটেক্সগুলি অগ্রাধিকারের বিপরীতে সুরক্ষা সরবরাহ করে। যেহেতু মুটেক্স তার বর্তমান মালিককে জানে তাই যখনই কোনও উচ্চ-অগ্রাধিকারের কার্যটি মুটেক্সের জন্য অপেক্ষা করা শুরু করে তখনই তার মালিকের অগ্রাধিকার প্রচার করা সম্ভব।
নীরবতাগুলি মুছে ফেলার সুরক্ষাও সরবরাহ করে, যেখানে মিটেক্স থাকা প্রক্রিয়াটি দুর্ঘটনাক্রমে মোছা যায় না। Semaphores এটি সরবরাহ করে না।
আমার বোধগম্যতা হল যে একটি মুটেক্স কেবলমাত্র একটি একক প্রক্রিয়ার মধ্যেই ব্যবহারের জন্য, তবে এর অনেকগুলি থ্রেড জুড়ে, যেখানে একটি সেমফোর একাধিক প্রক্রিয়া জুড়ে এবং তার সাথে সংশ্লিষ্ট থ্রেডগুলির মধ্যে ব্যবহার করা যেতে পারে।
এছাড়াও, একটি মিউটেক্স বাইনারি (এটি হয় লকড বা আনলকযুক্ত), যেখানে একটি সেমফোরের গণনা করার ধারণা, বা একাধিক লক এবং আনলক অনুরোধগুলির একটি সারি রয়েছে।
কেউ আমার ব্যাখ্যা যাচাই করতে পারে? আমি লিনাক্সের প্রসঙ্গে বলছি, বিশেষত রেড হ্যাট এন্টারপ্রাইজ লিনাক্স (আরএইচইল) সংস্করণ,, যা কার্নেল ২.6.৩২ ব্যবহার করে।
উদাহরণস্বরূপ একটি বেস কেস হিসাবে লিনাক্স ভেরিয়েন্টে সি প্রোগ্রামিং ব্যবহার করা।
লক:
Operation সাধারণত একটি খুব সাধারণ কন্ট্রাক্ট বাইনারি অপারেশনে হয় লকড বা আনলক করা হয়
Thread থ্রেডের মালিকানা, অগ্রাধিকার, সিকোয়েন্সিং ইত্যাদির কোনও ধারণা নেই
• সাধারণত একটি স্পিন লক যেখানে থ্রেড অবিচ্ছিন্নভাবে লকগুলির উপলব্ধতার জন্য পরীক্ষা করে।
• সাধারণত পারমাণবিক ক্রিয়াকলাপের উপর নির্ভর করে যেমন টেস্ট-অ্যান্ড-সেট, তুলনা-ও-সোয়াপ, আনতে এবং যোগ করা ইত্যাদি
At পারমাণবিক অপারেশনের জন্য সাধারণত হার্ডওয়্যার সমর্থন প্রয়োজন।
ফাইল লকস:
Multiple সাধারণত একাধিক প্রক্রিয়াগুলির মাধ্যমে কোনও ফাইলে অ্যাক্সেস সমন্বয় করতে ব্যবহৃত হয়।
• একাধিক প্রক্রিয়াগুলি রিড লকটি ধরে রাখতে পারে তবে যখন কোনও একক প্রক্রিয়া রাইটিং লক ধারণ করে তবে অন্য কোনও প্রক্রিয়াটি পড়ার বা লেখার লক অর্জনের অনুমতি দেয় না।
• উদাহরণ: ঝাঁক, fcntl ইত্যাদি।
mutex:
• Mutex ফাংশন কলগুলি সাধারণত কার্নেল স্পেসে কাজ করে এবং ফলস্বরূপ কল হয়।
• এটি মালিকানার ধারণাটি ব্যবহার করে। কেবলমাত্র থ্রেড যা বর্তমানে মুটেক্সকে ধরেছে এটি এটিকে আনলক করতে পারে।
• মুটেক্স পুনরাবৃত্ত হয় না (ব্যতিক্রম: PTHREAD_MUTEX_RECURSIVE)।
Cond সাধারণত কন্ডিশন ভেরিয়েবলের সাথে অ্যাসোসিয়েশনে ব্যবহৃত হয় এবং যুক্তি হিসাবে পাস করা হয় যেমন pthread_cond_signal, pthread_cond_wait ইত্যাদি to
• কিছু ইউনিক্স সিস্টেম একাধিক প্রক্রিয়া দ্বারা মিটেক্সকে ব্যবহার করার অনুমতি দেয় যদিও এটি সমস্ত সিস্টেমে প্রয়োগ করা নাও যেতে পারে।
সেমফোর্:
• এটি একটি কার্নেল রক্ষণাবেক্ষণ করা পূর্ণসংখ্যা যার মানগুলি শূন্যের নীচে নামার অনুমতি দেয় না।
• এটি প্রক্রিয়া সিঙ্ক্রোনাইজ করতে ব্যবহৃত হতে পারে।
Ma সেমফোরের মান 1 এর চেয়ে বেশি একটি মানকে সেট করা যেতে পারে যেখানে মানটি সাধারণত উপলব্ধ সংস্থানগুলির সংখ্যাকে নির্দেশ করে।
• একটি সেম্যাফোর যার মান 1 এবং 0 এর মধ্যে সীমাবদ্ধ রয়েছে বাইনারি সেম্যাফোর হিসাবে উল্লেখ করা হয়।
Supporting ownership
, maximum number of processes share lock
এবং maximum number of allowed processes/threads in critical section
তিনটি প্রধান কারণ যা সাধারণ নাম সহ সমবর্তী বস্তুর নাম / প্রকার নির্ধারণ করে lock
। যেহেতু এই কারণগুলির মান বাইনারি (দুটি রাজ্য রয়েছে), তাই আমরা তাদের 3 - 8 সত্য-জাতীয় টেবিলে সংক্ষিপ্ত করতে পারি।
X Y Z Name
--- --- --- ------------------------
0 ∞ ∞ Semaphore
0 ∞ 1 Binary Semaphore
0 1 ∞ SemaphoreSlim
0 1 1 Binary SemaphoreSlim(?)
1 ∞ ∞ Recursive-Mutex(?)
1 ∞ 1 Mutex
1 1 ∞ N/A(?)
1 1 1 Lock/Monitor
এই টেবিলটি সম্পাদনা বা প্রসারিত নির্দ্বিধায়, আমি এটিকে সম্পাদনযোগ্য হওয়ার জন্য এ্যাসকি টেবিল হিসাবে পোস্ট করেছি :)