2. Outlines
مقدمة
إدارة الذاكرة تحت المجهر
Type Value أنواع القيمة
Reference Type أنواع المرجع
Garbage Collector جامع النفايات
.NET تحرير الموارد غير المُدارة من قبل
Unsafe Code الشيفرة غير الآمنة
05 2 تشرين الثاني، 14
3. مقدمة
وهذه الشيفرة تحظر علينا )Managed Code ( لنا ما يُسمى بالشيفرة المُدارة .NET تؤمن
.)Reference( التعامل بشكل مباشر مع الذاكرة من خلال ما يُعرف بالمرجع
. Heap , Stack قد نحتاج إلى معرفة عميقة إلى كيفية الحجز الذاكري ضمن المناطق
آلية عمل جامع النفايات .
كيفية تحرير الموارد الغير مُدارة مثل الملفات المفتوحة أو اتصالات قواعد المعطيات المفتوحة .
. C# كيفية استخدام المؤشرات في لغة
05 3 تشرين الثاني، 14
4. إدارة الذاكرة تحت المجهر
أنها لا تتُعب المبرمج في تفاصيل C# مثل .NET من أهم مزايا اللغات التي تعمل تحت منصة
إدارة الذاكرة وكيفية حجز الأغراض وتحريرها .
يوفر على المبرمج عناء تحرير المناطق المحجوزة )Collector Garbage ( جامع النفايات
من قِبَل البرنامج في الذاكرة
سنتكلم عن الفرق بين أنواع القيمة وأنواع المرجع
Reference Data Type Vs Value Data Type
05 4 تشرين الثاني، 14
5. Type Value أنواع القيمة
يحوي المكدس :
المتحولات المحلية .
بارمترات الاستدعاءات للتوابع .
المتحولات الستاتيكية .
أي )LIFO( وهو بنية معطيات تعتمد على القاعدة التالية )Stack( المكدس
.)Last In First Out(
هي Struct و البنى Primitive Data Type كل الأنماط البسيطة
وتحفظ ضمن المكدس . value Type
05 5 تشرين الثاني، 14
6. Type Value أنواع القيمة
{
int intval = 10;
double doubleval = 300.0;
}
@80000
0
@79999
9
@79999
8
@79999
7
@79999
6
@79999
5
@79999
4
حجز
05 6 تشرين الثاني، 14
7. Type Value أنواع القيمة
{
int intval = 10;
double doubleval = 300.0;
}
@80000
0
@79999
9
@79999
8
@79999
7
@79999
6
@79999
5
@79999
4
تحرير
نلاحظ أن عملية حجز
المتحولات والأغراض ضمن
المكدس هي عملية سريعة جد ا
05 7 تشرين الثاني، 14
8. Reference Type أنواع المرجع
المكدس يعطينا وصول سريع جداً للمتحولات
.)Heap( لكن المكدس هو عبارة عن منطقة صغيرة مقارنةً بالكومة
. Class is Reference Type
Reference Type يُعامل معاملة ال New أي غرض يتم حجزه عن طريق التعليمة
في المكدس وهذا المرجع هو عبارة عن عنوان الغرض ) Reference( يتم تخزين المرجع
. Heap ضمن الذاكرة
05 8 تشرين الثاني، 14
9. Reference Type أنواع المرجع
Student s = new Student();
Stack
Heap
s Object
Reference is
Read only
Pointer
05 9 تشرين الثاني، 14
10. Garbage Collector جامع النفايات
{
List<int> Arr = new List<int>();
}
يحرره المترجم من المكدس(. ( Arr والذي هو Reference يموت ال Scope عند الخروج من ال
. )Heap( لكن الغرض الحقيقي موجود في الكومة
يصبح هذا الغرض من دون أي مؤشر يؤشر عليه.
يؤشر عليها Reference شبه ممتلئة فتقوم بحذف كل الأغراض التي ليس لها Heap عندما تصبح الذاكر GC تعمل
في المكدس.
05 10 تشرين الثاني، 14
11. Garbage Collector جامع النفايات
. Heap للمنطقة )Compact( بعملية ضغط GC يقوم
تحوي كل الأغراضالمحجوزة بشكل Heap باالتالي تصُبح المنطقة
متسلسل ومتلاصق من دون أي مساحات ضائعة
.Managed Heap
بشكل قسري لكن لا يوجد أي شيء يضمن لنا أنها ستعمل GC يمكننا تشغيل ال
باللحظة التي نريدها !
System.GC.Collect();
In use
Free
In use
In use
Free
05 11 تشرين الثاني، 14
12. دارة من قبل
ُ
.NET تحرير الموارد غير الم
يريح المبرمج من عناء تحرير الذاكرة المحجوزة . GC
لا تعرف كيف تقوم بتحرير الموارد الغير مُدارة . GC لكن
يحوي مرجع إلى غرض غير مُدار . لكي نجعل نقوم )Class( عندما يكون لدينا صف معين
قبل إزالة الغرض من الذاكرة. )Unmanaged Resources( بتحرير الموارد غير المُدارة
لدينا طريقتان :
ضمن الصف )Destructor or FinalizerMethod( نقوم بالتصريح عن تابع هادم
IDisposable استخدام الواجهة
استخدام كلا الطريقتين .
05 12 تشرين الثاني، 14
13. التصريح عن تابع هادم ضمن الصف:
.GC الهادم هو المكان المناسب للقيام بعملية التنظيف قبل هدم الغرض من قبل
//Implementation for free Unmanaged Resources used Directly by an Object: Examples :
يتم استدعاء الهادم عند هدم الغرض فوراً . c++ في
class Myclass
{
~Myclass()
{
// Closing connection To DB
// Closing Opened Files
// Closing Networking Connections
أما في فأننا نعتمد على لهذا السبب لا نعرف متى سيتم استدعاء
الهادم وتحرير }
GC الغرض C# }
.GC عن طريق
تنفيذ كود الهادم يبطئ من عملية تحرير الذاكرة بسبب وجود كود إضافي للهادم يتم استدعاءه من
قبل هدم الغضر فعليا من الذاكرة . GC قبل
05 13 تشرين الثاني، 14
14. IDisposable استخدام الواجهة
الطريقة الموصى بها من قبل مايكروسوفت لتحرير الموارد غير المُدارة لتجنب المشاكل
.GC المتعلقة باستخدام
يمكننا تحقيق هذه الطريقة كما يلي .
يزودنا بتحكم دقيق Dispose المنهج
class Myclass :IDisposable
{
public void Dispose()
{
//Implementation for free Unmanaged Resources used Directly by an Object: Examples :
// Closing connection To DB
// Closing Opened Files
// Closing Networking Connections
}
}
Myclass a = new Myclass();
//Do Processing
a.Dispose();
05 14 تشرين الثاني، 14
15. دارة من قبل
ُ
.NET تحرير الموارد غير الم
الحل الآمن هو كما يلي :
قد يكون مربكا لبعض الأشخاص . Dispose لكن استدعاء المنهج
التي تضمن لنا استدعاء تلقائي لهذا المنهج. using يمكننا استخدام التعليمة
Myclass a=null;
try
{
a= new Myclass();
//Do Processing
}
finally
{
if (a != null)
a.Dispose();
}
using (Myclass a=new Myclass())
{
//Do Processing
}
05 15 تشرين الثاني، 14
16. استخدام كلا الطريقتين :
)Destructor( تنفيذ الهادم
آلية أمنه ولكنها بطيئة وغير حتمية
IDisposable تحقيق الواجهة
) Dispose آلية حتمية لكنها تتطلب مجهود إضافي )استدعاء المنهج
الطريقة الأفضل هي تحقيق كلا الطريقتين السابقتين
05 16 تشرين الثاني، 14
17.
class Myclass :IDisposable
{
private bool isDisposed = false;
public void Dispose()
{
//Implementation for free Unmanaged Resources used Directly by an Object: Examples :
Console.WriteLine("Disposing");
Dispose(true); //Cleaning managed and unmanaged Resources
//Requests that the system not call the finalizer(Destructor) for the specified object
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!isDisposed)
{
if (disposing)
{
//Cleaning Magnaged objects by Calling Their Dispose() Methods ( Release Then Run GC)
}
//Cleaning Unmagnaged Resources
}
isDisposed = true;
}
05 17 تشرين الثاني، 14
18. استخدام كلا الطريقتين :
هذا الكود يصلح لنوعين من المبرمجين :
الأول يكتب :
أما الثاني فيكتب :
~Myclass()
{
Dispose(false);//Cleaning Unmanaged Resources
Console.WriteLine("Destructor");
}
}
Myclass a=null;
try
{
a= new Myclass();
//Do Processing
}
finally
{
if (a != null)
a.Dispose();
}
{
Myclass a = new Myclass();
//Do Processing
}
05 18 تشرين الثاني، 14
19. Unsafe Code الشيفرة غير الآمنة
قد نضطر في بعض الأحيان إلى الوصول المباشر إلى الذاكرة )استخدام مؤشرات( مثلا :
وهذا )C/C++ مكتوب بلغة ( )Unmanaged DLL( غير مُدار DLL تابع موجود في ملف
الوصول يتطلب تمرير مؤشر كبارمتر لهذا التابع .
تحسين الأداء .
05 19 تشرين الثاني، 14
20. كتابة شيفرة غير آمنة
والتي تخبر المترجم بأن هذا المنهج يستخدم مؤشرات. unsafe تقوم الكلمة
. Class,struct يمكن استخدامها مع ال
unsafe class Myclass
{
int* px ; //Declaration of a Pointer filed in a Class
كما يمُكننا كتابة كتلة من الشيفرة غير الآمنة ضمن منهج عادي
unsafe int GetNumber()
{
//Code That can use Pointer
int x = 10;
int* px = &x;
return 1;
}
// Any Method in This Class Can now use Pointers
}
static void Main(string[] args)
{
Unsafe int* px; // Wrong and Generate Compiler Error
unsafe
{
//Unsafe Code That uses Pointers Here
}
//More safe Code That deose't use Pointers
}
05 20 تشرين الثاني، 14