עבור לתוכן

זיכרון פנימי וזיכרון וירטואלי

Featured Replies

פורסם

חשבתי על משהו ואני לא בטוח

נגיד שאני מפעיל את המחשב והווינדוס עלה

אם אני יוציא את הזיכרונות המחשב לא יוכל להשתמש בזיכרון וירטואלי בלבד?

פורסם

תגיד לי אתה רציני?

אתה יודע מה תנסה ותגיד לנו מה קורה ... ::)

פורסם

יש לי רעיון

אולי תנסה ואחרי שתקנה מחשב חדש תודיע לנו

פורסם

חבר שלי הוציא את הכרטיס מסך מתי שהמחשב פעל

שרף לו חלק מהלוח

פורסם

אי אפשר להקטין את הזיכרון כשהמחשב פועל, מערכת ההפעלה תקרוס.

גם אם זה היה אפשרי, המחשב שלך היה מתפקד בערך באלפית מהמהירות הנורמלית שלו.

פורסם

"זכרון וירטואלי" הוא המונח לתאר מערכות זכרון מבוססות MMU.

הסבר קצר:

בוא נתאר את המצב הבא. רצות שתי תוכנות על המחשב. התוכנות, כדרכן של תוכנות, אינן מודעות אחת לקיומן של השניה.

אז איך, לעזאזל, הן יתחלקו בזכרון? נניח שתוכנה אחת תחליט שהיא רוצה את כתובת X, מי אמר שהתוכנה השניה לא תרצה את כתובת X גם היא?

מה שעושים הוא כזה: כל תוכנה שרצה רואה את הזכרון כאילו כולו שלה - ואף יותר זכרוון מהזכרון הפיזי, למעשה. בX86 (אינטל, AMD) התוכנה רואה

מרחב זכרון בן 4 ג'יגהבייט, ללא קשר לכמות הזכרון הפיזי שבמחשב (כך שגם אם אבא נתן לך עונש כי נכשלת במתמטיקה, ושבר לך על הראש את שני המודול GOLDEN DRAGON CAS-EMO, ונשארת עם 32 מגהבייט בלבד שגנבת מהמחשב של המזכירה בבית ספר, עדיין התוכנות שלך יחשבו שהן עובדות עם מרחב זכרון של 4 ג'יגהבייט).

נניח שהעלית עכשיו את "שולה המוקשים", ואיתו יחדיו העלית אקספלורר בשביל לראות פורנו. כל אחד מאלו יקבל 4 גיגה של זכרון! יחדיו, זה 8 גיגה של זכרון!

איך, אתה בוודאי צורח וחובט בראשך במקלדת מולטימדיה איכותית? איך? אין לך את הזכרון הזה, הרי! יש לך 32 מגה! GANGBANG! GANGBANG!

כאן המקום לומר שהזכרון הוירטואלי נקרא "וירטואלי" משום שהוא, נכון, לא קיים. אין כזה זכרון. אלו רק כתובות, ולא יותר.

הRAM של המחשב הוא הזכרון הפיזי.

מה שקורה הוא שעל הCPU, קיים רכיב בשם MMU (באופן מאוד.. יצירתי, MEMORY MANAGEMENT UNIT).

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

הדפים הללו יכולים להיות ממופים לדפים (בגודל זהה כמובן) של הזכרון הפיזי. התוכנה עדיין רואה את כל מרחב הזכרון כשלה,

אך רק הדפים בהם היא משתמשת בעצם תופסים בזכרון הפיזי של המחשב.

נניח ששולה המוקשים והאקספלורר מבקשים איזור 1K בזכרון (באמצעות ()malloc), בכתובת 0. מה שיקרה הוא שהדף הראשון בזכרון הוירטואלי של שולה המוקשים ימופה לכתובת 0 בזכרון הפיזי,

ואילו הדף הראשון בזכרון הוירטואלי של האקספלורר ימופה לכתובת 4000 בזכרון הפיזי (למה 4000? כי זה הדף הבא, הרי הם בגודל של 4K).

כך שתי התוכנות יחשבו שזכרון 0 הוא שלהן, אך לא ידרסו זו את זו, מאחר ובזכרון הפיזי הן בכתובות שונות.

לכל תוכנה שרצה, אם כך, יש טבלאות תרגום דפים משלה, שמכילות את הכתובות הוירטואליות, ולאן הן מובילות בכתובות הפיזיות.

ועוד נקודות:

אם תעשו חשבון, תראו שבשביל מחשב שמריץ, נניח, 30 תהליכים שונים, מדובר בכמות עצומה של טבלאות דפים שיש לשמור.

כמובן שזכרון בCPU הוא דבר יקר, ולא נבזבז ככה סתם טרנזיסטורים על הMMU בשביל להגדיל את הטבלאות שלו (במיוחד לא אם אפשר לנצל את הטרנזיסטורים

האלו בשביל להוסיף קאש, ולקרוא למעבד שלנו משהו-EXTREME...  :lol: ).

היחידה שבה מבוצעים תרגומי הדפים שמוזכרים לעיל (מכתובת וירטואלית לכתובת פיזית) קרויה הTLB (או בשפת אימנו, TRANSLATION LOOKASIDE BUFFER),

והיא מעין CACHE. הTLB אינו גדול, לפחות לא גדול מספיק בשביל להכיל את כל טבלאות הדפים של התהליכים השונים במערכת.

מצד שני, הTLB מספק תרגום מאוד מהיר - למעשה, תוך CYCLE אחד, כלומר לא מורגש, וזה מאוד הגיוני בהתחשב בכך שכמעט כל פעולה במעבד

עוברת דרכו.

אם כך, אנו צריכים בעצם מקום לשמור בו את טבלאות הדפים של כל התהליכים. ואת זה נעשה, מן הסתם, בRAM של המחשב.

לכן, מערכת ההפעלה צריכה לעבוד בצורה מאוד צמודה עם הMMU, ולטעון לתוך הTLB רק את טבלאות הדפים שבהן ישנו שימוש תכוף.

כאשר כתובת מסויימת נדרשת על ידי אחד התהליכים, ולא קיימת בTLB לתרגום מיידי, מתבצע תהליך שנקרא PAGE FAULT, שבו הMMU מסמן למערכת ההפעלה,

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

לתוך הTLB. כמובן שאז היא צריכה להוציא טבלה כלשהי מהTLB, ועל כן משתמשים באלגוריתמים שמזכירים במעט אלגוריתמי ניהול של CACHE (באופן הכי פשטני,

משתמשים בLRU - LEAST RECENTLY USED מסוג כלשהו, כלומר הטבלה האחרונה שבוצע בה שימוש תעוף מהTLB ובמקומה תכנס הטבלה הנדרשת).

מה קורה בעצם, אם התהליכים שבמערכת משתמשים ביותר זכרון ממה שיש לנו בזכרון הפיזי? האם נצרח? האם נקלע לפאניקה? האם נתניע מסור מכאני,

ונצא לרחוב בשביל לראות האם חלקי גופות נראים יותר טוב במציאות מאשר בDOOM3 בULTRA HIGH QUALITY? לא ולא  ;D

במקום זה, מה שיקרה הוא שמערכת ההפעלה תמצא את הדף הפיזי שבו נעשה השימוש הפחות ביותר, תכתוב אותו להרד דיסק, ותתן לתוכנה שביקשה זכרון לתפוס את מקומו.

כשהתוכנה שהדף שלה "ירד" להרד דיסק תבקש אותו שוב, יתרחש PAGE FAULT שבסופו יובא הדף מההרד דיסק בחזרה לתוך הRAM.

וזה מה שאתם מכירים כSWAPPING.

ומה קורה, למשל, אם תוכנה ביקשה גישה לזכרון הוירטואלי, ואותו זכרון וירטואלי מעולם לא מופה לכתובת פיזית (כלומר, לא היה ()malloc)?

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

ואז תופיע על המסך הקלאסיקה, "יישום זה ביצע פעולה לא חוקית והוא יסגר". ואז היישום, שביצע פעולה לא חוקית, יסגר.

כבונוס למנגנון, רק מערכת ההפעלה יכולה לגשת לטבלאות הדפים, וזה מה שקרוי KERNEL MODE.

תוכנות נמצאות בUSER MODE, שרואה רק זכרון וירטואלי, ולא יכול לגשת כלל לניהול הMMU (כך שוירוס שתקף אפליקציה כלשהי, לא יוכל לגשת לזכרון של אפליקציה אחרת).

זהו, בערך  :xyxthumbs:

פורסם

WOW

תודה על ההסבר

לימד אותי הרבה

פורסם

הסבר מעולה. כל הכבוד, לימד אותי המון. צריך לשמור את זה כאן בתור מדריך לפי דעתי.

פורסם

ישך' את זה :xyxthumbs:

פורסם

כל הכבוד על ההסבר :xyxthumbs:

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים