הערה: בשאלה זו, מתייחסים רק לדפים/מסגרות של מרחב המשתמש ומטמון הדפים. נתונה התוכנית הבאה ומניחים שהקובץ a.txt לא נפתח לפני שהתחלנו לבצע תוכנית זו:
Full original question text (raw OCR)
שאלה 2 - זיכרון וירטואלי (25 נק') הערה: בשאלה זו, מתייחסים רק לדפים/מסגרות של מרחב המשתמש ומטמון הדפים. נתונה התוכנית הבאה ומניחים שהקובץ a.txt לא נפתח לפני שהתחלנו לבצע תוכנית זו: 1. int fd = open(“a.txt”, O_RDWR); 2. char* a = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_PRIVATE, fd, 0); 3. int x = a[10]; 4. a[10] = 'a'; 1. (5 נקודות) בהתייחס לקוד שלמעלה, כמה מסגרות חדשות מוקצה אחרי כל פקודה וכמה חריגות דף,נמקו ? מספר שורה מספר חריגות דף מספר מסגרות חדשות נימוק 1 2 3 4 2. (6 נקודות) כעת מוסיפים קריאת המערכת ()fork אחרי שורה 1, כמה מסגרות חדשות מוקצות אחרי כל פקודה, וכמה חריגות דף ? הערה: רשמו עבור כל שורה סה"כ החריגות/מסגרות מ-2 התהליכים 1. int fd = open(“a.txt", O_RDWR); 2. fork(); 3. char* a = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_PRIVATE, fd, 0); 4. int x = a[10]; 5. a[10] = 'a'; מספר שורה מספר חריגות דף מספר מסגרות חדשות נימוק 1 2 3 4 5 3. (2 נקודות) בהתייחסות לקוד שלמעלה (עם ה-fork), תוכן ה-TLB נפסל בהחלפת ההקשר בין האב לבן: תשובה: נכון / לא נכון נימוק: כעת, משנים את הקריאה ל- mmap להקצות זיכרון אנונימי: 1. int fd = open(“a.txt”, O_RDWR); 2. char* a = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); 3. read(fd, a, 4096); 4. int x = a[10]; 5. a[10] = 'a'; 4. (6 נקודות) בהתייחסות לקוד שלמעלה, כמה מסגרות חדשות מוקצה אחרי כל פקודה וכמה חריגות דף? מספר שורה מספר חריגות דף מספר מסגרות חדשות נימוק 1 2 3 4 5 5. (6 נקודות) כעת מוסיפים את ה-fork, כמה מסגרות חדשות מוקצה אחרי כל פקודה, וכמה חריגות דף? הערה: רשמו עבור כל שורה סה״כ החריגות/מסגרות מ-2 התהליכים 1. int fd = open(“a.txt”, O_RDWR); 2. char* a = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); 3. read(fd, a, 4096); 4. fork(); 5. int x = a[10]; 6. a[10] = 'a'; מספר שורה מספר חריגות דף מספר מסגרות חדשות נימוק 1 2 3 4 5 6
int fd = open(“a.txt”, O_RDWR); char* a = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_PRIVATE, fd, 0); int x = a[10]; a[10] = 'a'; בהתייחס לקוד שלמעלה, כמה מסגרות חדשות מוקצה אחרי כל פקודה וכמה חריגות דף,נמקו ? (Table for lines 1-4)
Hard link vs symlink inode behaviorכעת מוסיפים קריאת המערכת ()fork אחרי שורה 1, כמה מסגרות חדשות מוקצות אחרי כל פקודה, וכמה חריגות דף ? הערה: רשמו עבור כל שורה סה"כ החריגות/מסגרות מ-2 התהליכים int fd = open(“a.txt
fork/exec address-space semanticslibc syscall wrapper caching pitfallsHard link vs symlink inode behaviorבהתייחסות לקוד שלמעלה (עם ה-fork), תוכן ה-TLB נפסל בהחלפת ההקשר בין האב לבן: תשובה: נכון / לא נכון נימוק:
fork/exec address-space semanticslibc syscall wrapper caching pitfallsVirtual-to-physical address translationint fd = open(“a.txt”, O_RDWR); char* a = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); read(fd, a, 4096); int x = a[10]; a[10] = 'a'; בהתייחסות לקוד שלמעלה, כמה מסגרות חדשות מוקצה אחרי כל פקודה וכמה חריגות דף?
Hard link vs symlink inode behaviorכעת מוסיפים את ה-fork, כמה מסגרות חדשות מוקצה אחרי כל פקודה, וכמה חריגות דף? הערה: רשמו עבור כל שורה סה״כ החריגות/מסגרות מ-2 התהליכים int fd = open(“a.txt”, O_RDWR); char* a = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); read(fd, a, 4096); fork(); int x = a[10]; a[10] = 'a';
fork/exec address-space semanticslibc syscall wrapper caching pitfallsHard link vs symlink inode behavior
The exam question — original PDF
pages 6, 7, 8, 9Exactly 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.
inodes & *stat syscalls • lstat(2) – Exactly the same as stat(2) if applied to a hard link – But if applied to a symlink, would return the information of this symlink (not to the target of the symlink) – In this case, POSIX says that the only fields within the stat structure that you can portably use are: • st_mode which will specify that the file is a symlink • st_size symlink content length (= length of target filepath) – The value of the rest of the fields could be valid, but it is not specified by POSIX – Notably, it is not specified if a symlink has a corresponding inode • Will be discussed shortly OS (234123) - files 34
אחרי fork()parentint main() { int x = 0; pid_t p = fork(); if (p == 0) { x = 1; } else { x = 2; }}sonint main() { int x = 0; pid_t p = fork(); if (p == 0) { x = 1; } else { x = 2; }}מערכות הפעלה - תרגול 210
הדפסה מתואמת למסךשימוש ב-wait() יכול לפתור את הבעיה שראינו קודם כאשר מדפיסים למסך במקביל משני תהליכים:int main() { pid_t p = fork(); if (p > 0) { // parent waits for child wait(NULL); } printf(“hello”); return 0;}מערכות הפעלה - תרגול 215
קריאות המערכת 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
בלינוקס יש שני סוגי קישורים (links)soft / symbolic linkln -s src dstקישור סימבולי הוא קובץ חדש עם inode נפרד מזה של הקובץ המקורי.כתיבה דרך הקישור כותבת לקובץ אליו הוא מצביע.מחיקת הקישור (באמצעות הפקודה rm) לא תמחק את הקובץ המוצבע.אפשר ליצור קישורים סימבוליים גם לקובץ שלא קיים.hard linkln src dstקישור קשיח הוא שם נרדף לקובץ המקורי כי הוא מצביע ישירות ל-inode של הקובץ המקורי.כתיבה דרך הקישור כותבת לקובץ אליו הוא מצביע.מחיקת הקישור תקטין את מונה הקישורים של הקובץ (כפי שנשמר ב-inode).הקובץ יימחק מהדיסק רק כאשר כל ה-hard links אליו יימחקו.מערכות הפעלה - תרגול 1213
>> rm /A/helloמערכות הפעלה - תרגול 1219inode #2type=dirdatanameinode #A5B7inode #5type=dirdatanameinode #…………inode #13type=soft_linkdatainode #7type=dirdatanameinode #soft13……data block/A/helloקישור "שבור"!dangling link
The exam text, the skills it tests, and the exact slides are already in context.