נתונה התוכנית הבאה: 1. #define N 100*1024*1024; 2. int a[N]; 3. 4. int main() { 5. if (fork() > 0) { // parent 6. wait(NULL); 7. } else { // child 8. printf("Bye!\n”); 9. } 10. return 0; 11. } יובל, שהיה קצת מבולבל מכל החומר שהוא ספג במהלך הקורס, לא זכר מדוע משתמשים במנגנון COW. לכן הוא שינה את קוד הגרעין של לינוקס וביטל את מנגנון COW, כך שקריאת המערכת fork מעתיקה מיד את כל איזורי הזיכרון הנגישים לכתיבה מתהליך האב לתהליך הבן. לאחר מכן יובל השווה בין: • (T(COW = זמן הריצה של התכנית הנ"ל במערכת ההפעלה המקורית, עם מנגנון COW. • (T(NO - COW = זמן הריצה של התכנית הנ"ל במערכת של יובל, ללא מנגנון COW. כדי להוריד את רעש המדידה, יובל הקצה שתי ליבות מעבד באופן אקסלוסיבי לשני התהליכים, האב והבן, כך שהם ירוצו ללא עיכובים מיותרים. כעת נתונה התוכנית הבאה: 1. #define N 100*1024*1024; 2. int a[N]; 3. 4. int main() { 5. if (fork() > 0) { // parent 6. wait(NULL); 7. } else { // child 8. for (unsigned int i = 0; i < N; ++i) { 9. a[i] = 1; 10. } 11. } 12. return 0; 13. }
Full original question text (raw OCR)
שאלה 4 - זיכרון וירטואלי (25 נק')
(5 נק') מהי סדרת האירועים אשר מתרחשת כאשר תוכנית ניגשת לכתובת זיכרון וירטואלית ומפעילה את מנגנון copy-on-write? a. TLB miss → page table walk → page fault b. TLB hit → page table walk → page fault c. page fault → page table walk → TLB miss d. page fault → page table walk → TLB hit e. page table walk → TLB miss → page fault f. page table walk → TLB hit → page fault נמקו:
Virtual-to-physical address translationCopy-on-write fork memory protectionPage fault error code classification(5 נק') כמה חריגות דף (page faults) יוצר תהליך הבן מתחילתו ועד סופו (שורות 7--10)? הניחו כי כל קריאות המערכת מצליחות. a. 0, בגלל שמנגנון COW חוסך את כל העתקות הזיכרון מהאב לבן. b. לפחות 1, בגלל ניסיון כתיבה של הבן למחסנית המשתמש שלו. c. לפחות 1, בגלל ניסיון כתיבה של הבן למחסנית הגרעין שלו. d. לפחות 1, בגלל ניסיון כתיבה של הבן לערימה שלו. e. אולי 0 ואולי יותר, תלוי במספר ההחטאות ב-TLB. f. אולי 0 ואולי יותר, תלוי בתזמון היחסי בין תהליך האב לתהליך הבן. נמקו:
libc syscall wrapper caching pitfallsVirtual-to-physical address translationCopy-on-write fork memory protectionPage fault error code classification(5 נק') באיזה מערכת זמן הריצה יהיה קצר יותר, ומדוע? T(COW) > T(NO-COW) .a בגלל שמעתיקים פחות זיכרון מהאב לבן. T(COW) <T(NO-COW).b בגלל שמעתיקים פחות זיכרון מהאב לבן. .בגלל שמספר חריגות הדף קטן יותר T(COW) > T(NO-COW) C .בגלל שמספר חריגות הדף קטן יותר T(COW) < T(NO-COW).d T(COW) > T(NO-COW).е בגלל שתהליך האב יכול לרוץ במקביל לתהליך הבן. T(COW) < T(NO-COW).f בגלל שתהליך האב יכול לרוץ במקביל לתהליך הבן. נמקו:
libc syscall wrapper caching pitfallsCopy-on-write fork memory protection(5 נק') כמה חריגות דף (page faults) יוצר תהליך הבן מתחילתו ועד סופו (שורות 7--12)? בחרו את התשובה הקרובה ביותר מבין הבאות (אנחנו מתעניינים בסדר גודל ולא תשובה מדויקת). הניחו כי כל קריאות המערכת מצליחות. 1.1024 .a 10.1024.b 100.1024 .C 1024 1024 .d 101024 1024 .e 1001024 1024 .f נמקו:
libc syscall wrapper caching pitfallsPage fault error code classification(5 נק') יובל חזר על תהליך המדידה שתואר קודם גם עבור התכנית החדשה. באיזה מערכת זמן הריצה יהיה קצר יותר, ומדוע? T(COW) > T(NO-COW) .a בגלל שמעתיקים פחות זיכרון מהאב לבן. T(COW) <T(NO-COW) .b בגלל שמעתיקים פחות זיכרון מהאב לבן. .בגלל שמספר חריגות הדף קטן יותר T(COW) > T(NO-COW).C .בגלל שמספר חריגות הדף קטן יותר T(COW) <T(NO-COW) .d T(COW) > T(NO-COW).е בגלל שתהליך האב יכול לרוץ במקביל לתהליך הבן. T(COW) < T(NO-COW).f בגלל שתהליך האב יכול לרוץ במקביל לתהליך הבן. נמקו:
libc syscall wrapper caching pitfallsCopy-on-write fork memory protection
The exam question — original PDF
pages 14, 15, 16Exactly as it appears on the exam paper.
Built from these components
Ordered basic → advanced. Master the earlier ones first.
Review the material
Read these before you answer — each verified slide teaches a component this question tests, and nothing from an unrelated topic is included. Tutorial slides show the actual slide image.
On-demand paging & readahead • On-demand paging rpt – OS maps / reads page from disk into DRAM only if/when the process attempts to access it for the first time (and, hence, a page fault occurs) – That is, OS pages-in data only via page faults (+ prefetching; see below) – Thus, a process begins execution with most pages “unmapped”, possibly not residing in physical memory (executable code included), and page faults occur until its pages are placed in in DRAM & mapped – Also called “ lazy” loading – What’s the benefit? Reading/mapping is costly, & with demand-paging we only read what we need • Notice: on-demand allocation also works rpt – For anonymously mmap-ed / (s)brk-ed memory • Readahead prefetching (anticipatory paging) – read() does prefetching when identifying sequential access – The page fault handler does the same when doing on-demand paging • Complements demand-paging in an attempt to minimize page faults OS (234123) - virtual memory 33
Reminder: x86 paging Need to translate from: virtual addresses to: physical addresses Translation is cached on-chip TLB (Translation Lookaside Buffer) Page table is read & modified by HW (Access/dirty bit) Each process has its own virtual address space Page table pointed to by CR3 register During context switch the OS updates the value of CR3. Page table is a hierarchical structure OS – virtualization 23
קריאות המערכת getpid(), getppid()pid_t getpid();קריאת מערכת המחזירה לתהליך הקורא את ה-pid של עצמו.pid_t getppid();קריאת מערכת המחזירה את ה-PID של תהליך האב של התהליך הקורא.שאלה: מה המשמעות של getppid() == 1 עבור תהליך משתמש טיפוסי?תשובה: תהליך האב הוא init. קורה למשל אם תהליך הבן יתום.מערכות הפעלה - תרגול 222
טבלת הדפים (page table)לכל תהליך יש טבלת דפים משלו – מבנה נתונים אשר ממפה בין דפים למסגרות.ניתן לממש טבלת דפים באמצעות מבני נתונים שונים: מערך פשוט, עצים, טבלאות גיבוב (hash tables), ...עבור כל דף במרחב הזיכרון הווירטואלי של התהליך, יש כניסה בטבלת הדפים אשר מציינת:האם הדף נמצא בזיכרון ובאיזו מסגרת?האם הדף נמצא בדיסק ובאיזה מיקום?האם הדף מעולם לא הוקצה? (כלומר איננו בזיכרון ואיננו בדיסק)טבלת הדפים אחראית לתפקידים נוספים כמו הגנת גישה.למשל: טבלת הדפים מסמנת דפים לקריאה בלבד ומונעת גישות כתיבה.19מערכות הפעלה - תרגול 10
סיכום: תהליך התרגום במעבדי אינטל39the CPU searches the TLBhitmissthe CPU walks the page tablecompletedpage faultphysical addressvirtual addressthe OS serves the page faultמערכות הפעלה - תרגול 10
סיכום השיעור שעבר2the CPU searches the TLBhitmissthe CPU walks the page tablecompletedpage faultphysical addressvirtual addressthe OS serves the page faultמערכות הפעלה - תרגול 10
מה נלמד היום?3the CPU searches the TLBhitmissthe CPU walks the page tablecompletedpage faultphysical addressvirtual addresskill the process or the entire systemfix the page table and retrythe OS serves the page faultinvalidvalidמערכות הפעלה - תרגול 10
הרשאות של אזור זיכרוןהדגלים המציינים את הרשאות האזור נשמרים בשדה vm_flags והם מאפשרים לגרעין לסווג גישות חוקיות ולא חוקיות לדפים באזור.VM_READ, VM_WRITE, VM_EXEC – האם מותר לקרוא/לכתוב/לבצע נתונים בדפים באזור.VM_MAYREAD, VM_MAYWRITE, VM_MAYEXEC – "הרשאת הרשאה" לכל אחת מההרשאות הנ"ל.לדוגמה VM_MAYWRITE קובע האם מותר להדליק את VM_WRITE.הדגלים האלה קשורים לקריאת המערכת mprotect() – מעבר לחומר הקורס.VM_SHARED – האם צריך לשתף דפים באזור זה עם תהליכי בן.VM_LOCKED – אסור לפנות את הדפים באזור מהזיכרון לדיסק.17מערכות הפעלה - תרגול 10
מרחבי זיכרון וקריאות מערכתחוטים הנוצרים ע"י קריאת המערכתclone() משתפים את מרחב הזיכרון ע"י הצבעה לאותו מתאר מרחב הזיכרון של תהליך האב.יש להגדיל את מונה השיתוף (mm_users) של מתאר מרחב הזיכרון של תהליך האב.קריאת המערכת execv() ודומותיה טוענות תהליך חדש ולכן הן משחררות את מרחב הזיכרון ומקצות אחד חדש.קריאת המערכתfork() מקצה לתהליך הבן מרחב זיכרון משלו.במקרה שכזה צריך להעתיק את מרחב הזיכרון של האב לזה של הבן.בפועל, בדרך-כלל אין באמת העתקה בזכות מנגנון copy-on-write.23מערכות הפעלה - תרגול 10
הפתרון: copy-on-write (COW)הרעיון של מנגנון copy-on-write (COW) הוא:דפים הניתנים לכתיבה שאינם יכולים להיות משותפים (לדוגמה, המחסנית), מוגדרים בתחילה כמשותפים אבל מועתקים לעותק פרטי כאשר אחד התהליכים השותפים (האב או הבן) מנסה לכתוב אליהם לראשונה.שאר הדפים (כדוגמת דפי קוד או דפי נתונים לקריאה בלבד) הופכים למשותפים בין מרחבי הזיכרון של האב והבן.מנגנון COW פותר את שתי הבעיות שהוצגו קודם:COW מקטין את זמן הביצוע של fork() כי הוא "פורס לתשלומים" את ההעתקה של כל מרחב הזיכרון להרבה העתקות קטנות בגודל דף שיתבצעו בעתיד---בכל כתיבה ראשונה לדף שאינו משותף.במידה ותהליך הבן יבצע מיד execv(), מרחב הזיכרון שלו יימחק וכך תיחסך רוב פעולת ההעתקה.27מערכות הפעלה - תרגול 10
father processpage tablememory regionsדוגמה: לפני קריאת מערכת fork()28…PTE #11r/w = 1…frame #250count == 1מערכות הפעלה - תרגול 10region #1VM_MAYWRITE=1VM_WRITE=1region #2
father processpage tablememory regionsדוגמה: אחרי קריאת מערכת fork()30…PTE #11r/w = 0…son processpage tablememory regions…PTE #11r/w = 0…מערכות הפעלה - תרגול 10frame #250count == 2region #1VM_MAYWRITE=1VM_WRITE=1region #2region #1VM_MAYWRITE=1VM_WRITE=1region #2
COW: טיפול ב-page faultתרחיש הטיפול: האב או הבן מנסים לכתוב לדף מוגן ע"י COW.המעבד ניגש לסיביות הבקרה ב-PTE של הדף, ומגלה כי r/w כבוי.המעבד יוצר חריגת דף (page fault).הגרעין מטפל בחריגה, ובודק שהדף שייך לאחד מאזורי הזיכרון ושהגישה בכלל חוקית (דגל VM_WRITE דלוק במתאר האזור).הגרעין בודק את ערך המונה השיתוף של המסגרת:אם count > 1, מקצים מסגרת חדשה, מעתיקים אליה את המסגרת המקורית, ומצביעים את הדף למסגרת החדשה.במסגרת הישנה מבוצע count-- .במסגרת החדשה מוצב count = 1 .בעותק החדש מאופשרת הכתיבה.אחרת (count == 1), הגרעין פשוט מאפשר כתיבה בדף ע"י הדלקת הדגל r/w.37מערכות הפעלה - תרגול 10
חריגת דף (page fault)החומרה מתריעה באמצעות חריגת דף על:גישה לדף שאינו נמצא בזיכרון, כלומר הביט present==0 בכניסה המתאימה בטבלת הדפים.גישה לא חוקית (שלא לפי ההרשאות בטבלת הדפים) לדף שנמצא בזיכרון, למשל ניסיון כתיבה לדף שמותר לקריאה בלבד.חריגת דף מפעילה את שגרת הטיפול הממומשת בפונקציית הגרעין do_page_fault().בסיום הטיפול בחריגה מבוצעת מחדש ההוראה שגרמה לה.אלא אם כן, כמובן, הטיפול בחריגה הורג את התהליך.43מערכות הפעלה - תרגול 10
The exam text, the skills it tests, and the exact slides are already in context.