মাল্টি-কোর সিস্টেমগুলির জন্য পোর্টেবল সি কোডটিতে "অস্থির" কোনও কিছুর নিশ্চয়তা দেয় না?


12

একটি দেখার পরও কি গুচ্ছ এর অন্যান্য প্রশ্ন এবং তাদের উত্তর , আমি এইরকম যে পেতে কি সি "উদ্বায়ী" KEYWORD মানে ঠিক কোন ব্যাপক চুক্তি নেই।

এমনকি স্ট্যান্ডার্ডটিও এর অর্থ বলতে সম্মত হওয়ার জন্য সবার পক্ষে যথেষ্ট স্পষ্ট বলে মনে হচ্ছে না ।

অন্যান্য সমস্যার মধ্যে:

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

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

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

দেখে মনে হচ্ছে যে "ব্যবহার 1" পোর্টেবল কোডে ঘটে না যার লক্ষ্যবস্তুতে মাল্টি-কোর সিস্টেম অন্তর্ভুক্ত রয়েছে।

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

সুতরাং "ব্যবহার 2" মনে হচ্ছে "উদ্বায়ী" কী সরবরাহ করতে পারে তার বাইরে।

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

সুতরাং "3 ব্যবহার" সম্ভবত অস্তিত্ব নেই ?

সুতরাং আমার প্রশ্ন:

মাল্টি-কোর সিস্টেমগুলির জন্য পোর্টেবল সি কোডটিতে "অস্থির" কোনও কিছুর নিশ্চয়তা দেয় না?


সম্পাদনা - আপডেট

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

সুতরাং আরও সুনির্দিষ্ট প্রশ্নটি হয়ে ওঠে:
"অস্থির" মাল্টি-কোর সিস্টেমগুলির জন্য পোর্টেবল সি কোডে কোনও কিছুর গ্যারান্টি দেয় না (1) একক থ্রেডেড প্রোগ্রামকে তার সিগন্যাল হ্যান্ডলারের কাছ থেকে তথ্য গ্রহণের অনুমতি দেয়, বা (2) সেটজ্যাম্পের অনুমতি দেয় সেটজ্যাম্প এবং লংজ্যাম্পের মধ্যে সংশোধিত ভেরিয়েবলগুলি দেখতে কোডটি?

এটি এখনও হ্যাঁ / কোনও প্রশ্ন নয়।

যদি "হ্যাঁ" হয় তবে এটি দুর্দান্ত হবে যদি আপনি বাগ-মুক্ত পোর্টেবল কোডের একটি উদাহরণ দেখাতে পারেন যা "অস্থির" বাদ দেওয়া হয় তবে বগি হয়ে যায়। যদি "না" হয় তবে আমি মনে করি যে একটি সংকলক বহু-মূল লক্ষ্যগুলির জন্য এই দুটি খুব নির্দিষ্ট ক্ষেত্রে বাইরে "উদ্বায়ী" উপেক্ষা করতে পারে free


3
সিগন্যালগুলি বহনযোগ্য সিতে বিদ্যমান; সিগন্যাল হ্যান্ডলার দ্বারা আপডেট হওয়া বৈশ্বিক পরিবর্তনশীল সম্পর্কে কী? এটি volatileপ্রোগ্রামটি অবহিত করা দরকার যে এটি অ্যাসক্রোনাক্রমে পরিবর্তিত হতে পারে।
নাট এল্ডারেজ

2
@ নেটএলড্রেডজ গ্লোবাল, যদিও একা অস্থির, যথেষ্ট ভাল নয়। এটি পাশাপাশি পারমাণবিক হওয়াও দরকার।
ইউজিন শ।

@ ইউজেনশ: হ্যাঁ, অবশ্যই তবে হাতে প্রশ্নটি volatileবিশেষত, যা আমি বিশ্বাস করি যে এটি প্রয়োজনীয়।
নাট এল্ডারেজ

" এল 1 ক্যাশে সমন্বয় করার সময় অন্যান্য থ্রেডের সাথে সমন্বয় সম্পর্কিত আরও কিছু গ্যারান্টি দেয় না " ডাব্লু / অন্যান্য থ্রেডের সাথে যোগাযোগের জন্য "এল 1 ক্যাশে সমন্বয়" কোথায়? "
কৌতূহলী

1
হতে পারে প্রাসঙ্গিক, অস্থির হ্রাস করার সি ++ প্রস্তাব , প্রস্তাবটি আপনি এখানে উত্থাপন করা অনেকগুলি উদ্বেগকে সম্বোধন করে এবং সম্ভবত এর ফলাফল সি কমিটির পক্ষে প্রভাবশালী হবে
এমএম

উত্তর:


1

সমস্যার সংক্ষিপ্তসার হিসাবে, এটি উপস্থিত হয় (অনেকগুলি পড়ার পরে) যা "উদ্বায়ী" এর মতো কিছুটির গ্যারান্টি দেয়: মানটি কেবল একটি রেজিস্টার / থেকে নয়, তবে কমপক্ষে মূলটির এল 1 ক্যাশে একই পংক্তিতে পাঠ করা / লেখা হবে that পাঠ্য / লেখার কোড উপস্থিত

না, একেবারে তা হয় না । এবং এটি এমটি নিরাপদ কোডের উদ্দেশ্যে অস্থিতিশীল প্রায় অকেজো করে তোলে।

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

কিন্তু উদ্বায়ী নেই না তত্ত্ব বা অভ্যাস পারেন কোনো নিশ্চয়তা ক্রম (বা "মেমরির দৃশ্যমানতা") ক্যাশের মধ্যে প্রদান।

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

অনুশীলনে, অস্থির ptrace- ক্ষমতা গ্যারান্টি দেয় যে চলমান প্রোগ্রামের জন্য, অপ্টিমাইজেশনের যে কোনও স্তরে ডিবাগ তথ্য ব্যবহার করার ক্ষমতা এবং ডিবাগ তথ্য এই অস্থির বস্তুগুলির জন্য সত্য বোঝায়:

  • ptraceঅস্থির বস্তু জড়িত ক্রিয়াকলাপের পরে ক্রম পয়েন্টগুলিতে অর্থবোধক ব্রেক পয়েন্টগুলি সেট করতে আপনি (একটি প্লাস্ট্রের মতো মেকানিজম) ব্যবহার করতে পারেন : আপনি ঠিক এই পয়েন্টগুলিতে সত্যই ভেঙে ফেলতে পারেন (দ্রষ্টব্য যে আপনি কেবলমাত্র অনেক ব্রেক পয়েন্ট সেট করতে ইচ্ছুক হলে এই কাজ করে সি / সি ++ বিবৃতিটি অনেকগুলি বিস্তৃত সমাবেশ এবং শেষ পয়েন্টগুলিতে সংকলিত হতে পারে, যেমন একটি ব্যাপকভাবে অনিবন্ধিত লুপ হিসাবে);
  • থামার মৃত্যুর একটি থ্রেড থাকাকালীন, আপনি সমস্ত উদ্বায়ী পদার্থের মান পড়তে পারেন, কারণ তাদের তাত্পর্যপূর্ণ উপস্থাপনা রয়েছে (স্ব স্ব ধরণের জন্য এবিআই অনুসরণ করে); একটি অ অস্থির স্থানীয় ভেরিয়েবলের একটি atypical প্রতিনিধিত্ব হতে পারে, f.ex. একটি স্থানান্তরিত প্রতিনিধিত্ব: একটি অ্যারে সূচকের জন্য ব্যবহৃত একটি পরিবর্তনশীল সহজ সূচক জন্য পৃথক বস্তুর আকার দ্বারা গুণিত হতে পারে; অথবা এটি বিন্যাসের সাহায্যে একটি অ্যারের উপাদানটিতে প্রতিস্থাপিত হতে পারে (যতক্ষণ না ভেরিয়েবলের সমস্তরূপে রূপান্তরিত হিসাবে ব্যবহার করা হয়) (ভাবুন ডিএক্সকে ডুতে অবিচ্ছেদ্য রূপে পরিবর্তন করুন);
  • আপনি সেই জিনিসগুলিও সংশোধন করতে পারেন (যতক্ষণ মেমরি ম্যাপিংগুলি এটির অনুমতি দেয় ততক্ষণ স্থির জীবনকাল সহ অস্থায়ী বস্তু কেবল মেমরি পঠিত ম্যাপের মধ্যে থাকতে পারে) qualified

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

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

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

উদ্বায়ী ইন্টারঅ্যাকশনগুলি আসল মেশিনের বাইরের বিশ্বের সাথে ইন্টারঅ্যাকশন হয় , যা অবশ্যই "বিমূর্ত মেশিন" অনুসরণ করে। এগুলি প্রোগ্রামের অংশগুলির সাথে অন্যান্য প্রোগ্রাম অংশগুলির অভ্যন্তরীণ মিথস্ক্রিয়া নয়। সংকলকটি এটি যা জানে কেবল সে সম্পর্কেই तर्क করতে পারে, এটি হ'ল অভ্যন্তরীণ প্রোগ্রামের অংশগুলি।

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

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

তবে অস্থিরতা নির্দিষ্ট ক্ষেত্রে মেমরি অপারেশন করার জন্য কমপক্ষে অনুকূলিত হওয়ার জন্য প্রত্যাশিত সমাবেশের নির্গমনকে জোর করা ছাড়া আর কিছুই করে না: অস্থায়ী শব্দার্থক অর্থ সাধারণ ক্ষেত্রে শব্দার্থক।

সাধারণ ক্ষেত্রে হ'ল সংকলকটি কি করে যখন এটির কোনও নির্মাণ সম্পর্কে কোনও তথ্য না থাকে: f.ex. ডায়নামিক প্রেরণের মাধ্যমে একটি ভার্চুয়াল ফাংশন কল করা একটি সাধারণ ঘটনা, সংকলন সময়ে নির্ধারণের পরে ওভাররাইডারে সরাসরি কল করা এক্সপ্রেশন দ্বারা নির্ধারিত বস্তুর ধরণটি একটি বিশেষ কেস। সংকলকটিতে সর্বদা সমস্ত নির্মাণের একটি সাধারণ কেস পরিচালনা করা থাকে এবং এটি এবিআই অনুসরণ করে।

অস্থায়ী থ্রেডগুলি সিঙ্ক্রোনাইজ করতে বা "মেমরি ভিজিবিলিটি" সরবরাহের জন্য বিশেষ কিছু করে না: অস্থায়ী কেবল একটি থ্রেডের সম্পাদনকারী বা থামানো থেকে দেখা বিমূর্ত স্তরটিতে গ্যারান্টি সরবরাহ করে , এটি একটি সিপিইউ কোর এর অভ্যন্তর :

  • কোন অস্থিরতা মেমরি অপারেশনগুলি প্রধান র‌্যামে পৌঁছায় সে সম্পর্কে কিছুই বলে না (আপনি এই গ্যারান্টিগুলি পাওয়ার জন্য অ্যাসেমব্লিং নির্দেশাবলী বা সিস্টেম কল সহ নির্দিষ্ট মেমরি ক্যাশিং ধরণের সেট করতে পারেন);
  • অস্থির কোনও মেশিন ক্রিয়াকলাপ যখন কোনও স্তরের ক্যাশে প্রতিশ্রুতিবদ্ধ হবে সে সম্পর্কে কোনও গ্যারান্টি সরবরাহ করে না (এমনকি এল 1ও নয়)

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

থ্রেড চলমান মূল দৃষ্টিকোণ থেকে গ্যারান্টেড আচরণ প্রদানের অস্থির সম্পত্তির অর্থ হ'ল সেই থ্রেডকে বিতরণ করা অ্যাসিনক্রোনাস সিগন্যালগুলি, যেগুলি এই থ্রেডের সম্পাদন আদেশের দৃষ্টিকোণ থেকে চালানো হয়, উত্স কোড ক্রমে ক্রিয়াকলাপ দেখুন ।

আপনি যদি আপনার থ্রেডগুলিতে সিগন্যাল প্রেরণের পরিকল্পনা না করেন (থেমে থেমে থেমে থেমে থেমে থেমে চলার বিষয়ে ইতিমধ্যে একীকরণের এক চূড়ান্ত কার্যকর পন্থা), অস্থিরতা আপনার পক্ষে নয়।


6

আমি কোনও বিশেষজ্ঞ নই, তবে সিপ্রেফারেন্স ডটকমের কাছে এমনটি রয়েছে যা আমার কাছে বেশ কিছু ভাল তথ্য বলে মনে হয়volatile । এখানে এর সংক্ষিপ্তসার:

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

এটি কিছু ব্যবহার দেয়:

অস্থির ব্যবহার

1) স্ট্যাটিক অস্থির বস্তু মডেল মেমরি-ম্যাপযুক্ত I / O পোর্টগুলি এবং স্ট্যাটিক কনস্ট অস্থির বস্তুগুলির মডেল মেমরি-ম্যাপযুক্ত ইনপুট পোর্টগুলি, যেমন রিয়েল-টাইম ক্লক

2) সিগ_আটমিক_টি টাইপের স্থিতিশীল উদ্বায়ী বস্তুগুলি সিগন্যাল হ্যান্ডলারের সাথে যোগাযোগের জন্য ব্যবহৃত হয়।

3) সেটিংজ্যাম্প ম্যাক্রোর অনুরোধ সম্বলিত কোনও ফাংশনের স্থানীয় যে উদ্বায়ী ভেরিয়েবলগুলি লংজ্যাম্প রিটার্নের পরে তাদের মানগুলি বজায় রাখার গ্যারান্টিযুক্ত একমাত্র স্থানীয় ভেরিয়েবল।

৪) এছাড়াও, উদ্বায়ী ভেরিয়েবলগুলি নির্দিষ্ট কিছু অপ্টিমাইজেশান অক্ষম করার জন্য ব্যবহার করা যেতে পারে, যেমন মাইক্রোব্যাঙ্কমার্কের জন্য ডেড স্টোর নির্মূলকরণ বা ধ্রুবক ভাঁজ অক্ষম করা।

এবং অবশ্যই, এতে উল্লেখ করা হয়েছে যে volatileথ্রেড সিঙ্ক্রোনাইজেশনের জন্য দরকারী নয়:

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


2
বিশেষত, (2) এবং (3) পোর্টেবল কোডের সাথে প্রাসঙ্গিক।
নাট এলেডারেজ

2
@ টিইডি ডোমেন নাম থাকা সত্ত্বেও, লিঙ্কটি সি সম্পর্কিত তথ্য নয়, সি ++ নয়
ডেভিড ব্রাউন

@ নেটএলড্রেডজ আপনি খুব কমই longjmpসি ++ কোড ব্যবহার করতে পারেন ।
কৌতূহলী

@ ডেভিডব্রাউন সি এবং সি ++ এর পর্যবেক্ষণযোগ্য এসই একই সংজ্ঞা রয়েছে এবং মূলত একই থ্রেড আদিম রয়েছে।
কৌতূহলী

4

প্রথমত, historতিহাসিকভাবে volatileঅ্যাক্সেসের অর্থ এবং এর অনুরূপ অর্থের বিভিন্ন ব্যাখ্যা সম্পর্কিত বিভিন্ন হিক্কার হয়েছে । এই অধ্যয়নটি দেখুন: ভোলিটাইলগুলি বিভ্রান্তিকর, এবং এটি সম্পর্কে কী করা উচিত

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

সি ভাষা মেমরির আচরণের গ্যারান্টি দেয় কি না volatileতা আপাতদৃষ্টিতে তর্কযোগ্য, যদিও ব্যক্তিগতভাবে আমি মনে করি ভাষাটি পরিষ্কার। প্রথম আমাদের পার্শ্ব প্রতিক্রিয়াগুলির আনুষ্ঠানিক সংজ্ঞা রয়েছে, C17 5.1.2.3:

কোনও অ্যাক্সেস অ্যাক্সেস করা, কোনও জিনিসকে volatileসংশোধন করা, কোনও ফাইল সংশোধন করা বা এমন কোনও ক্রিয়াকলাপ সম্পাদন করা ফাংশন কল করা সমস্ত পার্শ্ব প্রতিক্রিয়া , যা সম্পাদনের পরিবেশের অবস্থার পরিবর্তন।

মানটি ক্রম নির্ধারণ শব্দটি নির্ধারণ করে, মূল্যায়নের ক্রম নির্ধারণের (নির্বাহ) হিসাবে। সংজ্ঞাটি প্রথাগত এবং জটিল umbers

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

উপরের টিএল; ডিআরটি মূলত এটি হ'ল আমাদের যদি একটি এক্সপ্রেশন থাকে Aযার পার্শ্ব-প্রতিক্রিয়া থাকে তবে এটি অবশ্যই অন্য এক্সপ্রেশনের আগে সম্পাদন করতে হবে B, যদি Bপরে ধারাবাহিক হয় A

এই অংশের মাধ্যমে সি কোডের অপ্টিমাইজেশানগুলি সম্ভব হয়েছে:

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

এর অর্থ হল যে প্রোগ্রামটি অন্য কোথাও স্ট্যান্ডার্ড ম্যান্ডেট (ক্রম মূল্যায়নের ক্রম) অনুসারে এক্সপ্রেশনকে মূল্যায়ন (সম্পাদন) করতে পারে। তবে এটির মূল্য নির্ধারণ করা (সম্পাদন) করা উচিত নয় যদি এটি অনুমিত হয় যে এটি ব্যবহার করা হয়নি। উদাহরণস্বরূপ, অপারেশনটির সাথে এক্সপ্রেশনটি 0 * xমূল্যায়ন xএবং কেবল প্রতিস্থাপনের প্রয়োজন হয় না 0

কোনও ভেরিয়েবল অ্যাক্সেস না করা পার্শ্ব-প্রতিক্রিয়া। অর্থ যে ক্ষেত্রে xহয় volatile, এটা উচিত নয় মূল্যায়ন (প্রতিপাদন করুন) 0 * xযদিও ফলাফলের সবসময় 0. অপ্টিমাইজেশান হতে হবে মঞ্জুরিপ্রাপ্ত নয়।

অধিকন্তু, মানটি পর্যবেক্ষণযোগ্য আচরণের কথা বলে:

মেনে চলার ক্ষেত্রে সর্বনিম্ন প্রয়োজনীয়তা হ'ল:

  • অস্থির বস্তুগুলির অ্যাক্সেসগুলি বিমূর্ত মেশিনের নিয়ম অনুসারে কঠোরভাবে মূল্যায়ন করা হয়।
    / - / এটি প্রোগ্রামটির পর্যবেক্ষণযোগ্য আচরণ

উপরের volatileসমস্তটি প্রদত্ত, লিখিত সি উত্সটির শব্দার্থবিজ্ঞান অন্যথায় বলেছে, যদি একটি সম্মতিসূচক বাস্তবায়ন (সংকলক + অন্তর্নিহিত সিস্টেম) কোনও অমীমাংসিত ক্রমে অবজেক্টের অ্যাক্সেস কার্যকর করতে পারে না ।

এর অর্থ এই উদাহরণে

volatile int x;
volatile int y;
z = x;
z = y;

উভয় অ্যাসাইনমেন্ট এক্সপ্রেশন অবশ্যই মূল্যায়ন করা z = x; উচিত এবং তার আগে মূল্যায়ন করা উচিতz = y; । একটি মাল্টি-প্রসেসরের বাস্তবায়ন যা এই দুটি অপারেশনটিকে দুটি ভিন্ন ভিন্ন অনিয়ম কোরগুলিতে আউটসোর্স করে, এটি মেনে চলে না!

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

সংকলক অগত্যা সমস্যাটি সমাধান করার জন্য যত্নবান নয় এবং তাই volatileমেমরির বাধা হিসাবে অভিনয় করার জন্য অ-বহনযোগ্য। এটি বাস্তবায়নের ইস্যুতে পরিণত হয়েছে।


পছন্দ করুন
লুন্ডিন

@ কুরিয়াসগুয়ে যতক্ষণ না এটি বাছাইয়ের সাথে বা ছাড়াই কোনও ধরণের পূর্ণসংখ্যার ধরণের বিষয় নয়।
লন্ডিন

যদি এটি একটি সাধারণ অস্থিতিশীল পূর্ণসংখ্যার হয়, তবে রিডান্ট্যান্ট zসত্যিই মৃত্যুদন্ড কার্যকর করার জন্য কেন লিখবে ? (মত z = x; z = y;) পরবর্তী বিবৃতিতে মানটি মুছতে চলেছে।
কৌতূহলী

@ কুরিয়াসগুয়ি কারণ অস্থির ভেরিয়েবলগুলিকে পাঠ্য নির্দিষ্ট ক্রমে নির্বাহ করা উচিত।
লুন্ডিন

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