আপনি কি স্মৃতি ছাড়িয়ে যান?


9

malloc0 বা নতুন ব্যতিক্রম ছুঁড়ে ফেললে আপনি কী করবেন ? কেবল থামিয়ে দিন বা OOM অবস্থার বেঁচে থাকার চেষ্টা করবেন / ব্যবহারকারীর কাজটি সংরক্ষণ করুন?


4
সংশ্লিষ্ট উপর Stackoverflow stackoverflow.com/questions/763159/...
ysolik

11
আহা। আমি এটি "মন থেকে বাইরে" হিসাবে পড়তে থাকি। আমার অতীতে অনেকগুলি ভিডিও গেম রয়েছে বলে আমি মনে করি। :)
অ্যাডাম শিখুন

উত্তর:


4

আমি ক্রম এড়ানোর মতো OOM এড়াতে চাই।

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


স্পষ্টতই এটি সার্থক করে তোলে।
এমবিকিউ

2
কীভাবে ওমকে করুণভাবে পরিচালনা করতে হবে সে সম্পর্কে একটি দুর্দান্ত বিতর্ক ছিল (আরএআইআই, ব্যতিক্রমী সুরক্ষা, বেলা ...) তবে একবার আমি বুঝতে পেরেছিলাম যে একাধিক গতিশীল মডিউল (তৃতীয় পক্ষের কিছু) সহ একটি বহুবিধ সিস্টেমে, যদিও আপনার থ্রেডটি না করে ক্র্যাশ, দুর্ভাগ্যজনক মুহুর্তের একটি মুহুর্ত যেখানে প্রতিটি থ্রেড একটি OOM দেখতে পাবে। এমনকি যদি কোনও ব্যক্তিও এগিয়ে যাওয়ার সিদ্ধান্ত নিয়েছে তবে আপনি প্রত্যক্ষদর্শী ছাড়া আর কিছু করতে পারবেন না।
rwong

13

এই প্রশ্নের উত্তর দেওয়ার বেশিরভাগ লোক সম্ভবত এম্বেড থাকা সিস্টেমগুলিতে কখনও কাজ করেনি, যেখানে ম্যালোক 0 রিটার্ন করা খুব বাস্তব সম্ভাবনা। যে সিস্টেমে আমি বর্তমানে কাজ করছি, সেখানে মোট র‌্যামের মোট 4.25K বাইট রয়েছে (যা 4352 বাইট)। স্ট্যাকের জন্য আমি 64 বাইট বরাদ্দ করছি এবং বর্তমানে একটি 1600 বাইট হিপ রয়েছে। গতকালই আমি একটি হিপ ওয়াক রুটিন ডিবাগ করছিলাম যাতে আমি বরাদ্দ এবং মেমরি মুক্ত করতে পারি। হিপ ওয়াক একটি সিরিয়াল পোর্টে আউটপুট দেওয়ার জন্য স্ট্যাটিক্যালি বরাদ্দ করা বাফার ব্যবহার করে (30 বাইট)। এটি রিলিজ সংস্করণের জন্য বন্ধ করা হবে।

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


2
একটি ছোট জায়গার ভিতরে ফিটিং কার্যকারিতা আশ্চর্যজনক ... এটি বনসাইয়ের মতো শিল্পের
একধরনের

6
এম্বেড থাকা সিস্টেমে অনেকগুলি প্রকল্প কেবল মেমরির গতিশীল বরাদ্দকে নিষেধ করে। ওওমের একমাত্র কেস স্ট্যাক ওভারফ্লো remains
mouviciel

আপনি ঠিক বলেছেন, তবে বিশেষত আপনার প্রথম বাক্যটি সহ: বেশিরভাগটি ভাগ্যক্রমে বেশিরভাগ বিকাশকারীদের পক্ষে প্রাসঙ্গিক নয়।
কনরাড রুডল্ফ

4

মোটামুটি সত্য বলতে, আমি যে সমস্ত প্রকল্প করেছি (মনে রাখবেন আমি এখনও কোথাও কাজ করছি না), আমি কখনই ভাবিনি যে এটি ঘটতে পারে, এবং সুতরাং আমি মনে করি আমার প্রোগ্রামগুলি খুব দ্রুত মৃত্যুবরণ করবে।

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

আমি অনুভব করি যে আজকাল, মটরশুটির চেয়ে মেমরির দাম কম, এটি ঘন ঘন ঘটে যাওয়া কিছু নয়। সুরক্ষিত স্মৃতি ভোরের দিকে এবং আগে, সম্ভবত এটি উদ্বেগ ছিল তবে এখন? আমি কেবলমাত্র ওওএম এর ত্রুটিগুলি দেখেছি এটি বাগড কোড থেকে।


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

2

Malloc রিটার্ন কোড চেক করা যাই হোক না কেন ব্যবহারের অর্থহীন।

আধুনিক অপারেটিং সিস্টেমগুলি ওভারকমিট মেমরি: এগুলি প্রসেসগুলি আসলে উপলভ্য হওয়ার চেয়ে বেশি মেমরি দেয়। আপনার প্রক্রিয়াটি প্রদত্ত মেমরিটি ভার্চুয়াল, সমস্ত একক শূন্য-আউট পৃষ্ঠাতে ম্যাপ করা হয়েছে।

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


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

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

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

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

2
আমি নিশ্চিত যে উইন্ডোজ কখনই বেশি সংঘবদ্ধ হয় না। এটি র‌্যামের চেয়ে বেশি প্রতিশ্রুতিবদ্ধ করতে পারে তবে র‌্যাম + স্ব্যাপফাইলের চেয়ে বেশি নয়।
কোডসইনচাউস 13

2

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

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


অন্যান্য সিস্টেমের তুলনায় রিয়েল-টাইম সিস্টেমগুলিতে ম্যালোক ব্যর্থতা সম্পর্কে আরও চেক করা দরকার না।
জিনাক করুন

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

আপনি একবার OOM এ আঘাত করার পরে আপনি আর কী করতে যাচ্ছেন?
জিনাক করুন

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

একটি নির্দিষ্ট কোড পাথ দেওয়া হয়েছে যা অনিবার্যভাবে একটি OOM ত্রুটির দিকে পরিচালিত করবে, আমি দেখতে পাচ্ছি না যে ক্রাশ হওয়া মেমরি মুক্ত করার এবং প্রক্রিয়া বাতিল করার চেয়ে কম নির্ঘাটন পদ্ধতির।
জিনাক করুন

1

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

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

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