বরাদ্দ মেমরিতে বিনামূল্যে () * ব্যবহার না করা কি কখনও ঠিক আছে?


83

আমি কম্পিউটার ইঞ্জিনিয়ারিং পড়ছি, এবং আমার কিছু ইলেক্ট্রনিক্স কোর্স রয়েছে। আমি (এই কোর্স) যে এটি ব্যবহার এড়াতে সম্ভব আমার অধ্যাপকদের দুই থেকে শোনা, free()ফাংশন (পরে malloc(), calloc()ইত্যাদি) কারণ মেমরির সম্ভবত বরাদ্দ আবার ব্যবহার করা হবে না শূণ্যস্থান অন্যান্য মেমরি বরাদ্দ করা। উদাহরণস্বরূপ, উদাহরণস্বরূপ, আপনি যদি 4 বাইট বরাদ্দ করেন এবং সেগুলি ছেড়ে দেন তবে আপনার কাছে 4 বাইট জায়গা থাকবে যা সম্ভবত আবার বরাদ্দ দেওয়া হবে না: আপনার একটি গর্ত থাকবে

আমার মনে হয় এটি পাগল: আপনার খেলনা-না-প্রোগ্রাম থাকতে পারে না যেখানে আপনি গাদা ছাড়াই মেমরি বরাদ্দ করেন। তবে কেন এটি এত গুরুত্বপূর্ণ যে একে অপরের জন্য malloc()অবশ্যই একটি হতে হবে তা ব্যাখ্যা করার মতো জ্ঞান আমার নেই free()

সুতরাং: কখনও কি এমন পরিস্থিতি রয়েছে যেখানে ব্যবহার malloc()না করে এটি ব্যবহার করা উপযুক্ত হতে পারে free()? এবং যদি তা না হয় তবে আমি কীভাবে আমার অধ্যাপকদের কাছে এটি ব্যাখ্যা করব?


11
এগুলি "ভুল" নয় - খুব ছোট বিচ্ছিন্ন মুক্ত অঞ্চলগুলির খণ্ডন সম্পর্কে তাদের একটি বৈধ (যদি সীমাবদ্ধ থাকে) পয়েন্ট আছে এবং সম্ভবত আপনি এটির প্রতিবেদন করার চেয়ে কিছুটা সাবধানতার সাথে বলেছেন stated
ক্রিস স্ট্রাটন

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

17
@ মারিয়ান: আমার একজন অধ্যাপকের দাবি ছিল যে সি এবং সি ++ তে বরাদ্দকৃত একই .c / .cxx ফাইলে সংজ্ঞায়িত কোনও ফাংশনে আপনার বরাদ্দ হওয়া মেমরিটি মুক্ত করা প্রয়োজন ... এই লোকেরা কখনও কখনও হাইপোক্সিয়ায় মারাত্মকভাবে ভুগছেন বলে মনে হয় আইভরি টাওয়ারে বেশি উঁচু থাকার কারণে
প্লাজমাএইচ

4
বেশ কয়েকটি অ খেলনা প্রোগ্রাম ডি-এলোকেট মেমরির না যে, আর ওএস লেট এটা সব পরিষ্কার আপ প্রক্রিয়া নির্গম হয় অনেক বেশি (fussily) বই পালন প্রচুর পালন যাতে আপনি এটা নিজে করতে পারেন দ্রুত।
ডোনাল ফেলো

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

উত্তর:


100

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

বড় গর্তের সাথে সংলগ্ন গর্তগুলিতে যোগ করে মেমরিটি খণ্ডিত নয় তা নিশ্চিত করা খুব সাধারণ বিষয়। আরও গুরুতর বরাদ্দকারীরা এটি নিশ্চিত করতে আরও গুরুতর কৌশল ব্যবহার করে।

সুতরাং, ধরে নেওয়া যাক আপনি তিনটি বরাদ্দ এবং ডি-বরাদ্দ করেন এবং এই ক্রমে স্মৃতিতে ব্লকগুলি আউট করা যাক:

+-+-+-+
|A|B|C|
+-+-+-+

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

+-+-+-+
| |B| |
+-+-+-+

আপনি যখন শেষ পর্যন্ত বি মুক্ত করবেন, আপনি (প্রাথমিকভাবে, অন্তত তত্ত্বের ক্ষেত্রে) এর সাথে শেষ করবেন:

+-+-+-+
| | | |
+-+-+-+

যা ন্যায়বিচারে বিভক্ত হতে পারে

+-+-+-+
|     |
+-+-+-+

অর্থাত্ একটি একক বৃহত্তর ফ্রি ব্লক, কোনও টুকরা নেই।

অনুরোধ হিসাবে উল্লেখ:

  • Dlmalloc জন্য কোড পড়ার চেষ্টা করুন । আমি সম্পূর্ণ উত্পাদন-মানের বাস্তবায়ন হয়ে অনেক বেশি অগ্রসর advanced
  • এমনকি এম্বেড থাকা অ্যাপ্লিকেশনগুলিতে ডি-ফ্র্যাগমেন্টিং বাস্তবায়ন উপলব্ধ। উদাহরণস্বরূপ ফ্রিআরটিওএসে কোডে এই নোটগুলিheap4.c দেখুন ।

4
আপনি আমাকে কিছু রেফারেন্স সরবরাহ করতে পারেন?
নিক

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

@ পেটারবুদনিক এটি বিরল হবে যে ভার্চুয়াল মেমরিটি যাইহোক যাইহোক শারীরিক স্মৃতিতে 1-1 ম্যাপ করে, ওএস পৃষ্ঠা ম্যাপিংগুলিতে চিন্তা করবে এবং এটিকে ন্যূনতম গোলযোগের সাথে আউটপুট দিতে সক্ষম হবে
র‌্যাচেট ফ্রিক

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

@ খুব উদাহরণস্বরূপ ব্লকগুলির জন্য একটি আকারের উল্লেখ সরিয়ে দিয়েছি, যাইহোক এটি কোনও ব্যাপার নয়। উত্তম?
বিনোদন

42

অন্যান্য উত্তর ইতিমধ্যে ব্যাখ্যা পুরোপুরি ভাল যে প্রকৃত বাস্তবায়নের malloc()এবং free()বৃহত্তর বিনামূল্যে খন্ডে প্রকৃতপক্ষে একসঙ্গে বেড়ে ওঠা (defragmnent) গর্ত না। তবে এটি যদি না হয়, তবুও ভবিষ্যদ্বাণী করা খারাপ ধারণা হবে free()

বিষয়টি হ'ল, আপনার প্রোগ্রামটি কেবল 4 বাইট মেমরির বরাদ্দ করেছে (এবং মুক্ত করতে চায়)। যদি এটি একটি বর্ধিত সময়ের জন্য চলতে চলেছে, তবে সম্ভবত এটি আবার মাত্র 4 বাইট মেমরি বরাদ্দ করতে হবে that সুতরাং এমনকি যদি এই 4 বাইটগুলি কখনও বৃহত্তর স্থূল স্থানগুলিতে একত্রিত না হয়, তবুও তারা প্রোগ্রামটি নিজেই পুনরায় ব্যবহার করতে পারে।


6
+1 একদম ঠিক। বিষয়টি হ'ল, যদি freeপারফরম্যান্সে প্রভাব ফেলতে পর্যাপ্ত সময় বলা হয়, তবে সম্ভবত এটি যথেষ্ট সময়ও বলা হয়ে থাকে যে এটিকে বাইরে রেখে দেওয়ার ফলে উপলব্ধ স্মৃতিশক্তি খুব বড় আকারের হয়ে যায়। এম্বেড থাকা সিস্টেমের এমন পরিস্থিতিটি কল্পনা করা শক্ত যেখানে কর্মক্ষমতা অবিচ্ছিন্নভাবে ভুগতে থাকে freeতবে যেখানে mallocকেবল সীমাবদ্ধ সংখ্যাকে বলা হয়; এটি এম্বেড থাকা ডিভাইসটি মোটামুটি বিরল ব্যবহারের ক্ষেত্রে যা ডেটাটির শট প্রসেসিংয়ের পরে পুনরায় সেট করে।
জেসন সি


9

আপনার অধ্যাপকরা কোনও সুযোগে পসিক্সের সাথে কাজ করছেন? OS এর অবসর সময়ে একবারে পুরো গাদা freeing - তারা ছোট, minimalistic শেল অ্যাপ্লিকেশন প্রচুর লেখা, পরিস্থিতি যেখানে আমি এই পদ্ধতির কল্পনা করতে পারেন সব খুব খারাপ হবে না যে করতে অভ্যস্ত থাকেন হল একটি মুক্ত করা তুলনায় দ্রুততর হাজার ভেরিয়েবল। আপনি যদি নিজের অ্যাপ্লিকেশনটি দ্বিতীয় বা দু'একবার চালানোর প্রত্যাশা করেন তবে কোনও ডি-বরাদ্দ ছাড়াই আপনি সহজেই পালাতে পারবেন।

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


ওএসকে সবকিছু শেষে মুক্ত করা কেবলমাত্র পারফরম্যান্স নয় - কাজ করার জন্য এটির জন্য অনেক কম যুক্তিও প্রয়োজন।
hugomg

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

5

আপনি উল্লেখ করেছেন তারা ছিলেন ইলেক্ট্রনিক্স অধ্যাপক। তারা ফার্মওয়্যার / রিয়েলটাইম সফ্টওয়্যার লেখার জন্য অভ্যস্ত হতে পারে, সঠিকভাবে কিছু সময় কার্যকর করার প্রয়োজন হয় কিছু সময় কার্যকর করার জন্য সক্ষম হয়েছিলেন execution এই ক্ষেত্রে আপনার সমস্ত বরাদ্দের জন্য পর্যাপ্ত মেমরি রয়েছে এবং জেনে রাখা এবং মেমরিকে পুনর্নির্মাণ না করা কার্যকর করার সময় আরও সহজে গণনার সীমাবদ্ধতা দিতে পারে knowing

কিছু স্কিমগুলিতে হার্ডওয়্যার মেমরি সুরক্ষাও নিশ্চিত করা যায় যে রুটিনটি তার বরাদ্দ মেমরির ক্ষেত্রে সম্পূর্ণ হয় বা খুব ব্যতিক্রমী ক্ষেত্রে কী হওয়া উচিত তাতে একটি ফাঁদ তৈরি করে make


10
এটা একটা ভাল দিক. যাইহোক, আমি প্রত্যাশা করব যে তারা mallocএ ক্ষেত্রে ব্যবহার করবে না এবং এ জাতীয় ক্ষেত্রে, স্থির বরাদ্দের উপর নির্ভর করে (বা সম্ভবত একটি বড় অংশ বরাদ্দ করবে এবং ম্যানুয়ালি ম্যানুয়ালি হ্যান্ডেল করবে)।
লুয়ান

2

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

আপনি যখন এ জাতীয় কাজ করেন তখন স্থির বরাদ্দ আসে:

define MAX_SIZE 32
int array[MAX_SIZE];

অনেকগুলি রিয়েল-টাইম এবং এম্বেড থাকা সিস্টেমে (EEs বা CE এর দ্বারা সম্ভবতঃ এর মুখোমুখি হওয়া) সাধারণত গতিশীল মেমরির বরাদ্দ পুরোপুরি এড়ানো ভাল pre সুতরাং, এর ব্যবহার malloc, newএবং তাদের অপসারণের প্রতিরূপ বিরল। সর্বোপরি, সাম্প্রতিক বছরগুলিতে কম্পিউটারগুলির স্মৃতি বিস্ফোরিত হয়েছে।

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

উপরের উদাহরণে লিকটি প্রতি সেকেন্ডে 4 বাইট বা 240 বাইট / মিনিট হয়। এখন কল্পনা করুন যে আপনি সেই বাইট / মিনিট অনুপাত কম করেন। যে অনুপাতটি তত কম, আপনার প্রোগ্রাম আর সমস্যা ছাড়াই চলতে পারে। যদি আপনার mallocগুলি খুব কম হয়, তবে এটি আসল সম্ভাবনা।

হেক, আপনি যদি জানেন যে আপনি কেবল mallocএকবারে কিছু যাচ্ছেন , এবং এটি mallocআবার কখনও আঘাত হারাবে না, তবে এটি অনেকটা স্থির বরাদ্দের মতো, যদিও এটি কী পরিমাণ বরাদ্দ করছে তা আপনার আকারের জানা দরকার না- সামনের যেমন: ধরা যাক আমাদের আবার 512 এমবি রয়েছে। আমাদের mallocপূর্ণসংখ্যার 32 টি অ্যারে দরকার । এগুলি সাধারণ পূর্ণসংখ্যা - প্রতিটি 4 টি বাইট। আমরা জানি এই অ্যারেগুলির আকারগুলি কখনই 1024 পূর্ণসংখ্যার চেয়ে বেশি হবে না। আমাদের প্রোগ্রামে অন্য কোনও মেমরি বরাদ্দ পাওয়া যায় না। আমাদের কি যথেষ্ট স্মৃতি আছে? 32 * 1024 * 4 = 131,072। 128 কেবি - তাই হ্যাঁ। আমাদের প্রচুর জায়গা আছে। যদি আমরা জানি আমরা আর কখনও মেমরি বরাদ্দ করব না, আমরা নিরাপদে রাখতে পারিmallocতাদের বিনামূল্যে না করেই অ্যারে। তবে এর অর্থ এইও হতে পারে যে আপনার প্রোগ্রামটি ক্র্যাশ হলে আপনাকে মেশিন / ডিভাইস পুনরায় চালু করতে হবে। আপনি যদি আপনার প্রোগ্রামটি 4,096 বার শুরু / বন্ধ করেন আপনি সমস্ত 512 এমবি বরাদ্দ করবেন। আপনার যদি জম্বি প্রক্রিয়াগুলি থাকে তবে এটি সম্ভব যে ক্রাশের পরেও মেমরিটি কখনই মুক্ত হয় না।

নিজেকে ব্যথা এবং দুর্বিপাক সংরক্ষণ করুন, এবং এক সত্য হিসাবে এই মন্ত্রকে গ্রাস: mallocউচিত সবসময় একটি সঙ্গে যুক্ত করা freeসর্বদা একটি newহওয়া উচিত । delete


4
বেশিরভাগ এম্বেডেড এবং রিয়েল-টাইম সিস্টেমে, এমন একটি টাইম-বোমা যা কেবল 73৩ ঘন্টা পরে ব্যর্থতার কারণ হয়ে দাঁড়ায় এটি একটি মারাত্মক সমস্যা হয়ে দাঁড়াবে।
বেন ভয়েগট

সাধারণ পূর্ণসংখ্যা ??? পূর্ণসংখ্যা কমপক্ষে 16-বিট সংখ্যা এবং ছোট মাইক্রোচিপগুলিতে সাধারণত 16-বিট হয়। সাধারণত সেখানে একাধিক ডিভাইস সঙ্গে আছে sizeof(int)2 বরং 4. সমান
ST3

2

আমি মনে করি যে প্রশ্নটিতে বর্ণিত দাবিটি প্রোগ্রামারের দৃষ্টিকোণ থেকে আক্ষরিকভাবে নেওয়া হয় তবে এটি অপারেটিং সিস্টেমের দৃষ্টিভঙ্গি থেকে সত্য (কমপক্ষে কিছু) রয়েছে has

malloc () শেষ পর্যন্ত এমএমএপ () বা এসবিআরকে () কল করে যা ওএস থেকে একটি পৃষ্ঠা আনবে।

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


2

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

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

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

দীর্ঘমেয়াদে চলমান অ্যাপ্লিকেশনগুলিতে তারা বরাদ্দ করা সমস্ত কিছু পরিষ্কার বা পুনর্ব্যবহার করা সম্পর্কে পুরোপুরি বেআইনী হওয়া দরকার, বা এগুলি মেমরির বাইরে চলে যায়।


1

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

কিছু প্রোগ্রাম সুন্দর আচরণ করে। তারা তরঙ্গগুলিতে মেমরি বরাদ্দ করে: পুনরাবৃত্তি চক্রগুলিতে প্রচুর পরিমাণে ছোট বা মাঝারি আকারের বরাদ্দ followed এই প্রোগ্রামগুলিতে সাধারণত মেমরির বরাদ্দকারীরা ভাল করে। তারা মুক্ত ব্লকগুলি একত্রিত করে এবং একটি তরঙ্গ শেষে মুক্ত মেমরির বেশিরভাগ অংশ বৃহত সংকীর্ণ অংশে থাকে। এই প্রোগ্রামগুলি বেশ বিরল।

বেশিরভাগ প্রোগ্রাম খারাপ আচরণ করে। এগুলি মেমরিকে কম বা এলোমেলোভাবে কম বা এলোমেলোভাবে বরাদ্দ করে এবং খুব ছোট থেকে খুব বড় আকারের বিভিন্ন আকারে এবং তারা বরাদ্দকৃত ব্লকগুলির উচ্চ ব্যবহার ধরে রাখে। এই প্রোগ্রামগুলিতে ব্লকগুলি একত্রিত করার ক্ষমতা সীমাবদ্ধ এবং সময়ের সাথে সাথে তারা স্মৃতিটি অত্যন্ত খণ্ডিত এবং তুলনামূলকভাবে স্বতঃস্ফূর্তভাবে সমাপ্ত করে। যদি 32-বিট মেমরির স্থানে মোট মেমরির ব্যবহার 1.5 জিবি ছাড়িয়ে যায় এবং 10 এমবি বা তার বেশি বরাদ্দ থাকে তবে অবশেষে বৃহত বরাদ্দগুলির মধ্যে একটি ব্যর্থ হবে। এই প্রোগ্রামগুলি সাধারণ।

অন্যান্য প্রোগ্রামগুলি বন্ধ না হওয়া পর্যন্ত অল্প বা মেমরি মুক্ত করে। তারা ক্রমান্বয়ে চলতে চলতে স্মৃতি বরাদ্দ করে, কেবলমাত্র অল্প পরিমাণে মুক্ত করে এবং তারপরে থামায়, সেই সময়ে সমস্ত স্মৃতি মুক্ত হয়। একটি সংকলক এরকম। সুতরাং একটি ভিএম হয়। উদাহরণস্বরূপ,। নেট সিএলআর রানটাইম, নিজেই সি ++ তে লিখিত, সম্ভবত কখনও কোনও স্মৃতি মুক্ত করে না। এটা কেন করা উচিত?

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

আপনার অধ্যাপকরা ঠিক কী বলেছেন তা না জেনে, সত্যিকারের উত্পাদন স্কেল প্রোগ্রামগুলির জন্য আমি সম্ভবত তাদের পক্ষে বেরিয়ে আসব।

সম্পাদনা

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

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


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

4
এই দাবির জন্য উদ্ধৃতি অত্যন্ত প্রয়োজনীয় যে অ্যাপটি বন্ধ না হওয়া পর্যন্ত দক্ষতার সাথে লিখিত প্রোগ্রামগুলি মেমরি মুক্ত করে না।

12
এই পুরো উত্তরটি এলোমেলো অনুমান এবং অনুমানের সিরিজের মতো পড়ে। এর কোনটি ব্যাক আপ করার মতো কিছু আছে কি?
ক্রিস হেইস

4
। নেট সিএলআর রানটাইম কোনও স্মৃতি মুক্ত করে না বলে আপনি কী বোঝাতে চেয়েছেন তা আমি নিশ্চিত নই। যতদূর আমি এটি পরীক্ষা করতে পেরেছি, যদি এটি করতে পারে।
থিওডোরোস চ্যাটজিগিয়ানানাকিস

4
@ ভনব্র্যান্ড: জিসিসির নিজস্ব ব্র্যান্ডের আবর্জনা সংগ্রহকারী সহ একাধিক বরাদ্দকারী রয়েছে। এটি পাসের সময় স্মৃতি গ্রহণ করে এবং এটি পাসের মধ্যে সংগ্রহ করে। অন্যান্য ভাষার জন্য সর্বাধিক সংকলকগুলির মধ্যে কমপক্ষে ২ টি পাস এবং পাসের মধ্যে অল্প বা মেমরি বিনামূল্যে থাকে। যদি আপনি দ্বিমত পোষণ করেন তবে আপনি যে কোনও উদাহরণ দিয়েছেন তা নিয়ে আমি আনন্দিত।
ডেভিড.পিএফএফএক্স

1

আমি অবাক হয়েছি যে কেউ এখনও বইটি উদ্ধৃত করেনি:

এটি শেষ পর্যন্ত সত্য নাও হতে পারে, কারণ স্মৃতিগুলি এত বড় আকার ধারণ করতে পারে যাতে কম্পিউটারের জীবদ্দশায় ফ্রি মেমরির বাইরে চলে যাওয়া অসম্ভব। উদাহরণস্বরূপ, সেখানে 3 ⋅ 10 চলেছেন 13 বছরে মাইক্রোসেকেন্ড, তাই যদি আমরা কনস ছিল প্রতি মাইক্রোসেকেন্ড একবার আমরা 10 সম্পর্কে প্রয়োজন হবে 15 মেমোরির পরিমাণ চলমান ছাড়া মেমরির একটি মেশিন যে 30 বছর ধরে কাজ করতে পারে গড়ে তুলতে কোষগুলোর। সেই অনেক স্মৃতি আজকের মানদণ্ডে অযৌক্তিকভাবে বড় মনে হয়, তবে এটি শারীরিকভাবে অসম্ভব নয়। অন্যদিকে, প্রসেসরগুলি দ্রুততর হচ্ছে এবং ভবিষ্যতের কম্পিউটারে একক মেমরির সমান্তরালে প্রচুর সংখ্যক প্রসেসর অপারেটিং থাকতে পারে, তাই আমাদের মঞ্জুরের চেয়ে মেমরিটি আরও দ্রুত ব্যবহার করা সম্ভব হতে পারে।

http://sarabander.github.io/sicp/html/5_002e3.xhtml#FOOT298

সুতরাং, প্রকৃতপক্ষে, অনেক প্রোগ্রাম কোনও মেমরি মুক্ত করার ঝামেলা ছাড়াই ঠিকঠাক করতে পারে।


1

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

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