সর্বাধিক মিটেক্স বাস্তবায়ন কেন অন্যায়?


11

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

এটি আমার কাছে একটি অস্বাস্থ্যকর আচরণের মতো বলে মনে হচ্ছে - আমার কাছে মনে হয় যে কোনও প্রোগ্রামার কী চান / প্রত্যাশা করে তার সাথে সামঞ্জস্য রেখে একটি ন্যায্য মুটেক্স আচরণটি আরও বেশি উত্পন্ন করবে।

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

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


1
প্রতিটি মিটেক্সের জন্য সেই লিঙ্কযুক্ত তালিকার একটি ভাগ করা ডেটা স্ট্রাকচার হতে হবে, তাই না? সুতরাং, আপনি কীভাবে কর্মক্ষমতা হ্রাস না করে তাতে ডেটা দৌড় প্রতিরোধ করতে যাচ্ছেন?
ব্যবহারকারী 3543290

লকলেসযুক্ত লিঙ্কযুক্ত তালিকার ব্যবস্থাটি ব্যবহার করে আমার মনে হয়। পরবর্তী থ্রেডটি জাগ্রত করতে সন্ধানের জন্য কোন তথ্য কাঠামোটি একটি অযৌক্তিক মিটেক্স ব্যবহার করে?
জেরেমি ফ্রাইজনার

1
আপনাকে এটি সন্ধান করতে হবে, তবে লকলেসযুক্ত লিঙ্কযুক্ত তালিকাটি কি ন্যায্যতার গ্যারান্টি দেয়? আমি মনে করি আপনি সমবর্তী প্রোগ্রামিংয়ে ন্যায্যতার মতো গ্যারান্টিগুলি পাওয়া খুব কঠিন।
ব্যবহারকারী 3543290

উত্তর:


7

জিম সাওয়েরের উত্তর একটি উত্তরের দিকে ইঙ্গিত করে: যখন আপনার আলাদা আলাদা অগ্রাধিকারের সাথে থ্রেড থাকে, "ন্যায্য" আচরণটি ভুল হবে। আপনার যখন একাধিক থ্রেড চলতে পারে তখন সর্বোচ্চ অগ্রাধিকারের থ্রেডটি সাধারণত চালানো উচিত।

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

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

অ্যাসিক্রোনাস আই / ও এর মতো অনেক অপারেটিং সিস্টেম পরিষেবাদি প্রায়শই এই সুবিধার উপরে প্রয়োগ করা হয়।

আর একটি উদাহরণ যদি প্রক্রিয়াটি কোনও ডিবাগারের নিয়ন্ত্রণে থাকে। সেক্ষেত্রে ডিবাগিং সিস্টেমটি ইউজার টাস্ক হিসাবে কোড বিভিন্ন কারণে কার্যকর করতে পারে।


4

'অগ্রাধিকার বিপর্যয়' একটি কারণ যা ন্যায়বিচার অনাকাঙ্ক্ষিত হতে পারে। একটি নিম্ন অগ্রাধিকার প্রক্রিয়া লক করা মিটেক্সকে আঘাত করে এবং ঘুমায়। তারপরে একটি উচ্চতর অগ্রাধিকার প্রক্রিয়া এটিকে হিট করে, এবং ঘুমায়। যখন মিউটেক্স আনলক করে, কোন প্রক্রিয়াটির পরে লকটি পাওয়া উচিত?


সাইটে আপনাকে স্বাগতম এবং কোনও প্রশ্নের উত্তর না দেওয়ার জন্য ধন্যবাদ যা কোনও উত্তর না দিয়ে কিছুক্ষণ বসে আছে! আপনার উত্তর অবশ্যই সঠিক, তবে আমি মনে করি এটির কিছুটা বিশদ থাকতে পারে।
ডেভিড রিচার্বি

3

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

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

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