সি প্রোগ্রামাররা প্রায়শই অস্থির হয়ে থাকে যার অর্থ হ'ল চলকের বর্তমান থ্রেডের বাইরে পরিবর্তনশীল পরিবর্তন করা যেতে পারে; ফলস্বরূপ, ভাগ করা ডেটা স্ট্রাকচার ব্যবহার করার সময় তারা কখনও কখনও এটি কার্নেল কোডে ব্যবহার করতে প্রলুব্ধ হয়। অন্য কথায়, তারা উদ্বায়ী ধরণেরগুলিকে এক ধরণের সহজ পারমাণবিক পরিবর্তনশীল হিসাবে বিবেচনা করে, যা তারা নয় not কার্নেল কোডে অস্থির ব্যবহার প্রায়শই সঠিক নয়; এই নথিটি কেন তা বর্ণনা করে।
অস্থিরতার সাথে বোঝার মূল বিষয়টি হ'ল এর উদ্দেশ্যটি অপ্টিমাইজেশনকে দমন করা, যা বাস্তবে কেউ যা করতে চায় তা প্রায় কখনও হয় না। কার্নেলে, এক অবশ্যই অযাচিত সমবর্তী অ্যাক্সেসের বিরুদ্ধে ভাগ করা ডেটা স্ট্রাকচারগুলি রক্ষা করতে হবে, এটি খুব আলাদা কাজ। অযাচিত সম্মতি থেকে রক্ষা করার প্রক্রিয়াটি আরও কার্যকর উপায়ে প্রায় সমস্ত অপ্টিমাইজেশন-সংক্রান্ত সমস্যা এড়াতে পারবে।
অস্থিরতার মতো, কার্নেল আদিমগুলি যা ডেটা নিরাপদে (স্পিনলকস, মিটেক্সেস, মেমরি বাধা ইত্যাদি) একযোগে অ্যাক্সেস তৈরি করে অবাঞ্ছিত অপ্টিমাইজেশন প্রতিরোধের জন্য ডিজাইন করা হয়েছে। সেগুলি যদি সঠিকভাবে ব্যবহার করা হয় তবে পাশাপাশি অস্থিরতা ব্যবহার করার প্রয়োজন হবে না। যদি অস্থিরতা এখনও প্রয়োজনীয় হয় তবে কোডটিতে কোথাও কোথাও অবশ্যই একটি বাগ রয়েছে। সঠিকভাবে লিখিত কার্নেল কোডে, অস্থিরতা কেবল জিনিসগুলিকে ধীর করতে পারে।
কার্নেল কোডের একটি সাধারণ ব্লক বিবেচনা করুন:
spin_lock(&the_lock);
do_something_on(&shared_data);
do_something_else_with(&shared_data);
spin_unlock(&the_lock);
যদি সমস্ত কোড লকিংয়ের নিয়ম অনুসরণ করে তবে ভাগ করে রাখা_ডাতার মান অপ্রত্যাশিতভাবে পরিবর্তন করতে পারে না যখন_লকটি অনুষ্ঠিত হয়। অন্য যে কোনও কোড যা সেই ডেটা দিয়ে খেলতে চাইবে তা লকটির জন্য অপেক্ষা করবে। স্পিনলক আদিমগুলি মেমোরি বাধা হিসাবে কাজ করে - এগুলি স্পষ্টভাবে তা করার জন্য লিখিত হয় - যার অর্থ ডেটা অ্যাক্সেসগুলি তাদের জুড়ে অনুকূলিত হবে না। সুতরাং সংকলকটি ভাবতে পারে যে এটি শেয়ারড_ডাটাতে কী হবে তা জানে, তবে স্পিন_লক () কল, যেহেতু এটি একটি মেমরির বাধা হিসাবে কাজ করে, তাই এটি যা কিছু জানে তা ভুলে যেতে বাধ্য করবে। সেই ডেটাতে অ্যাক্সেস নিয়ে কোনও অপ্টিমাইজেশন সমস্যা থাকবে না।
যদি ভাগ করা_ডেটাকে অস্থির হিসাবে ঘোষণা করা হয় তবে লক করা এখনও প্রয়োজনীয় still তবে সংকলকটি সমালোচনামূলক বিভাগের মধ্যে ভাগ করা_ডাটাতে অ্যাক্সেসের অনুকূলকরণ থেকে বাধা দেওয়া হবে , যখন আমরা জানি যে এর সাথে আর কেউ কাজ করতে পারে না। লকটি ধরে রাখার সময়, ভাগ করা_ডাটা অস্থির নয়। ভাগ করা ডেটা নিয়ে কাজ করার সময়, সঠিক লকিংটি অস্থায়ী - এবং সম্ভাব্য ক্ষতিকারক করে তোলে।
উদ্বায়ী স্টোরেজ ক্লাসটি মূলত মেমরি-ম্যাপযুক্ত আই / ও রেজিস্টারের জন্য বোঝানো হত। কার্নেলের মধ্যে, রেজিস্টার অ্যাক্সেসগুলিও, লক দ্বারা সুরক্ষিত করা উচিত, তবে একটিও সঙ্কলকটিকে "অপ্টিমাইজ করা" একটি সমালোচনামূলক বিভাগের মধ্যে রেজিস্টার অ্যাক্সেসগুলি চায় না। তবে, কার্নেলের মধ্যে, আই / ও মেমরি অ্যাক্সেসগুলি সর্বদা অ্যাকসেসর ফাংশনের মাধ্যমে করা হয়; পয়েন্টারগুলির মাধ্যমে সরাসরি I / O মেমোরি অ্যাক্সেস করা ভ্রান্ত হয় এবং সমস্ত আর্কিটেকচারে কাজ করে না। এই অ্যাক্সেসরগুলি অযাচিত অপ্টিমাইজেশন প্রতিরোধ করার জন্য লিখিত হয়েছে, সুতরাং, আবারও, উদ্বায়ী অপ্রয়োজনীয়।
প্রসেসর যখন কোনও ভেরিয়েবলের মান নিয়ে ব্যস্ত-অপেক্ষা করে থাকে তখন অন্য পরিস্থিতিটি যখন অস্থির ব্যবহারের জন্য প্রলুব্ধ হতে পারে। ব্যস্ত অপেক্ষা করার সঠিক উপায় হ'ল:
while (my_variable != what_i_want)
cpu_relax();
সিপু_রেল্যাক্স () কলটি হাইপারথ্রেডড টুইন প্রসেসরের সিপিইউ পাওয়ার ব্যবহার বা ফলন কমিয়ে দিতে পারে; এটি মেমোরি বাধা হিসাবে পরিবেশন করার জন্যও ঘটে, তাই আবারও অস্থিরতা অপ্রয়োজনীয়। অবশ্যই, ব্যস্ত-অপেক্ষার শুরুটি একটি অসামাজিক কাজ।
এখনও কয়েকটি বিরল পরিস্থিতি রয়েছে যেখানে কর্নেলের মধ্যে অস্থিরতা বোধ করা হয়:
উপরে উল্লিখিত অ্যাক্সেসর ফাংশনগুলি আর্কিটেকচারে অস্থিরতা ব্যবহার করতে পারে যেখানে সরাসরি I / O মেমরি অ্যাক্সেস কাজ করে। মূলত, প্রতিটি অ্যাক্সেসর কল নিজে থেকেই কিছুটা সমালোচনামূলক বিভাগে পরিণত হয় এবং নিশ্চিত করে যে প্রোগ্রামার দ্বারা প্রত্যাশা অনুযায়ী অ্যাক্সেসটি ঘটে।
ইনলাইন অ্যাসেম্বলি কোড যা মেমরি পরিবর্তন করে, তবে এর কোনও দৃশ্যমান পার্শ্ব প্রতিক্রিয়া নেই, জিসিসি দ্বারা ঝুঁকি মোছা হচ্ছে। অ্যাসেট স্টেটমেন্টে অস্থির কীওয়ার্ড যুক্ত করা এই অপসারণটিকে রোধ করবে।
জিফিজ ভেরিয়েবলটি বিশেষ যেটিতে এটি প্রতিটি সময় রেফারেন্স করার সময় এটির আলাদা মান থাকতে পারে তবে এটি কোনও বিশেষ লকিং ছাড়া পড়া যায়। সুতরাং জিফিগুলি অস্থিতিশীল হতে পারে তবে এই ধরণের অন্যান্য ভেরিয়েবলগুলির সংযোজন দৃ strongly়ভাবে প্রত্যাশিত। জিফিসকে এই বিষয়ে "বোকা উত্তরাধিকার" ইস্যু (লিনাসের কথা) হিসাবে বিবেচনা করা হয়; এটির মূল্য নির্ধারণের তুলনায় এটি আরও জটিল হবে।
সুসংগত মেমরির ডেটা স্ট্রাকচারের পয়েন্টারগুলি যা I / O ডিভাইসগুলির মাধ্যমে সংশোধিত হতে পারে কখনও কখনও বৈধভাবে অস্থির হতে পারে। একটি নেটওয়ার্ক অ্যাডাপ্টারের দ্বারা ব্যবহৃত একটি রিং বাফার, যেখানে অ্যাডাপ্টারের নির্দেশকগুলি পরিবর্তিত হয় যা বর্ণনাকারীদের প্রক্রিয়া করা হয়েছে তা নির্দেশ করার জন্য, এই ধরণের পরিস্থিতির উদাহরণ।
বেশিরভাগ কোডের জন্য, উদ্বায়ী জন্য উপরোক্ত কোনও যুক্তি প্রয়োগ হয় না। ফলস্বরূপ, অস্থির ব্যবহার সম্ভবত ত্রুটি হিসাবে দেখা হবে এবং কোডটিতে অতিরিক্ত তদন্ত করবে will যে বিকাশকারীরা অস্থির ব্যবহারের জন্য প্ররোচিত হয় তাদের একটি পদক্ষেপ ফিরে নেওয়া উচিত এবং তারা সত্যিকার অর্থে কী অর্জন করার চেষ্টা করছে তা চিন্তা করা উচিত।