আমি মনে করি উভয়ই একই কাজ করছে, আপনি কীভাবে সিঙ্ক্রোনাইজেশনের জন্য ব্যবহার করবেন তা সিদ্ধান্ত নেবেন?
আমি মনে করি উভয়ই একই কাজ করছে, আপনি কীভাবে সিঙ্ক্রোনাইজেশনের জন্য ব্যবহার করবেন তা সিদ্ধান্ত নেবেন?
উত্তর:
তত্ত্বটি
তত্ত্ব অনুসারে, যখন কোনও থ্রেড একটি মিউটেক্সকে লক করার চেষ্টা করে এবং এটি সফল হয় না, কারণ এমনিতেই মিউটেক্সটি লক হয়ে গেছে, এটি ঘুমাতে যাবে, সঙ্গে সঙ্গে অন্য থ্রেড চালানোর অনুমতি দেয়। ঘুম থেকে ওঠা অবধি ঘুমোতে থাকবে, যা মুটেেক্স আনলক হয়ে যাবার আগে থ্রেডটি আগে লকটি ধরেছিল তার দ্বারা কেটে যাবে। যখন কোনও থ্রিন একটি স্পিনলককে লক করার চেষ্টা করে এবং এটি সফল হয় না, অবশেষে এটি সফল না হওয়া অবধি এটি লক করার জন্য অবিরাম চেষ্টা করবে; সুতরাং এটি অন্য থ্রেডকে এটির জায়গা দেবে না (তবে, অপারেটিং সিস্টেমটি জোর করে অন্য থ্রেডে স্যুইচ করবে, একবারের বর্তমান থ্রেডের সিপিইউ রানটাইম কোয়ান্টাম ছাড়িয়ে গেলে অবশ্যই)।
সমস্যাটি
মিউটেক্সেসের সমস্যাটি হ'ল ঘুমানোর জন্য থ্রেড লাগানো এবং তাদের আবার জাগানো উভয়ই ব্যয়বহুল অপারেশন, তাদের সিপিইউর প্রচুর নির্দেশাবলীর প্রয়োজন হবে এবং এইভাবে কিছুটা সময় নিতে হবে। যদি এখন কেবলমাত্র খুব অল্প সময়ের জন্য মিউটেক্সটি লক করা থাকে, তবে একটি সূত্রে ঘুমাতে রেখে আবার জাগাতে ব্যয় করা সময়টি থ্রেডটি প্রকৃতপক্ষে ঘুমিয়ে থাকা সময়ের চেয়ে বেশি হতে পারে এবং এটি থ্রেডের সময়ের চেয়েও বেশি হতে পারে একটি স্পিনলকের উপর ক্রমাগত ভোট দিয়ে অপচয় করা হয়েছে। অন্যদিকে, একটি স্পিনলকের উপর ভোটদান ক্রমাগত সিপিইউ সময় নষ্ট করবে এবং যদি লকটি আরও বেশি সময় ধরে রাখা হয় তবে এটি অনেক বেশি সিপিইউ সময় নষ্ট করবে এবং তার পরিবর্তে থ্রেডটি ঘুমিয়ে থাকলে এটি আরও ভাল হত।
সমাধান
একটি একক কোর / একক-সিপিইউ সিস্টেমে স্পিনলক ব্যবহার করা সাধারণত বোধগম্য হয় না, যেহেতু স্পিনলক পোলিং কেবলমাত্র উপলভ্য সিপিইউ কোরকে অবরুদ্ধ করে চলেছে, অন্য কোনও থ্রেড চলতে পারে না এবং যেহেতু অন্য কোনও থ্রেড চলতে পারে না, লক হবে না আনলক করা হয়। আইওডাব্লু, একটি স্পিনলক আসল সুবিধার জন্য those সিস্টেমে কেবল সিপিইউ সময় নষ্ট করে। থ্রেডটি যদি তার পরিবর্তে ঘুমানো হয় তবে অন্য থ্রেড একবারে দৌড়ে যেতে পারত, সম্ভবত লকটি আনলক করে এবং তারপরে আবার জেগে উঠলে প্রথম থ্রেডটি প্রক্রিয়াজাতকরণের অনুমতি দেয়।
মাল্টি-কোর / মাল্টি-সিপিইউ সিস্টেমে প্রচুর পরিমাণে তালা রয়েছে যা কেবলমাত্র খুব অল্প সময়ের জন্যই রাখা হয়, ধীরে ধীরে ঘুমানোর জন্য থ্রেড রাখার জন্য এবং তাদের আবার জাগ্রত করার জন্য সময় নষ্ট হয়ে যাওয়ার ফলে রানটাইম কর্মক্ষমতা হ্রাস পেতে পারে। পরিবর্তে স্পিনলকগুলি ব্যবহার করার সময়, থ্রেডগুলি তাদের পুরো রানটাইম কোয়ান্টামের সুবিধা নেওয়ার সুযোগ পায় (সর্বদা কেবল খুব স্বল্প সময়ের জন্য অবরুদ্ধ করে তবে তাৎক্ষণিকভাবে তাদের কাজ চালিয়ে যায়), ফলে উচ্চতর প্রসেসিংয়ের মাধ্যমে আউটপুট পাওয়া যায়।
অনুশীলন
যেহেতু খুব ঘন ঘন প্রোগ্রামাররা আগে থেকেই জানতে পারে না যদি মিটেক্সেস বা স্পিনলকগুলি আরও ভাল হয় (উদাহরণস্বরূপ কারণ লক্ষ্য আর্কিটেকচারের সিপিইউ কোরগুলির সংখ্যা অপরিচিত), অথবা অপারেটিং সিস্টেমগুলি জানতে পারে না যে কোনও একটি নির্দিষ্ট কোডের সিঙ্গেল-কোরের জন্য অনুকূলিত করা হয়েছে বা মাল্টি-কোর এনভায়রনমেন্ট, বেশিরভাগ সিস্টেমে মিটেক্স এবং স্পিনলকের মধ্যে কঠোরভাবে পার্থক্য করে না। আসলে, বেশিরভাগ আধুনিক অপারেটিং সিস্টেমে হাইব্রিড মিটেক্সেস এবং হাইব্রিড স্পিনলক রয়েছে। যে আসলে এর অর্থ কি?
একটি হাইব্রিড মিউটেক্স প্রথমে বহু-কোর সিস্টেমে একটি স্পিনলকের মতো আচরণ করে। যদি কোনও থ্রেড মিউটেক্সকে লক করতে না পারে তবে তা অবিলম্বে ঘুমানো হবে না, যেহেতু মিটেক্স খুব শীঘ্রই আনলক হয়ে যেতে পারে, সুতরাং পরিবর্তে মুটেক্স প্রথমে স্পিনলকের মতো হুবহু আচরণ করবে। নির্দিষ্ট সময়ের (বা পুনরায় চেষ্টা বা অন্য কোনও পরিমাপের উপাদান) পরে এখনও যদি লকটি না পাওয়া যায় তবে থ্রেডটি সত্যই ঘুমিয়ে দেওয়া হয়েছে। যদি একই কোডটি কেবলমাত্র একটি একক কোর সহ কোনও সিস্টেমে চলে, তবে মিউটেক্স স্পিনলক করবে না, যদিও উপরে হিসাবে দেখুন, এটি উপকারী হবে না।
একটি হাইব্রিড স্পিনলক প্রথমে একটি সাধারণ স্পিনলকের মতো আচরণ করে তবে খুব বেশি সিপিইউ সময় নষ্ট না করার জন্য এটির ব্যাক-অফ কৌশল থাকতে পারে। এটি সাধারণত থ্রেডকে ঘুমাতে দেয় না (যেহেতু আপনি স্পিনলক ব্যবহারের সময় এমনটি ঘটতে চান না) তবে এটি থ্রেডটি বন্ধ করার সিদ্ধান্ত নিতে পারে (হয় তাত্ক্ষণিকভাবে বা নির্দিষ্ট সময়ের পরে) এবং অন্য থ্রেড চালানোর অনুমতি দেয় , এইভাবে স্পিনলক আনলকড হওয়ার সম্ভাবনা বাড়ছে (খাঁটি থ্রেড সুইচ সাধারণত তার চেয়ে কম ব্যয়বহুল যার মধ্যে ঘুমানোর জন্য একটি থ্রেড লাগানো এবং পরে আবার জাগানো জড়িত, যদিও খুব বেশি দূরে নয়)।
সারসংক্ষেপ
যদি সন্দেহ হয়, মিটেক্সেস ব্যবহার করুন তবে এগুলি সাধারণত ভাল পছন্দ এবং বেশিরভাগ আধুনিক সিস্টেমগুলি যদি খুব সুবিধাজনক বলে মনে হয় তবে খুব অল্প সময়ের জন্য স্পিনলক করতে দেয়। স্পিনলক ব্যবহার কখনও কখনও পারফরম্যান্সের উন্নতি করতে পারে তবে কেবলমাত্র কিছু শর্তের মধ্যে এবং আপনি যে সন্দেহ করছেন তা বরং আমাকে বলে, আপনি বর্তমানে এমন কোনও প্রকল্পে কাজ করছেন না যেখানে স্পিনলক সুবিধাজনক হতে পারে। আপনি আপনার নিজের "লক অবজেক্ট" ব্যবহার করে বিবেচনা করতে পারেন, এটি হয় কোনও স্পিনলক বা কোনও মিউটেক্স অভ্যন্তরীণভাবে ব্যবহার করতে পারে (যেমন এইরকম বস্তু তৈরি করার সময় এই আচরণটি কনফিগারযোগ্য হতে পারে), শুরুতে সর্বত্র মুটেক্স ব্যবহার করুন এবং যদি আপনি মনে করেন যে কোনও স্পিনলক ব্যবহার করা সত্যিই পারে সহায়তা করুন, চেষ্টা করে দেখুন এবং ফলাফলগুলি তুলনা করুন (উদাহরণস্বরূপ প্রোফাইলার ব্যবহার করে) তবে উভয় ক্ষেত্রেই পরীক্ষা করতে ভুলবেন না,
আসলে আইওএস নির্দিষ্ট নয়, তবে আইওএস এমন একটি প্ল্যাটফর্ম যেখানে বেশিরভাগ বিকাশকারীরা সেই সমস্যার মুখোমুখি হতে পারেন: যদি আপনার সিস্টেমে থ্রেড শিডিয়ুলার থাকে তবে এটি কোনও গ্যারান্টি দেয় না যে কোনও থ্রেড, এর অগ্রাধিকার যত কম হোক না কেন, অবশেষে চালানোর সুযোগ পাবে, তারপরে স্পিনলকগুলি স্থায়ী অচলাবস্থার দিকে নিয়ে যেতে পারে। আইওএস শিডিউলর বিভিন্ন শ্রেণীর থ্রেড এবং থ্রেডকে নিম্ন শ্রেণীর মধ্যে আলাদা করে কেবল তখনই চালিত হবে যদি উচ্চতর শ্রেণীর কোনও থ্রেড পাশাপাশি চালাতে না চায়। এটির জন্য কোনও ব্যাক-অফ কৌশল নেই, সুতরাং আপনার যদি স্থায়ীভাবে উচ্চ শ্রেণির থ্রেড উপলব্ধ থাকে তবে নিম্ন শ্রেণীর থ্রেডগুলি কোনও সিপিইউ সময় পাবে না এবং এভাবে কোনও কাজ সম্পাদনের কোনও সুযোগ কখনও পাবেন না।
সমস্যাটি নিম্নলিখিত হিসাবে উপস্থিত হয়: আপনার কোডটি একটি নিম্ন প্রিও ক্লাসের থ্রেডে একটি স্পিনলক গ্রহণ করে এবং এটি সেই লকের মাঝখানে থাকাকালীন সময় কোয়ান্টামটি ছাড়িয়ে গেছে এবং থ্রেড চলমান বন্ধ করে দেয়। এই স্পিনলকটি কীভাবে আবার মুক্তি পেতে পারে তার একমাত্র উপায় হ'ল যদি নিম্ন প্রিও শ্রেণির থ্রেড আবার সিপিইউ সময় পায় তবে এটি হওয়ার নিশ্চয়তা নেই। আপনার কাছে বেশ কয়েকটি হাই প্রিও ক্লাস থ্রেড থাকতে পারে যা নিয়মিত চালাতে চায় এবং টাস্ক শিডিয়ুলার সর্বদা সেগুলিকে অগ্রাধিকার দেয়। তাদের মধ্যে একটি স্পিনলক পেরিয়ে দৌড়াতে পারে এবং এটি অর্জনের চেষ্টা করতে পারে যা অবশ্যই সম্ভব নয় এবং সিস্টেম এটি ফলন করবে। সমস্যাটি হ'ল: উত্পন্ন থ্রেডটি আবার চলার জন্য অবিলম্বে উপলব্ধ! লকটি ধরে থাকা থ্রেডের চেয়ে উচ্চতর প্রিও থাকায়, লকটি ধরে থাকা থ্রেডের সিপিইউ রানটাইম পাওয়ার কোনও সুযোগ নেই।
এই সমস্যাটি কেন মিটেক্সেসের সাথে ঘটে না? যখন উচ্চ প্রিও থ্রেড মিউটেক্সটি অর্জন করতে পারে না তখন ফল পাওয়া যায় না, এটি কিছুটা স্পিন করতে পারে তবে শেষ পর্যন্ত তাকে ঘুমাতে প্রেরণ করা হবে। এটি কোনও ইভেন্টে জাগ্রত না হওয়া অবধি ঘুমানোর জন্য থ্রেড পাওয়া যায় না, যেমন মিউটেক্স আনলক হওয়ার মতো একটি ইভেন্ট যার জন্য এটি অপেক্ষা করছিল। অ্যাপল সেই সমস্যা সম্পর্কে সচেতন এবং ফলস্বরূপ হ্রাস পেয়েছে OSSpinLock
। নতুন লক বলা হয় os_unfair_lock
। এই লকটি উপরে বর্ণিত পরিস্থিতি এড়িয়ে চলেছে কারণ এটি বিভিন্ন থ্রেড অগ্রাধিকার শ্রেণি সম্পর্কে অবগত। আপনি যদি নিশ্চিত হন যে স্পিনলকস ব্যবহার করা আপনার আইওএস প্রকল্পে একটি ভাল ধারণা, তবে এটি ব্যবহার করুন। থেকে দূরে থাকুনOSSpinLock
! এবং কোনও পরিস্থিতিতে আপনার নিজের স্পিনলকগুলি আইওএস এ প্রয়োগ করবেন না! যদি সন্দেহ হয়, একটি মিটেক্স ব্যবহার করুন! ম্যাকোস এই ইস্যু দ্বারা প্রভাবিত হয় না কারণ এর আলাদা থ্রেড শিডিয়ুলার রয়েছে যা কোনও থ্রেড (এমনকি নিম্ন প্রিও থ্রেড) সিপিইউতে "ড্রাই ড্রাই" চালাতে দেয় না, এখনও একই পরিস্থিতি সেখানে দেখা দিতে পারে এবং এরপরে খুব দুর্বল হয়ে যাবে পারফরম্যান্স, এভাবে OSSpinLock
ম্যাকোস-এও অবচয় করা হয়।
আলেকজান্ডার স্যান্ডলারের ব্লগে অ্যালেক্সের অ্যালেক্সে মেকির পরামর্শ অব্যাহত রেখে এই নিবন্ধে pthread mutex বনাম pthread স্পিনলক দেখায় যে কীভাবে #ifdef ব্যবহার করে আচরণ পরীক্ষা করার জন্য spinlock
& mutexes
প্রয়োগ করা যেতে পারে।
যাইহোক, আপনার পর্যবেক্ষণের ভিত্তিতে চূড়ান্ত কলটি গ্রহণ করা নিশ্চিত করুন, প্রদত্ত উদাহরণ হিসাবে বোঝা একটি বিচ্ছিন্ন ঘটনা, আপনার প্রকল্পের প্রয়োজনীয়তা, পরিবেশ সম্পূর্ণ আলাদা হতে পারে।
দয়া করে নোট করুন যে নির্দিষ্ট পরিবেশ এবং শর্তে (যেমন প্রেরন স্তরের উইন্ডোজ চলমান> = DISPATCH স্তর), আপনি মুটেক্স ব্যবহার করতে পারবেন না বরং স্পিনলক ব্যবহার করতে পারবেন। ইউনিক্সে - একই জিনিস।
প্রতিযোগী স্ট্যাকেক্সচেঞ্জ ইউনিক্স সাইটে সমতুল্য প্রশ্ন এখানে রয়েছে: /unix/5107/why-are-spin-locks-good-choice-in-linux-kernel-design-instead-of-something- অধিক
উইন্ডোজ সিস্টেমে প্রেরণের তথ্য: http://download.microsoft.com/download/e/b/a/eba1050f-a31d-436b-9281-92cdfeae4b45/IRQL_thread.doc
মক্কির উত্তর বেশ ভালভাবে নখ করে দিয়েছে। তবে, একটি একক প্রসেসরে, একটি স্পিনলক ব্যবহার করা বোধগম্য হতে পারে যখন টাস্কটি কোনও বিঘ্নিত পরিষেবা রুটিন দ্বারা প্রদত্ত লকটির জন্য অপেক্ষা করা হয়। বাধাগুলি আইএসআর-এ নিয়ন্ত্রণ স্থানান্তরিত করবে, যা প্রত্যাশাক টাস্ক দ্বারা ব্যবহারের জন্য উত্স প্রস্তুত করবে। এটি বাধাপ্রাপ্ত কার্যটিতে নিয়ন্ত্রণ ফিরিয়ে দেওয়ার আগে লকটি ছেড়ে দিয়ে শেষ হবে। স্পিনিং টাস্কটি স্পিনলকটি উপলভ্য করে এগিয়ে চলবে।
স্পিনলক এবং মুটেক্স সিঙ্ক্রোনাইজেশন প্রক্রিয়াগুলি আজ দেখা যায় খুব সাধারণ।
প্রথমে স্পিনলক সম্পর্কে চিন্তা করা যাক।
মূলত এটি একটি ব্যস্ত অপেক্ষার ক্রিয়া, যার অর্থ আমরা পরবর্তী ক্রিয়াকলাপটি চালিয়ে যাওয়ার আগে একটি নির্দিষ্ট লকটি প্রকাশের জন্য অপেক্ষা করতে হয়। ধারণাটি খুব সহজ, বাস্তবায়নের সময় এটি ক্ষেত্রে হয় না। উদাহরণস্বরূপ: যদি লকটি প্রকাশ না করা হয় তবে থ্রেডটি অদলবদল হয়ে ঘুমের দিকে চলে যায়, আমাদের কি এটির সাথে মোকাবিলা করা উচিত? যখন দুটি থ্রেড একযোগে অ্যাক্সেসের অনুরোধ করে তখন সিঙ্ক্রোনাইজেশন লকগুলি কীভাবে মোকাবেলা করতে হবে?
সাধারণত, সবচেয়ে স্বজ্ঞাত ধারণাটি সমালোচনামূলক বিভাগটি সুরক্ষিত করার জন্য একটি ভেরিয়েবলের মাধ্যমে সিঙ্ক্রোনাইজেশনের সাথে কাজ করে। মুটেক্সের ধারণাটি একই রকম, তবে তারা এখনও আলাদা। ফোকাস: সিপিইউ ব্যবহার। স্পিনলক এই ক্রিয়াটি করার জন্য অপেক্ষা করতে সিপিইউ সময় নেয় এবং তাই আমরা দুজনের মধ্যে পার্থক্যটি যোগ করতে পারি:
একজাতীয় মাল্টি-কোর পরিবেশে, স্পিনলক ব্যবহারের চেয়ে সমালোচনামূলক বিভাগে সময় ব্যয় করা যদি ছোট হয়, কারণ আমরা প্রসঙ্গের স্যুইচ সময়কে হ্রাস করতে পারি। (একক কোর তুলনা গুরুত্বপূর্ণ নয়, কারণ কিছু সিস্টেম বাস্তবায়ন স্যুইচ এর মাঝখানে স্পিনলক)
উইন্ডোজে স্পিনলক ব্যবহার করে থ্রেডটি DISPATCH_LEVEL এ আপগ্রেড করবে, যা কিছু ক্ষেত্রে অনুমোদিত হতে পারে না, তাই এবার আমাদের একটি Mutex (APC_LEVEL) ব্যবহার করতে হয়েছিল।
একটি একক কোর / একক-সিপিইউ সিস্টেমে স্পিনলক ব্যবহার করা সাধারণত বোধগম্য হয় না, যেহেতু স্পিনলক পোলিং কেবলমাত্র উপলভ্য সিপিইউ কোরকে অবরুদ্ধ করে চলেছে, অন্য কোনও থ্রেড চলতে পারে না এবং যেহেতু অন্য কোনও থ্রেড চলতে পারে না, লক হবে না আনলক করা হয়। আইওডাব্লু, একটি স্পিনলক আসল সুবিধার জন্য those সিস্টেমে কেবল সিপিইউ সময় নষ্ট করে
এটা ভুল. ইউনি প্রসেসর সিস্টেমে স্পিনলকগুলি ব্যবহারে সিপিইউ চক্রের কোনও অপচয় নেই, কারণ কোনও প্রক্রিয়া একবার স্পিন লক নিলে প্রিম্পেশন অক্ষম হয়ে যায়, সুতরাং আর কেউ স্পিনি করতে পারে না! এটি কেবল এটি ব্যবহার করে কোনও লাভ হয় না! সুতরাং, ইউএনআই সিস্টেমে স্পিনলকগুলি কার্নেল দ্বারা সংকলিত সময়ে প্রিমিপ_ডেজেবল দ্বারা প্রতিস্থাপিত হয়!