আপনি যখন কোনও সি অ্যাপ্লিকেশনটি প্রস্থান করবেন, তখন কী ম্যালোক-এড মেমরি স্বয়ংক্রিয়ভাবে মুক্ত হয়?


97

ধরা যাক আমার কাছে নিম্নলিখিত সি কোড রয়েছে:

যখন আমি সেই সি প্রোগ্রামটি সংকলন ও সম্পাদন করি, অর্থাৎ মেমরির কিছু জায়গা বরাদ্দের পরে, আমি যে অ্যাপ্লিকেশনটি বরাদ্দ করেছি তা কি অ্যাপ্লিকেশন থেকে বেরিয়ে যাওয়ার পরে এবং প্রক্রিয়াটি শেষ হওয়ার পরেও বরাদ্দ দেওয়া হবে (অর্থাত্ মূলত স্থান গ্রহণ)?


9
আপনার স্মৃতি পরিষ্কার করার জন্য এটি "ভাল স্টাইল" নয়, কারণ আপনি এমন কোনও ওএসে চালনা করতে পারেন যা মেমরি সুরক্ষিত করে না (যা নীচের মূল পরামর্শ) তবে এটি আপনার স্মৃতি ফাঁস হওয়ার সম্ভাবনা বাড়িয়ে তোলে এবং রাখে আপনার কোড পাতলা এবং সঠিক ...
ম্যাট যোগদানকারী

উত্তর:


116

এটি অপারেটিং সিস্টেমের উপর নির্ভর করে। আধুনিক (এবং সমস্ত বড়) অপারেটিং সিস্টেমের সিংহভাগ প্রোগ্রাম শেষ করে মেমরি মুক্ত করবে না।

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


16
আমি একবার এম্বেড থাকা প্ল্যাটফর্মে win98 এর মুখোমুখি হয়েছিলাম এবং সেই অভিজ্ঞতার ভিত্তিতে আমি বলতে পারি যে প্রোগ্রামগুলি বন্ধ হয়ে গেলে এটি মেমরি মুক্ত করে না।
সান জ্যাকিন্টো

9
@ কেন এটি একটি উদাহরণ ছিল। এছাড়াও, ইয়াজিএনআই এবং স্লোপি কোডিংয়ের মধ্যে একটি লাইন রয়েছে। সম্পদ মুক্ত না করে এটি অতিক্রম করে। YAGNI নীতিটি এমন বৈশিষ্ট্যগুলিতে প্রয়োগ করার জন্য বোঝানো হয়েছিল, কোডটি নয় যা প্রোগ্রামটি সঠিকভাবে কাজ করে। (এবং স্মৃতি মুক্ত না করা একটি বাগ)।
ইয়াকোবি

4
+1: বিবেচনা করার জন্য সবচেয়ে গুরুত্বপূর্ণ বিষয়টি হ'ল মেমরি পরিচালনা যেমন ইয়াকোবি যথেষ্ট সঠিকভাবে বলেছেন: "অপারেটিং সিস্টেমের একটি বৈশিষ্ট্য" । আমার ভুল না হলে প্রোগ্রামিং ভাষা প্রোগ্রাম নির্বাহের আগে বা পরে কী ঘটে তা সংজ্ঞায়িত করে না।
ডি.শ্যাওলি

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

6
এসও-তে মেমরি ফাঁসের প্রস্তাব দেওয়ার জন্য যে কোনও
ব্যক্তিকে

53

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

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

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

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

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


11

এই থ্রেডে শেষ পোস্টের পরে এত দিন পোস্ট করার জন্য আমার ক্ষমা চাইছি।

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

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

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

এই ডিজাইন সম্পর্কে মন্তব্য করতে কেউ যত্নবান?


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

8
স্ট্যাকওভারফ্লো কোনও ফোরাম নয়; নেই কিছুই একটি পুরানো প্রশ্নের উত্তর ভুল। meta.stackexchange.com/questions/20524/reviving-old-questions
এম কে 12

6

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

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

এটি এর নৈতিক সমতুল্য, যখন আপনি আপনার ল্যাপটপটি ব্যবহার করে শেষ করেন এবং কোনও বন্ধুর কাছে দিতে চান, আপনি প্রতিটি ফাইল পৃথকভাবে মুছতে বিরক্ত করবেন না। আপনি কেবল হার্ড ড্রাইভ ফর্ম্যাট করুন।

এগুলি যা বলেছিল, অন্য সমস্ত উত্তরদাতারা যেমন লক্ষ করছে, এই বিষয়টির উপর নির্ভর করা ভাল অনুশীলন নয়:

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

4

হ্যাঁ. ওএস সংস্থানগুলি পরিষ্কার করে। ভাল ... নেটওয়ারের পুরানো সংস্করণগুলি হয়নি।

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


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

@ সান জ্যাকিন্টো: এটি একটি ভাল বিষয়। এজন্যই আমি নেটওয়্যার রেফারেন্স করেছি, তবে এটি সম্ভবত স্পষ্টতা ব্যবহার করতে পারে। আমি এটিকে কিছুটা সম্পাদনা করব।
মার্ক উইলকিনস

4
@ সান ডস কোনও মাল্টি টাস্কিং ওএস নয় - যখন কোনও ডস প্রোগ্রাম (টিএসআর বাদে) শেষ হয়, পরবর্তী প্রোগ্রামটি লোড করার জন্য সমস্ত স্মৃতি উপলব্ধ থাকে।

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

2

হ্যাঁ, প্রক্রিয়াটি শেষ হলে অপারেটিং সিস্টেম সমস্ত মেমরি ছেড়ে দেয়।


আমি কেন দেখছি না কেন এটি নিম্নমানের ছিল। যখন প্রক্রিয়া ডাইস malloc'ed মেমরির প্রকাশ করা হবে (উইকিপিডিয়া যদি malloc এর definiton তাই বলেছেন)
Arve

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

2

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

আপনি এটিকে মুক্ত করেছেন তা নিশ্চিত করুন, পরে যখন আপনি এটি কোনও বড় প্রকল্পে সংহত করতে চান তখন এটি আপনাকে অনেক সময় বাঁচাতে পারে।


0

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


0

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

কোথায়, বা না, আমি খুঁজে পেয়েছি যে ডাব্লু 9৮-তে আসল প্রশ্নটি 'কখন' ছিল (আমি এর উপর জোর দিয়ে কোনও পোস্ট দেখিনি)। একটি ছোট টেম্পলেট প্রোগ্রাম (মিডিআই সিসেক্স ইনপুট জন্য, বিভিন্ন ম্যালোক'ড স্পেস ব্যবহার করে) ডাব্লুড্রপ্রোকের ডাব্লুএম_এসটিস্ট্রয় বিটটিতে মেমরি মুক্ত করবে, তবে আমি যখন এটি বৃহত্তর প্রোগ্রামে ট্রান্সপ্ল্যান্ট করলাম তখন এটি প্রস্থান করার সময় ক্র্যাশ হয়ে গেছে। আমি ধরে নিয়েছি এর অর্থ হ'ল আমি বৃহত্তর ক্লিনআপের সময় ওএস ইতিমধ্যে যা মুক্তি পেয়েছিলাম তা মুক্ত করার চেষ্টা করছি। যদি আমি এটি ডাব্লুএম_সিএলএসএতে করি, তারপরে ডাস্ট্রয়ওয়াইন্ডো () বলা হয়, এটি সব ঠিকঠাক, তাত্ক্ষণিক পরিষ্কার প্রস্থানে কাজ করে।

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

ব্যতিক্রমগুলি উপস্থিত থাকতে পারে, যেমন কেউ ডিস্কে অদলবদল ফাইলের বাইরে বড় মেমরি খণ্ডগুলি এড়াতে এড়াতে বলেছিল, তবে এটি আরও, এবং আরও কম বরাদ্দ করা স্পেস রেখে কমিয়ে আনা যেতে পারে।

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