malloc
0 বা নতুন ব্যতিক্রম ছুঁড়ে ফেললে আপনি কী করবেন ? কেবল থামিয়ে দিন বা OOM অবস্থার বেঁচে থাকার চেষ্টা করবেন / ব্যবহারকারীর কাজটি সংরক্ষণ করুন?
malloc
0 বা নতুন ব্যতিক্রম ছুঁড়ে ফেললে আপনি কী করবেন ? কেবল থামিয়ে দিন বা OOM অবস্থার বেঁচে থাকার চেষ্টা করবেন / ব্যবহারকারীর কাজটি সংরক্ষণ করুন?
উত্তর:
আমি ক্রম এড়ানোর মতো OOM এড়াতে চাই।
একসাথে বিশাল পরিমাণ কাজ (এবং মেমরির বিশাল অংশ বরাদ্দ) এড়িয়ে চলুন। ডিস্কে ডেটা রাখুন, ওএস ডিস্ক ক্যাশে বিশ্বাস করুন এবং মেমরি-ম্যাপযুক্ত আইওকে যথাসম্ভব ব্যবহার করুন এবং একসাথে কেবলমাত্র ডেটার একটি ছোট অংশে কাজ করুন। যদি বিপুল পরিমাণে ডেটা অন-লাইন হওয়া দরকার (স্বল্প বিলম্বের সাথে পরিবেশন করা) তবে সেগুলি সমস্ত বড় সার্চ ইঞ্জিন সংস্থাগুলির মতো বিভিন্ন মেশিনে মেমোরিতে রাখুন। অথবা একটি এসএসডি কিনুন।
এই প্রশ্নের উত্তর দেওয়ার বেশিরভাগ লোক সম্ভবত এম্বেড থাকা সিস্টেমগুলিতে কখনও কাজ করেনি, যেখানে ম্যালোক 0 রিটার্ন করা খুব বাস্তব সম্ভাবনা। যে সিস্টেমে আমি বর্তমানে কাজ করছি, সেখানে মোট র্যামের মোট 4.25K বাইট রয়েছে (যা 4352 বাইট)। স্ট্যাকের জন্য আমি 64 বাইট বরাদ্দ করছি এবং বর্তমানে একটি 1600 বাইট হিপ রয়েছে। গতকালই আমি একটি হিপ ওয়াক রুটিন ডিবাগ করছিলাম যাতে আমি বরাদ্দ এবং মেমরি মুক্ত করতে পারি। হিপ ওয়াক একটি সিরিয়াল পোর্টে আউটপুট দেওয়ার জন্য স্ট্যাটিক্যালি বরাদ্দ করা বাফার ব্যবহার করে (30 বাইট)। এটি রিলিজ সংস্করণের জন্য বন্ধ করা হবে।
যেহেতু এটি একটি ভোক্তা পণ্য, তাই পণ্যটি প্রকাশিত হওয়ার পরে এটি মেমরির বাইরে চলে যাওয়া ভাল। আমি নিশ্চিত এটি উন্নয়নের সময় হবে। যাই হোক না কেন, আমি যা করতে পারি তা বেশ কয়েকবার স্পিকারকে বীপ দেওয়া, এবং একটি রিবুট জোর করে।
মোটামুটি সত্য বলতে, আমি যে সমস্ত প্রকল্প করেছি (মনে রাখবেন আমি এখনও কোথাও কাজ করছি না), আমি কখনই ভাবিনি যে এটি ঘটতে পারে, এবং সুতরাং আমি মনে করি আমার প্রোগ্রামগুলি খুব দ্রুত মৃত্যুবরণ করবে।
এছাড়াও, কোনও ওওএম হ্যান্ডলিংয়ের জন্য আপনাকে ত্রুটি বার্তাটি প্রদর্শন করতে বা সমস্ত কিছু সংরক্ষণ করার জন্য সংস্থানগুলি আগে থেকেই নির্ধারণ করতে হবে যা কোনও ধরনের অসুবিধে হতে পারে।
আমি অনুভব করি যে আজকাল, মটরশুটির চেয়ে মেমরির দাম কম, এটি ঘন ঘন ঘটে যাওয়া কিছু নয়। সুরক্ষিত স্মৃতি ভোরের দিকে এবং আগে, সম্ভবত এটি উদ্বেগ ছিল তবে এখন? আমি কেবলমাত্র ওওএম এর ত্রুটিগুলি দেখেছি এটি বাগড কোড থেকে।
Malloc রিটার্ন কোড চেক করা যাই হোক না কেন ব্যবহারের অর্থহীন।
আধুনিক অপারেটিং সিস্টেমগুলি ওভারকমিট মেমরি: এগুলি প্রসেসগুলি আসলে উপলভ্য হওয়ার চেয়ে বেশি মেমরি দেয়। আপনার প্রক্রিয়াটি প্রদত্ত মেমরিটি ভার্চুয়াল, সমস্ত একক শূন্য-আউট পৃষ্ঠাতে ম্যাপ করা হয়েছে।
আপনি মেমোরিটিতে লেখার আগ পর্যন্ত এটি নয় যে আপনার প্রক্রিয়াগুলির জন্য একটি শারীরিক, অনন্য, পৃষ্ঠা বরাদ্দ করা হয়। যদি এই বরাদ্দ ব্যর্থ হয় তবে কার্নেল মেমরির সন্ধানের প্রয়াসে একটি প্রক্রিয়া (সম্ভবত আপনার!) বন্ধ করবে। এই মুহুর্তে আপনি আর কিছু করতে পারবেন না।
যদি আপনি এমবেডেড সিস্টেম, রিয়েল-টাইম সিস্টেমগুলি বা এমন জটিল সিস্টেমগুলির জন্য বিকাশ না করেন যে ব্যর্থতাগুলি জীবন, বা বিলিয়ন ডলার ব্যয় করতে পারে ... তবে স্মৃতিশক্তি থেকে বেরিয়ে আসার বিষয়ে চিন্তা করা সম্ভবত আর্থিকভাবে লাভজনক নয়।
বেশিরভাগ ক্ষেত্রে, আপনি যখনই স্মৃতি থেকে বাইরে চলে যান তখন খুব কম কাজ করা যায়, যেহেতু কোনও নতুন অবজেক্ট তৈরি করতে বা কোনও কাজ করতে পারে এমন কোনও কার্য সম্পাদন করার স্মৃতি নেই। OOM পরিচালনা করে অ্যাপ্লিকেশনটির ব্যয়টি আপনি কীভাবে লাভ করতে পারেন তার তুলনায় আপনাকে ব্যয় করতে হবে।
আমি সর্বদা ত্রুটি পরীক্ষা করতাম। যদি কোনও কিছু ত্রুটির শর্তটি প্রদান করে তবে তা আপনার প্রোগ্রাম দ্বারা পরিচালনা করতে হবে। এমনকি যদি এটি কোনও বার্তা বলে যে "মেমরির বাইরে চলে গেছে, যেতে হবে!", তবে এটি "অ্যাক্সেস লঙ্ঘন", "কোর ডাম্পড", বা যাই হোক না কেন থেকে ভাল। একটি হ'ল আপনি পরিচালনা করেন এমন ত্রুটি শর্ত, অন্যটি বাগ। এবং ব্যবহারকারী হিসাবে এটি হিসাবে উপলব্ধি করা হবে।
আপনার নির্দিষ্ট ক্ষেত্রে, আপনি অপারেশনটি আবার রোল করার চেষ্টা করতে পারেন, ব্যর্থতার পর্যায়ে পৌঁছানো, ত্রুটির প্রতিবেদন করা এবং চালিয়ে যাওয়া চালিয়ে যাওয়া অবধি সম্পদকে মুক্ত করে দেওয়া (সম্ভবত আপনি যখন অ্যাপ্লিকেশনটি ছাড়ার চেষ্টা করছেন, আপনি দিতে পারেন) অবিলম্বে প্রস্থান করার বিকল্প)। এই পদ্ধতিতে ব্যবহারকারী কী করবেন তা স্থির করতে পারেন, অথবা চারপাশে ঝাঁকুনি দিয়ে, ফাইলগুলি বন্ধ করে দিয়ে কিছু মেমোরি মুক্ত করার চেষ্টা করতে পারেন অবশ্যই, আপনি কীভাবে পরিস্থিতি পরিচালনা করতে পারবেন আপনার প্রোগ্রামের উপর নির্ভর করে - এমন একটি প্রোগ্রাম যা অনুমিত হয় না ইন্টারেক্টিভ হতে সম্ভবত সম্ভবত ত্রুটিটি লগ করতে হবে এবং হয় ছাড়তে হবে, বা চালিয়ে যেতে হবে।