• 0
khaled_prg

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

سؤال

السلام عليكم

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

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

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

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

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

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

تحياتي.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

20 إجابة على هذا السؤال .

  • 0

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

3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

=========

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

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

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

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

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

=========

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

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

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

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

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

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

Fisrt In Last Out

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

تم تعديل بواسطه yahya91
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
stack ---> FILO .... بالعربي ... مُكدس

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

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

Fisrt In Last Out

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

تم تعديل بواسطه yahya91
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
جزء مخصص للمتحولات العامةglobal

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

=========

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
تحتاج تشكيلة ربع كيلو أسمبلي على نصف كيلو 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};

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

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

تم تعديل بواسطه محمد علاء الدين
2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

+1

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

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

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

تم تعديل بواسطه khaled_prg
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
هل أفهم من كلامك أن الـ buffer ليست جزء من الذاكرة !؟ :blink: :wacko:

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

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
أى جزء من كلامى فهمت منه هذه النقطه؟

عفوا :blush:

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

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

=========

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

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

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


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

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

تم تعديل بواسطه A.S Hack
0

شارك هذا الرد


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

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

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

==========

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

==========

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
يا ريت لو تصحح لي هذه المعلومة :

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

تمام يا ريس :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
هل حجمها ثابت أم يتغير بتغير النوع المراد استعماله !؟

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
يتغير بتغير النوع المراد استعماله.

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

up

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

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

up

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

نعم

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

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

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

نعم

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

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

+++++++++++

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

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

+++++++++++

إلى TheBigBiss:

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

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

:blink: :wacko:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

تم تعديل بواسطه khaled_prg
-2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .