শারীরিক ফুটো
জিসি ঠিকানার যে ধরণের বাগগুলি দেখে মনে হয় (কমপক্ষে কোনও বাহ্যিক পর্যবেক্ষকের কাছে) এমন এক ধরণের জিনিস যা কোনও প্রোগ্রামার তার ভাষা, গ্রন্থাগার, ধারণাগুলি, আইডিয়োম ইত্যাদি ভাল জানেন না। তবে আমি ভুল হতে পারি: ম্যানুয়াল মেমোরি হ্যান্ডলিং অভ্যন্তরীণ জটিল?
সি প্রান্তটি থেকে আগত যা মেমরি পরিচালনাকে ম্যানুয়াল হিসাবে পরিচালনা করে এবং যথাসম্ভব উচ্চারণ করে তোলে যাতে আমরা চূড়ান্ত তুলনা করি (সি ++ বেশিরভাগই জিসি ছাড়াই মেমরি পরিচালনার স্বয়ংক্রিয়ভাবে চলে), আমি যখন জিসির সাথে তুলনা করার অর্থে "সত্যই না" বলি ফাঁস আসে । একটি শিক্ষানবিস এবং কখনও কখনও এমনকি একটি প্রো free
একটি প্রদত্ত জন্য লিখতে ভুলে যেতে পারে malloc
। এটা অবশ্যই ঘটে।
তবে, valgrind
ফাঁস সনাক্তকরণের মতো সরঞ্জাম রয়েছে যা কোডটি কার্যকর করার সাথে সাথে, কখন / যেখানে এই জাতীয় ভুলের কোডের সঠিক লাইনে চলে আসে তা তত্ক্ষণাত উপস্থিত হবে। যখন এটি সিআই-তে সংহত হয়, তখন এ জাতীয় ভুলগুলি মার্জ করা প্রায় অসম্ভব হয়ে যায় এবং সেগুলি সংশোধন করার জন্য পাই হিসাবে সহজ। সুতরাং এটি যুক্তিসঙ্গত মানসম্পন্ন কোনও দল / প্রক্রিয়াতে কখনই বড় কাজ নয়।
মঞ্জুর, মৃত্যুদন্ড কার্যকর করার কিছু বহিরাগত মামলা থাকতে পারে যা পরীক্ষার রাডারটির নীচে উড়ে যায় যেখানে free
ডাকা যায় না, সম্ভবত কোনও দুর্নীতিগ্রস্থ ফাইলের মতো অস্পষ্ট বাহ্যিক ইনপুট ত্রুটির মুখোমুখি হওয়ার ক্ষেত্রে সম্ভবত সিস্টেমটি 32 বাইট বা অন্য কিছু ফাঁস করে দেয়। আমি মনে করি এটি অবশ্যই খুব ভাল পরীক্ষার মান এবং লিক সনাক্তকরণ সরঞ্জামের অধীনে ঘটতে পারে, তবে এমন কোনও কিছুর উপরে মেমরির সামান্য কিছুটা ফাঁস করাও এতটা সমালোচিত হবে না। আমরা আরও অনেক বড় সমস্যা দেখতে পাব যেখানে জিসি প্রতিরোধ করতে না পারার জন্য আমরা নীচে সাধারণ প্রয়োগের পথে এমনকি প্রচুর সংস্থানগুলি ফাঁস করতে পারি।
জিসির সিউডো-ফর্মের অনুরূপ কিছু ছাড়াই এটি কঠিন (রেফারেন্স গণনা, উদাহরণস্বরূপ) যখন কোনও বস্তুর জীবদ্দশায় কোনও প্রকার স্থগিত / অ্যাসিনক্রোনাস প্রসেসিংয়ের জন্য বাড়ানো প্রয়োজন, সম্ভবত অন্য থ্রেড দ্বারা।
ঝাঁকুনি পয়েন্টার
মেমরি পরিচালনার আরও ম্যানুয়াল ফর্মগুলির আসল সমস্যাটি আমার কাছে ফাঁস হয় না। সি বা সি ++ তে লেখা কতগুলি নেটিভ অ্যাপ্লিকেশন আমরা জানি যে এটি সত্যিই ফাঁস? লিনাক্স কার্নেলটি কি ফুটো হয়ে গেছে? মাইএসকিউএল? ক্রেইজাইন 3? ডিজিটাল অডিও ওয়ার্কস্টেশন এবং সিনথেসাইজার? জাভা ভিএম ফাঁস হয় (এটি নেটিভ কোডে প্রয়োগ করা হয়)? ফটোশপ?
যদি কিছু থাকে তবে আমি মনে করি যখন আমরা চারপাশে তাকাব তখন লিকেস্ট অ্যাপ্লিকেশনগুলি জিসি স্কিমগুলি ব্যবহার করে লিখিত হয়েছে। তবে আবর্জনা সংগ্রহের উপর স্ল্যাম হিসাবে গ্রহণের আগে নেটিভ কোডটিতে একটি উল্লেখযোগ্য সমস্যা রয়েছে যা মেমরি ফাঁসের সাথে মোটেই সম্পর্কিত নয়।
আমার জন্য বিষয়টি সর্বদা সুরক্ষিত ছিল। এমনকি যখন আমরা free
কোনও পয়েন্টারের মাধ্যমে স্মরণ করি , উত্সটিতে যদি অন্য কোনও পয়েন্টার থাকে তবে সেগুলি ঝোলা (অবৈধ) পয়েন্টার হয়ে যাবে।
আমরা যখন এই ঝুঁকিপূর্ণ পয়েন্টারগুলির পয়েন্টগুলি অ্যাক্সেস করার চেষ্টা করি তখন আমরা অপরিজ্ঞাত আচরণের দিকে ধাবিত হয়েছি, যদিও প্রায় সবসময়ই সেগফল্ট / অ্যাক্সেস লঙ্ঘন একটি শক্ত, তাত্ক্ষণিক ক্রাশের দিকে পরিচালিত করে।
আমি উপরে উল্লিখিত সমস্ত নেটিভ অ্যাপ্লিকেশনগুলিতে একটি অস্পষ্ট প্রান্তের কেস রয়েছে যা মূলত এই সমস্যাটির কারণে ক্র্যাশ হতে পারে, এবং অবশ্যই স্থানীয় কোডে লিখিত নোংরা অ্যাপ্লিকেশনগুলির ন্যায্য অংশ রয়েছে যা খুব ক্র্যাশ-ভারী, এবং প্রায়শই এই সমস্যা কারণে বড় অংশ।
... এবং এর কারণ আপনি জিসি ব্যবহার করেন বা না করেন তা নির্বিশেষে রিসোর্স ম্যানেজমেন্ট কঠোর। ব্যবহারিক পার্থক্য প্রায়শই হয় হয় ফাঁস হয় (জিসি) বা ক্রাশ করা (জিসি ছাড়াই) একটি ভুলের মুখে রিসোর্স অব্যবস্থাপনার দিকে পরিচালিত করে।
রিসোর্স ম্যানেজমেন্ট: আবর্জনা সংগ্রহ
জটিল রিসোর্স ম্যানেজমেন্ট একটি কঠিন, ম্যানুয়াল প্রক্রিয়া যাই হোক না কেন। জিসি এখানে কিছু স্বয়ংক্রিয় করতে পারে না।
আসুন একটি উদাহরণ নেওয়া যাক যেখানে আমাদের এই বস্তুটি রয়েছে, "জো"। জো বেশ কয়েকটি সংস্থার দ্বারা রেফারেন্স করেছেন যার কাছে তিনি একজন সদস্য। প্রতি মাসে বা তাই তারা তার ক্রেডিট কার্ড থেকে সদস্যপদ ফি আহরণ করে।
জো তার জীবনকাল নিয়ন্ত্রণ করতে আমাদের কাছে একটি উল্লেখ রয়েছে। ধরা যাক, প্রোগ্রামার হিসাবে আমাদের আর জোয়ের দরকার নেই। তিনি আমাদের উদ্বিগ্ন হতে শুরু করেছেন এবং আমাদের আর তাঁর সাথে এই আচরণের সময় নষ্ট করার জন্য এই সংস্থাগুলির দরকার নেই need সুতরাং আমরা তাঁর জীবনলগ্ন রেফারেন্সটি সরিয়ে তাকে পৃথিবী থেকে মুছে ফেলার চেষ্টা করি।
... তবে অপেক্ষা করুন, আমরা আবর্জনা সংগ্রহ ব্যবহার করছি। জো এর প্রতিটি দৃ reference় উল্লেখ তাকে চারপাশে রাখবে। সুতরাং আমরা তাঁর যে সংস্থাগুলির অন্তর্ভুক্ত তার থেকে তাকে রেফারেন্সগুলি সরিয়ে দিই (তাকে সদস্যতা ছাড়াই)।
... ওফ, বাদে আমরা তার ম্যাগাজিনের সাবস্ক্রিপশন বাতিল করতে ভুলে গেছি! জো স্মৃতিতে প্রায় রয়ে গেছে, আমাদের উদ্রেক করে এবং সংস্থানগুলি ব্যবহার করে এবং ম্যাগাজিন সংস্থাটিও প্রতিমাসে জো-এর সদস্যপদ প্রক্রিয়া অব্যাহত রাখে।
এটি হ'ল মূল ভুল যা আবর্জনা সংগ্রহের স্কিমগুলি ব্যবহার করে প্রচুর জটিল প্রোগ্রাম লিখিত হতে পারে এবং তারা যত বেশি সময় চালায় এবং সম্ভবত আরও বেশি সংখ্যক প্রক্রিয়াজাতকরণ (পুনরাবৃত্ত ম্যাগাজিনের সাবস্ক্রিপশন) ব্যবহার করতে শুরু করে garbage তারা সেই সমস্ত এক বা একাধিক উল্লেখ মুছে ফেলতে ভুলে গিয়েছিল, পুরো প্রোগ্রামটি বন্ধ না হওয়া পর্যন্ত আবর্জনা সংগ্রাহকের পক্ষে তার যাদু করা অসম্ভব করে তোলে।
তবে প্রোগ্রামটি ক্রাশ হয় না। এটি পুরোপুরি নিরাপদ। এটি কেবল স্মৃতিটিকে জড়িয়ে রাখতে চলেছে এবং জো এখনও চারিদিকে লম্বা থাকবে। অনেক অ্যাপ্লিকেশনগুলির জন্য, এই ধরণের ফাঁসী আচরণ যেখানে আমরা সমস্যাটিতে সর্বাধিক মেমরি / প্রসেসিং ফেলেছি এটি একটি শক্ত ক্রাশের চেয়ে বেশি পছন্দনীয় হতে পারে, বিশেষত আমাদের মেশিনগুলিতে আজ কত স্মৃতি এবং প্রসেসিং শক্তি রয়েছে given
রিসোর্স ম্যানেজমেন্ট: ম্যানুয়াল
এখন আসুন আমরা জো এবং ম্যানুয়াল মেমরি ম্যানেজমেন্টের জন্য পয়েন্টারগুলি ব্যবহার করি এমন বিকল্পটি বিবেচনা করি:
এই নীল লিঙ্কগুলি জোয়ের জীবনকাল পরিচালনা করে না। আমরা যদি তাকে পৃথিবীর মুখ থেকে সরিয়ে নিতে চাই, আমরা ম্যানুয়ালি তাকে বিনষ্ট করার অনুরোধ করছি, এরকম:
এখন এটি আমাদের পুরো জায়গাগুলিতে ঝাঁকুনি পয়েন্টারগুলির সাথে ছেড়ে যায়, সুতরাং আসুন জোতে পয়েন্টারগুলি সরিয়ে দিন।
... উফফফফ, আমরা আবার একই একই ভুলটি করেছি এবং জো এর ম্যাগাজিনের সাবস্ক্রিপশনটি সাবস্ক্রাইব করতে ভুলে গেছি!
এখন বাদে আমাদের কাছে ঝুঁকির পয়েন্টার রয়েছে। যখন ম্যাগাজিনের সাবস্ক্রিপশন জো এর মাসিক ফি প্রক্রিয়া করার চেষ্টা করবে তখন পুরো বিশ্ব বিস্ফোরিত হবে - সাধারণত আমরা তাত্ক্ষণিকভাবে হার্ড ক্র্যাশ পাই।
এই একই বেসিক রিসোর্স অব্যবস্থাপনা ভুল যেখানে বিকাশকারী কোনও উত্সের সমস্ত পয়েন্টার / রেফারেন্স ম্যানুয়ালি মুছে ফেলার ভুলে গিয়েছিল স্থানীয় অ্যাপ্লিকেশনগুলিতে প্রচুর ক্র্যাশ হতে পারে। সাধারণত তারা যতক্ষণ চালায় এগুলি তারা মেমরিটিকে জড়িয়ে রাখে না কারণ তারা প্রায়শই এই ক্ষেত্রে সরাসরি ক্র্যাশ হয়ে থাকে।
বাস্তব জগতে
এখন উপরের উদাহরণটি একটি হাস্যকরভাবে সরল চিত্রটি ব্যবহার করছে। একটি বাস্তব-জগত অ্যাপ্লিকেশনটির জন্য পুরো গ্রাফটি কভার করতে হাজার হাজার চিত্র একসাথে সেলাই করা দরকার, দৃশ্য গ্রাফে শত শত বিভিন্ন ধরণের সংস্থান রয়েছে, কিছু কিছুতে জিপিইউ সংস্থান রয়েছে, এক্সিলারেটর অন্যদের সাথে বাঁধা রয়েছে, কয়েকশ প্লাগইন জুড়ে পর্যবেক্ষক বিতরণ করা হবে পরিবর্তনের জন্য দৃশ্যে বেশ কয়েকটি সত্তা প্রকারের পর্যবেক্ষণ, পর্যবেক্ষক পর্যবেক্ষক পর্যবেক্ষক, অ্যানিমেশনগুলিতে সিড করা অডিও ইত্যাদি So সুতরাং এটির মতো মনে হতে পারে যে আমি উপরে বর্ণিত ভুলটি এড়ানো সহজ, তবে এটি সাধারণত বাস্তবের জগতে এই সাধারণের কাছাকাছি কোথাও নেই here কয়েক মিলিয়ন কোডের লাইনের বিস্তৃত জটিল অ্যাপ্লিকেশনটির জন্য উত্পাদন কোডবেস।
কেউ, কোনও দিন, সেই কোডবেসে কোথাও কোথাও সংস্থানসমূহের অব্যবস্থাপনা করার সুযোগটি বেশ উচ্চতার দিকে ঝুঁকির সম্ভাবনা রয়েছে এবং জিসির সাথে বা তার বাইরেও সম্ভাবনা একই। মূল তফাতটি এই ভুলের ফলে কী ঘটবে তা হ'ল এটিও সম্ভবত ভুল করে যে এই ভুলটি কত দ্রুত চিহ্নিত করা এবং ঠিক করা হবে।
ক্রাশ বনাম ফাঁস
এখন কোনটি খারাপ? একটি তাত্ক্ষণিক ক্রাশ, বা একটি নিঃশব্দ স্মৃতি ফাঁস যেখানে জো রহস্যজনকভাবে চারপাশে লম্বা?
বেশিরভাগের উত্তরটি সম্ভবত উত্তর দিতে পারে, তবে আসুন আমরা এই সফ্টওয়্যারটি কয়েক ঘন্টা, সম্ভবত কয়েকদিন ধরে চালানোর জন্য ডিজাইন করা হয়েছে এবং এর মধ্যে জো এবং জেনের প্রতিটি আমরা একটি গিগা বাইটের সাহায্যে সফ্টওয়্যারটির মেমরির ব্যবহার বাড়িয়ে তোলে। এটি একটি মিশন-সমালোচনামূলক সফ্টওয়্যার নয় (ক্র্যাশগুলি আসলে ব্যবহারকারীদের হত্যা করে না), তবে একটি পারফরম্যান্স-সমালোচনামূলক।
এই ক্ষেত্রে, একটি হার্ড ক্র্যাশ যা আপনার ত্রুটিটি চিহ্নিত করে ডিবাগ করার সাথে সাথেই তত্ক্ষণাত্ প্রদর্শিত হয়, এটি কেবলমাত্র একটি ফাঁসযুক্ত সফ্টওয়্যার থেকে পছন্দনীয় হতে পারে যা আপনার পরীক্ষার পদ্ধতির রাডারের নিচেও উড়ে যেতে পারে।
ফ্লিপ দিকে, যদি এটি একটি মিশন-সমালোচনামূলক সফ্টওয়্যার যেখানে কর্মক্ষমতা লক্ষ্য নয়, কেবল কোনও উপায়ে ক্রাশ না করা সম্ভব হয়, তবে লিকটি করা সম্ভবত পছন্দনীয়।
দুর্বল রেফারেন্স
দুর্বল রেফারেন্স হিসাবে পরিচিত জিসি স্কিমগুলিতে এই ধারণাগুলির একটি সংকর রয়েছে available দুর্বল রেফারেন্স সহ, আমরা এই সমস্ত সংস্থাকে দুর্বল-রেফারেন্স জো রাখতে পারি কিন্তু দৃ the় রেফারেন্স (জো এর মালিক / লাইফলাইন) চলে গেলে তাকে অপসারণ করা থেকে বিরত রাখতে পারি না। তা সত্ত্বেও, জো যখন এই দুর্বল রেফারেন্সগুলির কাছাকাছি থাকবে না তখন আমরা সনাক্ত করতে সক্ষম হওয়ার সুবিধা পেয়ে থাকি, যাতে আমাদের প্রকারের সহজেই পুনরুত্পাদনযোগ্য ত্রুটি পেতে দেয়।
দুর্ভাগ্যক্রমে দুর্বল উল্লেখগুলি প্রায় ব্যবহার করা হয় না যতটা সম্ভবত তাদের ব্যবহার করা উচিত, তাই প্রায়শই অনেকগুলি জটিল জিসি অ্যাপ্লিকেশনগুলি জটিল সি অ্যাপ্লিকেশনটির তুলনায় সম্ভবত অনেক কম ক্র্যাশ হয়ে থাকলেও লিকের জন্য খুব বেশি সংবেদনশীল হতে পারে eg
যাই হোক না কেন, জিসি আপনার জীবনকে সহজ বা কঠিন করে তোলে বা না করে এটি আপনার সফ্টওয়্যারটির ফাঁস এড়ানোর পক্ষে কতটা গুরুত্বপূর্ণ, এবং এই ধরণের জটিল সংস্থান পরিচালনার সাথে সম্পর্কিত কিনা তা নির্ভর করে deals
আমার ক্ষেত্রে, আমি একটি কার্যকারিতা-সমালোচনামূলক ক্ষেত্র যেখানে সম্পদ গিগাবাইট মেগাবাইটের বিঘত শত শত, এবং মেমরি মুক্তি ব্যবহারকারীদের উপরে মত ভুলের কারণেই আন অনুরোধ যখন আসলে হতে পারে না কাজ কম বাঞ্ছনীয় একটি ক্র্যাশ করে। ক্র্যাশগুলি স্পট করা এবং পুনরুত্পাদন করা সহজ, এটি প্রায়শই প্রোগ্রামারের পছন্দের ধরণের বাগটি তৈরি করে এমনকি এটি ব্যবহারকারীর সবচেয়ে কম প্রিয়, এমনকি এগুলির অনেকগুলি ক্র্যাশ এমনকি ব্যবহারকারীর কাছে পৌঁছানোর আগেই একটি বুদ্ধিমান পরীক্ষার পদ্ধতিতে প্রদর্শিত হবে।
যাইহোক, সেগুলি হ'ল জিসি এবং ম্যানুয়াল মেমরি পরিচালনার মধ্যে পার্থক্য। আপনার তাত্ক্ষণিক প্রশ্নের জবাব দেওয়ার জন্য আমি বলব ম্যানুয়াল মেমরি ম্যানেজমেন্টটি কঠিন, তবে এটি ফাঁসের সাথে খুব একটা সম্পর্কযুক্ত নয়, এবং যখন রিসোর্স ম্যানেজমেন্ট অ-তুচ্ছ হয় তখন মেমরি ম্যানেজমেন্টের জিসি এবং ম্যানুয়াল উভয় রূপই খুব জটিল । জিসি এখানে তর্কসাপেক্ষভাবে আরও কৃপণ আচরণ করেছে যেখানে প্রোগ্রামটি ঠিকঠাকভাবে কাজ করছে বলে মনে হচ্ছে তবে আরও এবং আরও বেশি সংস্থান ব্যবহার করছে। ম্যানুয়াল ফর্মটি কম জটিল, তবে উপরের দেখানো মত ভুলগুলি সহ বড় সময় ক্রাশ এবং জ্বলতে চলেছে।