সেম্যাফোর এবং সেম্যাফোরস্লিমের মধ্যে আমি কীভাবে নির্বাচন করব?


109

তাদের পাবলিক ইন্টারফেস একই রকম প্রদর্শিত হয়। ডকুমেন্টেশন বলে যে SemaphoreSlim একটি হালকা বিকল্প নেই এবং Windows কার্নেল semaphores ব্যবহার করে না। এই সংস্থান বলে যে সেমফোরস্লিম অনেক দ্রুত। কোন পরিস্থিতিতে সেমফোরস্লিম সেম্যাফোরের উপর আরও তাত্পর্যপূর্ণ এবং এর বিপরীতে?


1
Semaphore সর্বদা ওএস এ কাজটি পাস করে। এটি যদি তুলনামূলকভাবে ব্যয়বহুল করে তোলে যদি সেমফোর দৃ strongly়ভাবে প্রতিযোগিতা না করা হয়, কার্নেল কলটিতে সহজেই 400 ন্যানো সেকেন্ডের দাম পড়বে। স্লিম অনুগ্রহটি প্রথমে ভাগ করে নেওয়া পরিবর্তনশীল দিয়ে সস্তায় এটি করার চেষ্টা করে, যখন ওএস কাজ করে না তখন কেবল ওএস এ কল করে। আপনি সর্বদা সস্তা পছন্দ করেন, কোণার ক্ষেত্রে ব্যতীত যেখানে একাধিক প্রক্রিয়া দ্বারা সেমফোর ভাগ করে নেওয়া দরকার।
হ্যানস প্যাস্যান্ট

উত্তর:


64

একটি পার্থক্য হ'ল SemaphoreSlimনামবিহীন সেমফোর্ডগুলি অনুমোদন দেয় না, যা সিস্টেম-প্রশস্ত হতে পারে। এর অর্থ হ'ল ক্রোম-প্রক্রিয়া সিঙ্ক্রোনাইজেশনের জন্য একটি সেমফোরস্লিম ব্যবহার করা যায়নি।

এমএসডিএন ডকুমেন্টেশনটিও ইঙ্গিত দেয় যে "অপেক্ষা করার সময় খুব সংক্ষিপ্ত হওয়ার আশা করা হয়" তখন সেমস্লিম ব্যবহার করা উচিত। এটি বেশিরভাগ ট্রেড অফের জন্য স্লিম সংস্করণটি বেশি হালকা weight


66
আশা করি এমএস যখন অপেক্ষা সময়গুলি খুব খুব সংক্ষিপ্ত না হয় তখন কী ঘটেছিল সে সম্পর্কে কিছু লিখেছিলেন।
জন রেইনল্ডস

79
... বা "খুব সংক্ষিপ্ত" এর অর্থ
রিচার্ড জাজাল

9
সিস্টেমের উপর নির্ভর করে, ওয়েমওন করতে বা মুক্তি দেওয়ার জন্য সেমাফোরের জন্য 1 মাইক্রোসেকেন্ড এবং সেমাফোরস্লিমের জন্য 1/4 মাইক্রোসেকেন্ড [পি] "সংক্ষেপে" সি # 5.0 "পিজি। 890] তাই সম্ভবত তারা খুব সংক্ষিপ্ত অপেক্ষার সময় বলতে কী বোঝায়?
ডেভিড শেরেট

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

4
@ কুলিক্স সেমফোর বনাম সেমফোরস্লিমের উত্সের দিকে তাকিয়ে আমি সন্দেহ করি যে সেমফোরস্লিম কেবল "খুব সংক্ষিপ্ত" অপেক্ষার জন্য ব্যবহার করা উচিত কারণ এটি স্পিন ওয়েট ব্যবহার করে। এটি আরও প্রতিক্রিয়াশীল, তবে প্রচুর সিপিইউ খায় এবং তাত্ক্ষণিক প্রতিক্রিয়াগুলি কম গুরুত্বপূর্ণ এমন দীর্ঘ সময়ের জন্য অপ্রয়োজনীয়। সেমফোর পরিবর্তে থ্রেডটি ব্লক করে।
r2_118

17

এমএসডিএন ডকুমেন্টেশন পার্থক্য বর্ণনা করে।

এক বাক্যে:

  • SemaphoreSlim বর্গ একটি হালকা ওজনের, দ্রুত সেমোফোর প্রতিনিধিত্ব করে যা একক প্রক্রিয়ার মধ্যে অপেক্ষা করার জন্য ব্যবহার করা যেতে পারে যখন অপেক্ষা করার সময়গুলি খুব কম আশা করা হয়।

1
এটি যুক্ত করতে, সমস্ত ক্ষেত্রেই আপনার অ্যাপ্লিকেশনটি আপনার কম্পিউটারে একমাত্র প্রক্রিয়া যেখানে সেমাফোরে অ্যাক্সেসের প্রয়োজন হতে চলেছে সেম্যাফোরস্লিম ব্যবহার করুন।
অস্টিন সালগাত

2
@ সালগাট আপনি কেন এটি করবেন? অন্যান্য SemaphoreSlimউত্তরে বর্ণিত হিসাবে, স্পিনওয়েট ব্যবহার করে প্রয়োগ করা হয়েছে, সুতরাং আপনি যদি এটির জন্য অনেকটা অপেক্ষা করেন, আপনি অনেকগুলি সিপিইউ সময় নষ্ট করবেন। কম্পিউটারে যদি আপনার প্রক্রিয়াটি একমাত্র প্রক্রিয়া হয় তবে এটি কোনও ভাল ধারণাও নয়।
এম স্ট্রামম

এমএসডিএন ডকুমেন্টেশন থেকে, "একক অ্যাপ্লিকেশনটির মধ্যে সিঙ্ক্রোনাইজেশনের জন্য সেমফোরস্লিম ক্লাস হ'ল প্রস্তাবিত সেমফোর" " বিশেষ কেস ব্যতীত আপনার কেবলমাত্র একটি প্রক্রিয়া সেম্যাফোর ব্যবহার করছে সেম্যাফোরস্লিম ব্যবহার করে আপনার ডিফল্ট হওয়া উচিত। বিশেষত কোনও ব্যতিক্রমী ডেটা টাইপের জন্য বিশেষ ব্যতিক্রমগুলি উপস্থিত থাকে যা কোনও কথা ছাড়াই চলে।
অস্টিন সালগাত

17

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

সেম্যাফোর ওএস কার্নেলের প্রয়োগের উপর নির্ভর করে, তাই আপনি যখনই লকটি অর্জন করবেন তখন প্রতিবার আপনি অনেকগুলি সিপিইউ চক্র ব্যয় করেন, তবে এর পরে থ্রেডটি কেবল লক পাওয়ার জন্য যতক্ষণ প্রয়োজন ততক্ষণ ঘুমায়।


12

"স্বল্প সময়ের" বিতর্ক সম্পর্কিত:

কমপক্ষে সেমফোরস্লিম এমএসডিএন ডকুমেন্টেশনে বলা হয়েছে যে

SemaphoreSlim বর্গটি একটি একক অ্যাপ্লিকেশনের মধ্যে সিঙ্ক্রোনাইজেশনের জন্য প্রস্তাবিত সেমফোর।

মন্তব্য বিভাগে। একই বিভাগটি সেমফোর এবং সেম্যাফোরস্লিমের মধ্যে প্রধান পার্থক্যটিও বলে:

SemaphoreSlim Semaphore বর্গের জন্য একটি হালকা ওজনের বিকল্প যা উইন্ডোজ কার্নেল semaphores ব্যবহার করে না। সেম্যাফোর ক্লাসের বিপরীতে, সেমফোরস্লিম ক্লাস নামকৃত সিস্টেম সেমোফোরগুলি সমর্থন করে না। আপনি কেবল স্থানীয় সেমফোর হিসাবে এটি ব্যবহার করতে পারেন।


1
আরো বিস্তারিত: [SemaphoreSlim and other locks] use busy spinning for brief periods before they put the thread into a true Wait state. When wait times are expected to be very short, spinning is far less computationally expensive than waiting, which involves an expensive kernel transition: dotnet.github.io/docs/essentials/collections/...
মার্কো সাল্লা

0

আমি এখানে সোর্স কোডটি দেখেছি এবং এটিই আমি এনেছি:

  1. সেমাফোর এবং সেম্যাফোরস্লিম উভয়ই ওয়েটহ্যান্ডল থেকে প্রাপ্ত যা অভ্যন্তরীণভাবে Win32 নেটিভ হ্যান্ডেল ব্যবহার করে। এজন্য আপনার উভয়কেই নিষ্পত্তি করতে হবে। সুতরাং স্লিম হালকা ওজনের ধারণাটি সন্দেহজনক।

  2. সেমাফোরস্লিম অভ্যন্তরীণভাবে স্পিনওয়েট ব্যবহার করে যখন সেমাফোরে নেই। এটি আমাকে জানিয়েছে যে ক্ষেত্রে অপেক্ষা অপেক্ষা দীর্ঘ হতে পারে, সেম্যাফোরের কমপক্ষে এই অর্থে আরও ভাল করা উচিত যে এটি আপনার সিপিইউকে হ্রাস করবে না।


2
SemaphoreSlim ওয়েটহ্যান্ডল থেকে প্রাপ্ত নয়। প্রকৃতপক্ষে এটি একটি একক লক্ষ্য নিয়ে তৈরি হয়েছিল - ওয়েটহ্যান্ডল, যা কার্নেল স্পেস আদিম, থেকে ডাইভারিং নির্মূল করার জন্য যেখানে আপনাকে কেবলমাত্র একটি প্রক্রিয়াটির মধ্যে ক্রিয়াকলাপ সিঙ্ক্রোনাইজ করতে হবে।
ইগোর ভি সাভচেঙ্কো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.