স্পিনলক বনাম সেম্যাফোর


119

একটি semaphore এবং স্পিন লক মধ্যে মৌলিক পার্থক্য কি?

আমরা কখন একটি স্পিন-লকের উপরে একটি সেমফোর ব্যবহার করব?

উত্তর:


134

স্পিনলক এবং সেমফোর মূলত চারটি জিনিসে পৃথক:

1. তারা কী
একটি স্পিনলক হ'ল একটি লকের সম্ভাব্য বাস্তবায়ন, যাহা ব্যস্ত অপেক্ষা ("স্পিনিং") দ্বারা প্রয়োগ করা হয়। একটি সেমফোর একটি লকের একটি সাধারণীকরণ (বা অন্যদিকে, লকটি একটি সেমফোরের একটি বিশেষ কেস)। সাধারণত, তবে অগত্যা নয় যে স্পিনলকগুলি কেবলমাত্র একটি প্রক্রিয়ার মধ্যেই বৈধ থাকে তবে বিভিন্ন প্রসেসের মধ্যেও সিমফোরগুলি সিঙ্ক্রোনাইজ করতে ব্যবহার করা যেতে পারে।

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

ইনসোফার, একটি লকটি সর্বোচ্চ মান 1 দিয়ে একটি সেমফোরের বিশেষ কেসটিকে বিবেচনা করতে পারে।

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

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

৩. ভিড়ের উপস্থিতিতে তারা কীভাবে আচরণ করে
এটি একটি সাধারণ ভুল ধারণা যে স্পিনলকস বা লক-মুক্ত অ্যালগোরিদমগুলি "সাধারণত দ্রুত" হয়, বা এগুলি কেবল "খুব ছোট কাজগুলির" জন্য কার্যকর (আদর্শভাবে, কোনও সুসংগত বস্তু বেশি দিন ধরে রাখা উচিত নয়) একেবারে প্রয়োজনের তুলনায়, কখনও)।
একটি গুরুত্বপূর্ণ পার্থক্য হ'ল ভিড়ের উপস্থিতিতে বিভিন্ন পদ্ধতি কীভাবে আচরণ করে ।

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

এই জাতীয় ক্ষেত্রে, একটি স্পিনলক একটি বিস্তৃত পরিমাণে একটি উপকূলকে ছাড়িয়ে যায় কারণ যদি কোনও তালাবন্ধি না থাকে, তবে স্পিনলক অর্জনের ওভারহেডটি প্রসঙ্গের সুইচটির জন্য কয়েকশো / হাজার হাজার চক্রের তুলনায় বা হারানোর জন্য 10-20 মিলিয়ন চক্রের তুলনায় মাত্র কয়েক ডজন চক্র is একটি সময় স্লাইস বাকি।

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

এছাড়াও, একটি একক-কোর সিস্টেমে একটি স্পিনলক লক যানজটের উপস্থিতিতে যথেষ্ট অকার্যকর হবে, কারণ একটি স্পিনিং থ্রেড সম্ভবত এমন ঘটতে পারে না এমন রাষ্ট্রীয় পরিবর্তনের জন্য অপেক্ষা করে তার সম্পূর্ণ সময় নষ্ট করবে (মুক্ত থ্রেডটি নির্ধারিত না হওয়া অবধি, না অপেক্ষার থ্রেড চলমান অবস্থায় ঘটছে না!)। অতএব, কোনও পরিমাণ বিতর্ক দেওয়া থাকলে, লকটি অর্জন করতে সেরা ক্ষেত্রে প্রায় 1 1/2 সময়ের টুকরোগুলি লাগে (ধরে নিচ্ছেন যে রিলিজিং থ্রেডটি পরেরটি নির্ধারিত হচ্ছে), যা খুব ভাল আচরণ নয়।

৪) কীভাবে তারা বাস্তবায়ন করা হয়
একটি সেমফোর আজকাল সাধারণত sys_futexলিনাক্সের আওতায় আবৃত (বিকল্পভাবে একটি স্পিনলক যা কয়েক চেষ্টার পরে বেরিয়ে আসে)।
একটি স্পিনলক সাধারণত পারমাণবিক ক্রিয়াকলাপগুলি ব্যবহার করে এবং অপারেটিং সিস্টেমের সরবরাহকৃত কিছু ব্যবহার না করে প্রয়োগ করা হয়। অতীতে, এর অর্থ সংকলক অভ্যন্তরীণ বা অ-বহনযোগ্য অ্যাসেমব্লার নির্দেশাবলী using ইতিমধ্যে সি ++ 11 এবং সি 11 উভয়ের ভাষার অংশ হিসাবে পারমাণবিক ক্রিয়াকলাপ রয়েছে, সুতরাং সম্ভবত সঠিকভাবে লক-ফ্রি কোড লেখার সাধারণ অসুবিধা বাদ দিয়ে এখন সম্পূর্ণ পোর্টেবল এবং (প্রায়) লক-ফ্রি কোডটি প্রয়োগ করা সম্ভব implement বেদনাবিহীন উপায়


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

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

76

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

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

সাধারণত আপনি যদি কোনও থ্রেড কোয়ান্টামের চেয়ে বেশি সময় ধরে স্পিন করেন তবে আপনার একটি সেমফোর ব্যবহার করা উচিত।


27

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


7
আমি একক থ্রেডেড সিস্টেমে স্পিনলক ব্যবহার না করা কতটা গুরুত্বপূর্ণ তা দ্বিতীয়টি বলতে চাই। এগুলি অগ্রাধিকার বিপরীতে সমস্যাগুলির প্রতি টিক্সিত। এবং আমাকে বিশ্বাস করুন: আপনি এই ধরণের বাগগুলি ডিবাগ করতে চান না।
নীল পিপেনব্রিংক

2
স্পিনলকগুলি লিনাক্স কার্নেলে সমস্ত শেষ, আপনার যদি আরও একটি আকরিক সিপিইউ থাকে তা নির্বিশেষে। তুমি আসলে কি বোঝাতে চাও?
অধ্যাপক ফ্যালকেন

@ অভিবাসী: সংজ্ঞা অনুসারে, একটি স্পিনলক মানে সিপিইউতে বর্তমান থ্রেডটি লক করা অবজেক্টটি ছেড়ে দেওয়ার জন্য অন্য কোনও কিছুর জন্য অপেক্ষা করছে। যদি লকটি পরিবর্তন করতে পারে এমন একমাত্র সক্রিয় জিনিসটি হ'ল বর্তমান সিপিইউ, স্পিন করে লকটি মুক্ত হবে না। যদি অন্য কিছু হয় - একটি ডিএমএ স্থানান্তর বা অন্য আই / ও কন্ট্রোলার লকটি ছেড়ে দিতে পারে, সব ভাল good তবে অন্য কোনও কিছুই যখন লকটি ছেড়ে দিতে পারে না তখন স্পিনিং করা খুব বুদ্ধিমানের নয় - প্রিম্প্ট হওয়ার অপেক্ষা হিসাবে আপনি এখনই অন্য একটি প্রক্রিয়ায় সিপিইউ দিতে পারেন।
জোনাথন লেফলার

1
আমি খুব ভাল ভুল হতে পারি, কিন্তু আমি এই ছাপে ছিলাম যে একটি পুনরায় প্রবেশকারী (একক সিপিইউ) লিনাক্স কার্নেল চলমান স্পিন লককে বাধা দিতে পারে।
অধ্যাপক ফ্যালকেন

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

19

রুবিনির দ্বারা লিনাক্স ডিভাইস ড্রাইভার থেকে

সেমফোরগুলির বিপরীতে, স্পিনলকগুলি এমন কোডে ব্যবহার করা যেতে পারে যা ঘুমাতে পারে না, যেমন বাধা হ্যান্ডলারগুলি


8

আমি কার্নেল বিশেষজ্ঞ নই তবে এখানে কয়েকটি পয়েন্ট রয়েছে:

এমনকি ইউনিকপ্রসেসর মেশিনটি কার্নেল সংকলনের সময় কার্নেল প্রিম্পশন সক্ষম করা থাকলে স্পিন-লক ব্যবহার করতে পারে। যদি কার্নেল প্রিম্পশন অক্ষম থাকে তবে স্পিন-লক (সম্ভবত) একটি অকার্যকর স্টেটমেন্টে প্রসারিত হয় ।

এছাড়াও, যখন আমরা সেমফোর বনাম স্পিন-লকটির সাথে তুলনা করার চেষ্টা করছি, আমি বিশ্বাস করি যে সেমফোর কর্নলে ব্যবহৃত একটিকে বোঝায় - আইপিসি (ইউজারল্যান্ড) এর জন্য ব্যবহৃত এক নয়।

মূলত, স্পিন-লক ব্যবহার করা হবে যদি সমালোচনামূলক বিভাগটি ছোট হয় (ঘুমের ঘুম থেকে উঠে / জেগে ওঠার চেয়ে ছোট) এবং সমালোচনা বিভাগটি এমন কিছু কল করতে পারে না যা ঘুমাতে পারে! সমালোচনা বিভাগটি বড় হলে এবং এটি ঘুমাতে পারে যদি একটি সেমফোর ব্যবহার করা হবে।

রমন চলোত্রা।


7

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

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

এটি বলেছিল - সমাবেশে স্প্লিনলকগুলি কার্যকর করা জটিল, এবং বহনযোগ্য নয়।


4
সমস্ত মাল্টি-থ্রেডিং সিপিইউগুলির একটি স্পিনলক নির্দেশ ("পরীক্ষা ও সেট") প্রয়োজন এবং এটি সর্বদা হার্ডওয়্যারে একক নির্দেশনা হিসাবে প্রয়োগ করা হয় কারণ অন্যথায় সর্বদা একটি দৌড়ের অবস্থা থাকবে যেখানে একাধিক থ্রেড সুরক্ষিত সংস্থানটিকে "মালিকানাধীন" বলে মনে করেছিল।
রিচার্ড টি

আমি নিশ্চিত না যে আপনি সেমফোরগুলি
gbjbaanb

পসিক্স থ্রেড দ্বারা ভাগ করা একটি সেমফোর এবং প্রক্রিয়া দ্বারা ভাগ করা একটি সেমফোরের মধ্যে পার্থক্য তৈরি করে।
গ্রেগ রজার্স

2
সেমোফোরগুলি ইন্টার-প্রসেস সিঙ্ক্রোনাইজেশনের জন্য, যোগাযোগ নয়।
জোহান বেজেম

6

আমি আমার পর্যবেক্ষণগুলি যুক্ত করতে চাই, আরও সাধারণ এবং খুব লিনাক্স-নির্দিষ্ট নয়।

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

হ্যাঁ, যদি আপনার মেমরি আর্কিটেকচারটি অন্য কোনও অ্যাক্সেসে বিলম্বিত করে একটি কোর / প্রসেসরের দ্বারা মেমরি বিভাগটিকে লক করার প্রস্তাব দেয় এবং যদি আপনার প্রসেসরগুলি পরীক্ষা-সেট দেয় তবে আপনি কোনও স্পিন-লক ছাড়াই একটি সেমফোর প্রয়োগ করতে পারেন (তবে খুব সাবধানে! )।

তবে, সহজ / সস্তা মাল্টি-কোর সিস্টেমগুলি যেমন ডিজাইন করা হয়েছে (আমি এম্বেডড সিস্টেমে কাজ করছি), সমস্ত মেমরি আর্কিটেকচারগুলি এই জাতীয় মাল্টি-কোর / মাল্টিপ্রসেসর বৈশিষ্ট্যগুলি সমর্থন করে না, কেবল পরীক্ষা-সেট-সেট বা সমতুল্য। তারপরে একটি বাস্তবায়ন নিম্নরূপ হতে পারে:

  • স্পিন-লক অর্জন (ব্যস্ত অপেক্ষা)
  • semaphore অর্জন করার চেষ্টা করুন
  • স্পিন-লক ছেড়ে দিন
  • যদি সেমফোরটি সফলভাবে অর্জিত না হয়, তবে বর্তমান থ্রেড স্থগিত করুন যতক্ষণ না سيمফোরটি প্রকাশিত হয়; অন্যথায় সমালোচনা বিভাগে চালিয়ে যান

সমুদ্রের তীর ছেড়ে দেওয়ার জন্য নিম্নলিখিতভাবে প্রয়োগ করা দরকার:

  • স্পিন-লক অর্জন
  • সেমফোর ছেড়ে দিন
  • স্পিন-লক ছেড়ে দিন

হ্যাঁ, এবং কোনও ওএস-স্তরের সাধারণ বাইনারি সেমফোরগুলির জন্য প্রতিস্থাপন হিসাবে কেবল একটি স্পিন-লক ব্যবহার করা সম্ভব। তবে কেবলমাত্র কোড-বিভাগগুলি সুরক্ষিত রাখতে যদি খুব ছোট হয়।

পূর্বে যেমন বলা হয়েছে, আপনি যখন নিজের ওএস প্রয়োগ করেন এবং কখন, সতর্কতা অবলম্বন করুন। এই জাতীয় ত্রুটিগুলি ডিবাগ করা মজাদার (আমার মতামত, অনেকের দ্বারা ভাগ করা হয়নি), তবে বেশিরভাগই অত্যন্ত ক্লান্তিকর এবং কঠিন।


1

একটি "মুটেক্স" (বা "পারস্পরিক বাদে লক") এমন সংকেত যা দুটি বা ততোধিক অ্যাসিনক্রোনাস প্রক্রিয়া একচেটিয়া ব্যবহারের জন্য ভাগ করা সংস্থান সংরক্ষণ করতে ব্যবহার করতে পারে। "মিটেক্স" এর মালিকানা প্রাপ্ত প্রথম প্রক্রিয়াটি ভাগ করা সংস্থার মালিকানাও অর্জন করে। অন্যান্য প্রক্রিয়াগুলি প্রথম প্রক্রিয়াটি এটি পাওয়ার চেষ্টা করার আগে "মুটেক্স" এর মালিকানা প্রকাশের জন্য অপেক্ষা করতে হবে।

কার্নেলের মধ্যে সবচেয়ে সাধারণ লকিং আদিম হ'ল স্পিনলক। স্পিনলকটি খুব সাধারণ একক-ধারক লক। যদি কোনও প্রক্রিয়া একটি স্পিনলক অর্জন করার চেষ্টা করে এবং এটি অনুপলব্ধ থাকে, তবে লকটি অর্জন না করা অবধি প্রক্রিয়াটি চেষ্টা (স্পিনিং) চালিয়ে যাবে। এই সরলতা একটি ছোট এবং দ্রুত লক তৈরি করে।


1

আপনার থ্রেডের এক্সিকিউশন স্লাইস সময় শেষ হওয়ার আগে আপনার প্রত্যাশিত ফলাফল খুব শীঘ্রই ঘটবে বলে আপনি যদি নিশ্চিত হন তবেই স্পিনলক ব্যবহার করা হয়।

উদাহরণ: ডিভাইস ড্রাইভার মডিউলে, ড্রাইভার হার্ডওয়্যার রেজিস্টার আর 0 তে "0" লিখেছেন এবং এখন সেই আর0 রেজিস্টারটি 1 হওয়ার জন্য অপেক্ষা করতে হবে। এইচ / ডাব্লু আর0 পড়ে এবং কিছু কাজ করে এবং আর 1 তে "1" লিখেছে। এটি সাধারণত দ্রুত (মাইক্রো সেকেন্ডে) is ঘুমানোর চেয়ে এখন স্পিনিং আরও ভাল এবং এইচ / ডাব্লু দ্বারা বাধা দেওয়া। অবশ্যই স্পিনিংয়ের সময় এইচ / ডাব্লু ব্যর্থতার শর্তটি যত্ন নেওয়া দরকার!

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


1

থেকে কি স্পিন কেশ এবং semaphores মধ্যে পার্থক্য কি? দ্বারা Maciej Piechotka :

উভয়ই একটি সীমিত সংস্থান পরিচালনা করে। আমি প্রথমে বাইনারি সেম্যাফোর (মিটেক্স) এবং স্পিন লকের মধ্যে পার্থক্য বর্ণনা করব।

স্পিন লকগুলি একটি ব্যস্ত অপেক্ষা করে - অর্থাত এটি লুপটি চালিয়ে যায়:

যখন (চেষ্টা_অ্যাক্কায়ার_স্রোত ()); 
 ...  
মুক্তি();

এটি খুব লাইটওয়েট লকিং / আনলকিং সম্পাদন করে তবে যদি লকিং থ্রেডটি অন্যের দ্বারা প্রিম্প্ট হয়ে যায় যা একই পুনরায় স্থানটি অ্যাক্সেস করার চেষ্টা করবে তবে দ্বিতীয়টি কেবল সিপিইউ কোয়ান্টায় চালিত না হওয়া অবধি রিসোর্সটি খালাস করার চেষ্টা করবে।
অন্যদিকে মিটেক্স আরও বেশি আচরণ করে:

যদি (! চেষ্টা_লক ())
    add_to_waiting_queue ();
    অপেক্ষা করুন ();
}
...
প্রক্রিয়া * পি = get_next_process_from_waiting_queue ();
p-> ওয়েকআপ ();

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

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

পি (resources_sem)
রিসোর্স = রিসোর্স.পপ ()
...
resources.push (সম্পদ)
ভী (resources_sem)

সেমফোর, মিটেক্স এবং স্পিনলকের মধ্যে পার্থক্য?

লিনাক্সে লক করা হচ্ছে


1
এটির একটি অনুলিপি / পেস্ট বলে মনে হচ্ছে ;-): স্পিন লক এবং সেমোফোরগুলির মধ্যে পার্থক্য কী?
Hibou57

0

স্পিন লক কেবল একটি প্রক্রিয়া দ্বারা ধারণ করা যেতে পারে যখন সেমফোর এক বা একাধিক প্রক্রিয়া দ্বারা রাখা যেতে পারে। প্রক্রিয়াটি কোনও লক প্রকাশ না করে এবং তারপরে একটি লকটি অর্জন না করা পর্যন্ত স্পিন লক অপেক্ষা করুন। Semaphore ঘুমন্ত লক অর্থাৎ অপেক্ষা করে ঘুমাতে যায়।

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