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

חשוב לדעת שאין רשימה רשמית של שאלות. מה שכתוב כאן מבוסס על הנושאים הנלמדים בדרך כלל בהכנה לשאלון ועל סגנון השאלות שנפוץ בו, ואפשר להשתמש בו כדי לבנות הבנה יציבה שתעבוד גם על שאלות שלא ראיתם קודם.
למה מערכות הפעלה נמצאות בשאלון בכלל
סייבר הוא במידה רבה הבנה של השכבות שמתחת לאפליקציה. מי שחוקר תוכנה זדונית, מנתח קריסה או מחפש פרצה חייב לדעת איך תהליך נוצר, איך הוא מקבל זיכרון ומי מחליט מתי הוא רץ.
לכן השאלות בנושא הזה הן לרוב קצרות אך דורשות חשיבה. אפשר לפתור אותן רק אם יש בראש מודל ברור של המערכת, ולא בעזרת ניחוש חכם.
תהליכים, חוטים ומעבר הקשר
תהליך (Process) הוא תוכנית שרצה, עם מרחב זיכרון משלה. חוט (Thread) הוא יחידת ריצה בתוך תהליך, וחוטים באותו תהליך חולקים זיכרון. זו הבחנה שחוזרת בהרבה שאלות, במיוחד בשאלות על שיתוף נתונים ועל בעיות סנכרון.
בכל רגע תהליך נמצא באחד ממצבים: מוכן, רץ או ממתין. כשמערכת ההפעלה מחליפה בין תהליכים היא מבצעת מעבר הקשר (Context Switch): שומרת את מצב התהליך הנוכחי וטוענת את מצב התהליך הבא. למעבר כזה יש מחיר, ולכן תדירות גבוהה מדי שלו פוגעת בביצועים.
תזמון תהליכים: מי רץ עכשיו ולמה
המתזמן (Scheduler) בוחר איזה תהליך מוכן יקבל את המעבד. הגישות הקלאסיות שכדאי להכיר הן FCFS (הראשון שהגיע נשרת ראשון), SJF (הקצר ביותר קודם), Round Robin (כל תהליך מקבל פרוסת זמן קבועה) ותזמון לפי עדיפות.
לכל גישה יש חיסרון שחוזר בשאלות. ב-FCFS תהליך ארוך יכול לעכב את כולם. ב-SJF תהליכים ארוכים עלולים לא לרוץ לעולם, מצב שנקרא הרעבה (Starvation). בתזמון לפי עדיפות אפשר לפתור הרעבה באמצעות Aging, כלומר העלאת עדיפות של תהליך שממתין זמן רב.
דוגמה לחישוב
נניח שלושה תהליכים שמגיעים יחד בזמן 0 בסדר הזה: P1 צריך 6 יחידות זמן, P2 צריך 3 ו-P3 צריך 1. ב-FCFS זמני ההמתנה הם 0, 6 ו-9, ולכן הממוצע הוא 5. ב-SJF הסדר הוא P3, P2, P1 וזמני ההמתנה הם 0, 1 ו-4, ממוצע של כ-1.67.
ב-Round Robin עם פרוסת זמן של 2 יחידות, P3 מסיים בזמן 5, P2 בזמן 8 ו-P1 בזמן 10. זמן המתנה הוא זמן סיום פחות זמן ריצה, כלומר 4 עבור P1, 5 עבור P2 ו-4 עבור P3, ממוצע של כ-4.33. שימו לב שהתשובה תלויה באלגוריתם ולא רק בנתונים, וזה בדיוק מה ששאלה טובה בודקת.
זיכרון וירטואלי ו-Paging
זיכרון וירטואלי נותן לכל תהליך אשליה של זיכרון רציף ופרטי משלו. בפועל מערכת ההפעלה מחלקת את המרחב הווירטואלי לדפים (Pages) בגודל קבוע, ואת הזיכרון הפיזי למסגרות (Frames) באותו גודל. טבלת דפים (Page Table) מתרגמת בין השניים.
כתובת וירטואלית מורכבת ממספר דף ומהיסט (Offset) בתוך הדף. אם גודל דף הוא 4KB, כלומר 2 בחזקת 12, ההיסט תופס 12 סיביות. בכתובת של 32 סיביות נשארות 20 סיביות למספר הדף, ולכן יש עד 2 בחזקת 20 רשומות בטבלה.
דוגמה לתרגום כתובת
הכתובת הווירטואלית 0x3A7C עם דפים של 4KB היא דף מספר 3 עם היסט 0xA7C. אם טבלת הדפים מצביעה על מסגרת פיזית מספר 9, הכתובת הפיזית תהיה 0x9A7C. ההיסט אף פעם לא משתנה בתרגום, ורק מספר הדף מוחלף במספר המסגרת.
כדי לא לפנות לטבלת הדפים בכל גישה, המעבד משתמש במטמון תרגומים קטן שנקרא TLB. פגיעה ב-TLB חוסכת גישה נוספת לזיכרון, ולכן שאלות על זמן גישה ממוצע מבוססות לרוב על שיעור הפגיעות בו. הסבר בסיסי על Page Fault תמצאו במאמר על מבחנים לדוגמה בגאמא סייבר.
Page Fault ואלגוריתמי החלפת דפים
Page Fault קורה כשתהליך פונה לדף שאינו נמצא כרגע בזיכרון הפיזי. מערכת ההפעלה טוענת את הדף מהדיסק, ואם אין מסגרת פנויה היא חייבת לפנות דף אחר. הבחירה של הדף שיפונה נקבעת באלגוריתם החלפה, ואלה שנפוצים בשאלות הם FIFO ו-LRU.
FIFO מפנה את הדף שנכנס ראשון, ו-LRU מפנה את הדף שלא היה בשימוש הכי הרבה זמן. במחרוזת הגישות 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5 עם FIFO מתקבלים 9 Page Faults כשיש 3 מסגרות ו-10 כשיש 4 מסגרות. זו התופעה הידועה בשם Belady, שבה הוספת זיכרון דווקא מגדילה את מספר ה-Faults. היא מופיעה ב-FIFO אך לא ב-LRU.
Deadlock: כשכולם מחכים לכולם
Deadlock הוא מצב שבו קבוצת תהליכים תקועה לצמיתות, וכל אחד מהם מחזיק משאב שאחר צריך וממתין למשאב שמישהו אחר מחזיק. הדוגמה הקלאסית היא שני חוטים ושני נעילות: חוט אחד נועל את A ואז מבקש את B, והשני נועל את B ואז מבקש את A.
כדי שיקרה Deadlock צריכים להתקיים ארבעה תנאים בו זמנית: הדרה הדדית, החזקה והמתנה, היעדר הפקעה וקיום מעגל המתנה. שאלות רבות מבקשות לזהות איזה תנאי נשבר בפתרון מסוים. למשל, קביעת סדר קבוע לנעילת משאבים שוברת את מעגל ההמתנה.
מעבר למניעה יש שתי גישות נוספות: הימנעות, כמו אלגוריתם הבנקאי שבודק אם מצב הוא בטוח לפני שמקצה משאב, וזיהוי עם התאוששות. כדאי להכיר את ההבדל ביניהן כי שאלות אוהבות לערבב אותן.
סנכרון ו-Race Condition
כששני חוטים ניגשים לאותו משתנה ולפחות אחד מהם כותב, התוצאה תלויה בסדר הריצה. מצב כזה נקרא Race Condition. דוגמה קלאסית היא שני חוטים שמגדילים מונה משותף: כל אחד קורא את הערך, מוסיף אחד וכותב בחזרה, ואם הפעולות משתלבות, אחת העדכונים הולכת לאיבוד.
הפתרון הוא נעילה. Mutex מאפשר לחוט אחד בלבד להיכנס לקטע קריטי בכל רגע, ו-Semaphore הוא מונה שמגביל כמה חוטים ייכנסו במקביל. שאלות רבות משלבות אותם עם Deadlock, כי נעילה לא נכונה היא בדיוק מה שיוצר אותו.
מחסנית וערימה: איפה חיים המשתנים
לכל תהליך יש שני אזורי זיכרון עיקריים לנתונים. המחסנית (Stack) מחזיקה משתנים מקומיים וכתובות חזרה של פונקציות, והיא מנוהלת אוטומטית. הערימה (Heap) מיועדת להקצאות דינמיות, וגודלן וחייהן נקבעים על ידי התוכנית.
ההבחנה הזו חשובה גם לסייבר. כתיבה מעבר לגבול של מערך במחסנית יכולה לדרוס כתובת חזרה, וזו אחת הפרצות הוותיקות ביותר. מי שמבין את המבנה מסוגל להסביר למה זה קורה ואיך מונעים את זה.
Thrashing: כשהמערכת עסוקה רק בלהחליף דפים
כשהזיכרון הפיזי קטן מדי ביחס לצרכים של התהליכים, המערכת מבלה את רוב זמנה בטעינה ובפינוי דפים ומתקדמת מעט מאוד בעבודה עצמה. מצב כזה נקרא Thrashing. סימן ההיכר שלו הוא שיעור גבוה מאוד של Page Faults לצד ניצול נמוך של המעבד.
הפתרון הוא להקטין את מספר התהליכים הפעילים או להוסיף זיכרון. שאלה טיפוסית תציג נתוני ניצול ותבקש לזהות את המצב, ולכן כדאי לזכור את הצירוף של פעילות דיסק גבוהה ומעבד ממתין.
איך מתרגלים מערכות הפעלה בצורה נכונה
הטעות הנפוצה היא לקרוא הסברים ולהרגיש שהבנתם. הדרך הבדוקה יותר היא לפתור על דף, שלב אחר שלב, ולהסביר לעצמכם בקול למה כל תשובה נכונה ולמה האחרות לא.
אחרי שפתרתם ידנית, כתבו סימולציה קצרה בפייתון של Round Robin או של החלפת דפים ובדקו שהתוצאה זהה. כך מתרגלים גם קוד וגם חשיבה, ורואים במו עיניים איך האלגוריתם מתנהג כשמשנים פרמטר. ואם טעיתם, חזרו לשאלה כעבור כמה ימים ופתרו אותה שוב מאפס.
איך אקדמיית המתכנתים מסייעת בהכנה
הקורס להכנה לגאמא סייבר באקדמיית המתכנתים בנוי מ-10 פרקי ליבה, ובהם Windows, Linux, רשתות, הצפנות ופייתון. הלימוד מתקיים ב-30 מפגשי לייב עם מרצה בוגר יחידה, לצד מתרגל אישי צמוד עד סוף י״ב.
בנוסף, התלמידים מתרגלים מעל 500 סימולציות ומקבלים מפת דרכים אישית, כך שאפשר לראות בדיוק אילו נושאים, כמו מערכות הפעלה, עדיין דורשים חיזוק.
שאלות נפוצות בנושא שאלות מערכות הפעלה בשאלון גאמא סייבר
האם צריך לדעת מערכות הפעלה לעומק כדי להצליח בשאלון?
לא צריך ידע אקדמי מלא, אבל כן הבנה יציבה של המושגים המרכזיים: תהליכים, תזמון, זיכרון וירטואלי וסנכרון. השאלות בודקות הבנה ויכולת חישוב, ולא שינון של פרטים טכניים.
מה ההבדל בין Paging לזיכרון וירטואלי?
זיכרון וירטואלי הוא הרעיון: לכל תהליך יש מרחב כתובות משלו, שיכול להיות גדול מהזיכרון הפיזי. Paging היא אחת הטכניקות שמממשות אותו, על ידי חלוקה לדפים ולמסגרות בגודל קבוע.
האם תמיד יש שאלות חישוב בנושא הזה?
לא תמיד, אבל שאלות חישוב הן נפוצות, בעיקר בתזמון תהליכים, בתרגום כתובות ובספירת Page Faults. מי שמתרגל את שלושת סוגי החישוב האלה מכסה חלק גדול מהשאלות.
איך יודעים שמצב מסוים הוא Deadlock ולא סתם המתנה?
בודקים אם קיים מעגל המתנה שבו כל תהליך מחכה למשאב שמוחזק על ידי חבר אחר במעגל, ואם אף אחד מהם לא יכול להתקדם בלי לקבל את המשאב. המתנה רגילה מסתיימת כשהמשאב מתפנה, ו-Deadlock אינו מסתיים בעצמו.
מוכנים לתרגל מערכות הפעלה ועוד תחומים בשיטה מסודרת, עם מרצה בוגר יחידה? אפשר לקרוא על התוכנית המלאה בעמוד קורס ההכנה לגאמא סייבר של אקדמיית המתכנתים.
לקבלת ייעוץ משפטי מקצועי בנושא זה, צרו קשר עם אקדמיית המתכנתים.