সি ++ 11 একটি প্রমিত মেমরি মডেল প্রবর্তন করেছে। এর মানে কী? এবং এটি সি ++ প্রোগ্রামিংকে কীভাবে প্রভাব ফেলবে?


1894

সি ++ 11 একটি প্রমিত মেমরির মডেল প্রবর্তন করেছে, তবে এর অর্থ কী? এবং এটি সি ++ প্রোগ্রামিংকে কীভাবে প্রভাব ফেলবে?

এই নিবন্ধটি ( গ্যাবিন ক্লার্ক যিনি হার্ব সাটারের উদ্ধৃতি দিয়েছেন ) বলেছেন যে,

মেমোরি মডেলটির অর্থ হ'ল সি ++ কোডটির কাছে এখনই একটি সংমিত পাঠাগার রয়েছে যা সংকলক তৈরি করেছে এবং কোন প্ল্যাটফর্মে চলছে তা নির্বিশেষে কল করতে library প্রসেসরের স্মৃতিতে বিভিন্ন থ্রেড কীভাবে কথা বলে তা নিয়ন্ত্রণ করার একটি স্ট্যান্ডার্ড উপায় রয়েছে।

"যখন আপনি স্ট্যান্ডার্ডের মতো বিভিন্ন কোর জুড়ে [কোড] বিভক্ত করার বিষয়ে কথা বলছেন, আমরা মেমরির মডেলটির বিষয়ে কথা বলছি people লোকেরা কোডটি তৈরি করার জন্য নিম্নলিখিত অনুমানগুলি ভঙ্গ না করেই আমরা এটিকে অপ্টিমাইজ করতে যাচ্ছি," সুতার বলেছিলেন।

ভাল, আমি অনলাইনে উপলব্ধ এই এবং অনুরূপ অনুচ্ছেদগুলি মুখস্থ করতে পারি (যেমন জন্মের পর থেকেই আমার নিজস্ব স্মৃতি মডেল ছিল: পি) এবং অন্যরা জিজ্ঞাসা করা প্রশ্নের উত্তর হিসাবে পোস্ট করতে পারে, তবে সত্যি বলতে কী, আমি ঠিক বুঝতে পারি না এই.

সি ++ প্রোগ্রামাররা এর আগেও বহু-থ্রেডযুক্ত অ্যাপ্লিকেশনগুলি বিকাশ করত, সুতরাং এটি পসিক্স থ্রেড, বা উইন্ডোজ থ্রেড, বা সি ++ 11 থ্রেডের ক্ষেত্রে কীভাবে গুরুত্বপূর্ণ? লাভ কি কি? আমি নিম্ন-স্তরের বিশদটি বুঝতে চাই।

আমি এই অনুভূতিটিও পেয়েছি যে সি ++ 11 মেমরি মডেলটি একরকম সি ++ 11 মাল্টি-থ্রেডিং সমর্থনটির সাথে সম্পর্কিত, কারণ আমি প্রায়শই এই দু'টিকে একসাথে দেখি। যদি তা হয় তবে ঠিক কীভাবে? কেন তারা সম্পর্কিত হতে হবে?

যেহেতু আমি জানি না যে মাল্টি-থ্রেডিংয়ের ইন্টার্নালগুলি কীভাবে কাজ করে এবং মেমরির মডেলটি সাধারণভাবে কী বোঝায়, দয়া করে আমাকে এই ধারণাগুলি বুঝতে সহায়তা করুন understand :-)


3
@ কুরিয়াসগুয়ে: বিস্তৃত ...
নওয়াজ

4
@ কুরিয়াসগুয়ে: তারপরে একটি ব্লগ লিখুন ... এবং ঠিক করার প্রস্তাব দিন। আপনার বক্তব্যকে বৈধ ও যুক্তিযুক্ত করার কোনও উপায় নেই।
নওয়াজ

2
আমি সেই সাইটটিকে প্রশ্ন জিজ্ঞাসা এবং ধারণা বিনিময় করার জায়গা হিসাবে ভুল করেছিলাম। আমার খারাপ; এটি উপযুক্ততার জন্য জায়গা যেখানে আপনি ভেষজ সটারের সাথে একমত হতে পারবেন না এমনকি এমনকি যখন তিনি স্পষ্টভাবে থ্রো স্পেকের সাথে নিজেকে বিরোধিতা করেন।
কৌতূহলী

5
@ কুরিয়াসগুই: সি ++ হ'ল স্ট্যান্ডার্ড যা বলে, তা ইন্টারনেটের এলোমেলো লোক কী বলে না। হ্যাঁ, মানের সাথে সামঞ্জস্যতা থাকতে হবে । সি ++ এমন একটি উন্মুক্ত দর্শন নয় যেখানে আপনি এমন কোনও বিষয়ে কথা বলতে পারেন যা মানদণ্ডের সাথে খাপ খায় না ।
নওয়াজ

3
"আমি প্রমাণ করেছি যে কোনও সি ++ প্রোগ্রামের যথাযথভাবে সংজ্ঞা দেওয়া উচিত নয়" " । লম্বা দাবি, কোনও প্রমাণ ছাড়াই!
নওয়াজ

উত্তর:


2204

প্রথমত, আপনাকে কোনও ভাষা আইনজীবির মতো ভাবতে শিখতে হবে।

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

সি ++ 98 / সি ++ 03 স্পেসিফিকেশনের বিমূর্ত মেশিনটি মূলত একক থ্রেডযুক্ত। সুতরাং অনুমানের ক্ষেত্রে "সম্পূর্ণ পোর্টেবল" এমন মাল্টি-থ্রেডেড সি ++ কোড লেখা সম্ভব নয়। মেমরি লোড এবং স্টোরের পারমাণবিকতা বা ক্রম যাতে লোড এবং স্টোরগুলি ঘটতে পারে সে সম্পর্কে ম্যাপেক্স এমনকি কিছু মনে করে না The

অবশ্যই, আপনি নির্দিষ্ট কংক্রিট সিস্টেমের জন্য অনুশীলনে মাল্টি-থ্রেড কোড লিখতে পারেন - যেমন পাইথ্রেড বা উইন্ডোজ। তবে সি ++ 98 / সি ++ 03 এর জন্য মাল্টি-থ্রেড কোড লেখার কোনও মানক উপায় নেই ।

সি ++ 11 এ বিমূর্ত মেশিনটি ডিজাইনের মাধ্যমে বহু-থ্রেডযুক্ত। এটির একটি সুস্পষ্ট সংজ্ঞাযুক্ত মেমরি মডেলও রয়েছে ; এটি হ'ল মেমরি অ্যাক্সেস করার ক্ষেত্রে সংকলকটি কি করতে পারে এবং না পারে তা বলে।

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

           Global
           int x, y;

Thread 1            Thread 2
x = 17;             cout << y << " ";
y = 37;             cout << x << endl;

থ্রেড 2 আউটপুট কি হতে পারে?

সি ++ 98 / সি ++ 03 এর অধীনে, এটি এমনকি সংজ্ঞায়িত আচরণ নয়; প্রশ্নটি নিজেই অর্থহীন কারণ মানকটি "থ্রেড" বলে কোনও কিছু বিবেচনা করে না।

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

তবে সি ++ 11 দিয়ে আপনি এটি লিখতে পারেন:

           Global
           atomic<int> x, y;

Thread 1                 Thread 2
x.store(17);             cout << y.load() << " ";
y.store(37);             cout << x.load() << endl;

এখন বিষয়গুলি আরও আকর্ষণীয় হয়ে উঠেছে। প্রথমত, এখানে আচরণ সংজ্ঞায়িত করা হয় । থ্রেড 2 এখন মুদ্রণ করতে পারে 0 0(যদি এটি থ্রেড 1 এর আগে চলে), 37 17(যদি এটি থ্রেড 1 এর পরে চলে) বা 0 17(যদি এটি থ্রেড 1 এক্স এর পরে নির্ধারিত হয় তবে এটি y নির্ধারিত হওয়ার আগে)।

এটি যা মুদ্রণ করতে পারে না তা হ'ল 37 0সি ++ 11 এ পারমাণবিক লোড / স্টোরের জন্য ডিফল্ট মোড হ'ল ক্রমযুক্ত ধারাবাহিকতা প্রয়োগ করা । এর অর্থ হ'ল সমস্ত বোঝা এবং স্টোরগুলি অবশ্যই "যেন" হ'ল প্রতিটি থ্রেডের মধ্যে আপনি সেগুলি লিখেছেন এমনভাবে ঘটেছিল, যখন থ্রেডগুলির মধ্যে ক্রিয়াকলাপ আন্তঃবাহিত হতে পারে তবে সিস্টেমটি পছন্দ করে। সুতরাং পারমাণবিকের ডিফল্ট আচরণ লোড এবং স্টোরগুলির জন্য পারমাণবিকতা এবং ক্রম উভয় সরবরাহ করে ।

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

           Global
           atomic<int> x, y;

Thread 1                            Thread 2
x.store(17,memory_order_relaxed);   cout << y.load(memory_order_relaxed) << " ";
y.store(37,memory_order_relaxed);   cout << x.load(memory_order_relaxed) << endl;

সিপিইউ যত বেশি আধুনিক, এটি পূর্বের উদাহরণের চেয়ে তত দ্রুত হওয়ার সম্ভাবনা রয়েছে।

শেষ অবধি, আপনার যদি কেবল নির্দিষ্ট বোঝা এবং স্টোরগুলিকে যথাযথভাবে রাখতে হয় তবে আপনি লিখতে পারেন:

           Global
           atomic<int> x, y;

Thread 1                            Thread 2
x.store(17,memory_order_release);   cout << y.load(memory_order_acquire) << " ";
y.store(37,memory_order_release);   cout << x.load(memory_order_acquire) << endl;

এটি আমাদের অর্ডার করা লোড এবং স্টোরগুলিতে ফিরিয়ে নিয়ে যায় - সুতরাং 37 0আর কোনও সম্ভাব্য আউটপুট হয় না - তবে এটি ন্যূনতম ওভারহেডের সাথে করে। (এই তুচ্ছ উদাহরণে, ফলাফলটি সম্পূর্ণ-প্রস্ফুটিত ধারাবাহিক ধারাবাহিকতার মতো; বৃহত্তর প্রোগ্রামে এটি হবে না))

অবশ্যই, আপনি দেখতে চাইলে কেবলমাত্র আউটপুটগুলি হ'ল 0 0বা 37 17, আপনি কেবলমাত্র মূল কোডটির চারপাশে একটি মিটেক্স মোড়তে পারেন। তবে আপনি যদি এখন পর্যন্ত এটি পড়ে থাকেন তবে আমি বাজি ধরছি যে এটি কীভাবে কাজ করে তা আপনি ইতিমধ্যে জানেন এবং এই উত্তরটি আমার ইচ্ছা :-) অপেক্ষা ইতিমধ্যে দীর্ঘ।

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

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

এই স্টাফ উপর আরও জানতে, এই ব্লগ পোস্ট দেখুন


37
উত্তম উত্তর, তবে এটি সত্যই নতুন আদিমদের প্রকৃত উদাহরণের জন্য ভিক্ষা করছে। এছাড়াও, আমি মনে করি আদিমগুলি ছাড়াই মেমরি ক্রমটি প্রি-সি ++ 0x এর মতো: কোনও গ্যারান্টি নেই।
জন রিপলি

5
@ জন: আমি জানি, তবে আমি নিজেও আদিমদের শিখছি :-)। এছাড়াও আমি মনে করি তারা বাইট অ্যাক্সেসগুলি পরমাণু (যদিও অর্ডার না দেওয়া) এর গ্যারান্টি দেয় যে কারণেই আমি আমার উদাহরণের জন্য "চর" নিয়েছিলাম ... তবে আমি এ সম্পর্কে 100% নিশ্চিত নই ... আপনি যদি কোনও ভাল প্রস্তাব দিতে চান তবে " টিউটোরিয়াল "রেফারেন্সগুলি আমি তাদের আমার উত্তরে যুক্ত করব
নিমো

48
@ নাওয়াজ: হ্যাঁ! মেমরি অ্যাক্সেসগুলি সংকলক বা সিপিইউ দ্বারা পুনঃক্রম করতে পারে। (উদাঃ) ক্যাশে এবং অনুমানমূলক বোঝা সম্পর্কে চিন্তা করুন। সিস্টেমে মেমরিটি যে ক্রমে আঘাত হানে তা আপনার কোডডের মতো কিছুই হতে পারে না। সংকলক এবং সিপিইউ নিশ্চিত করবে যে এই জাতীয় পুনঃক্রমগুলি একক থ্রেডযুক্ত কোডটি ভঙ্গ না করে । বহু-থ্রেডযুক্ত কোডের জন্য, "মেমোরি মডেল" সম্ভাব্য পুনঃক্রমগুলি বৈশিষ্ট্যযুক্ত করে এবং যদি দুটি থ্রেড একই সময়ে একই অবস্থান একই সাথে পড়তে / লিখতে হয় এবং কীভাবে আপনি উভয়ের উপরে নিয়ন্ত্রণকে উদ্ধৃত করেন। একক থ্রেডযুক্ত কোডের জন্য, মেমরি মডেলটি অপ্রাসঙ্গিক।
নিমো

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

17
@ এজেজি 85: খসড়া সি ++ 0x অনুচ্ছেদের ৩.6.২ বলছে, "স্ট্যাটিক স্টোরেজ সময়কাল (৩.7.১) বা থ্রেড স্টোরেজ সময়কাল (৩.7.২) সহ ভেরিয়েবলগুলি অন্য কোনও সূচনা হওয়ার আগে শূন্য-ইনিশিয়ালাইজড (৮.৫) হবে স্থান। " এক্স, ওয়াই যেহেতু এই উদাহরণে বিশ্বব্যাপী, তাদের স্থির স্টোরেজ সময়কাল এবং তাই শূন্য-সূচনা হবে, আমি বিশ্বাস করি।
নিমো

345

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

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

"মেমোরি ধারাবাহিকতা এবং ক্যাশে সমন্বয় একটি প্রাইমার" থেকে উদ্ধৃতি

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

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

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

[উইকিপিডিয়া থেকে চিত্র] উইকিপিডিয়া থেকে ছবি

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

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

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

সি ++ ১১ মেমোরি মডেলে, এই স্থানীয় কার্যকারিতা সম্পর্ক স্থাপনের জন্য একটি অনুরূপ প্রক্রিয়া (অর্জন-প্রকাশের ধারাবাহিকতা মডেল) ব্যবহৃত হয় ।

স্মৃতি ধারাবাহিকতার সংজ্ঞা এবং এসসি ত্যাগ করার অনুপ্রেরণা সরবরাহ করার জন্য, আমি "মেমরির ধারাবাহিকতা এবং ক্যাশে কোহেরেন্সের একটি প্রাইমার" থেকে উদ্ধৃত করব

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

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

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

যেহেতু ক্যাশে সংগতি এবং মেমরির ধারাবাহিকতা কখনও কখনও বিভ্রান্ত হয়, তাই এই উদ্ধৃতিটি থাকাও শিক্ষামূলক tive

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

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


52
বিশেষ আপেক্ষিকতার সাথে উপমাটির জন্য +1, আমি নিজেই একই উপমা তৈরি করার চেষ্টা করছি। প্রায়শই আমি প্রোগ্রামাররা থ্রেডেড কোডটি তদন্ত করে দেখি যে বিভিন্ন থ্রেডের ক্রিয়াকলাপগুলি একটি নির্দিষ্ট ক্রমে একে অপরের সাথে ইন্টারলিভড হয়ে থাকে এবং আমি তাদের বলতে হবে, না, বহু প্রসেসর সিস্টেমের সাথে বিভিন্ন <s এর মধ্যে যুগপততার ধারণাটি রয়েছে < > ফ্রেমের রেফারেন্স </ s> থ্রেড এখন অর্থহীন। বিশেষ আপেক্ষিকতার সাথে তুলনা করা তাদের সমস্যার জটিলতার প্রতি শ্রদ্ধা জানানোর একটি ভাল উপায়।
পিয়েরে লেবেউপিন

71
সুতরাং আপনি কি এই সিদ্ধান্তে উপনীত হওয়া উচিত যে ইউনিভার্সটি মাল্টিকোর?
পিটার কে

6
@ পিটারক: হুবহু :) এবং এখানে পদার্থবিজ্ঞানী ব্রায়ান গ্রিনের সময়ের এই চিত্রটির খুব সুন্দর দৃশ্যায়ন করেছেন: youtube.com/watch?v=4BjGWLJNPcA&t=22m12s 22 মিনিটের সময় এটি "সময়ের বিভ্রম [সম্পূর্ণ ডকুমেন্টারি]" 12 সেকেন্ড
আহমেদ নাসার

2
এটি কি আমি বা তিনি 1D মেমরি মডেল (অনুভূমিক অক্ষ) থেকে 2D মেমরি মডেল (যুগপতনের প্লেন) এ স্যুইচ করছেন। আমি এটিকে কিছুটা বিভ্রান্তি বোধ করি তবে এটি সম্ভবত কারণ আমি স্থানীয় বক্তা নই ... তবুও একটি খুব আকর্ষণীয় পঠন।
বিদায় SE

আপনি একটি প্রয়োজনীয় অংশটি ভুলে গেছেন: " লোড এবং স্টোরগুলির ফলাফল বিশ্লেষণ করে " ... নির্দিষ্ট সময়কালীন তথ্য ব্যবহার না করে।
কৌতূহলী

115

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

চ্যানেল 9 সাইটে উপলব্ধ অংশ "পারমাণবিক <> অস্ত্র" শিরোনামের সি ++ 11 মেমরি মডেল সম্পর্কে ভেষজ সুতারের তিন ঘন্টা দীর্ঘ আলোচনা রয়েছে - অংশ 1 এবং অংশ 2 । আলোচনাটি বেশ প্রযুক্তিগত এবং নিম্নলিখিত বিষয়গুলি অন্তর্ভুক্ত করে:

  1. অপটিমাইজেশন, রেস এবং মেমোরি মডেল
  2. অর্ডারিং - কী: অর্জন এবং মুক্তি Release
  3. অর্ডারিং - কীভাবে: শব্দের, পরমাণু এবং / অথবা বেড়া
  4. কম্পাইলার এবং হার্ডওয়্যার সম্পর্কিত অন্যান্য বিধিনিষেধ
  5. কোড জেনার ও পারফরম্যান্স: x86 / x64, আইএ 64, পাওয়ার, এআরএম
  6. রিলাক্সড অ্যাটমিক্স

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


10
এই কথাটি সত্যিই দুর্দান্ত, আপনি এটি দেখার জন্য ব্যয় করার জন্য 3 ঘন্টা সম্পূর্ণ মূল্যবান।
জুনটজু

5
@ জুনটজু: বেশিরভাগ ভিডিও প্লেয়ারগুলিতে আপনি গতিটি 1.25, 1.5 বা মূলের চেয়ে 2 গুণ স্থির করতে পারেন।
খ্রিস্টান সেভেরিন

4
@ ইরান আপনি কি লোকেরা স্লাইডগুলি পেয়েছেন? চ্যানেলে লিঙ্কগুলি 9 টক পৃষ্ঠাতে কাজ করে না।
অ্যাথোজ

2
দুঃখিত, আমি তাদের কাছে নেই, দুঃখিত। চ্যানেল 9 এর সাথে যোগাযোগের চেষ্টা করুন, আমি মনে করি না যে অপসারণটি ইচ্ছাকৃত হয়েছিল (আমার ধারণা হ'ল তারা লিখিতভাবে হার্ব সটারের কাছ থেকে পোস্ট পেয়েছিল এবং পরে তিনি ফাইলগুলি সরিয়ে দিয়েছেন; তবে এটি কেবল একটি জল্পনা ...)।
ইরান

75

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

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


28
পিক্সিক থ্রেডগুলি x86 এর মধ্যে সীমাবদ্ধ নয়। প্রকৃতপক্ষে, তারা প্রয়োগ করা প্রথম সিস্টেমে সম্ভবত x86 সিস্টেম ছিল না। পিক্সিক থ্রেডগুলি সিস্টেম-স্বতন্ত্র এবং সমস্ত পসিক্স প্ল্যাটফর্মগুলিতে বৈধ। এটি সত্যই সত্য নয় যে এটি একটি হার্ডওয়্যার সম্পত্তি কারণ পোজিক্স থ্রেডগুলিও সমবায় মাল্টিটাস্কিংয়ের মাধ্যমে প্রয়োগ করা যেতে পারে। তবে অবশ্যই বেশিরভাগ থ্রেডিংয়ের সমস্যাগুলি কেবল হার্ডওয়্যার থ্রেডিং বাস্তবায়নগুলিতে (এবং কিছু এমনকি কেবল মাল্টিপ্রসেসর / মাল্টিকোর সিস্টেমেও) পৃষ্ঠতলের।
celtschk

57

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

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

মজার বিষয় হচ্ছে, সি ++ এর জন্য মাইক্রোসফ্ট সংকলকগুলি অস্থির জন্য শব্দার্থবিদ্যা অর্জন / প্রকাশ করেছে যা সি ++ http://msdn.microsoft.com/en-us/library/12a04hfd(v=vs এ মেমরির মডেলের অভাবকে মোকাবেলা করার জন্য একটি সি ++ এক্সটেনশন / .80)। এসপিএক্স । যাইহোক, উইন্ডোজ কেবল x86 / x64 এ চলে, এটি তেমন কিছু বলছে না (ইন্টেল এবং এএমডি মেমরি মডেলগুলি কোনও ভাষায় অর্জন / প্রকাশের শব্দার্থায়নগুলি কার্যকর করা সহজ এবং দক্ষ করে তোলে)।


2
এটি সত্য যে, যখন উত্তরটি লেখা হয়েছিল, উইন্ডোজ কেবল x86 / x64 এ চালিত হয়, তবে উইন্ডোজ কোনও সময় আইএ 64৪, এমআইপিএস, আলফা এএক্সপি,, পাওয়ারপিসি এবং এআরএম এ চালায়। আজ এটি এআরএমের বিভিন্ন সংস্করণে চলেছে, যা x86 থেকে সম্পূর্ণ ভিন্ন মেমরি, এবং ক্ষমা করার মতো কোথাও নেই।
লরেঞ্জো ডিম্যাট

সেই লিঙ্কটি কিছুটা ভাঙা হয়েছে ( "ভিজ্যুয়াল স্টুডিও 2005 অবসরপ্রাপ্ত ডকুমেন্টেশন" বলে )। এটি আপডেট করতে যত্নশীল?
পিটার মর্টেনসেন

3
উত্তরটি লেখা হলেও এটি সত্য ছিল না।
বেন

" একই মেমরির একই সময়ে অ্যাক্সেস করতে একটি অ্যাক্সেস করতে" পরস্পরবিরোধী উপায়
curiousguy

27

আপনি যদি আপনার সমস্ত ডেটা সুরক্ষিত করার জন্য মিউটেক্সগুলি ব্যবহার করেন তবে আপনার সত্যিই চিন্তা করার দরকার নেই। নীরবতা সর্বদা পর্যাপ্ত ক্রম এবং দৃশ্যমানতার গ্যারান্টি সরবরাহ করে।

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

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


19
আগে সমস্যাটি ছিল যে মুটেক্স (সি ++ স্ট্যান্ডার্ডের ক্ষেত্রে) এর মতো জিনিস ছিল না। সুতরাং আপনার কেবলমাত্র গ্যারান্টি সরবরাহ করা হয়েছিল মূটেক্স প্রস্তুতকারকের দ্বারা, যা আপনি কোডটি পোর্ট করেন না এমন সময় পর্যন্ত ঠিক ছিল (গ্যারান্টিতে ছোটখাটো পরিবর্তনগুলি স্পষ্ট করা কঠিন)। এখন আমরা স্ট্যান্ডার্ড দ্বারা সরবরাহিত গ্যারান্টি পাচ্ছি যা প্ল্যাটফর্মগুলির মধ্যে পোর্টেবল হওয়া উচিত।
মার্টিন ইয়র্ক

4
@ মার্টিন: যে কোনও ক্ষেত্রে একটি জিনিস হ'ল মেমরি মডেল এবং অন্যটি হ'ল অ্যাটমিক্স এবং থ্রেডিং আদিমগুলি যা সেই মেমরির মডেলের শীর্ষে চলে।
নিনজালজ

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

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

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

0

উপরের উত্তরগুলি সি ++ মেমরি মডেলের সর্বাধিক মৌলিক দিকগুলি পেয়েছে। অনুশীলনে, বেশিরভাগ std::atomic<>"সুনির্দিষ্ট কাজ" এর ব্যবহারগুলি কমপক্ষে প্রোগ্রামারকে বেশি-অনুকূল করে তোলা (যেমন, অনেকগুলি বিষয় শিথিল করার চেষ্টা করে)।

এমন একটি জায়গা রয়েছে যেখানে ভুলগুলি এখনও সাধারণ: ক্রম লকHttps://www.hpl.hp.com/techreports/2012/HPL-2012-68.pdf এ চ্যালেঞ্জগুলির একটি দুর্দান্ত এবং সহজেই পঠনযোগ্য আলোচনা রয়েছে । সিকোয়েন্স লকগুলি আবেদন করছে কারণ পাঠক লক শব্দটিতে লেখা এড়ানো যায়। নিম্নলিখিত কোডটি উপরের প্রযুক্তিগত প্রতিবেদনের চিত্র 1 এর উপর ভিত্তি করে এবং সি ++ এ সিকোয়েন্স লকগুলি প্রয়োগ করার সময় এটি চ্যালেঞ্জগুলি হাইলাইট করেছে:

atomic<uint64_t> seq; // seqlock representation
int data1, data2;     // this data will be protected by seq

T reader() {
    int r1, r2;
    unsigned seq0, seq1;
    while (true) {
        seq0 = seq;
        r1 = data1; // INCORRECT! Data Race!
        r2 = data2; // INCORRECT!
        seq1 = seq;

        // if the lock didn't change while I was reading, and
        // the lock wasn't held while I was reading, then my
        // reads should be valid
        if (seq0 == seq1 && !(seq0 & 1))
            break;
    }
    use(r1, r2);
}

void writer(int new_data1, int new_data2) {
    unsigned seq0 = seq;
    while (true) {
        if ((!(seq0 & 1)) && seq.compare_exchange_weak(seq0, seq0 + 1))
            break; // atomically moving the lock from even to odd is an acquire
    }
    data1 = new_data1;
    data2 = new_data2;
    seq = seq0 + 2; // release the lock by increasing its value to even
}

Unintuitive যেমন প্রথমে seams হিসেবে data1এবং data2প্রয়োজন হতে atomic<>। যদি তারা পারমাণবিক না হয় তবে তারা (ইন reader()) লিখিতভাবে ঠিক একই সময়ে (ইন ) পড়তে পারে writer()। সি ++ মেমরির মডেল অনুসারে, এটি আসলে এমন একটি দৌড় যা এমনকি reader()কখনই ডেটা ব্যবহার না করে । তদতিরিক্ত, যদি সেগুলি পরমাণু হয় না, তবে সংকলক একটি রেজিস্টারে প্রতিটি মানের প্রথম পঠনকে ক্যাশে করতে পারে। অবশ্যই আপনি তা চান না ... আপনি whileলুপ ইন প্রতিটি পুনরাবৃত্তি পুনরায় পড়তে চান reader()

এটি তৈরি atomic<>এবং তাদের সাথে অ্যাক্সেস করার পক্ষেও এটি পর্যাপ্ত নয় memory_order_relaxed। এর কারণ হ'ল সেক (ইন reader()) এর পাঠাগুলি কেবল শব্দার্থবিদ্যা অর্জন করেছে । সহজ কথায়, যদি এক্স এবং ওয়াই মেমোরি অ্যাক্সেস হয় তবে এক্স পূর্বের ওয়াই, এক্স কোনও অর্জন বা প্রকাশ নয় এবং ওয়াই একটি অর্জন, তবে সংকলকটি এক্স এর পূর্বে Y কে পুনঃক্রম করতে পারে Y ডেটা পঠন ছিল, যেমন একটি পুনর্নির্মাণ লক বাস্তবায়ন ভঙ্গ করবে।

কাগজটি কয়েকটি সমাধান দেয়। সেরা পারফরম্যান্স আজ সঙ্গে এক সম্ভবত এক একটি ব্যবহার করে হয় atomic_thread_fenceসঙ্গে memory_order_relaxed আগে seqlock দ্বিতীয় পঠিত। কাগজে এটি চিত্র 6 রয়েছে I'm আমি এখানে কোডটি পুনরায় উত্পাদন করছি না, কারণ যে কেউ এ পর্যন্ত পড়েছে তাদের অবশ্যই কাগজটি পড়া উচিত। এটি এই পোস্টের চেয়ে আরও সুনির্দিষ্ট এবং সম্পূর্ণ।

শেষ ইস্যুটি হ'ল dataভেরিয়েবলগুলি পারমাণবিক করা অপ্রাকৃত হতে পারে । আপনি যদি আপনার কোডটিতে না পারেন, তবে আপনাকে খুব সতর্কতা অবলম্বন করা উচিত, কারণ অ-পরমাণু থেকে পরমাণুতে ingালাই কেবল আদিম ধরণের জন্য বৈধ। সি ++ ২০ যোগ করার কথা atomic_ref<>, যা এই সমস্যার সমাধান করা আরও সহজ করে দেবে।

সংক্ষিপ্তসার হিসাবে: এমনকি আপনি যদি মনে করেন যে আপনি সি ++ মেমরি মডেলটি বুঝতে পেরেছেন তবে নিজের ক্রম লকগুলি রোল করার আগে আপনার খুব যত্নশীল হওয়া উচিত।


-2

সি এবং সি ++ একটি সুগঠিত প্রোগ্রামের একটি এক্সিকিউশন ট্রেস দ্বারা সংজ্ঞায়িত করা হত।

এখন সেগুলি অর্ধেক একটি প্রোগ্রামের একটি এক্সিকিউশন ট্রেস দ্বারা সংজ্ঞায়িত করা হয়েছে, এবং অর্ধেকটি পোস্টেরিয়েরি সিঙ্ক্রোনাইজেশন অবজেক্টগুলিতে অনেকগুলি অর্ডার দ্বারা।

অর্থ যে এই ভাষার সংজ্ঞাগুলি এই দুটি পদ্ধতির মিশ্রিত করার জন্য কোনও যৌক্তিক পদ্ধতি হিসাবে মোটেই উপলব্ধি করে না। বিশেষত, একটি মিটেক্স বা অ্যাটমিক ভেরিয়েবলের ধ্বংসটি সঠিকভাবে সংজ্ঞায়িত হয় না।


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

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

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

1
"কম্পিউটার প্রোগ্রামগুলির দুর্গমতা সম্পর্কে প্রশ্নগুলি স্ট্যাকওভারফ্লোতে বা স্ট্যাকেক্সচেঞ্জে পোস্ট করা উচিত (যদি না হয় তবে কোথায়)?" এটি মেটা স্ট্যাকওভারফ্লোয়ের জন্য এক বলে মনে হচ্ছে, তাই না?
মাতিয়াস হিউস্লার

1
@ মাতিয়াসহিউসলার ১) সি এবং সি ++ মূলত পারমাণবিক ভেরিয়েবল, মিউটেক্স এবং মাল্টিথ্রেডিংয়ের "মেমরি মডেল" ভাগ করুন। 2) এর প্রাসঙ্গিকতা "মেমরি মডেল" থাকার সুবিধা সম্পর্কে। মডেলটি আনসাউন্ড হওয়ায় সুবিধাটি শূন্য বলে আমি মনে করি।
কৌতূহলী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.