זכרון וירטואלי

eyal the one

New member
זכרון וירטואלי

הי אני קורא וקורא וכאילו משהו חסר לי: נניח שיש לי מרחב כתובות פיסיות של 500 מגה ( RAM ), ולצורך הפשטות יש לי רק תוכנה אחת שמתחילה ישר מכתובת הבסיס. התוכנה צורכת 1 ג'יגה כלומר יש צורך בזכרון וירטואלי שכידוע נמצא על ה harddisk. עכשיו נניח התוכנה רוצה לפנות לכתובת 800. פיסת הזכרון נמצאת על ההארדדיסק. מה בעתם קורא, עכשיו? האם פיסת הזכרון עולה ל ram? נניח שכן, איך אחרי זה המעבד ידע, שפיסת הזכרון היא על ה ram כבר ולא בהארדדיסק, יש איזשהוא מיפוי? איפה הוא מוחזק?
 

eyal the one

New member
לא , אני מכיר paging

למדנו את כל התאוריה על זה אני יכול לדקלם לך אלגוריתמים LRU rubin.., הבעיה היא שאני לא מבין איך זה מתבצע בפועל, מבחינת רכיבי המחשב. איך הוא יודע, אם זה נמצא על ההארדדיסק או על ה ram? כשהוא פונה לכתובת נניח 786, איזה תהליך בעצם מתבצע?
 

MotiAd

New member
או קיי...

בכצם כמו שאתה כבר יודע העסק מתבצע עם דפים. אז ככה, אתה בעצם בונה טבלה שמציינת מיפוי לכתובת אמיתית (תוכנה ניגשת לערך והמעבד ממיר את הערך לכתובת האמיתית בזיכרון וכו'). לכל ערך נשמר המידע האם הוא זמין בזיכרון או בדף. אם כן הדבר מאוד פשוט והמידע נשלף. במידה והוא לא קיים, מתרחשת פסיקה של PageFault שאם תשתמש בוינדוס ותציג את המידע של כמה פעמים כל תוכנה גרמה לפסיקה הזאת אתה תראה שהערך יכול להגיע לאלפים אפילו. ברגע שהפסיקת מערכת הזאת מתבצעת המע"ה יודעת שהדף לא קיים בזיכרון וטוענת אותו למקום מסויים ומציינת שהערך בטבלה שמפנה אליו כבר מראה "קיים". ככה זה עובד.
 

eyal the one

New member
רגע

א. מה זה דף, זה קבוצה של הרבה bytes עוקבים? ב. בטבלה יש מיפוי של הכתובת הלוגית שהמעבד צריך, המיפוי חייב להכיל גם מיפוי לכתובת על ההארדדיסק וגם לכתובת בram, כי גם אם זה בram,הכתובות הרי שונות זה לא הכתובת האמיתית שהיתה אמורה להיות ב ram. ג. אני מבין שהפניה היא לכתובת הבסיס של הדף + היסט?, ל byte המתאים? ד. ניתן לפנות ל byte בודד, נכון? ה. איפה נמצאת המפה הזו, ב cash? ו. כל פעם שהמעבד רוצה לפנות, הוא חייב לעבור דרך המפה? תודה רבה רבה מראש
 

DadleFish

New member
תשובות

א. כן. ב. לא בהכרח. לכל PAGE ידוע מיקומו האמיתי ב-RAM, או בקובץ ה-SWAP, ומצד שני ידוע מיקומו בזיכרון הוירטואלי. ככה אפשר לשייך בין כתובת X בזכרון הוירטואלי לבין כתובת Y ב-RAM. ג. איזו פניה? באיזה מודל זכרון? מתי? זה משתנה. תלוי באיזו ארכיטקטורה מדובר. ד. שוב, זה תלוי בארכיטקטורה. אם המעבד מאפשר גישה ועבודה ברמה של בייט בודד, אז כן. ה. לא בהכרח, זה תלוי במערכת ההפעלה. אל תשכח שמי שמנהל את כל המנגנון זה מערכת ההפעלה (אגב, זה cache ולא cash). ו. כן.
 

eyal the one

New member
אלדד

בבקשה , תסביר לי שוב את ב', מה זאת אומרת ל page ידוע מקומו האמיתי, הרי אם כבר הגעתי ל page אז אני מסודר, השאלה היא איך אני מוצא אותו. בטבלת ה swap יש מיפוי , לפי איך שאני מבין את הדברים, אז גם אם הבלוק נמצא בהארד דיסק וגם אם הוא נמצא כבר בram ה swap חייב לדעת היכן הוא נמצא. יתרה מזה, נניח יש pagefault נוצר מיפוי חדש ל ram במקום ל הארדדיסק. מה? המעבד שוב פעם צריך לעבור דרך המפה בשביל למצוא את המיקום ב ram? חוץ מזה אני מדבר על אפליקציית windows,32bit עד כמה שאני יודע 32 מתיחס לגודל מילה, כלומר ל registery. אבל זה לא אומר שאני לא יכול לפנות לbyte בודד. זה רק אומר שבסך הכתובות יכול ליהיות 4 ג'יגה, 2 בחזקת 32. אני צודק? שוב תודה אייל
 

gilad_no

New member
אייל,

את המיפוי לא אתה מבצע. מערכת ההפעלה מבצעת בשבילך. מבחינתך, אתה עובד במוד שטוח - ליישום שלך יש מרחב כתובות של 4GB. נניח שכל PAGE הוא 1024 בתים. היישום שלך רוצה לגשת למשתנה שנמצא ב500: מערכת ההפעלה טוענת את הדף הראשון (נקרא לו A) ומחזירה לך מצביע למשתנה בתוך אותו דף שכרגע נטען לזיכרון. עכשיו נניח שאתה רוצה לגשת למשתנה ב600. מערכת ההפעלה מגלה שדף A כבר בזיכרון והוא מכיל את 0-1024. היא לא טוענת אותו שוב אלא ישר מחזירה לך מצביע. אם היית מבקש משהו ב2000, מערכת ההפעלה הייתה טוענת את הדף הבא (ודוחקת את A בתור) ומחזירה לך מצביע חדש. אם עכשיו שוב היית מבקש משהו מהדף הראשון, היא הייתה מחזירה אותו לראש התור (אין צורך לטעון אותו מהדיסק כי הוא עדיין בזיכרון) ומחזירה לך מצביע נוסף. מה שבעצם קורה זה שלמערכת ההפעלה יש מספר מוגבל של דפים שהיא יכולה להחזיק בו זמנית. הדפים ממוינים לפי השימוש בהם. דף שלא משתמשים בו הרבה זמן, יידחק בסופו של דבר לסוף התור ואז יחזור לדיסק. דפים שמשתמשים בהם הרבה, יזוזו כל פעם מחדש לראש התור ולא יעברו דרך הדיסק (וכך יישמרו ביצועים גבוהים - אין צורך בהעברות לדיסק)
 

MotiAd

New member
../images/Emo45.gif ותוספת ספציפית...

במעבדים שאתה עובד אליהם (איכס 86) גודל של דף יכול להיות או 4 קילו או 4 מגה. זה מה שהמעבד מאפשר לך. עכשיו אתה יכול לחשב כמה דפים יכולים להיות. כל העסק הזה מסודר בצורה של עץ. למה הכוונה? יש לך את האפשרות ליצור לכל תהליך במערכת רשימת דפים שרק הוא יודע עליה ורואה. בטבלה שלו יהיו כל הדפים שהוא מכיר והם יכולים להיות או בגודל 4 קילו או מגה. כמו כן קיים עץ או רשימה גדולה יותר של אילו טבלאות קיימות במערכת/מעבד. כלומר העץ הוא כביכול בעל 3 רמות (שורש - רשימת הטבלאות, בןא' - טבלה של רשימת הדפים, בןלבןא' דפים).
 

eyal the one

New member
גלעד תודה, אבל

אלה בדיוק הדברים שאני כבר יודע, מה שיותר מעניין אותי זה ה level היותר נמוך. נניח שאני צריך כתובת מתוך אמצע page. אני אחדד את שאלותי בקשר לזה: א. האם ניתן לפנות ל byte בודד בזיכרון ולשים אותו ברג'יסטרי במע' של 32 ביט? או שבכל מקרה ב bus יעברו 4 byte? ב. איפה נמצאת הטבלה הזו? האם היא נמצאת ב ram , האם יש טבלאות שונות עבור כל תהליך? ג. וזה הכי מעניין אותי, איך המידע רשום בטבלה? איך היא רושמת לדוגמא שבלוק A שלוגית מכוון לכתובת 500, נמצא למעשה בכתובת פיסית בRAM של 2000 ומה אם זה נמצא בכלל בהארדדיסק? אם המיפוי הוא ל 2000, איך יודעים עם זה 2000 של RAM או 2000 של harddisk?
 

gilad_no

New member
כמה דברים,

כמו שכבר אמרו, מבחינתך *כמתכנת*, זה הכל שקוף. לא מעניין אותך אם המידע שלך נמצא באמת בזיכרון או בדיסק. אתה ניגש אליו ומערכת ההפעלה מחליטה מה הכי טוב בשבילה (ובשבילך). אם ממש מעניין אותך המימוש (בקוד מקור), תוריד את הקרנל של לינוקס ותחקור את הPAGING שלו. כדי ללמוד ספציפית על המימוש של חלונות, תבדוק בספר INSIDE WINDOWS 2000 (עד כמה שזכור לי - אולי אני טועה בשם). יש שם פירוט מלא של הכל.
 

eyal the one

New member
גלעד , התרשמתי ממך כתכנת מעמיק

אני בטוח שאתה בעצמך לא מסכים עם הגישה של "מבחינתך *כמתכנת*, זה הכל שקוף", באותה מידה היית יכול לטעון שאין צורך לדעת מה זה paging כי התהליך שקוף לי. אני מניח שאם הייתי שואל שאלות lowlevel בתחומים יותר מוכרים לך, היית שמח לענות. בכל אופן אני מעריך את עזרתך. תודה.
 

gilad_no

New member
לא הבנת אותי,

או שאני לא הבנתי אותך. היה לי הרושם כי רצית לדעת איך לשלוט בתהליך הPAGING (ולכן אמרתי שזה תלוי במערכת ההפעלה ושקוף מבחינתך). אם השאלות שלך מתמקדות יותר סביב ידע כללי (כמו שאמרת - LOWLEVEL), מה שהסתבר לי רק עכשיו, אז עניתי לך: תבדוק את הקוד של לינוקס - זה יהיה מקור הרבה יותר מעמיק וברור מאשר כל תשובה כאן בפורום. ולגבי ההערה הצינית - אני תמיד שמח לענות. גם בתחומים שאני פחות שולט בהם, אני יכול לנסות לכוון אותך למקורות מידע וזה לא קשור במידת הכרותי עם הנושא.
 

eyal the one

New member
גלעד, לא הערתי שום דבר ציני

אתה יכול אולי בכל זאת לנסות? א. האם ניתן לפנות ל byte בודד בזיכרון ולשים אותו ברג'יסטרי במע' של 32 ביט? או שבכל מקרה ב bus יעברו 4 byte? ב. איפה נמצאת הטבלה הזו? האם היא נמצאת ב ram , האם יש טבלאות שונות עבור כל תהליך? ג. וזה הכי מעניין אותי, איך המידע רשום בטבלה? איך היא רושמת לדוגמא שבלוק A שלוגית מכוון לכתובת 500, נמצא למעשה בכתובת פיסית בRAM של 2000 ומה אם זה נמצא בכלל בהארדדיסק? אם המיפוי הוא ל 2000, איך יודעים עם זה 2000 של RAM או 2000 של harddisk? וכן זה לידע כללי.
 

eyal the one

New member
וגם..

כשאומרים 32 bit , מדברים רק על הרג'יסטרי, נכון? אני אסביר מה לא מובן לי. הרג'יסטרי כאשר הוא ב 32 ביט, מאפשר מרחב כתובות של 4 ג'יגה כי יש בערך 4 ג'יגה אפשרויות שונות לסידורים שונים. אבל אז לפי מה שאני מבין יש 4 ג'יגה כתובות שונות שניתן לפנות אליהן, כלומר ניתן לפנות לכל בייט בודד. מצד שני קראתי במקום אחר שבכל מקרה התעבורה היא של 4 בייט, כלומר לא נקרא בייט ספציפי, אלא 4 בבת אחת, אם כך לפי חישוב פשוא רגיסטרי קטן יותר היה מספיק לייצוג הכתובות. איך בעצם אני מיישב את הסתירה הזו?
 

vinney

Well-known member
מה זה רג'יסטרי?

32 ביטים כוללים את הדף עליו אתה מסתכל והיסט בתוך הדף. ההצבעה היא באמת בדיוק של בית בודד, אתה יכול לקחת 4 בתים בפקודת MOV אחת לכל היותר (בארכיטקטורת 32 ביט של PC הנוכחיים), אבל אם זכרוני אינו מטעה אותי, אסמבלר של PC/INTEL מאפשר לעשות MOV לבית בודד. ומה הקשר לרג'סטרי ? התלבלבת במושגים נראה לי.
 

eyal the one

New member
סליחה ../images/Emo13.gif התכוונתי כמובן לרגיסטר

וכן יש בו 32 ביטים ולכן הוא יכול להכיל בתוכו 4 ג'יגה כתובות שונות ולכן אני מניח שהוא יכול לפנות לבייט בודד. מה שכן על ה bus נלקחים כל פעם 4 בייט. אז מה? אם אני מבקש בייט אחד אני מקבל מתנה גם 3 נלווים? ופשוא קוד המכונה בוחר שלא להתיחס אליהם? תודה
 

DecayCell

New member
זה לא משנה מה עובר על הבאס

אני מניח שעוברים 4 בייטים בכל קריאה, ולו בגלל שזה יותר פשוט ליישם זאת בחומרה - אבל אני בכלל לא בטוח בכך. לאוגר שלך תגיע רק כמות הנתונים שביקשת - אם הפעלת הוראת mov על אוגר של 16 ביט, שני הבייטים האלו בלבד ישתנו.
 

vinney

Well-known member
לא היה לי ספק לרגע ../images/Emo13.gif

ואני חושב שעל ב BUS באמת עוברים 4 בתים בכל קריאה, והמעבד מתעלם מהביטים הלא נחוצים. זה הכי הגיוני מבחינת יעילות, על כל פנים.
 
למעלה