C++ Garbage Collector

أرسل من قبل M-RAY-Y في الجمعة, 2008/08/15 - 4:27pm.
عضو فعال
صورة M-RAY-Y

تاريخ التسجيل: 2005-10-11
مشاركات: 758

الجامعة: دمشق
الكلية: الهندسة المعلوماتية
المرحلة: السنة الرابعة
الاختصاص: ذكاء صنعي

hi C++ Programmers
today i'm gonna present The Garbage Collector which i've been working on these last days
like in C# and Java , they had a way to clean up the program from any useless data
 
so for my lucky i've found a very great book "The Art of C++ - Mcgraw Hill" which talk about developing a Garbage Collecter
so now , after i've done it i liked to share you my GC, it's multi-threaded
i've wrote a very small program to show you how to use it
written under VS2005
 
 Important NOTE: Rename the file from GC.JPG => GC.RAR , Cuz i couldn't upload it in rar extensionWink

C++ is Not a programming language ,
C++ is a Way Of Life

 
دخول أو تسجيل لإرسال التعليقات | قراءة: 367

خيارات عرض التعليقات

اختر طريقتك المفضلة لعرض التعليقات و اضغط "حفظ الإعدادات" لتفعيل تغييراتك.
الجمعة, 2008/08/15 - 4:45pm
عضو فعال

تاريخ التسجيل: 2006-12-10
مشاركات: 1473

الجامعة: الافتراضية
الكلية: تكنولوجيا المعلومات
المرحلة: متخرج

The pic is dead!
Edit:Sorry,didn't notice the note.

 
دخول أو تسجيل لإرسال التعليقات
الجمعة, 2008/08/15 - 4:57pm

تاريخ التسجيل: 2006-02-08
مشاركات: 101

الجامعة: دمشق
الكلية: الهندسة المعلوماتية
المرحلة: ماجستير
الاختصاص: ذكاء صنعي

Great idea

It seems it can solve memory leak problems

Any way one question:

in java and .net GC has another job: it moves the objects in the memory to optimize the heap allocation and to enhance the performance of GCing

Is it possible to improve your implementation so that you can do the same?

another thing: why not using C++ .net with "gcnew" operator that allocate storage on a managed heap that is garbage collected?

Thank you

اعمل لدنياك كأنك تعيش أبدا, واعمل لآخرتك كأنك تموت غدا

 
دخول أو تسجيل لإرسال التعليقات
الجمعة, 2008/08/15 - 5:03pm
عضو فعال
صورة M-RAY-Y

تاريخ التسجيل: 2005-10-11
مشاركات: 758

الجامعة: دمشق
الكلية: الهندسة المعلوماتية
المرحلة: السنة الرابعة
الاختصاص: ذكاء صنعي

كتب Ammar_N:
in java and .net GC has another job: it moves the objects in the memory to optimize the heap allocation and to enhance the performance of GCing

Is it possible to improve your implementation so that you can do the same?

in fact i've wrote it as a layer above the basic C++ allocation method , so i think to do so what you've said i'should override the "new" operater

كتب Ammar_N:
another thing: why not using C++ .net with "gcnew" operator that allocate storage on a managed heap that is garbage collected?
Thank you
you mean using CLR, mmm ,why not but in this way i should rewrite all my programs to support CLR Sad

C++ is Not a programming language ,
C++ is a Way Of Life

 
دخول أو تسجيل لإرسال التعليقات
الجمعة, 2008/08/15 - 6:27pm

تاريخ التسجيل: 2006-02-08
مشاركات: 101

الجامعة: دمشق
الكلية: الهندسة المعلوماتية
المرحلة: ماجستير
الاختصاص: ذكاء صنعي

As I can see from your implementation (but I have a quick look so I am not sure)

you are testing the objects each half a second to find the objects to be collected

So in a real world application with thousands of objects , do you think it will go perfectly without loss of performance?

Is it tested?

اعمل لدنياك كأنك تعيش أبدا, واعمل لآخرتك كأنك تموت غدا

 
دخول أو تسجيل لإرسال التعليقات
الجمعة, 2008/08/15 - 7:50pm
صورة mrabooode

تاريخ التسجيل: 2006-09-28
مشاركات: 299

الجامعة: دمشق
الكلية: الهندسة المعلوماتية
المرحلة: السنة الثالثة

يعني مجرد ما أعمل include  لل "GCPtr" و عرف أي object عالتيملبت GCPtr لحالو بيعمل collect ؟؟

..dont limp at the disabled boulevard

 
دخول أو تسجيل لإرسال التعليقات
الجمعة, 2008/08/15 - 9:26pm
صورة wazzz

تاريخ التسجيل: 2005-11-29
مشاركات: 942

الجامعة: دمشق
الكلية: الهندسة المعلوماتية
المرحلة: السنة الثانية

i know just a few about Garbage collector but isn't that like
available in some IDE's like c# or we have to make them every time

I'll code Pascal codes for food and shelter

 
دخول أو تسجيل لإرسال التعليقات
السبت, 2008/08/16 - 10:10am

تاريخ التسجيل: 2006-02-08
مشاركات: 101

الجامعة: دمشق
الكلية: الهندسة المعلوماتية
المرحلة: ماجستير
الاختصاص: ذكاء صنعي

كتب wazzz:
i know just a few about Garbage collector but isn't that like
available in some IDE's like c# or we have to make them every time

When you create an object using "new" you should release the memory it uses by calling "delete"

but if garbage collector exists it calls delete on behalf of you and when needed so you are no longer worried about it Smile Smile

اعمل لدنياك كأنك تعيش أبدا, واعمل لآخرتك كأنك تموت غدا

 
دخول أو تسجيل لإرسال التعليقات
السبت, 2008/08/16 - 11:39am
صورة eng.samar

تاريخ التسجيل: 2006-05-22
مشاركات: 730

الجامعة: دمشق
الكلية: الهندسة المعلوماتية
المرحلة: السنة الخامسة
الاختصاص: هندسة برمجيات

تعودت على gc بالجافا لدرجة اني لما بكتب ++C وبيستخدم مؤشرات بنسا إعملهن Delete

 
دخول أو تسجيل لإرسال التعليقات
السبت, 2008/08/16 - 10:43pm
عضو فعال
صورة M-RAY-Y

تاريخ التسجيل: 2005-10-11
مشاركات: 758

الجامعة: دمشق
الكلية: الهندسة المعلوماتية
المرحلة: السنة الرابعة
الاختصاص: ذكاء صنعي

كتب Ammar_N:
As I can see from your implementation (but I have a quick look so I am not sure)

you are testing the objects each half a second to find the objects to be collected

So in a real world application with thousands of objects , do you think it will go perfectly without loss of performance?

Is it tested?

thanks for the question..
in fact I've done GC using  it's own thread with low priority,so no problem for my real-time application
the main problem i faced was using a mutex to synchronous my work on the active list, so my application well wait tell the collect done to create a new object
i've solved this problem by adding a new list -Dead List- so i've cleared the problem but not all
any way , in this implementation , I think it gives a very good performance
 

C++ is Not a programming language ,
C++ is a Way Of Life

 
دخول أو تسجيل لإرسال التعليقات
السبت, 2008/08/16 - 10:36pm
عضو فعال
صورة M-RAY-Y

تاريخ التسجيل: 2005-10-11
مشاركات: 758

الجامعة: دمشق
الكلية: الهندسة المعلوماتية
المرحلة: السنة الرابعة
الاختصاص: ذكاء صنعي

كتب mrabooode:
يعني مجرد ما أعمل include  لل "GCPtr" و عرف أي object عالتيملبت GCPtr لحالو بيعمل collect ؟؟
اي متل السحر Smile
هو بينضاف للقائمة الميتة deadList بس ينتهي عدد العناصر هلي عم بتأشر على هاد العنصر

C++ is Not a programming language ,
C++ is a Way Of Life

 
دخول أو تسجيل لإرسال التعليقات
الأحد, 2008/08/17 - 12:20am
صورة bayrn

تاريخ التسجيل: 2008-03-05
مشاركات: 801

الجامعة: الافتراضية
الكلية: تكنولوجيا المعلومات
المرحلة: السنة الرابعة
الاختصاص: غير ذلك

السلام عليكم ورحمة الله
سوف أقوم بوضع شرح بسيط لفكرة جامع المهملات ( GC ) في لغةC# ، و أترك التعليق للخبراء ليعطونا فكرة عن GC في C++
( الشرح من مرجع )
مقدمة بسيطة
إن أنظمة التشغيل بالإضافة إلى محركات التشغيل مثل ( محرك تشغيل اللغات المشترك CLR ) كثيرا ما تقسم الذاكرة المستعملة لتخزين البيانات إلى قطعتين منفصلتين.
تتم إدارة كل واحدة منها بأسلوب مختلف ، تسمى هاتان القطعتان من الذاكرة
المكدس ( stack ) - الكومة ( heap )
المتحولات المباشرة
عندما تصرح متحول من نوع int ( أو أي نوع مباشر ) يدعى i و تسند له القيمة 3 :
int i;

لنأخذ الآن مثال عن الأنواع المرجعية
Circle c = new Circl(3);

عندما تستدعي منهج معين ، تؤخذ الذاكرة المطلوبة لبارامتراتها و متحولاتها المحلية من المكدس ( stack ) دائما .
عندما ينتهي المنهج ( إما لأنه أنهى عمله أو لأنه رمى استثناء ) ، تفلت الذاكرة المحجوزة للبارامترات و المتحولات المحلية تلقائيا وتعود إلى المكدس ، وتصبح متوفرة ليتم استخدامها عند استدعاء منهج آخر .
عندما تنشئ كائنا ( من كلاس معين ) باستعمال new و باستدعاء التابع البناء ، تؤخذ الذاكرة المطلوبة لبناء الكائن من الكومة دائما

الفائدة من استعمال GC ( مجمع النفايات )
في C# لا يمكننا تدمير كائن بأنفسنا ، حيث لا يتوفر أي تركيب نحوي لفعل ذلك ، و ذلك لعدة أسباب قد يرتكبها المبرمج فتؤدي الى كوارث :
نسيان تدمير الكائن
يمكنتدمير كائن نشط
تدمير نفس الكائن أكثر من مرة
هذه المشاكل غير مقبولة في C# ( الأمن في مقدمة أولوياتها )

كيف يعمل مجمع النفايات GC
يشتغل GC في مسار ( thread ) خاص به و يمكنه أن يشتغل في أوقات معينة فقط ( عادة عندما يصل البرنامج الى نهاية أحد الطرق )
بينما GC يشتغل ، تتوقف مؤقتا بقية المسالك ( threads ) المشتغلة في البرنامج ، لماذا ؟
لأن GC قد يحتاج الى نقل كائنات و تحديث مراجعها ، ولا يمكنهفعل ذلك بينما تكون الكائنات قيد الاستعمال

 

قرأتُ مجدَكِ في قلبي و في الكُتُـبِ         شَـآمُ ، ما المجدُ؟ أنتِ المجدُ لم يَغِبِ

 
دخول أو تسجيل لإرسال التعليقات
الأحد, 2008/08/17 - 10:42am
صورة wazzz

تاريخ التسجيل: 2005-11-29
مشاركات: 942

الجامعة: دمشق
الكلية: الهندسة المعلوماتية
المرحلة: السنة الثانية

bayrn u are so awsome

I'll code Pascal codes for food and shelter

 
دخول أو تسجيل لإرسال التعليقات
الأحد, 2008/08/17 - 11:42am

تاريخ التسجيل: 2006-02-08
مشاركات: 101

الجامعة: دمشق
الكلية: الهندسة المعلوماتية
المرحلة: ماجستير
الاختصاص: ذكاء صنعي

bayrn explanation is perfect but a little bit confusing for a new programmers who are still learning c++

since C++ uses pointers not references to allocate heap storage

اعمل لدنياك كأنك تعيش أبدا, واعمل لآخرتك كأنك تموت غدا

 
دخول أو تسجيل لإرسال التعليقات
الأحد, 2008/08/17 - 4:28pm
عضو فعال
صورة M-RAY-Y

تاريخ التسجيل: 2005-10-11
مشاركات: 758

الجامعة: دمشق
الكلية: الهندسة المعلوماتية
المرحلة: السنة الرابعة
الاختصاص: ذكاء صنعي

كتب bayrn:
بينما GC يشتغل ، تتوقف مؤقتا بقية المسالك ( threads ) المشتغلة في البرنامج ، لماذا ؟ لأن GC قد يحتاج الى نقل كائنات و تحديث مراجعها ، ولا يمكنه فعل ذلك بينما تكون الكائنات قيد الاستعمال
اول الشي يعطيك اخي Bayrn على الشرح القيم
بس مو معقول انو بيقوم بعملية ايقاف لجميع ال Threads بالوقت هي بيكون GC شغال
بتصور انو بيقوم بعملية قفل على العناصر المراد حذفها , انا هيك تصوري
على كل حال فيك اخي Bayrn تعطيني اسم المرجع هلي حكيت عنو , حابب طور ال GC اكتر

C++ is Not a programming language ,
C++ is a Way Of Life

 
دخول أو تسجيل لإرسال التعليقات
الأحد, 2008/08/17 - 5:28pm
عضو فعال
صورة Rammstein

تاريخ التسجيل: 2006-02-27
مشاركات: 177

الجامعة: تشرين
الكلية: الهندسة المعلوماتية
المرحلة: متخرج
الاختصاص: هندسة برمجيات

auto_ptr template is a GC-like method for dereferencing heap memory automatically, it's already available in C++ standard ISO/IEC:14882 as a part of STD, hope to see better techniques in the upcoming standard as well.

 
دخول أو تسجيل لإرسال التعليقات
الأحد, 2008/08/17 - 6:22pm
صورة bayrn

تاريخ التسجيل: 2008-03-05
مشاركات: 801

الجامعة: الافتراضية
الكلية: تكنولوجيا المعلومات
المرحلة: السنة الرابعة
الاختصاص: غير ذلك

كتب M-RAY-Y:
كتب bayrn:
بينما GC يشتغل ، تتوقف مؤقتا بقية المسالك ( threads ) المشتغلة في البرنامج ، لماذا ؟ لأن GC قد يحتاج الى نقل كائنات و تحديث مراجعها ، ولا يمكنه فعل ذلك بينما تكون الكائنات قيد الاستعمال
اول الشي يعطيك اخي Bayrn على الشرح القيم بس مو معقول انو بيقوم بعملية ايقاف لجميع ال Threads بالوقت هي بيكون GC شغال بتصور انو بيقوم بعملية قفل على العناصر المراد حذفها , انا هيك تصوري على كل حال فيك اخي Bayrn تعطيني اسم المرجع هلي حكيت عنو , حابب طور ال GC اكتر

شكرا على الموضوع ، ذكرتنا و نبهتنا لل GC

الحقيقة المرجع يللي أنا جبت منه الشرح Visual C# 2005 Step by step وهو مرجع بسيط بحيث أن الشرح أردته أن يكون مفهوما لي و للمبتدئين بس الشرح كان مقتطفات من فصلين الفصل 8 الفصل 13

ولكي توضح الصورة لك الشرح الاضافي للخطوات التي يقوم بها GC :

 1- يبني خريطة بكل الكائنات النافذة( التي يمكن بلوغها )

 2- يفحص ان كان أحد الكائنات غير النافذة له مدمر يجب تشغيله ( finalization ) ، كل الكائنات غير النافذة و التي تتطلب تدمير توضع في طابور ( freachable )

3- يلغي حجز الكائنات غير النافذة المتبقية ( تلك التي لا تتطلب انهاء ) بنقل الكائنات النافذة نزولا في الذاكرة التكويمية و تحرير الذاكرة التكويمية في الأعلى بحيث أنه يحدث كل المراجع عند النقل

 4- في هذه النقطة يتيح لل ( threads ) الأخرى باستئناف العمل

 5- ينهي الكائنات غير النافذة التي تتطلب انهاء ( الموجودة الآن فيforeachable )في thread منفصل

 

قرأتُ مجدَكِ في قلبي و في الكُتُـبِ         شَـآمُ ، ما المجدُ؟ أنتِ المجدُ لم يَغِبِ

 
دخول أو تسجيل لإرسال التعليقات
الخميس, 2008/08/21 - 10:30pm
صورة bayrn

تاريخ التسجيل: 2008-03-05
مشاركات: 801

الجامعة: الافتراضية
الكلية: تكنولوجيا المعلومات
المرحلة: السنة الرابعة
الاختصاص: غير ذلك

Until Now I could not get the GC wich wich you are Working on it Mr.M_Ray_y , it's not found

 

قرأتُ مجدَكِ في قلبي و في الكُتُـبِ         شَـآمُ ، ما المجدُ؟ أنتِ المجدُ لم يَغِبِ

 
دخول أو تسجيل لإرسال التعليقات
الجمعة, 2008/08/22 - 9:23pm
عضو فعال
صورة M-RAY-Y

تاريخ التسجيل: 2005-10-11
مشاركات: 758

الجامعة: دمشق
الكلية: الهندسة المعلوماتية
المرحلة: السنة الرابعة
الاختصاص: ذكاء صنعي

كتب bayrn:
Until Now I could not get the GC wich wich you are Working on it Mr.M_Ray_y , it's not found
do you mean to download it
just right click on the link
save as
rename it to "GC.rar"
open it
compile it
tada !!

C++ is Not a programming language ,
C++ is a Way Of Life

 
دخول أو تسجيل لإرسال التعليقات
الجمعة, 2008/08/22 - 9:32pm
عضو فعال
صورة M-RAY-Y

تاريخ التسجيل: 2005-10-11
مشاركات: 758

الجامعة: دمشق
الكلية: الهندسة المعلوماتية
المرحلة: السنة الرابعة
الاختصاص: ذكاء صنعي

by the way guys
i've added to my 3d game engine
and it was very effective
and there was memory leak
no delete statement
nothing at all
yooooohooooooo

C++ is Not a programming language ,
C++ is a Way Of Life

 
دخول أو تسجيل لإرسال التعليقات