الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ماذا تعرف عن الـ buffer و stack و الـ heap !؟

بدأه khaled_prg في 19 أكتوبر 2010 · 20 رد · 4,739 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

عندي بعض الأسئلة حول الـ buffer و stack و الـ heap, سأعرض لكم مأعرفه عن هذه الأشياء الثلاث و أريد منكم تصحيح المعلومات الخاطئة كما أرجو منكم أن تفيدوني إذا كانت لديكم معلومات أكثر عنها.

حسب علمي/جهلي فإن :

  • الـ buffer هي ذاكرة مؤقتة لتخزين البيانات أثناء انتقالها من طرف إلى آخر بحيث تختلف السرعة بين كلا الطرفين, باعتبار أن وصول البيانات إلى الطرف الثاني أسرع .. فإن دور الـ buffer يكمن في حفظ البيانات ريثما يكتمل وصولها إلى الطرف الأول لتكمل طريقها إلى الطرف الثاني و الذي غالبا ما يكون المعالج. على سبيل المثال : يتم استخدام الـ buffer عند كل عملية إدخال لأن الإنسان (الطرف الأول) بطبيعة حاله أبطأ من المعالج (الطرف الثاني).

  • stack لا أعرف عنها الكثير !, أخبرني بعض الإخوة أنها عبارة عن ذاكرة مؤقتة لتخزين البيانات (المتغيرات) قبل تنفيذ البرنامج أي أنها تدعم الحجز استاتيكي فقط, البعض يقول أن جميع المتغيرات تُخزن في stack (لأن الحجز هنا استاتيكي) و البعض يقول أن وسائط الدوال (فقط) هي التي تُخزن في stack كما يُخزن عنوان السطر الذي تم استدعاء الدالة فيه من الكود .. ينتقل المعالج إلى stack ليجد عناوين وسائط الدالة ثم يرجع إلى المكان الذي توقف عنده سابقا و ذلك عن طريق العنوان المُخزن آنفا, قرأت أيضا أنها تعمل بطريقة "الأول يدخل هو الأول يخرج" أو ما يُعرف اختصارا بـ FIFO ولكن أظن أن هذه الفائدة يجب أن نتعرف عليها أكثر عند التعامل مع هياكل البيانات فقط !

  • الـ heap هي ذاكرة مؤقتة لتخزين البيانات (المؤشرات) و هي معاكسة لـ stack حيث يتم فيها تخزين البيانات أثناء تنفيذ البرنامج, البعض يقول أن هذه الذاكرة خاصة بالتعامل مع المؤشرات (لأن الحجز هنا سيكون ديناميكي أي في وقت الرين تايم) و تمتاز الـ heap بأنها تستعمل أسلوب FILO أي أن الذي يدخل أولا يخرج أخيرا.

هذا كل ما أعرفه, حان دوركم في تصحيح الأخطاء و إعطاء المزيد من المعلومات التي من شأنها أن تثري أفكارنا البرمجية :)

تحياتي.

#2

تحتاج تشكيلة ربع كيلو أسمبلي على نصف كيلو OS Concepts وصدقني سترتاح من هذه المفاهيم tongue.gif

3

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#3

stack ---> FILO .... بالعربي ... مُكدس

Buffer على مستوى تراكيب البيانات يمكن أن تعتبرها queue أي رِتل أو صف (شاع بالعامية استخدام كلمة "بنفر" لوصف الدعامة الأمامية للسيارة.. ونقصد بها buffer حيث هي وسيط بين الجسم المصدوم والسيارة...)

أما heap فأشهر من يستخدمه هو دالة malloc() ... أضن انه يترجم ل كومة في المصادر العربيية

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

#4

هلا يا حلوين :)

اقتباس
تحتاج تشكيلة ربع كيلو أسمبلي على نصف كيلو OS Concepts وصدقني سترتاح من هذه المفاهيم :P

ما عندي فلوس كافية لشراء هذه الوصفة ممكن تستلف لي !؟ :P :lol:

=========

خارج نطاق الممازحة .. يا ريت لو تشرح لي هذه المفاهيم و تصحح لي معلوماتي فأنت من مشايخ الأسمبلي و أهل مكة أدرى بشعابها :wink:

اقتباس
stack ---> FILO .... بالعربي ... مُكدس

Buffer على مستوى تراكيب البيانات يمكن أن تعتبرها queue أي رِتل أو صف (شاع بالعامية استخدام كلمة "بنفر" لوصف الدعامة الأمامية للسيارة.. ونقصد بها buffer حيث هي وسيط بين الجسم المصدوم والسيارة...)

أما heap فأشهر من يستخدمه هو دالة malloc() ... أضن انه يترجم ل كومة في المصادر العربيية

شكلك عندك قاموس برمجي (انجليزي/عربي) ! :P

=========

هل يوجد خطأ في المعلومات التي ذكرتها !؟

بانتظاركم يا أبطال الأسمبلي :cool:

#5

السلام عليكم

الذي أعرفه أن البرنامج الذي نكتبه ينقسم في تخزينه إلى 4 أنواع(من الناحية التخزينية)

1- كود البرنامج program code و يتم تخزينه على جزء مخصص لهذا الغرض في الذاكرة حتى يتنسى للكومبايلر قراءته و التعامل معه.

2-جزء مخصص للمتحولات العامةglobal

3-جزء مخصص للحجز الديناميكي (مثلاً باستخدام new )وتدعى heap

4-جزء لتخزين المتحولات المحلية localو الساكنةstatic و تدعى بـ stack و يتعامل معها بترتيب معين بمعنى لا يمكن إدخال العناصر فيها و إخراجها بشكل عشوائي و إنما أول العناصر إدخالاً فيها هي آخرها إخراجاً و العكس صحيح لذلك يطلق عليها FILO

Fisrt In Last Out

و بالتالي لزم هذا الترتيب و مراعاته.

تم تعديل هذه المشاركة بواسطة yahya91 في 19 أكتوبر 2010 في 20:05

#6
اقتباس
stack ---> FILO .... بالعربي ... مُكدس

Buffer على مستوى تراكيب البيانات يمكن أن تعتبرها queue أي رِتل أو صف

يتعامل معها بترتيب معين بمعنى لا يمكن إدخال العناصر فيها و إخراجها بشكل عشوائي و إنما أول العناصر إدخالاً فيها هي آخرها إخراجاً و العكس صحيح لذلك يطلق عليها FILO

Fisrt In Last Out

و بالتالي لزم هذا الترتيب و مراعاته.

تم تعديل هذه المشاركة بواسطة yahya91 في 19 أكتوبر 2010 في 20:09

#7
اقتباس
جزء مخصص للمتحولات العامةglobal

ألا تُخزن المتغيرات العامة في stack !؟ :blink:

=========

بصراحة .. بحثتُ كثيـــــــــــــرا لكي أفهم هذه الأشياء و عرضتُ لكم ما أعرفه عنها فيا ريت لو يتدخل أحد الخبراء و يجيب عن أسئلتي التي بالأعلى :blush:

بالإنتظار ...

#8
اقتباس
تحتاج تشكيلة ربع كيلو أسمبلي على نصف كيلو OS Concepts وصدقني سترتاح من هذه المفاهيم :P

+1

****************

1 - الـ Stack: هو مكان بالذاكره لابد من تحديد المساحه التى سيتم حجزها به وقت ترجمة البرنامج، هذا الجزء من الذاكره يحتوى على المتغيرات التى تم تعريفها داخل الكود أيا كان نوع هذه المتغيرات (ماعدا المتغيرات العامه) و أيضا المصفوفات التى تم تحديد حجم لها بشكل مباشر أو غير مباشر1، أيضا تحتوى هذه الذاكره على شجرة إستدعاءات الدوال و قيم المعاملات. هذه الذاكره يتم تحريرها بمجرد العوده للداله التى قامت بالإستدعاء او بمجرد الإنتهاء من تنفيذ الداله الحاليه (تعتمد على طبيعة الإستدعاء cdecl او stdcall و توجد انواع اخرى).

2 - الـ Heap: هو مكان بالذاكره مساحته يمكن تحديدها وقت ترجمة البرنامج أو وقت تشغيل البرنامج و لا يتم الحجز الفعلى للذاكره إلا بإستدعاء الدوال التى تقوم بتنفيذ عملية الحجز و حيث انك تقوم بعملية الحجز بشكل يدوى فإنك ملزم بتنفيذ عملية تحرير الذاكره بشكل يدوى أيضا و إن لم تقم بتحرير الذاكره قد يحدث Memory Leak مما قد يؤدى إلى انهاء برنامجك بشكل غير طبيعى او أمور أسوء.

3 - الـ Buffer: هو لقب يطلق على المتغيرات التى تستخدم لحفظ قيم مؤقته و يمكن ان يكون مكان هذا المتغير بالـ Stack او Heap.

***************

1 المصفوفات التى يتم تحديد مساحتها بشكل مباشر مثل:

int arr[3];

المصفوفات التى يتم تحديد مساحتها بشكل غير مباشر مثل:

int arr[] = {1, 2, 3};

الفرق بين النوعين أن الأول يتم تحديد مساحته بشكل صريح أما الأخر فيتم معرفة مساحته من خلال عدد العناصره التى يستم وضعها به.

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 19 أكتوبر 2010 في 20:31

2

مدونتي: C++ Tips and Tricks

#9

+1

كفيت و وفيت يا أستاذنا الفاضل :), تسلم الأيادي :wub:

اقتباس
الـ Buffer: هو لقب يطلق على المتغيرات التى تستخدم لحفظ قيم مؤقته و يمكن ان يكون مكان هذا المتغير بالـ Stack او Heap.

هل أفهم من كلامك أن الـ buffer ليست جزء من الذاكرة !؟ :blink: :wacko:

تم تعديل هذه المشاركة بواسطة khaled_prg في 19 أكتوبر 2010 في 20:39

#10
اقتباس
هل أفهم من كلامك أن الـ buffer ليست جزء من الذاكرة !؟ :blink: :wacko:

أى جزء من كلامى فهمت منه هذه النقطه؟

اقتباس
هو لقب يطلق على المتغيرات التى تستخدم لحفظ قيم مؤقته و يمكن ان يكون مكان هذا المتغير بالـ Stack او Heap.

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 19 أكتوبر 2010 في 20:42

مدونتي: C++ Tips and Tricks

#11
اقتباس
أى جزء من كلامى فهمت منه هذه النقطه؟

عفوا :blush:

اقتباس
هو لقب يطلق على المتغيرات التى تستخدم لحفظ قيم مؤقته و يمكن ان يكون مكان هذا المتغير بالـ Stack او Heap.

ما هو نوع هذه المتغيرات !؟, هل نوعها ثابت أم يتغير بتغير النوع المراد استعماله !؟ ماحجمها أيضا !؟

=========

يا ريت لو تصحح لي هذه المعلومة :

اقتباس
الـ buffer هي ذاكرة مؤقتة لتخزين البيانات أثناء انتقالها من طرف إلى آخر بحيث تختلف السرعة بين كلا الطرفين, باعتبار أن وصول البيانات إلى الطرف الثاني أسرع .. فإن دور الـ buffer يكمن في حفظ البيانات ريثما يكتمل وصولها إلى الطرف الأول لتكمل طريقها إلى الطرف الثاني و الذي غالبا ما يكون المعالج. على سبيل المثال : يتم استخدام الـ buffer عند كل عملية إدخال لأن الإنسان (الطرف الأول) بطبيعة حاله أبطأ من المعالج (الطرف الثاني).
#12
khaled_prg كتب:

يا ريت لو تصحح لي هذه المعلومة :

معلومتك صحيحة عن ال Buffer .. لكن حتى يكون الأمر أكثر دقة ... يوجد Buffer في عدة مستويات!! يوجد بفر في علم الميكانيكا والفيزياء... ويوجد في علوم العتاد الصلب للحاسوب وتقنيات نقل ال bits بين أجزاءه... يوجد ما يُسمى buffering على مستوى تطبيقات الكمبيوتر - لاحض برنامج windows media player عندما تطلب منه تشغيل ملف من الانترنت- ... وشاع استخدام buffer لتسمية بعض المتغيرات في لغات البرمجة كون هذا المتغير سيكون واجهة تخزينية....

في النهاية ال Buffer بشكل عام وسيط تخزيني بين جهتين سواء في البرمحة أو الفيزياء أو تطبيقات وبرامج الحاسب,..

لا يوجد متغير من نوع Buffer!! انما المسألة هكذا تقريبا

int buffer[6];
while(i<=6)
cin>>buffer;
i++;

المتغير buffer لعب دور الوسيط التخزيني بين البيانات التي سيدخلها المستخدم ووبين الحاسوب..

تم تعديل هذه المشاركة بواسطة A.S Hack في 19 أكتوبر 2010 في 21:13

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

#13
اقتباس
معلومتك صحيحة عن ال Buffer .. لكن حتى يكون الأمر أكثر دقة ... يوجد Buffer في عدة مستويات!! يوجد بفر في علم الميكانيكا والفيزياء... ويوجد في علوم العتاد الصلب للحاسوب وتقنيات نقل ال bits بين أجزاءه... يوجد ما يُسمى buffering على مستوى تطبيقات الكمبيوتر - لاحض برنامج windows media player عندما تطلب منه تشغيل ملف من الانترنت- ... وشاع استخدام buffer لتسمية بعض المتغيرات في لغات البرمجة كون هذا المتغير سيكون واجهة تخزينية....

في النهاية ال Buffer بشكل عام وسيط تخزيني بين جهتين سواء في البرمحة أو الفيزياء أو تطبيقات وبرامج الحاسب,..

أشكرك على الإفادة و المداخلة المفيدة :)

==========

بانتظار تعليق الأستاذ محمد علاء الدين لإثراء الساحة البرمجية أكثر :)

==========

بقي سؤال أخير :

أين تُخزن المتغيرات العامة !؟

#14
اقتباس
يا ريت لو تصحح لي هذه المعلومة :

الكلمات Variable - Buffer تعنى مساحه تخزينيه فى الذاكره تستخدم لحفظ قيم معينه هذه القيم نوعها هو الذى قمت بتحديده عند حجز هذه المساحه.

اقتباس
أين تُخزن المتغيرات العامة !؟

تعتمد على الهاردوير الذى تكتب له و على المترجم و لكن فى الأغلب يتم تخزينها داخل bss section، كل ما تحتاج معرفته عن هذه النقطه هو ان كل المتغيرات العامه تظل موجوده داخل الذاكره طوال فترة تشغيل البرنامج و يتم تحرير الجزء الذى تحجزه من الذاكره عندما يتم غلق البرنامج.

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#15
اقتباس
الكلمات Variable - Buffer تعنى مساحه تخزينيه فى الذاكره تستخدم لحفظ قيم معينه هذه القيم نوعها هو الذى قمت بتحديده عند حجز هذه المساحه.

هل حجمها ثابت أم يتغير بتغير النوع المراد استعماله !؟

اقتباس
تعتمد على الهاردوير الذى تكتب له و على المترجم و لكن فى الأغلب يتم تخزينها داخل bss section، كل ما تحتاج معرفته عن هذه النقطه هو ان كل المتغيرات العامه تظل موجوده داخل الذاكره طوال فترة تشغيل البرنامج و يتم تحرير الجزء الذى تحجزه من الذاكره عندما يتم غلق البرنامج.

تمام يا ريس :)

#16
اقتباس
هل حجمها ثابت أم يتغير بتغير النوع المراد استعماله !؟

يتغير بتغير النوع المراد استعماله.

مدونتي: C++ Tips and Tricks

#17
اقتباس
يتغير بتغير النوع المراد استعماله.

يعني عندما نريد إدخال قيمة لمتغير من النوع float هل سيتم إنشاء متغير من النوع float في stack و ستُخزن فيه القيمة المُدخلة و بعدما يضغط المستخدم على enter سنتتقل القيمة (إذا كانت من النوع float) إلى المتغير الأصلي !؟

#18

up

بقي هذا السؤال الأخير :

اقتباس
يعني عندما نريد إدخال قيمة لمتغير من النوع float هل سيتم إنشاء متغير من النوع float في stack و ستُخزن فيه القيمة المُدخلة و بعدما يضغط المستخدم على enter سنتتقل القيمة (إذا كانت من النوع float) إلى المتغير الأصلي !؟
#19
khaled_prg كتب:

up

بقي هذا السؤال الأخير :

نعم

و ما شاء الله موضوع رائع و مفيد

فالناس عند تعلم البرمجة

تتعلم كيف يفعل كذا و كذا

و لكن القليل من يريد ان يعرف ماذا يحدث خلف الكواليس

و معرفة هذه الاشياء مهمة للغاية و تساعدك على ان تكون مبرمج جيد

يا سلام بقى لو نغير الدفة و حد يكلمنا عن الـ Threads

#20
اقتباس
نعم

ما دليلك (مصدر معتمد,موقع عالمي,قول لأحد علماء البرمجة أو ...)

أرجو أن يكون هناك تأصيل للمعلومات :happy: فبهذه الطريقة سنضمن صحتها و بشكل قطعي أيضا :wink:

+++++++++++

يا ريت لو يتدخل أحد خبراء القسم .. كما تعلمون فإن:

"إسناد الضعيف على الضعيف يؤدي إلى سقوطهما معا !, وهذا ما أخشاه :blush: "

+++++++++++

إلى TheBigBiss:

إذا كانت عندك معلومات إضافية حول "الـ buffer و stack و الـ heap" فنرجوا منك ذكرها ولك جزيل الشكر :)

اقتباس
يا سلام بقى لو نغير الدفة و حد يكلمنا عن الـ Threads

:blink: :wacko:

#21

يبدو أن الأخ خالد الشايع يحضر مقالة لوضعها في الموضوع !!! :P :lol:

مضى عليه ساعة زمانية وهو يكتب الرد :ohmy: ما زال تحت المراقبة :wink: سنوافيكم بآخر الأخبار :)

خالد شلبوط, الجزائر, من محطة الفريق العربي للبرمجة :)

تم تعديل هذه المشاركة بواسطة khaled_prg في 21 أكتوبر 2010 في 02:49

−2

مواضيع مشابهة