আনলক করা মিউটেক্সকে কীভাবে কার্যকর করা যায়? একটি মুটেক্সের দাম কত?


149

নিম্ন স্তরের ভাষায় (সি, সি ++ বা যাই হোক না কেন): আমার কাছে গুটি গুচ্ছ (যেমন পাইথ্রেড আমাকে দেয় বা দেশীয় সিস্টেমের পাঠাগারটি যা দেয়) তার মধ্যে বা একটি সামগ্রীর জন্য একটি একক মধ্যে আমার পছন্দ আছে।

মিউটেক্স লক করা কতটা দক্ষ? উদাহরণস্বরূপ: কতগুলি সমাবেশের নির্দেশাবলী সম্ভবত রয়েছে এবং তারা কতটা সময় নেয় (সেই ক্ষেত্রে যে म्यूटটি আনলক করা আছে)?

একটি মুটেক্সের দাম কত? সত্যিই প্রচুর পরিমাণে মিউটেক্স লাগানো কি সমস্যা ? বা আমার কোডে আমার যতটা ভেরিয়েবল রয়েছে ততটুকু মিউটেক্স ভেরিয়েবলগুলি ফেলে দিতে পারি intএবং এটি আসলে কী আসে যায়?

(বিভিন্ন হার্ডওয়ারের মধ্যে কতটা পার্থক্য রয়েছে তা আমি নিশ্চিত নই। যদি সেখানে থাকে তবে আমি সেগুলি সম্পর্কেও জানতে চাই But তবে বেশিরভাগ ক্ষেত্রেই আমি সাধারণ হার্ডওয়্যার সম্পর্কে আগ্রহী))

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


লকিং সম্পর্কিত ওয়েবকিটস ব্লগ পোস্ট (২০১ 2016) এই প্রশ্নের সাথে খুব সম্পর্কিত, এবং একটি স্পিনলক, অ্যাডাপটিভ লক, ফিউটেক্স ইত্যাদির মধ্যে পার্থক্য ব্যাখ্যা করে explains


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

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

আমি সত্যিই কোথাও এই প্রভাব দেখতে পাই না। আপনি "এসেম্বলারের নির্দেশাবলী" সম্পর্কে জিজ্ঞাসা করেন - আপনি কোন আর্কিটেকচারের কথা বলছেন তার উপর নির্ভর করে উত্তরটি 1 নির্দেশ থেকে দশ হাজার নির্দেশাবলীর মধ্যে যে কোনও জায়গায় হতে পারে।
জিয়ান

15
@ জিয়ান: তাহলে দয়া করে ঠিক এই উত্তরটি দিন। দয়া করে এটি x86 এবং amd64 এ যা রয়েছে তা বলুন, দয়া করে কোনও স্থাপত্যের যেখানে 1 টি নির্দেশনা রয়েছে তার উদাহরণ দিন এবং এটি যেখানে 10 কে রয়েছে তা দিন। এটা কি আমার প্রশ্ন থেকে জানতে চাই না?
অ্যালবার্ট

উত্তর:


120

আমার কাছে একটি গুচ্ছ মুটিেক্সেস বা একটি সামগ্রীর জন্য একটি একগুচ্ছ থাকার মধ্যে পছন্দ রয়েছে।

আপনার যদি অনেক থ্রেড থাকে এবং অবজেক্টে অ্যাক্সেস প্রায়শই ঘটে তবে একাধিক লক সমান্তরালতা বাড়িয়ে তুলবে। রক্ষণাবেক্ষণের ব্যয়ে, যেহেতু আরও লক করা মানে লকটি আরও ডিবাগিং করা।

মিউটেক্স লক করা কতটা দক্ষ? উদাহরণস্বরূপ: সংশ্লেষকারীদের কত নির্দেশাবলী সম্ভবত রয়েছে এবং তারা কতটা সময় নেয় (সেই ক্ষেত্রে যে म्यूटটি আনলক করা আছে)?

সুনির্দিষ্ট এসেম্বলারের নির্দেশাবলী হ'ল কোনও মিটেক্সের সর্বনিম্ন ওভারহেড - মেমরি / ক্যাশে সুসংগত গ্যারান্টিগুলি প্রধান ওভারহেড। এবং কম প্রায়ই একটি নির্দিষ্ট লক নেওয়া হয় - ভাল।

মুটেক্স দুটি প্রধান অংশ (ওভারসিম্প্লিফাইটিং) দিয়ে তৈরি: (1) একটি পতাকা নির্দেশ করে যা মুটেক্স লক করা আছে কিনা এবং (২) অপেক্ষার সারি।

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

আনলক করা মিউটেক্স লক করা সত্যিই সস্তা। আনটলিং মুটেক্স ডাব্লু / ও কনটেন্ট খুব সস্তা।

একটি মুটেক্সের দাম কত? সত্যিই প্রচুর পরিমাণে মিউটেক্স লাগানো কি সমস্যা? অথবা আমার কোডটিতে আমি যতটা মিটেক্স ভেরিয়েবলগুলি ফেলে দিতে পারি যেমন আমার ইনটি ভেরিয়েবল রয়েছে এবং এটি আসলে কোনও বিষয় নয়?

আপনি নিজের ইচ্ছেমতো আপনার কোডটিতে যতটা মুটেক্স ভেরিয়েবল নিক্ষেপ করতে পারেন। আপনি কেবলমাত্র অ্যাপ্লিকেশন বরাদ্দ করতে পারবেন তার পরিমাণের দ্বারা সীমাবদ্ধ।

সারসংক্ষেপ. ব্যবহারকারীর স্পেস লকগুলি (এবং বিশেষত মিউটেক্সগুলি) সস্তা এবং কোনও সিস্টেমের সীমাতে নয়। তবে তাদের মধ্যে অনেকগুলি ডিবাগিংয়ের জন্য দুঃস্বপ্নের জাদু করে। সাধারণ টেবিল:

  1. কম লক মানেই বেশি বিতর্ক (ধীর সাইক্লাল, সিপিইউ স্টল) এবং কম সমান্তরালতা
  2. কম লকগুলির অর্থ মাল্টি-থ্রেডিং সমস্যা ডিবাগ করা কম সমস্যা।
  3. আরও লক মানে কম বিতর্ক এবং উচ্চতর সমান্তরালতা
  4. আরও লকগুলির অর্থ অনস্বীকার্য ডেডলকগুলিতে দৌড়ানোর আরও সম্ভাবনা।

অ্যাপ্লিকেশনের জন্য একটি ভারসাম্য লকিং স্কিমটি সন্ধান করা এবং বজায় রাখা উচিত, সাধারণত # 2 এবং # 3 এর ভারসাম্যপূর্ণ।


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

স্টলগুলি হ'ল লকিং কোডটি ধীরে ধীরে চালিত হয়, প্রায়শই অ্যাপ্লিকেশনটি কেন ধীর হয় তার কোনও স্পষ্ট ইঙ্গিত ছাড়াই। (কিছু খিলান আন্তঃ সিপিইউ / কোর ট্র্যাফিকের পরিসংখ্যান সরবরাহ করে, কিছু না।)

সমস্যা এড়াতে, লোকেরা সাধারণত তালাবন্ধির ঝুঁকির সম্ভাবনা হ্রাস করতে এবং স্টলটি এড়াতে প্রচুর সংখ্যক তালা ব্যবহার করে। এই কারণেই সস্তা ব্যবহারকারীর স্পেস লকিং সিস্টেমের সীমাবদ্ধতার অধীন নয়।


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

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

@ ডমি00001 অন্য কোনও প্রক্রিয়ায় স্যুইচ করার অর্থ আপনাকে সিপিইউর মেমরি ম্যাপিংগুলি পরিবর্তন করতে হবে। এটা এত সস্তা নয়।
কৌতূহলী

27

আমি একই জিনিস জানতে চেয়েছিলাম, তাই আমি এটি মাপা। আমার বাক্সে (এএমডি এফএক্স (টিএম) -8150 আট-কোর প্রসেসরটি 3.612361 গিগাহার্জ) এ, একটি আনলক করা মিটেক্সকে লক এবং আনলক করছে যা তার নিজস্ব ক্যাশে লাইনে রয়েছে এবং ইতিমধ্যে ক্যাশে রয়েছে, 47 টি ঘড়ি (13 এনএস) লাগে takes

দুটি কোরের মধ্যে সিঙ্ক্রোনাইজেশনের কারণে (আমি সিপিইউ # 0 এবং # 1 ব্যবহার করেছি), আমি কেবলমাত্র দুটি লম্বায় প্রতি 102 এনএসে একবার লক / আনলক জোড় কল করতে পারি, তাই প্রতি 51 এনএস একবার, যার থেকে সিদ্ধান্ত নেওয়া যায় যে এটি মোটামুটি 38 লাগে পরবর্তী থ্রেডটি আবার লক করতে পারে তার আগে কোনও থ্রেড একটি আনলক করার পরে পুনরুদ্ধার করতে এনএস।

আমি যে প্রোগ্রামটি তদন্ত করতে ব্যবহার করেছি এটি এখানে পাওয়া যাবে: https://github.com/CarloWood/ai-statefultask-testsuite/blob/b69b112e2e91d35b56a39f41809d3e3de2f9e4b8/src/mutex_test.cxx

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

এই রাজ্যে এটি তৈরি করা গ্রাফটি হ'ল:

এখানে চিত্র বর্ণনা লিখুন

এটি নীচের কোডে বেঞ্চমার্কের ফলাফল দেখায়:

uint64_t do_Ndec(int thread, int loop_count)
{
  uint64_t start;
  uint64_t end;
  int __d0;

  asm volatile ("rdtsc\n\tshl $32, %%rdx\n\tor %%rdx, %0" : "=a" (start) : : "%rdx");
  mutex.lock();
  mutex.unlock();
  asm volatile ("rdtsc\n\tshl $32, %%rdx\n\tor %%rdx, %0" : "=a" (end) : : "%rdx");
  asm volatile ("\n1:\n\tdecl %%ecx\n\tjnz 1b" : "=c" (__d0) : "c" (loop_count - thread) : "cc");
  return end - start;
}

দুটি আরডিএসসি কলগুলি `মুটেক্স 'লক এবং আনলক করতে যে ঘড়িগুলি লাগবে তা পরিমাপ করে (আমার বাক্সে আরডিএসসি কলগুলির জন্য 39 টি ঘড়ির ওভারহেড সহ)। তৃতীয় asm একটি বিলম্ব লুপ হয়। দেরী লুপের আকার থ্রেড 1 এর চেয়ে থ্রেড 1 এর চেয়ে 1 কাউন্ট ছোট, সুতরাং থ্রেড 1 কিছুটা দ্রুত is

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

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

এ থেকে আমরা উপসংহারে আসতে পারি যে প্রতি 50 এনএসে একটি মিউটেক্সকে লক করা এবং আনলক করা আমার বাক্সে কোনও সমস্যা নয়।

আমার সমস্ত উপসংহারে সব মিলিয়ে ওপি-র প্রশ্নের উত্তরটি হ'ল যতক্ষণ পর্যন্ত কম বিতর্ক হয় তার ফলাফল হিসাবে আরও মুটেক্স যুক্ত করা আরও ভাল।

যতটা সম্ভব সংক্ষিপ্তভাবে লক করার চেষ্টা করুন। এগুলিকে রাখার একমাত্র কারণ - একটি লুপের বাইরে যদি লুপটি প্রতি 100 এনএস একবারে (বা বরং একই সময়ে 50 টি এনএস এ লুপটি চালাতে চায় এমন থ্রেডের সংখ্যা) বা 13 এনএস বারের চেয়ে দ্রুত লুপ হয় লুপের আকারটি আপনি বিতর্কিত হওয়ার চেয়ে বেশি বিলম্ব করেছেন।

সম্পাদনা: আমি এখন এই বিষয়টিতে আরও অনেক জ্ঞাতযোগ্য হয়েছি এবং আমি এখানে উপসংহারে উপস্থাপনের বিষয়ে সন্দেহ শুরু করি। প্রথমত, সিপিইউ 0 এবং 1 হাইপার-থ্রেডযুক্ত পরিণত হয়; যদিও এএমডি ৮ টি বাস্তব কোর রয়েছে বলে দাবি করেছে তবে অবশ্যই খুব মজাদার কিছু আছে কারণ অন্য দুটি কোরের মধ্যে বিলম্ব অনেক বড় (যেমন, 0 এবং 1 একটি জোড় তৈরি করে, যেমন 2 এবং 3, 4 এবং 5 এবং 6 এবং 7 করে )। দ্বিতীয়ত, স্টাডি :: মিউটেক্সটি এমনভাবে প্রয়োগ করা হয় যে সিস্টেম কল করার আগে এটি যখন কিছুক্ষণের জন্য লক স্পিন করে তখন তা যখন তাত্ক্ষণিকভাবে কোনও মিটেক্সে লকটি অর্জন করতে ব্যর্থ হয় (যা সন্দেহ নেই যে খুব ধীর হবে)। সুতরাং আমি এখানে যা পরিমাপ করেছি তা হ'ল পরম আদর্শ সিটেশন এবং অনুশীলনে লক করা এবং আনলক করাতে লক / আনলক প্রতি মারাত্মকভাবে আরও বেশি সময় লাগতে পারে।

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


10

এটি নির্ভর করে যে আপনি আসলে "মুটেক্স", ওএস মোড এবং কী নামে পরিচিত on

ন্যূনতম এটি একটি পরস্পর মেমরির অপারেশন ব্যয়ে আছে। এটি তুলনামূলকভাবে ভারী অপারেশন (অন্যান্য আদিম সমাবেশী কমান্ডের তুলনায়)।

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

উদাহরণস্বরূপ ইন্টেল কোর ডুও প্রসেসর, উইন্ডোজ এক্সপি। ইন্টারলকড অপারেশন: প্রায় 40 সিপিইউ চক্র গ্রহণ করে। কার্নেল মোড কল (যেমন সিস্টেম কল) - প্রায় 2000 সিপিইউ চক্র।

যদি এটি হয় - আপনি সমালোচনা বিভাগগুলি ব্যবহার করার বিষয়ে বিবেচনা করতে পারেন। এটি কার্নেল মিটেক্সের এবং একটি সংযুক্ত মেমরির অ্যাক্সেসের একটি সংকর।


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

2
সংখ্যাটি আরও কার্যকর হবে যদি সাধারণ অপারেশনের সিপিইউ চক্রের পরিমাণ (যেমন গণিত / যদি-অন্যথায় / ক্যাশে-মিস / ইন্ডিরিশন) সরবরাহ করা হয় তবে তুলনা করার জন্য এই সংখ্যাটি আরও কার্যকর হবে। .... সংখ্যাটির কিছু রেফারেন্স থাকলে তা আরও দুর্দান্ত হবে। ইন্টারনেটে এ জাতীয় তথ্য পাওয়া খুব কঠিন hard
javaLover

@ জাভালওভার অপারেশনগুলি চক্রের উপর চালিত হয় না; এগুলি বিভিন্ন চক্রের জন্য পাটিগণিত ইউনিটগুলিতে চালিত হয়। এটা খুব আলাদা। সময়ে কোনও নির্দেশের ব্যয় নির্ধারিত পরিমাণ নয়, কেবলমাত্র সংস্থান ব্যবহারের জন্য ব্যয়। এই সংস্থানগুলি ভাগ করা হয়। মেমরির নির্দেশাবলীর প্রভাব প্রচুর ক্যাচিং ইত্যাদির উপর নির্ভর করে
কৌতূহলী

@ কুরিয়াসগুয়ে সম্মত আমি পরিষ্কার ছিল না। আমি উত্তর চাই যেমন std::mutexগড় ব্যবহারের সময়কাল (দ্বিতীয় ক্ষেত্রে) এর চেয়ে 10 গুণ বেশি int++। তবে, আমি জানি এটির উত্তর দেওয়া শক্ত কারণ এটি প্রচুর পরিমাণে নির্ভর করে।
javaLover

6

বাস্তবায়নের উপর নির্ভর করে ব্যয় পৃথক হবে তবে আপনার দুটি বিষয় মনে রাখা উচিত:

  • ব্যয়টি সম্ভবত সর্বনিম্ন হবে কারণ এটি উভয়ই যথেষ্ট আদিম অপারেশন এবং এটির ব্যবহারের প্যাটার্নের কারণে এটি যতটা সম্ভব অনুকূলিত করা হবে ( প্রচুর পরিমাণে ব্যবহৃত হয়েছে )।
  • আপনি নিরাপদ মাল্টি-থ্রেডেড অপারেশন চাইলে এটি ব্যবহার করা আপনার যেহেতু ব্যয়বহুল তা বিবেচ্য নয়। আপনার যদি এটি প্রয়োজন হয় তবে আপনার এটি প্রয়োজন।

একক প্রসেসর সিস্টেমে, আপনি সাধারণত খুব সহজেই ডেটা পারমাণবিকভাবে পরিবর্তন করতে যথেষ্ট দীর্ঘ বিরতি অক্ষম করতে পারেন। মাল্টি-প্রসেসর সিস্টেমগুলি একটি পরীক্ষা-সেট- কৌশল কৌশল ব্যবহার করতে পারে ।

উভয় ক্ষেত্রেই, নির্দেশাবলী তুলনামূলকভাবে দক্ষ।

আপনার বিশাল ডেটা স্ট্রাকচারের জন্য একটি একক মুটেক্স সরবরাহ করা উচিত, বা এর প্রতিটি বিভাগের জন্য অনেকগুলি মুটেক্স রয়েছে, এটি একটি ভারসাম্যপূর্ণ কাজ।

একটি একক মুটেক্স থাকার কারণে আপনার একাধিক থ্রেডের মধ্যে ঝগড়ার ঝুঁকি বেশি। আপনি প্রতি বিভাগে মুটেক্স রেখে এই ঝুঁকি হ্রাস করতে পারবেন তবে আপনি এমন পরিস্থিতিতে পড়তে চান না যেখানে কোনও থ্রেডের কাজটি করার জন্য 180 টি মুটেক্সকে লক করতে হবে :-)


1
হ্যাঁ, তবে কতটা দক্ষ? এটি কি একক মেশিনের নির্দেশনা? নাকি প্রায় 10? নাকি প্রায় 100? 1000? আরো? এই সমস্ত এখনও দক্ষ, তবে চরম পরিস্থিতিতে একটি পার্থক্য করতে পারে।
অ্যালবার্ট

1
ঠিক আছে, এটি সম্পূর্ণরূপে বাস্তবায়নের উপর নির্ভর করে। আপনি বাধা বন্ধ করতে পারেন, পরীক্ষা করতে পারেন / একটি পূর্ণসংখ্যা সেট করতে পারেন এবং প্রায় ছয়টি মেশিনের নির্দেশাবলীতে একটি লুপে বাধা পুনরায় সক্রিয় করতে পারেন। প্রসেসরগুলি একক নির্দেশ হিসাবে এটি সরবরাহ করার প্রবণতা থেকে টেস্ট-সেট প্রায় অনেকগুলি ক্ষেত্রে করা যেতে পারে।
paxdiablo

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

বিটিডাব্লু, অন্যের কাছে থ্রেড ফলন পাওয়ার উপায় হিসাবে ড্রপ / পুনঃপ্রকাশকে ব্যবহার করবেন না; এটি এমন একটি কৌশল যা বহুজাতিক সিস্টেমে ব্যর্থ হয়। (সিপিথন যে অপেক্ষাকৃত কয়েকটি জিনিস ভুল হয়ে যায় সেগুলির মধ্যে এটি একটি))
ডোনাল ফেলো

@ ডোনাল: ড্রপ / প্রতিক্রিয়া বলতে কী বোঝ? এটি গুরুত্বপূর্ণ শোনায়; আপনি কি আমাকে আরও তথ্য দিতে পারেন?
অ্যালবার্ট

5

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

y = exp(-j*0.0001);
pthread_mutex_lock(&lock);
x += y ;
pthread_mutex_unlock(&lock);

একটি থ্রেড সহ, প্রোগ্রামটি ভার্চুয়াল তাত্ক্ষণিকভাবে (এক সেকেন্ডেরও কম) 10,000,000 মানের যোগান দেয়; দুটি থ্রেড সহ (৪ টি কোর সহ একটি ম্যাকবুকে) একই প্রোগ্রামটির জন্য 39 সেকেন্ড সময় লাগে।

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