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

اختبر مهاراتك في المؤشرات (الحلقة الأولى)

مغلق
بدأه khaled_prg في 18 فبراير 2012 · 38 رد · 3,805 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#26
اقتباس
هل تعني أن العناوين الذي تم إظهارها ليست العناوين الفعلية للمؤشرات ؟؟ :huh:

ماذا تقصد بالإحتمال التخيلي ؟؟ :wacko: :blink:

أقصد virtual Environment وليس بيئة فعلية

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#27

بصراحة, لم أقتنع بعد أخي محمد :)

عموما, سننتقل إلى الحلقة الثانية و من وجد تفسيرا دقيقا .. واضحا للسؤال فليفدنا به و له جزيل الشكر.

#28

السلام عليكم ورحمه الله وبركاته

مرحباً مجدداً

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

فضلاً أرفق الكود إذا كان مكتوب بلغة السي فقط :D

سأحاول تهيئه النت بينز ليعمل مع السي لنجرب سوياً :cool:

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#29

الكود مجرد إعلان عن متغيرين ومؤشرين يشيران إليهما, بلغة السي :

#include<stdio.h>
int main(){
    int a = 1, b = 2;
    int *p1 = &a, *p2 = &b;
    printf("p1 = %p\np2 = %p\n",p1,p2);
    return 0;
}

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

نعم قمت بذلك, ما دام المؤشر p1 يشير إلى a و p2 إلى b فالعناوين تُعتبر محجوزة (لأنني تركت البرنامج قيد التنفيذ حيث وضعت في نهاية البرنامج أمر إدخال) و لا يحق لنظام التشغيل استخدامها.

تم تعديل هذه المشاركة بواسطة khaled_prg في 23 فبراير 2012 في 12:54

#30
اقتباس
نعم قمت بذلك, ما دام المؤشر p1 يشير إلى a و p2 إلى b فالعناوين تُعتبر محجوزة (لأنني تركت البرنامج قيد التنفيذ حيث وضعت في نهاية البرنامج أمر إدخال) و لا يحق لنظام التشغيل استخدامها.

فى الغالب أو على ما أظن إسناد عناوين قيم للمؤشرات ليس كافى لحفظ العناوين من العبث الخارجى :D ... قم بحجز مساحة لتلك العناوين وجرب البرنامج ووافينا بجديد الأخبار :D إلى أن أهيئ النت بينز لنجرب سوياً :regular_smile:

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#31

السلام عليكم

من أجل فهرسة الموضوع مستقبلا, هذا رابط الحلقة الثانية.

اقتباس
فى الغالب أو على ما أظن إسناد عناوين قيم للمؤشرات ليس كافى لحفظ العناوين من العبث الخارجى :D

إذا ما فائدة إسناد العناوين ؟

كيف نحفظ العناوين من العبث الخارجى ؟ :D

اقتباس
قم بحجز مساحة لتلك العناوين وجرب البرنامج ووافينا بجديد الأخبار :D إلى أن أهيئ النت بينز لنجرب سوياً :regular_smile:

قمت بكتابة الكود الآتي في Code::Blocks (قصدت أن لا أحرر العنوان :wink: ) :

#include<iostream>
using namespace std;
int main(){
    int *p1 = new int, *p2 =  new int;
    cout<<"p1 = "<<p1<<endl<<"p2 = "<<p2<<endl;
    int x;
    cin>>x;
    return 0;
}

و قمت بتنفيذ البرنامج عدة مرات حيث ظهرت لي النتائج كما في الصورة :

post-225348-063812900 1330003492_thumb.p

كيف تم حجز نفس العنوان و البرنامج لا زال قيد التنفيذ ؟ :blink:

رحم الله الحجاج ما أعدله ! :D, يبدو أن stack لا تملك مشاكلا مقارنة مع الــ heap :lol:

المرفقات
Prblm_ptr.png
#32

السلام عليكم ..

أحب أن أشكركم على هذا الموضوع والنقاش الشيّقين (هذه أول مشاركة لي في هذا المنتدى :))

مع أني تمنيت لو أني وصلت إلى هذا الموضوع قبل الآن..

على كلٍ أحب أن أدلي بدلوي في الإجابة عن السؤال الباقي، (مع أني لست بخبرتكم في البرمجة (ما شاء الله :blush:) فأنا لم أدرس في كلية المعلوماتية أو ما شابه، فأنا طبيب، لكن أعشق البرمجة حتى النخاع :happy:)..

ليست المشكلة باعتقادي في الـ Heap أو Stack، فكليهما في النهاية موجودان في الذاكرة رام، وبالتالي من المفترض أن تكون عناوينهم مختلفة.

برأيي، أن سبب استخدام العناوين نفسها في أكثر من برنامج بالوقت نفسه هو تقريباً كما لمح الأخ محمد أبو زايد، أن هذه العناوين "تخيلية"، أو أن البيئة التي يعمل داخلها التطبيق تخيلية.

دعوني أشرح أكثر.

قرأت منذ مدة كتاباً عن أصول أنظمة التشغيل وبالأخص ويندوز، وقرأت عن ما يسمى النمط المحمي Protected Mode للمعالج (والذي أصبح معياراً لتشغيل البرامج ابتداءاً من معالجات 32 بت).

لمن قرأ هذه المواضيع، أكيد أنه سمع على الأقل بمفاهيم مثل (Virtual Memory Address (VMA و (Relative Virtual Address (RVA. حيث أن عناوين الذاكرة تكون تخيلية وليست حقيقية مثلما كانت أيام أنظمة 16 بت والـ Real-time Mode.

أيام أنظمة 16 بت، كان يمكننا أن نستخدم طريقة المقطع:الإزاحة (أو ما يسمى Segment:Offset) للحصول على العنوان الحقيقي الفيزيائي لمتحول ما أو جزء من الكود مثلاً، لكن تختلف القصة عند العمل على أنظمة 32 بت ذات النمط المحمي، حيث يقوم نظام التشغيل بتحميل التطبيق في مكان ما من الذاكرة ويضعه ضمن مساحة تخيلية معزولة عن التطبيقات الأخرى، ومقدارها 4 GB. بحيث يكون عنوان أول تعليمة في البرنامج ضمن هذه المساحة التخيلية هو عادةً 0x40000000.

كي يستطيع المعالج تنفيذ تعليمة ما في البرنامج، تقوم نواة نظام التشغيل بتحويل عنوان هذه التعليمة (والموجودة ضمن التطبيق والذي يقع بكامله في المساحة الوهمية تلك) إلى ما يكافئها في الذاكرة الفيزيائية، قبل تنفيذ المعالج لتلك التعليمة.

لماذا هذا التعقيد كله؟

كي تكون التطبيقات معزولة عن بعض، ولا يسمح لها بالوصول إلى ذاكرة التطبيقات الأخرى، أو الوصول لنواة نظام التشغيل وبالتالي إمكانية انهياره. (الشيء الذي كام ممكناً أيام الـ Real-mode وأنظمة 16 بت).

لذلك، فإن العناوين التي تحصل عليها من المؤشرات بلغة ++C/C هي بالحقيقة Relative أي نسبية، نسبة إلى العنوان الفعلي الذي تم تحميل التطبيق عليه في الذاكرة.

وهذه الفقرة مقتبسة من MSDN (الموضوع بالروابط في الأسفل)

اقتباس
A virtual address does not represent the actual physical location of an object in memory; instead, the system maintains a page table for each process, which is an internal data structure used to translate virtual addresses into their corresponding physical addresses. Each time a thread references an address, the system translates the virtual address to a physical address.

وهذه الترجمة إلى العربية لتعم الفائدة:

إن العنوان التخيلي لا يمثل الموقع الفعلي لعنصر ما في الذاكرة، إنما يحتفظ نظام التشغيل بما يسمى "جدول الصفحات" والذي هو عبارة عن بنية داخلية تستخدم لترجمة العناوين التخيلية إلى مكافئاتها في الذاكرة الفعلية. عندما يقوم Thread ما (أي أحد الـ Threads في تطبيق ما) بقراءة عنوان معين، يقوم نظام التشغيل بترجمة هذا العنوان التخيلي إلى عنوان فعلي فيزيائي.

هنا الموضوع كاملاً

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366912%28v=vs.85%29.aspx

لمن يحب الاستزادة

http://technet.microsoft.com/en-us/library/cc767886.aspx

والسلام

2
#33

وعليكم السلام ورحمة الله وبركاته

بارك الله فيك يا دكتور على المشاركة القيمة ... بجد سلمت يداك ... وشرفتنا بمشاركتك

اقتباس
مع أني تمنيت لو أني وصلت إلى هذا الموضوع قبل الآن..

مازال النقاش مستمر تابعنا على إحدى قنواتنا للبث المباشر على القمر نايل سات بتردد ... :D

وهذه قائمة القنوات ولك إشتراك شهر مجانا بها :D :

الحلقة الثانية

الحلقة الثالثة

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#34

ممتاز أخي ElectroDoc بارك الله فيك. فعلا تأصيل علمي دقيق لا يحتمل التأويل :)

كالعادة, صدقت المقولة الشهيرة :

لكي تلعب بالمؤشرات لا بد أن تكون ملم بالأسمبلي و كيفية عمل أنظمة التشغيل :wink:

بالمناسبة, ننتظر مشاركتكم في الحلقة الثالثة و الإشتراك مجاني لمدة شهر كامل .. كما ذكر أخي أحمد السعود :lol:

+1

#35

شكراً لكما إخوتي ahmedsaoud31 و khaled_prg وشكراً على الاشتراك المجاني :lol:

ومن دواعي سروري المشاركة معكم في الحلقة الثالثة (أقصد سأبذل جهدي على قدر معرفتي :blush:)

بصراحة، موضوع أنظمة التشغيل وكيفية إدارة الذاكرة يعتبر من أمتع المواضيع التي قرأتها في مجال علوم الكمبيوتر على الإطلاق، ويستحق أن نتعلمه ونتعمق فيه.

1
#36

السلام عليكم

بانتظار مشاركاتك أخي ElectroDoc :)

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

نعم, كلام مضبوط !

و عندي طلب : يا ريت لو تكتب لنا مقالات قصيرة تتحدث فيها عن بعض هذه المواضيع حتى نستفيد منك و يستفيد الجميع.

تحياتي.

+1

#37

أخي حقك علي بس ما حسنت ابعث علخاص تحملني وحقك على راسي

هذه محاولتي

post-256536-057365300 1330352643_thumb.p

المرفقات
بدون عنوان.png
#38

عزيزي انت لازم تعمل update ! :D

طرح المحاولات انتهى زمنه المُحدد منذ فترة !! :sleep:

أضف إلى ذلك أن محاولتك تحتوي على العديد من الأخطاء :blush:

راجع فقرة تصحيح التمرين :)

بالتوفيق.

#39

بالمناسبة, سيكون هناك قانون جديد :) من اجل تسير أفضل و تنظيم محتوى هذه الحلقات.

يُغلق موضوع كل حلقة عند الإنتهاء من مناقشة أفكارها.

جاري التواصل مع الإدارة.

هذا الموضوع مغلق.

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