دانلود مقاله تحقیقی آزمایشگاه سیستم عامل با موضوع مدیریت حافظه و منابع Memory and Resource Management
نوع فایل : Word
تعداد صفحات : 37
*همراه با ترجمه به زبان انگلیسی*
شرح محتوا
مدیریت حافظه و منابع
C++ در مدیریت حافظه انعطاف زیادی دارد ، اما تعداد کمی از برنامه نویسان C++ مکانیسم های در دسترس و مورد استفاده و موجود را به طور کامل درک کرده اند .در این محیط برنامه نویسی ، سربار گذاری ، سازنده ها و مخرب ها ، استثناء ها ، توابع مجازی و استاتیک ، توابع عملگر و غیر عملگر همه با هم برای ایجاد انعطاف پذیری زیاد و مدیریت حافظه سفارشی ، می آیند . متاسفانه ، و شاید به دلیل اجتناب ناپذیر بودن ، همه اینها می توانند موجب کمی پیچیدگی شوند .
در این فصل ، ما نگاهی داریم به ابنکه چگونه خصوصیات و ترکیبات مختلف C++ در مدیریت حافظه مورد استفاده قرار می گیرند ، چگونه گاهی اوقات به طور شگفت انگیز واکنش نشان می دهند ، و چگونه واکنش هایشان را ساده می کنند ...
شکست در متمایز کردن تخصیص Array و Scalar
آیا یک Widget همان آرایه ای از Widget ها است ؟ البته که نه . چرا تعدادی از برنا مه نویسان C++ از یافتن عملگرهای مختلفی که برای اختصاص دادن و آزاد کردن آرایه ها واسکالرها استفاده شده است ، تعجب می کنند ؟
ما چگونگی اختصاص دادن و آزادکردن یک Widget را می دانیم.ما برای این کار از عملگرهای new و delete استفاده می کنیم .
Widget *w = new Widget( arg );
// . . .
delete w;
برخلاف بیشتر عملگرها در C++ ، رفتار عملگر new نمی تواند با سربارگذاری تغییر کند . عملگر new همیشه یک تابع را بنام عملگر new برای فراهم کردن حافظه فراخوانی می کند ، سپس ممکن است ان حافظه را مقدار دهی اولیه کند . در مورد Widget ، نامبرده ، با استفاده از عملگر new موجب فراخوانی یک تابع عملگرnew خواهد شد که یک پارامتراز نوع size_t می گیرد ، سپس درخواست یک سازنده Widget روی حافظه ای که مقداردهی نشده است خواهد کرد که توسط عملگرnew برای ایجاد یک شئ Widget برگردانده شده است ...
بررسی شکست تخصیص حافظه
در اینجا چند خط کد برای بررسی اختصاص حافظه ی موفق نمایش داده شده است :
bool error = false;
String **array = new String *[n];
if( array ) {
for( String **p = array; p < array+n; ++p ) {
String *tmp = new String;
if( tmp )
*p = tmp;
else {
error = true;
break;
}
}
}
else
error = true;
if( error )
handleError();
این روش کدنویسی زحمت زیادی دارد ، اما ممکن است تلاش ما ارزش زیادی داشته باشد اگر ان توانایی نمایان ساختن همه ناتوانی های ممکن در تخصیص حافظه را داشته باشد ...
جایگزینی new و delete سراسری
جایگزینی نسخه های استاندارد و سراسری عملگر new ، عملگرdelete ، آرایه ی new ، یا آرایه ی delete هرگز عقیده ی خوبی نیست ، حتی با وجود اینکه استاندارد ان را مجاز می داند . نسخه های استاندارد عموما برای هدف کلی مدیریت حافظه بهینه شده اند ، و کاربر تعریف شده که جایگزین می شود بعید می رسد که ان را به خوبی انجام دهد .
هدف ویژه ی نسخه های عملگر new و عملگرdelete که رفتار متفاوتی را از نسخه های استاندارد پیاده سازی می کند احتمالا اشکالاتی داشته باشند ، چون که صحت تعداد زیادی از کتابخانه های استاندارد و کتابخانه های سه بخشی به پیاده سازی استاندارد پیش فرض این توابع وابسته است ...
Memory and Resource Management
C++ offers tremendous flexibility in managing memory, but few C++ programmers fully understand the available mechanisms. In this area of the language ,overloading , name hiding, constructors and destructors, exceptions, static and virtual functions, ...
Failure to Distinguish Scalar and Array Allocation
Is a Widget the same thing as an array of Widgets? Of course not. Then why are so many C++ programmers surprised to find that different operators are used to allocate and free arrays and scalars?
We know how to allocate and free a single Widget. We use the new and delete operators:
Widget *w = new Widget( arg );
// . . .
delete w;
Unlike most operators in C++, the behavior of the new operator can’t be modified by overloading. The new operator always calls a function named operator new to obtain some storage,...
Checking for Allocation Failure
Here’s some code that’s careful to check that every memory allocation succeeds:
bool error = false;
String **array = new String *[n];
if( array ) {
for( String **p = array; p < array+n; ++p ) {
String *tmp = new String;
if( tmp )
*p = tmp;
else {
error = true;
break;
}
}
}
else
error = true;
if( error )
handleError();
This style of coding is a lot of trouble, but it might be worth the effort if it were able to detect all possible memory allocation failures...
Replacing Global New and Delete
It’s almost never a good idea to replace the standard, global versions of operator new, operator delete, array new, or array delete, even though the standard permits it. The standard versions are typically highly optimized for general-purpose storage management, and user-defined replacements are unlikely to do better
Special-purpose versions of operator new and operator delete that implement different behavior from the standard versions will probably introduce bugs, since the correctness of much of the standard library and many third-party libraries depends on the default standard implementations of these functions.
A safer approach is to overload the global operator new rather than ...replace it...
مدیریت حافظه و منابع Memory and Resource Management