tantie L

مسير الذاكرة...كيف يعمل؟ ^_^

4 ردود في هذا الموضوع

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

كيف حالكم؟ ان شاء الله بخير؟ انا الحمد لله  ^_^

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

اولا كمقدمة صغيرة سأتحدث ب

اختصار شديد عن الذاكرة تعريفها و انواعها

الذاكرة يتم فيها حفظ المعطيات بشتى انواعها و يتم استخدامها عند الحاجة

انواعها هي ذاكرة مركزية و ذاكرة ثانوية أي بشكل معادلة رياضية جميلة  :rolleyes:

ذاكرة = ذاكرة مركزية + ذاكرة ثانوية ( و كتحليل لهذه المعادلة ) = DD + ram + rom + cache

الذاكرة المركزية فيها : الذاكرة الحية و الميتة  :mellow:  و cache ( لا اعرف مصطلحها العلمي  :blush:  )

الذاكرة الثانوية فيها : القرص الصلب DD كما يمكننا ان نظيف الاقراص المضغوطة و الاقراص المرنة و الفلاش ميموري لكن نكتفي بذكر التي تاتي مرفقة مع الحاسوب  -_-

الهدف من مسير الذاكرة هو 

ليتم فيها حجز الامكنة من اجل البرامج التي تريد التنفيذ اي بمصطلح بسيط ( التأجير  :D  )

من أجل حماية معطيات البرنامج الموجود بمكانه في الذاكرة

مشاركة المعطيات و المعلومات بين البرامج التي في قيد التنفيذ

مهامه الرائعة  :wub:

مراقبة حالة الذاكرة المركزية ( معرفة المساحة الفارغة و المساحة المحجوزة و حجم المساحات المأجرة  :rolleyes:  )

ايجاد الاستراتيجيات الفعالة لحجز الاماكن في الذاكرة ( و كأنني اتخيله يقول كيف اختار افضل طريقة للتأجير  :lol:  )

ايجاد التقنيات الفعالة لحجز الاماكن في الذاكرة ( و هنا يقول كيف افوم بالحجز ما أفضل طريقة  :lol: )

و في الاخير ايجاد الطرق الفعالة لتحرير الاماكن المحجوزة في الذاكرة

حسنا حسنا الى بعض التفصيل ننطلق الان  ;)

لنتعرف قليلا على استراتيجيات المسير في حجز الاماكن في الذاكرة المركزية 

توجد استراتيجياتان :

الاولى : استراتيجية المساحة الواحدة او ما يسمى علميا mono programmation

فيها البرنامج لا يتم تقسيمه الى اجزاء او اقسام و انما هنا المسير يأخذ البرنامج باكمله و بحجمه الكامل و يقوم بتحميله الى الذاكرة المركزية و يتم التنفيذ، هيا معي نأخذ مثالا على ذلك صغير  :P

فرضا ان ذاكرتنا المركزية سعتها 150 ko و برنامجنا حجمه 100 ko اذن و حسب هذه الاستراتيجية يكون شكل الذاكرة هكذا :

 

wHlram.png

 

أي انه سيتم تنفيذ برنامج واحد فقط  -_-

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

و مسيرنا الرائع ( صرت متيمة بمسير الذاكرة و نظام التشغيل  :D  ) ليعرف حالة الذاكرة يكفيه ان يستخدم bit واحد فقط 1 ان كانت محجوزة و 0 ان كانت حرة

اتى الان موعد معرفة الايجابيات و السلبيات الخاصة بهذه الاستراتيجية البسيطة :

الايجابيات هي ان هذه الاستراتيجية سهلة جدا اذ كل ما يفعله المسير هو مقارنة احجام البرامج التي تنتظر في طابور الانتظار مع مساحة الذاكرة ثم يحجز ان كانت مناسبة  ثم يغير حالة الذاكرة من 0 الى 1 اي ان الذاكرة تعمل الان و ينتظر الى ان ينتهي التنفيذ و ينتقل الى البرنامج التالي ^_^ ، ان لم تكن كافية يرسل تنبيه فتظهر لك نافذة مفادها ان برنامجك اكبر من ذاكرتك ( لذلك عليك ان تجد حلا بنفسك  :rolleyes: ) و ينتقل للبرنامج التالي

و من الايجابيات ايضا انها غير مكلفة في الوقت لان برنامجك كاملا موجود في الذاكرة اي ان التنفيذ سيكون سريعا 

اما السلبيات  :( فهي ان هذه الاستراتيجية استغلالها سيء جدا سواء للذاكرة ام للمعالج المركزي ام الثانوي 

بالنسبة للذاكرة تخيلوا معي ذاكرتنا لها حجم كبير ( و لنبقي ب 150 ko )

و برنامجنا حجمه 20  ko 

 

تعالوا معي لنرى كيف ستكون الذاكرة

u5OL8X.png

هذا حقا امر سيء جدا لا يمكننا السكوت عنه  :angry:

لقد ضيعنا قدرا كبيرا جدا من الذاكرة لانه لا يمكننا ان نقوم بادراج برنامج ثان تبعا لهذه الاستراتيجية

و ايضا ليس هذا فقط فالبرنامج كما تعلمون يستخدم المعالج المركزي و المعالج الثانوي كمصادر ليقوم بعمله اذ ان المعالج المركزي مثلا من مهامه الحساب و المعالج الثانوي او علميا يسمى canal اختصاصه تنظيم وحدات الادخال و الاخراج حتى يحصل البرنامج على معطياته ليعمل

لنتخيل البرنامج يستخم الان المعالج المركزي فماذا يفعل الثانوي الان؟ أكيد مرتاح و لا يقوم باي عمل  <_<

حسنا انتهى البرنامج من المعالج المركزي، بدأ باسعمال الثانوي فماذا سيفعل المركزي؟ واضح سيبقى بدون عمل ايضا

لا لا لا هذا امر سيء جدا بالنسبة لهذه الاستراتيجة اذن سيقول المسير ساغيرها فاستغلالها للموارد او المصادر غير جيد فلنجرب استراتيجة اخرى

ملاحظة صغيرة : زمن تنفيذ البرنامج = زمن انتهاء التنفيذ - زمن ولادة التنفيذ

اتينا للاستراتيجة الثانية : التجزئة المتعددة او ما تسمى علميا multi programmation :

في هذه الاستراتيجة ما يحدث تماما معاكس لسابقتها فالذاكرة تقسم الى اجزاء ( و هذا بتقنيات محددة سنتطرق اليها باختصار فيما بعد  ;) ) اذن فالبرنامج هو ايضا يقسم الى اجزاء ( و سنعرف تقنيات ذلك باختصار ) و منه نستنتج ان المعالج المركزي و الثانوي لن يتوقفا عن العمل ابدا في حالة عامة ( هذه الاستراتيجية مجهدة بشكل كبير للموارد و الطاقات  :D )

و بالتالي شكل الذاكرة سيكون هكذا 

YpDTtw.png

رااائع تم استغلال الذاكرة باكملها :lol:  و المعالج الرئيسي و الثانوي لم يرتاحا فهما ينتقلان من جزء الى اخر  :rolleyes: و فقط للتنبيه P1 الى P6 ليست برامج باكملها و انما اجزاء من برامج فقط  تم تقسيمها بتقنيات محددة 

حسنا حسنا حان وقت قليل من التفصيل في هذه الاستراتيجية  ;)

لدى المسير خياران في هذه الاستراتيجية و هما 

التجزئة المتعددة الثابتة :

و فيها يقوم المسير بتقسيم الذاكرة الى اجزاء تتساوى سعاتها او تختلف و في معظم الاوقات تختلف سعة كل جزء عن الجزء الاخر ثم يقوم بادراج البرامج من طابور الانتظار الى تلك الاجزاء كل برنامج في جزء يساويه او اكبر منه  و للادراج عنده طريقتين 

الطريقة الاولى و هي الثابتة حيث لكل جزء من الذاكرة طابور انتظار خاص به اي مثلا في الذاكرة عندنا 5 اجزاء مخصصة للبرامج و الاستعمال فسيكون عندنا 5 طوابير انتظار و لادراج برنامج بهذه الطريقة فان المسير يقوم بالمقارنة مع عنصر واحد فقط من الذاكرة اي مقارنة الاحجام ( بالمناسبة ليتم ادراج برنامج في طابور معين فان المسير يستند الى ال @ الابتدائية حتى يقوم بذلك و بصراحة فانا اجهل التفصيلات :blush:  و لمن يعلم فليفدنا كلنا )

و الطريقة الثانية تسمى المتحركة (على ما اظن ) هي طابور واحد فقط لكل الذاكرة اي ان كل البرامج في طابور واحد و لتحميل برنامج الى الذاكرة فان المسير يقوم بمقارنة حجم البرنامج مع جميع احجام الاجزاء الموجودة في الذاكرة و يدرجها في المكان المناسب

و لكي يقوم مسيرنا بمراقبة حالة الذاكرة فانه يستخدم ما يسمى ب جدول PDT أو جدول حالة الاجزاء فيه 3 خانات 

خانة : تبين الوضعية محجوز = 1 او لا  = 0

خانة : فيها حجم البرنامج

خانة : فيها ال @ الابتدائية لموقع البرنامج في الذاكرة

من بين ايجابيات هذا الخيار 

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

السلبيات

وجود الفراغات الداخلية هذه صورة توضح قليلا

sMinfd.png

كما نرى حتى في هذه الاستراتيجية الذاكرة لم تسلم المسكينة فهناك فراغات داخلية لا يمكن استعمالها...امرنا لله فلنحاول بالخيار الثاني  :D

الخيار الثاني...يتبع في موضوع اخر ان شاء الله  :lol:

ارجو من كل من قرأه ان يصحح لي اخطائي و يفيدني بما يعرف حتى ازيل ما أجهل

3

شارك هذا الرد


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

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

عذرا على الازعاج بهذا الرد  -_- ... أنا مبتدئ وليس لدي معلومات كثيرة عن الأنظمة

هل مسير الذاكرة (Memory Manager) برنامج مدرج مع نظام التشغيل ؟ أم أنه برنامج صغير يتواجد على بعض المركبات الفيزيائية للجهاز
( على أحد الرومات في الجهاز) ؟ وهل يمكن المبرمج أن يصنع مسيره الخاص حسب احتياجه ( في الأنظمة المفتوحة المصدر)؟

يقال أن الذاكرة في نظام لينكس تسير بطريقة Tourniquet ... هل هذا يعني أنه جزء من النظام؟ أم هذا له معنى آخر (  لا يقصد فيه مسير الذاكرة ) ...

لدي كثير من الأسئلة التي تخص الأنظمة وددت لو أطرحها  :P ... إن سمحتم !

 

 

والسلام عليكم 
 

 

 

0

شارك هذا الرد


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

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

لا عليك ابدا  ^_^ فانا ايضا مثلك مبتدئة جدا في انظمة التشغيل رغم اني احبها  :lol:

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

اعتقد انه يمكن للمبرمج ان يكتب برنامج لتسيير الذاكرة ففي النهاية مسير الذاكرة هو برنامج فيه استراتيجيات و تقنيات للتسيير و الكود المرفق هو محاكاة لاستراتيجية يستخدمها المسير في حالة التجزئة المتعددة و اسمها FIFO اختصارا ل first in first out  و قد كتبتها بلغة C و ان شئت فانني ايضا املك برنامجا لمحاكاة استراتيجية LRU اختصارا ل least recently used يمكنني ان اطرحها ايضا لكنها ب C هي الاخرى  ... لذلك فانني ارى بانه يمكن للمبرمج ان يبرمج مسيرا للذاكرة لكن ليس بالسهولة المتوقعة و تحتاج للتعمق اكثر في هذا المجال 

بالنسبة لسؤالك الاخير فانا لا اعرف الاجابة فعذرا منك لهذا ... و من يعرف فليتفضل و يفدنا مشكورا 

#include<stdio.h>#include<stdlib.h>typedef struct liste//القائمة الخاصة بسلسلة المرجع{    int a;    struct liste *ptrn;}chaine_ref;typedef struct liste1//القائمة الخاصة بعدد الامكنة المحدد للبرنامج{    int a,age,Dp;//المتغير 1 خاص بمحتوى الخانة و 2 خاص بمدة مكوث جزء البرنامج في تلك الخانة و 3 عدد مرات تحميل الصفحات او اجزاء البرنامج    struct liste *ptrn;}case_memoire;chaine_ref *criation_chaine(chaine_ref *tete,int tpage)//ايجاد سلسلة المراجع{    chaine_ref *p,*n_m;    int x,i=0;    tete=NULL;    p=tete;    while(i!=-1)//شرط التوقف    {        p=(chaine_ref*)malloc(sizeof(chaine_ref));        do        {            printf("entrer le numero de page svp (inferieur a taille de page): ");            scanf("%d",&x);        }while(x>=tpage);        p->a=x;        p->ptrn=NULL;        if(tete!=NULL)            n_m->ptrn=p;        else            tete=p;        n_m=p;        printf("(si vous voulez arriter ecrivez -1) : ");        scanf("%d",&i);    }    return tete;}void aff_chain_ref(chaine_ref *tete)//الدالة الخاصة بطباعة السلسة المرجعية{    chaine_ref *p;    p=tete;    printf("la chaine de reference est :\n");    while(p!=NULL)    {        printf("%d ",p->a);        p=p->ptrn;    }}case_memoire *criation_case(case_memoire *tete,int n)//ايجاد القائمة الخاصة بمحتوايات حصة البرنامج من الذاكرة{    case_memoire *p,*n_m;    int i=0;    tete=NULL;    p=tete;    while(i<n)    {        p=(case_memoire*)malloc(sizeof(case_memoire));        p->a=-1;//قيم ابتدائية للمساعدة        p->age=0;//نفس الشيء        p->Dp=n;//اول قيمة لعدد مرات تحميل صفحات البرنامجو هو عدد الخانات المخصصة للبرنامج في الذاكرة        p->ptrn=NULL;        if(tete!=NULL)            n_m->ptrn=p;        else            tete=p;        n_m=p;        i++;    }    return tete;}case_memoire *nbr_defaut_page(case_memoire *tete)//الدالة التي تحسب عدد مرات تحميل صفحات البرنامج{    case_memoire *p;    p=tete;    while(p!=NULL)    {        p->Dp++;        p=p->ptrn;    }    return tete;}void aff_case_memo(case_memoire *tete,int tpage)//الدالة التي تطبع محتويات حصة البرنامج من الذاكرة{    case_memoire *p;    p=tete;    printf("\n:::::::::::::::::::::::::::::\n");    while(p!=NULL && p->a>=-1 && p->a<tpage && p->age>-1 && p->age<tpage)//شرط طباعة المحتويات لانه في بعض الاحيان عندما تكون هناك خانات متبقية من حصة البرنامج في الذاكرة في المرحلة الاخيرة فانه يظهر محتوى عشوائيو انا لا اريده    {        printf("%d\n",p->a);        p=p->ptrn;    }}case_memoire *mis_a_jour(case_memoire *tete)// الدالة التي تقوم بتحديث مدة مكوث مراجع الصفحات في خانات الذاكرة{    case_memoire *p;    p=tete;    while(p!=NULL)    {         p->age++;         p=p->ptrn;    }    return tete;}int il_est_repeter(case_memoire *tete,int t)// الدالة الجديدة{    case_memoire *p;    int existe=1;    p=tete;    while(p!=NULL && existe==1)    {        if(p->a==t)           existe=0;        else           p=p->ptrn;    }    if(existe==1)       return 1;//القيمة ليست موجودة    else       return 0; // القيمة موجودة}case_memoire *ptr_max(case_memoire *tete,int t,int tpage)//الدالة التي تجد اطول مكوث و تقوم بادراج المرجع الجديد مكانه{    case_memoire *p,*max;    int existe;    p=tete;    max=tete;//متغير لايجاد المكوث الاطول و ياخذ قيمة راس القائمة    while(p!=NULL)    {        if(p->age>=max->age)        {            max=p;            p=p->ptrn;        }        else            p=p->ptrn;    }    existe=il_est_repeter(tete,t);    p=tete;    while(p!=NULL && p!=max && existe==1)// اعود و ابحث عن القيمة المساوية لاكبر مكوث في الذاكرة    {         p=p->ptrn;    }    if(existe==0)    {       return tete;    }    if(p==max && existe==1)//هنا الشرط الثاني لتوقف الحلقة و هو ايجاد قيمة مساوية لاكبر مكوث    {       //if()//اقوم بشرط و هو اختلاف قيمته عن قيمة اول قيمة للسلة المرجعية       {            p->age=0;//اعيد عمره صفرا            p->a=t;//و اسند اول قيمة في الجدول له            tete=nbr_defaut_page(tete);//احسب عدد مرات تحميل الصفحات            aff_case_memo(tete,tpage);//اطبع محتوى الذاكرة        }       tete=mis_a_jour(tete);//ثم اقوم بتحديث فترة مكوث الصفحات في الذاكرة       return tete;    }}chaine_ref *chaine_ref_organizer(chaine_ref *tete,chaine_ref *tete2)//هذه الدالة تقوم بتنظيم السلسلة المرجعية و تحذف القيم المتكررة بشكل متتال مثل 11 او 222 و هكذا{    chaine_ref *P,*Q,*n_m;    int i=0;    P=tete2;    tete=NULL;    Q=tete;    while(P!=NULL)    {        if(P==tete2)            {               Q=(chaine_ref*)malloc(sizeof(chaine_ref));               Q->a=P->a;               Q->ptrn=NULL;               tete=Q;               P=P->ptrn;            }        else        {            if(P->a!=Q->a)            {               Q=(chaine_ref*)malloc(sizeof(chaine_ref));               Q->a=P->a;               Q->ptrn=NULL;               n_m->ptrn=Q;               P=P->ptrn;            }            else                P=P->ptrn;        }        n_m=Q;     }    return tete;}case_memoire *FIFO(chaine_ref *tete,case_memoire *tete2,int n_c,int *t,int l,int tpage)//هذه هي الدالة الخاصة بهذه الاستراتيجية{    chaine_ref *p;    case_memoire *q,*old;    int i=n_c,j=l-n_c;    p=tete;    q=tete2;    //هنا اقوم بملئ الذاكرة بالقيم المرجعية كاول خطوة ثم اتابع تحميل البقية    while(q!=NULL && p!=NULL && i>0)    {        q->a=p->a;        q->age=i;        p=p->ptrn;        q=q->ptrn;        i=i-1;    }    aff_case_memo(tete2,tpage);    //هنا اقوم بحذف القيم التي تم ادراجها في الذاكرة عن طريق ازاحة قيم الجدول بعدد خانات الذاكرة    for(i=0;i<l;i++)        t[i]=t[i+n_c];   //هنا  تأتي المراحل الاخرى و هي تحميل بقية السلسلة المرجعية في الذاكرة    while(j>0)// متغير الحلقة اخذ قيمة ابتدائية هي الفرق بين طول السلسلة المرجعية و عدد خانات الذاكرة لانه يبدأ عمله بع ادراج الدفع الاولى    {        tete2=ptr_max(tete2,t[1],tpage);// انادي الدالة التي تبحث عن اكبر مكوث و تدرج القيمة التالية حيث توابعها هي خانات الذاكرة و جدول السلسلة المرجعية الجديد        for(i=0;i<l-j+2;i++)//احذف القيمة التي تم ادراجها            t[i]=t[i+1];        j--;    }    return tete2;}int chaine_ref_lenth(chaine_ref *tete)//الدالة التي تحسب لي طول السلسة المرجعية بعد تنظيمها{    chaine_ref *p;    int x;    p=tete;    while(p!=NULL)    {        x++;        p=p->ptrn;    }    return x;}//البرنامج الرئيسيmain(){    int n_page,Tpage,nbr_case,Tpgm,i=0,lenth_chaine,Tmc,*t;/*النتغيرات على الترتيب    عدد صفحات البرنامج    حجم الصفحة الواحدة    عدد خانات الذاكرة الخاصة بالبرنامج    حجم البرنامج    متغير لتحريك الحلقة    طول السلسلة المرجعية    حجم الذاكرة    جدول يحمل السلسلة المرجعية المنظمة و تتم عليه عمليات الحذف*/    chaine_ref *tete_chaine,*chaine_referense,*tete_chaine_or,*p;/*قائمة للمراجع قبل و بعد تنظيمها*/    case_memoire *tete_case_memory,*case_memory,*q;/*قائمة الذاكرة*/    do    {        printf("entrer la taille de pgm svp : ");        scanf("%d",&Tpgm);    }while(Tpgm<=0);    do    {        printf("entrer la taille de votre MC svp : ");        scanf("%d",&Tmc);    }while(Tmc<=0);    do    {        printf("entrer la taille de votre page svp : ");        scanf("%d",&Tpage);    }while(Tpage<=0);    n_page=Tpgm/Tpage;//حساب عدد صفحات البرنامج    nbr_case=Tmc/Tpage;//حساب عدد الخانات المخصصة للبرنامج في الذاكرة    printf("\n/ remarque / svp entrez les num de pages, non chaine des adresse...\n\n");    chaine_referense=criation_chaine(tete_chaine,Tpage);    case_memory=criation_case(tete_case_memory,nbr_case);    chaine_referense=chaine_ref_organizer(tete_chaine_or,chaine_referense);    lenth_chaine=chaine_ref_lenth(chaine_referense);    aff_chain_ref(chaine_referense);    aff_case_memo(case_memory,Tpage);    // ايجاد الجدول الخاص بالسلسلة المحرفية تبعا للقائمة المنظمة    t=(int*)malloc(lenth_chaine*sizeof(int));    p=chaine_referense;    while(p!=NULL && i<lenth_chaine)    {        t[i]=p->a;        p=p->ptrn;        i++;    }    case_memory=FIFO(chaine_referense,case_memory,nbr_case,t,lenth_chaine,Tpage);    q=case_memory;    printf("\nle nbr de defaut de page est : %d\n===================================\n",q->Dp);

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

1

شارك هذا الرد


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

موضوع جيد كبداية، بارك الله فيك.

 

 

cache ( لا اعرف مصطلحها العلمي  :blush:  )

الـ cache ليست نوعاً مستقلا و إنما هي ذاكرة بمواصفات معينة، الـ RAM مثلا هي cache للـ processor.

الـ cache memory ببساطة هي ذاكرة تخزين مؤقت، الهدف الأساس منها هو حفظ بيانات بشكل مؤقت بدلا استرجاعها من في كل مرة. تتميز الكاش بالسرعة و صغر الحجم.

بالنسبة للمتصفحات مثلا، تُعتبر الـ cookies و الـ browsing history من أبرز استخدامات الكاش.

 

ملاحظة : حاولي التقليل من استخدام الـ emoticons قدر اإلإمكان عند كتابة مواضيع ذات طابع تعليمي.

 

بالتوفيق.

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

شارك هذا الرد


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

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

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



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

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

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