# מערך שיעור: מערכת הפעלה ו-Terminal<no value>

**משך:** יום לימוד מלא — 6 שעות אקדמיות (270 דקות).

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

**בסוף השיעור הסטודנטים צריכים:**

1. להסביר את חמשת התפקידים של מערכת ההפעלה ואת ההבדל בין Program ל-Process.
2. להבחין בין נתיב מלא לנתיב יחסי, ולהסביר למה `FileNotFoundError` קורה כשמריצים מהתיקייה הלא נכונה.
3. לנווט, ליצור, להעתיק, להעביר ולמחוק קבצים מה-Terminal בלי עכבר.

**דגש קריטי:** **Current Working Directory**. זה המושג שימנע הכי הרבה תקלות בשבועות הבאים (קבצים, JSON, Database). כל הדגמה ביום הזה צריכה לחזור אליו.

---

## מהלך השיעור

| חלק בשיעור | משך | הערות ודגשים |
|---|---|---|
| חזרה קצרה על נושא המחשב ומערכת ההפעלה | 15 דק' | 3 שאלות לכיתה: RAM מול Storage, מהו PID, Syntax מול Runtime. |
| מהי מערכת הפעלה + Kernel | 40 דק' | אנלוגיית מנהל הבניין. ציור שכבות: Hardware → Kernel → Programs. להדגים `PermissionError` אמיתי. |
| Program מול Process + Scheduling + זיכרון | 45 דק' | `worker.py` בשני Terminals במקביל. לראות PID שונים ו-counter נפרד. Task Manager / `Get-Process`. |
| הפסקה | 15 דק' | |
| File System, נתיבים, משתמשים והרשאות | 50 דק' | לצייר עץ תיקיות על הלוח. `paths_lab.py`: להריץ משתי תיקיות שונות ולתת לכיתה לנחש. |
| הפסקה | 15 דק' | |
| Terminal ו-Shell | 55 דק' | טבלת PowerShell/Bash על הלוח. "מרוץ תיקיות" בזוגות. להדגיש `Tab` ו-`↑` מההתחלה. |
| תרגול עצמאי + בדוק את עצמך | 35 דק' | Mini Project: `project_check.py`. לשים לב לחזרות בקוד, זה גשר ל-DRY בנושא Python. |

---

## דגשים להעברת השיעור

- **לא להפוך את היום להרצאה תיאורטית.** כל מושג (Process, זיכרון, הרשאה) מקבל הדגמה חיה של דקה-שתיים.
- **Terminal = שריר.** הסטודנטים צריכים להקליד הרבה. עדיף פחות פקודות שכל אחד הריץ חמש פעמים מאשר טבלה ענקית שרק הוצגה.
- **אזהרת `rm`** בקול ובבירור: אין סל מחזור. להראות את ההרגל "ls לפני rm".
- **Windows/Mac:** חשוב שכל סטודנט ידע מה ה-Shell שלו. ב-Windows לוודא שה-Terminal של VS Code פותח PowerShell ולא cmd.
- **לא להעמיק ב-ACL של Windows או ב-chmod.** המטרה היא הבנת הרעיון של Read/Write/Execute ובעלים, לא ניהול הרשאות.
- **לחזור על ה"למה":** כל פעם ש-Python "מבקשת" משהו מה-OS, להשתמש במילה System Call, כדי שתתקבע.
- **Mini Project מכוון לחזרתיות.** כשמישהו מתלונן "זה ארוך ומשעמם", להגיד: "בדיוק! בשבוע הבא נלמד איך לא לכתוב ככה".

---

## מושגים

| מושג | הסבר קצר |
|---|---|
| Operating System | התוכנה שמנהלת את משאבי המחשב ומספקת שירותים לתוכנות. |
| Kernel | הליבה המוגנת של ה-OS. רצה ב-Kernel Mode. |
| User Mode / Kernel Mode | הרשאות מוגבלות לתוכנות / גישה מלאה לחומרה. |
| System Call | בקשה של תוכנה מה-Kernel לבצע פעולה מוגנת. |
| Program / Process | קובץ סטטי / מופע רץ עם PID, זיכרון ומצב. |
| Scheduler | רכיב ב-Kernel שמחלק זמן CPU בין תהליכים. |
| Memory Isolation | כל תהליך ניגש רק לזיכרון שלו. |
| Swap / Page File | שימוש בדיסק כהמשך ל-RAM כשהוא מתמלא. איטי. |
| File System | ארגון הדיסק כעץ של תיקיות וקבצים, עם Metadata. |
| Absolute / Relative Path | נתיב מהשורש / נתיב מהתיקייה הנוכחית. |
| Current Working Directory | התיקייה ש-Process "עומד" בה. נתיבים יחסיים נמדדים ממנה. |
| Permissions (r/w/x) | קריאה, כתיבה, הרצה. לפי בעלים, קבוצה ואחרים. |
| Terminal / Shell / Prompt | חלון / מפרש פקודות / הטקסט שמחכה לפקודה. |

---

## תרגיל חשיבה

**שאלת פתיחה (לפני חלק File System):** "יש לי קובץ `data.txt` ליד הסקריפט שלי. כשאני מריץ עם כפתור Run ב-VS Code, הסקריפט אומר שהקובץ לא קיים. כשאני מריץ מה-Terminal, הוא מוצא אותו. איך ייתכן שאותו קוד מתנהג אחרת?"

**מהלך:**

1. לאסוף השערות (באג ב-VS Code? הקובץ לא נשמר?).
2. להריץ מול הכיתה את שתי הדרכים עם `print(os.getcwd())` בתחילת הקוד.
3. לגלות יחד שכפתור Run מריץ לפעמים מתיקיית הפרויקט הראשית (`kodkod6`), ולא מתיקיית הקובץ.
4. לשאול: "אז ממה נמדד נתיב יחסי?" ולהגיע ל-Current Working Directory.

**מה המרצה מראה בסוף:** ציור של עץ התיקיות, עם חץ "אני עומד כאן" שזז בין `kodkod6` ל-`week-1`, ואיך אותו נתיב יחסי `data.txt` מצביע פעם על קובץ קיים ופעם על כלום. משפט סיום: "כשקובץ 'לא נמצא', השאלה הראשונה היא: מאיפה הרצתי?"
