c++ - যবহ - বিটা ক্ষয় কি




উচ্চ তেজস্ক্রিয় পরিবেশে ব্যবহারের জন্য একটি অ্যাপ্লিকেশন সংকলন (16)

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

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


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


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

এই সমাধানটির একটি সুবিধা হ'ল আপনি দাসদের মতো মাস্টার হিসাবে একই API ব্যবহার করতে পারেন, তাই অপ্রয়োজনীয়তা একটি স্বচ্ছ বৈশিষ্ট্য হয়ে ওঠে।

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


আমি সত্যিই অনেক দুর্দান্ত উত্তর পড়েছি!

এখানে আমার 2 শতাংশ: মেমরিটির একটি পরিসংখ্যানের মডেল তৈরি করুন / অস্বাভাবিকতা নিবন্ধ করুন, মেমরিটি যাচাই করতে বা ঘন ঘন নিবন্ধকের তুলনা সম্পাদনের জন্য একটি সফ্টওয়্যার লিখে by আরও, ভার্চুয়াল মেশিনের স্টাইলে একটি এমুলেটর তৈরি করুন যেখানে আপনি সমস্যাটি নিয়ে পরীক্ষা করতে পারবেন। আমার ধারণা আপনি যদি জংশনের আকার, ঘড়ির ফ্রিকোয়েন্সি, বিক্রেতার, কেসিং ইত্যাদির পরিবর্তিত হন তবে এটি অন্যরকম আচরণ পর্যবেক্ষণ করবে।

এমনকি আমাদের ডেস্কটপ পিসি মেমরির একটি ব্যর্থতার একটি নির্দিষ্ট হার রয়েছে, যা তবে প্রতিদিনের কাজকে ক্ষতিগ্রস্ত করে না।


আয়নগুলি সহজেই বিটগুলি ফ্লিপ করা থেকে রোধ করতে ধীর চিপগুলি ব্যবহার করার কথা কেউ উল্লেখ করেছেন। অনুরূপ ফ্যাশনে সম্ভবত একটি বিশেষায়িত সিপিইউ / র‌্যাম ব্যবহার করুন যা একক বিট সংরক্ষণ করতে একাধিক বিট ব্যবহার করে। সুতরাং একটি হার্ডওয়্যার ত্রুটি সহনশীলতা সরবরাহ করা কারণ এটি সমস্ত বিটগুলি উল্টে যাওয়ার সম্ভাবনা খুব কম unlikely সুতরাং 1 = 1111 তবে 4 বার আঘাত করতে হবে বাস্তবে উল্টাতে। (4 টি যদি ইতিমধ্যে অস্পষ্টভাবে উল্টে যায় তবে 4 টি একটি খারাপ সংখ্যা হতে পারে)। সুতরাং আপনি যদি 8 এর সাথে যান তবে আপনি 8 গুণ কম র‌্যাম এবং কিছু ভগ্নাংশ ধীর অ্যাক্সেসের সময় পাবেন তবে অনেক বেশি নির্ভরযোগ্য ডেটা উপস্থাপনা। আপনি সম্ভবত কোনও বিশেষায়িত সংকলক (সমস্ত কিছুর জন্য x পরিমাণ আরও বেশি পরিমাণ বরাদ্দ) বা ভাষা প্রয়োগকরণ (এমনভাবে ডেটা স্ট্রাকচারের জন্য মোড়কে লিখুন যা এইভাবে জিনিস বরাদ্দ করে) দিয়ে সফ্টওয়্যার পর্যায়ে এটি উভয়ই করতে পারেন।বা বিশেষায়িত হার্ডওয়্যার যা একই লজিকাল কাঠামোযুক্ত তবে ফার্মওয়্যারটিতে এটি করে।


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

উত্তরটি সাধারণত স্বয়ংক্রিয় ইউনিট পরীক্ষার হয়। উন্নয়ন ব্যবস্থায় কোডটি প্রয়োগ করে এমন পরীক্ষার জোতা লিখুন, তারপরে লক্ষ্য সিস্টেমে একই পরীক্ষার জোতাগুলি চালান। পার্থক্য সন্ধান করুন!

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

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


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

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

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

এ জাতীয় ত্রুটি পরিস্থিতি থেকে পুনরুদ্ধার হয় পুনরায় বুট করা (যদি সফ্টওয়্যারটি এখনও বেঁচে থাকে এবং লাথি মারছে) বা হার্ডওয়্যার রিসেট (যেমন এইচডাব্লু ওয়াচডগস)। প্রথমটি থেকে শুরু করা সহজ।

যদি সমস্যাটি হার্ডওয়্যার সম্পর্কিত হয় - তবে লগিংয়ের সাহায্যে আপনাকে কোন ফাংশন কল সমস্যা দেখা দেয় এবং এটি আপনাকে কী কাজ করছে না এবং কোথায় চলছে তার ভিতরে জ্ঞান দিতে পারে identify

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

যদি কিছু সময়ের পরে সমস্যা দেখা দেয় - তবে স্ট্যাকের ওভারফ্লো সন্দেহ করা যায় - তবে স্ট্যাক পয়েন্ট রেজিস্টারগুলি নিরীক্ষণ করা ভাল - যদি তারা ক্রমাগত বৃদ্ধি পায়।

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

সবচেয়ে গুরুত্বপূর্ণ বিষয় সম্ভবত মেশিন পুরোপুরি বন্ধ হয়ে গেলে / পুনরায় সেট করা / কাজ না করে আপনি কীভাবে আপনার লগগুলি ফিরে পাবেন - সম্ভবত বুটস্ট্যাপের প্রথম জিনিসটি করা উচিত - সমস্যাযুক্ত পরিস্থিতিটি আটকানো থাকলে বাড়িতে ফিরে আসা head

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


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

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

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


যদি আপনার হার্ডওয়্যার ব্যর্থ হয় তবে আপনি এটি পুনরুদ্ধার করতে যান্ত্রিক স্টোরেজ ব্যবহার করতে পারেন। যদি আপনার কোড বেসটি ছোট হয় এবং কিছু শারীরিক জায়গা থাকে তবে আপনি একটি যান্ত্রিক ডেটা স্টোর ব্যবহার করতে পারেন।

উপাদানগুলির একটি পৃষ্ঠ থাকবে যা বিকিরণের দ্বারা প্রভাবিত হবে না। একাধিক গিয়ার থাকবে। একটি যান্ত্রিক পাঠক সমস্ত গিয়ারে চলবে এবং উপরে এবং নীচে নমনীয় হবে। ডাউন মানে এটি 0 এবং আপ এর অর্থ এটি 1। 0 এবং 1 থেকে আপনি আপনার কোড বেস তৈরি করতে পারেন।


সম্ভবত এটির সাহায্যে হার্ডওয়্যারটির "এই পরিবেশের জন্য ডিজাইন করা" অর্থ কী তা বোঝাতে সহায়তা করবে। এটি কীভাবে সংশোধন করে এবং / অথবা এসইউ ত্রুটির উপস্থিতি নির্দেশ করে?

একটি স্পেস এক্সপ্লোরেশন সম্পর্কিত প্রকল্পে, আমাদের একটি কাস্টম এমসিইউ ছিল, যা এসইউ ত্রুটিগুলিতে ব্যতিক্রম বা বাধাগ্রস্ত করবে, তবে কিছুটা বিলম্বের সাথে, অর্থাত্ কিছু চক্র এসইউ ব্যতিক্রম ঘটায় এমন একটি ইনসানের পরে পাস / নির্দেশাবলী কার্যকর করতে পারে।

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

আমরা বিপজ্জনক (পুনরায় আরম্ভযোগ্য নয়) সিকোয়েন্সগুলি সনাক্ত করেছি (যেমন lw $3, 0x0($2) , একটি ইনসান অনুসরণ করে, যা সংশোধন করে $2 এবং ডেটা নির্ভর করে না $3 ), এবং আমি জিসিসিতে পরিবর্তন করেছি, যাতে এই ধরণের ক্রমগুলি ঘটে না (যেমন একটি শেষ রিসোর্ট হিসাবে পৃথক করে পৃথক করে) two insns by a nop )।

কিছু বিবেচনা করার জন্য ...


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


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

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

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


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

ভেরিয়েবলকে volatile হিসাবে ঘোষণা করা প্রায়শই সহায়ক, তবে পঞ্চাশক্তি হতে পারে না। বিশেষ গুরুত্ব সহকারে নোট করুন, নিরাপদ কোডিংয়ে প্রায়শই প্রয়োজন হয় যে বিপজ্জনক ক্রিয়াকলাপগুলিতে হার্ডওয়্যার ইন্টারলক থাকে যা সক্রিয় করার জন্য একাধিক পদক্ষেপের প্রয়োজন হয় এবং সেই কোডটি প্যাটার্ন ব্যবহার করে লেখা উচিত:

... code that checks system state
if (system_state_favors_activation)
{
  prepare_for_activation();
  ... code that checks system state again
  if (system_state_is_valid)
  {
    if (system_state_favors_activation)
      trigger_activation();
  }
  else
    perform_safety_shutdown_and_restart();
}
cancel_preparations();

যদি কোনও সংকলক কোডটি তুলনামূলক আক্ষরিক ফ্যাশনে অনুবাদ করে এবং যদি সিস্টেমের জন্য সমস্ত পরীক্ষার prepare_for_activation() পরে পুনরাবৃত্তি করা হয় তবে সিস্টেমটি প্রায় কোনও প্রশংসনীয় একক ত্রুটির ঘটনার বিরুদ্ধে শক্তিশালী হতে পারে, এমনকি যেগুলি নির্বিচারে প্রোগ্রামের কাউন্টারকে দূষিত করবে এবং গাদা। যদি prepare_for_activation() কল করার ঠিক পরে কোনও ত্রুটি ঘটে থাকে তবে এর দ্বারা বোঝা যায় যে সক্রিয়করণটি যথাযথ হবে (যেহেতু কোনও ত্রুটির আগে প্রস্তুত_ফো_অ্যাক্টিভেশন prepare_for_activation() বলা হয়নি)। যদি এই prepare_for_activation() অনুপযুক্তভাবে পৌঁছে prepare_for_activation() তবে পরবর্তী কোনও ত্রুটির ঘটনা না ঘটে তবে কোডের পরবর্তী সময়ে বৈধতা চেক বা ক্যান্সেল_প্রিপারেশনগুলি কল না করেই ট্রিগার_অ্যাক্টিভেশন trigger_activation() পৌঁছানোর কোনও উপায় থাকবে না [যদি স্ট্যাক গ্লিট থাকে, prepare_for_activation() এর প্রেক্ষাপটের আগে prepare_for_activation() রিটার্ন করার ঠিক আগে trigger_activation() একটি জায়গায় এগিয়ে যেতে পারে, তবে cancel_preparations() এর কলটি প্রস্তুত_ prepare_for_activation() এবং prepare_for_activation() এর কলগুলির মধ্যে উপস্থিত হত, সুতরাং পরের কলটিকে prepare_for_activation() রেন্ডার করে।

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


এটি একটি অত্যন্ত বিস্তৃত বিষয়। মূলত, আপনি সত্যই স্মৃতি দুর্নীতি থেকে পুনরুদ্ধার করতে পারবেন না, তবে আপনি অন্তত তাত্ক্ষণিকভাবে ব্যর্থ হওয়ার চেষ্টা করতে পারেন। আপনি ব্যবহার করতে পারেন কয়েকটি কৌশল এখানে:

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

  • অপ্রয়োজনীয় সাথে স্টোর ভেরিয়েবল । আপনার যদি একটি গুরুত্বপূর্ণ ভেরিয়েবল x এর মানটি x1 , x2 এবং x3 এবং এটি (x1 == x2) ? x2 : x3 হিসাবে পড়বেন (x1 == x2) ? x2 : x3 (x1 == x2) ? x2 : x3

  • প্রোগ্রাম প্রবাহ পর্যবেক্ষণ বাস্তবায়ন। মূল লুপ থেকে ডাকা গুরুত্বপূর্ণ ফাংশন / শাখায় একটি অনন্য মান সহ একটি গ্লোবাল পতাকা XOR X কাছাকাছি -100% পরীক্ষার কভারেজ সহ একটি বিকিরণ-মুক্ত পরিবেশে প্রোগ্রামটি চালানো আপনাকে চক্রের শেষে পতাকাটির গ্রহণযোগ্য মানগুলির তালিকা দেয়। আপনি যদি বিচ্যুতি দেখেন তবে পুনরায় সেট করুন।

  • স্ট্যাক পয়েন্টার নিরীক্ষণ । মূল লুপের শুরুতে, স্ট্যাক পয়েন্টারটিকে তার প্রত্যাশিত মানের সাথে তুলনা করুন। বিচ্যুতির উপর পুনরায় সেট করুন।


তেজস্ক্রিয় পরিবেশের জন্য লিখিত কোড কোনও মিশন-সমালোচনামূলক অ্যাপ্লিকেশনটির জন্য লিখিত কোডের চেয়ে আসলে আলাদা নয়।

ইতিমধ্যে যা উল্লেখ করা হয়েছে তা ছাড়াও এখানে কয়েকটি বিবিধ টিপস দেওয়া হয়েছে:

  • যে কোনও আধা-পেশাদার এম্বেডড সিস্টেমে উপস্থিত থাকা উচিত প্রতিদিনের "ব্রেড এবং মাখন" সুরক্ষা ব্যবস্থাগুলি ব্যবহার করুন: অভ্যন্তরীণ নজরদারি, অভ্যন্তরীণ কম-ভোল্টেজ সনাক্তকরণ, অভ্যন্তরীণ ক্লক মনিটর। এই জিনিসগুলি এমনকি ২০১ 2016 সালে উল্লেখ করার দরকার নেই এবং এগুলি প্রতিটি আধুনিক মাইক্রোকন্ট্রোলারের তুলনায় বেশ মানক।
  • আপনার যদি সুরক্ষা এবং / বা স্বয়ংচালিতমুখী এমসিইউ থাকে তবে এতে নির্দিষ্ট ওয়াচডগ বৈশিষ্ট্য থাকবে যেমন একটি নির্দিষ্ট সময় উইন্ডো, যার ভিতরে আপনাকে ওয়াচডগটি রিফ্রেশ করতে হবে। যদি আপনার কাছে একটি মিশন-সমালোচনামূলক রিয়েল-টাইম সিস্টেম থাকে তবে এটি পছন্দ করা হয়।
  • সাধারণভাবে, এই জাতীয় সিস্টেমগুলির জন্য উপযুক্ত একটি এমসিইউ ব্যবহার করুন, এবং কোনও জেনেরিক মূলধারার ফ্লাফ নয় যা আপনি ভুট্টা ফ্লেকের প্যাকেটে পেয়েছেন। আজকাল প্রায় প্রতিটি এমসইউ প্রস্তুতকারকের কাছে সুরক্ষা অ্যাপ্লিকেশনগুলির জন্য নকশাকৃত এমসিইউ রয়েছে (টিআই, ফ্রিস্কেল, রেনেসাস, এসটি, ইনফিনিয়ন ইত্যাদি)। এগুলিতে লক-স্টেপ কোর সহ প্রচুর অন্তর্নির্মিত সুরক্ষা বৈশিষ্ট্য রয়েছে: এর অর্থ হ'ল একই কোডটি সম্পাদনকারী 2 সিপিইউ কোর রয়েছে এবং তাদের অবশ্যই একে অপরের সাথে একমত হতে হবে।
  • গুরুত্বপূর্ণ: আপনাকে অবশ্যই অভ্যন্তরীণ MCU নিবন্ধগুলির নিখরচায়তা নিশ্চিত করতে হবে। লেখার যোগ্য হার্ডওয়্যার পেরিফেরিয়ালগুলির সমস্ত নিয়ন্ত্রণ এবং স্থিতি রেজিস্ট্রিগুলি র‌্যাম মেমরিতে থাকতে পারে এবং তাই তারা দুর্বল।

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

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

  • র‌্যাম বা এনভিএম-তে ত্রুটিগুলি যাচাই করার জন্য সমস্ত ধরণের পদ্ধতি রয়েছে: চেকসামস, "ওয়াকিং প্যাটার্নগুলি", সফ্টওয়্যার ইসিসি ইত্যাদি etc. আজকাল সর্বোত্তম সমাধান হ'ল এর কোনওটি ব্যবহার না করা, বিল্ট-ইন ইসিসি সহ একটি এমসিইউ ব্যবহার করা এবং অনুরূপ চেক। কারণ সফ্টওয়্যারটিতে এটি করা জটিল এবং নিজেই ত্রুটি পরীক্ষা করা ত্রুটি এবং অপ্রত্যাশিত সমস্যার পরিচয় দিতে পারে।

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

    উচ্চমানের মিশন-সমালোচনামূলক ফার্মওয়্যার যথাসম্ভব ত্রুটি সনাক্ত করে এবং তারপরে সেগুলি নিরাপদে উপেক্ষা করে।

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

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

    একইভাবে সি ++ এ, স্ট্যাটিক স্টোরেজ সময়কাল ভেরিয়েবলগুলির জন্য কনস্ট্রাক্টরের উপর নির্ভর করবেন না। কনস্ট্রাক্টরকে একটি সর্বজনীন "সেট-আপ" রুটিন কল করুন, যা আপনি পরে কল করার পরে সরাসরি কলার অ্যাপ্লিকেশন থেকে কল করতে পারেন।

    যদি সম্ভব হয় তবে সম্পূর্ণভাবে "কপি-ডাউন" স্টার্ট-আপ কোডটি সরিয়ে ফেলুন যা .data এবং .bss (এবং সি ++ কনস্ট্রাক্টরকে কল করে) পুরোপুরি, যাতে আপনি যদি এর উপর নির্ভর করে কোড লিখেন তবে আপনি লিঙ্কারের ত্রুটি পেতে পারেন। অনেক সংকলককে এড়িয়ে যাওয়ার বিকল্প রয়েছে, সাধারণত "মিনিমাল / ফাস্ট স্টার্ট-আপ" বা অনুরূপ called

    এর অর্থ হ'ল যে কোনও বাহ্যিক গ্রন্থাগারগুলি পরীক্ষা করতে হবে যাতে সেগুলিতে এ জাতীয় কোনও নির্ভরতা না থাকে।

  • প্রোগ্রামটির জন্য একটি নিরাপদ রাষ্ট্র প্রয়োগ এবং সংজ্ঞা দিন, যেখানে আপনি গুরুতর ত্রুটির ক্ষেত্রে ফিরে যাবেন।

  • ত্রুটি প্রতিবেদন / ত্রুটি লগ সিস্টেম কার্যকর করা সর্বদা সহায়ক।

রেডিয়েশন-কঠোর সফ্টওয়্যার সম্পর্কিত নাসার একটি কাগজ রয়েছে। এটি তিনটি প্রধান কার্য বর্ণনা করে:

  1. ত্রুটিগুলির জন্য মেমরির নিয়মিত পর্যবেক্ষণ করা হলে সেই ত্রুটিগুলি স্ক্র্যাব করা,
  2. শক্তিশালী ত্রুটি পুনরুদ্ধার ব্যবস্থা, এবং
  3. কিছু যদি আর কাজ না করে তবে পুনরায় কনফিগার করার ক্ষমতা।

নোট করুন যে মেমরি স্ক্যানের হারটি পর্যাপ্ত পরিমাণে হওয়া উচিত যাতে মাল্টি-বিট ত্রুটি খুব কমই ঘটে থাকে, কারণ বেশিরভাগ ECC মেমরি একক-বিট ত্রুটিগুলি থেকে পুনরুদ্ধার করতে পারে, মাল্টি-বিট ত্রুটিগুলি থেকে নয়।

দৃ error় ত্রুটি পুনরুদ্ধারের মধ্যে নিয়ন্ত্রণ প্রবাহ স্থানান্তর (সাধারণত ত্রুটির আগে এক পর্যায়ে একটি প্রক্রিয়া পুনরায় চালু করা), রিসোর্স রিলিজ এবং ডেটা পুনরুদ্ধার অন্তর্ভুক্ত থাকে।

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

তারা সি ++ এর মতো অবজেক্ট-ভিত্তিক ভাষার জন্য বিশেষত উপযোগী কৌশলগুলি নিয়ে আলোচনা করেন। উদাহরণ স্বরূপ

  1. স্বচ্ছ মেমরি অবজেক্টগুলির জন্য সফ্টওয়্যার ভিত্তিক ইসিসি
  2. চুক্তি অনুসারে প্রোগ্রামিং : পূর্বশর্ত এবং পোস্টকন্ডিশনগুলি যাচাই করা, তারপরে এটি যাচাই করার জন্য বস্তুটি পরীক্ষা করা এখনও বৈধ অবস্থায় রয়েছে।

এবং, ঠিক তাই ঘটে, নাসা মার্স রোভারের মতো বড় প্রকল্পগুলির জন্য সি ++ ব্যবহার করেছে।

সি ++ শ্রেণীর বিমূর্ততা এবং এনক্যাপসুলেশন একাধিক প্রকল্প এবং বিকাশকারীদের মধ্যে দ্রুত বিকাশ এবং পরীক্ষা সক্ষম করে।

তারা নির্দিষ্ট সি ++ বৈশিষ্ট্যগুলি এড়িয়ে গিয়েছিল যা সমস্যা তৈরি করতে পারে:

  1. ব্যতিক্রমসমূহ
  2. টেমপ্লেট
  3. আইস্ট্রিম (কোনও কনসোল নেই)
  4. একাধিক উত্তরাধিকার
  5. অপারেটর ওভারলোডিং ( new এবং delete )
  6. গতিশীল বরাদ্দ (সিস্টেম হিপ দুর্নীতির সম্ভাবনা এড়াতে new একটি ডেডিকেটেড মেমরি পুল এবং প্লেসমেন্ট ব্যবহার করা হয়েছে)।

এই উত্তরটি ধরে নিয়েছে যে আপনি এমন একটি সিস্টেম যা সঠিকভাবে কাজ করে, ন্যূনতম ব্যয় বা দ্রুত এমন একটি সিস্টেম রাখার সাথে আপনি উদ্বিগ্ন; বেশিরভাগ মানুষ তেজস্ক্রিয় জিনিস নিয়ে গতি / ব্যয়ের চেয়ে নির্ভুলতা / সুরক্ষাকে গুরুত্ব দেয়

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

এখানে কিছু ধারনা:

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

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

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

  • আপনার চেকসাম নিশ্চিত করুন (যেমন সিআরসি / এসএএ) আপনার এফএসএম, এবং সিআরসি / এসএইচএ নিজেই এফএসএমে সংরক্ষণ করুন (পাশাপাশি বার্তায় প্রেরণ এবং নিজেই বার্তাগুলি চেকসামিং)। এই চেকসাম, চেকসাম আগত বার্তাগুলির বিরুদ্ধে নিয়মিত তাদের এফএসএম পরীক্ষা করার জন্য নোডগুলি পান এবং তাদের চেকসামটি কোরামের চেকসামের সাথে মিলে যায়।

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

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

ধরা যাক যে আপনার একদিনের মধ্যে প্রদত্ত কোনও নোডের ব্যর্থতা হওয়ার 1% সম্ভাবনা রয়েছে এবং আসুন আপনি ভান করুন যে আপনি ব্যর্থতা সম্পূর্ণ স্বাধীন করতে পারেন। ৫ টি নোডের সাহায্যে আপনার এক দিনের মধ্যে তিনটি ব্যর্থ হতে হবে, এটি একটি .00001% সুযোগ। আরও, ভাল, আপনি ধারণা পেতে।

জিনিষ আমি চাই না করুন:

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

  • আপনার নিজস্ব অ্যালগরিদমগুলি রোল করুন । লোকেরা এই জিনিসগুলি আগেও করে ফেলেছে। তাদের কাজ ব্যবহার করুন। ফল্ট সহনশীলতা এবং বিতরণ করা অ্যালগরিদমগুলি শক্ত। যেখানে সম্ভব সেখানে অন্যান্য লোকের কাজ ব্যবহার করুন।

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

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





fault-tolerance