מילון מונחים ל-Low Level ומחשבים - איך המחשב באמת עובד מתחת למכסה המנוע¶
כל עוד אתם כותבים קוד בפייתון או בג'אווהסקריפט, המחשב מסתיר מכם כמעט הכל. אבל ברגע שיורדים רמה, ל-C, לאסמבלי, או סתם מנסים להבין למה התוכנית קורסת, צץ אוצר מילים שלם שאף אחד לא טרח להסביר. המילון הזה אוסף את המושגים הכי חשובים ב-Low Level, בעברית פשוטה, עם דוגמה קונקרטית לכל אחד.
חומרה בסיסית¶
מעבד - CPU
זה החלק שמבצע את הפקודות בפועל, מיליארדי פעמים בשנייה. כשאתם מריצים לולאה שסופרת עד מיליון, המעבד הוא זה שבפועל מחבר, משווה וקופץ בין הוראות.
זיכרון גישה אקראית - RAM
המקום שבו נשמרים הנתונים והתוכניות שרצות כרגע, בניגוד לדיסק שאיטי אבל קבוע. ה-RAM מהיר, אבל נמחק כשמכבים את המחשב. כשפותחים דפדפן עם עשרים לשוניות, כולן יושבות ב-RAM כדי שהמעבד יוכל לגשת אליהן מהר.
זיכרון מטמון - L1/L2/L3 - Cache
זיכרון קטן וממש מהיר שיושב קרוב פיזית למעבד, ושומר עותק של נתונים שנעשה בהם שימוש לאחרונה. L1 הכי קטן והכי מהיר, L3 הכי גדול והכי איטי מבין השלושה. כשהמעבד צריך משתנה שכבר נגע בו לפני רגע, יש סיכוי טוב שימצא אותו במטמון במקום לחכות ל-RAM.
רגיסטר - Register
תא זיכרון זעיר בתוך המעבד עצמו, שמחזיק ערך יחיד שהמעבד עובד איתו ממש עכשיו. אין דבר מהיר יותר מגישה לרגיסטר. כשהמעבד מחבר שני מספרים, שניהם קודם נטענים לרגיסטרים ורק אז מבוצע החיבור.
אפיק - Bus
הערוץ הפיזי שדרכו המעבד, הזיכרון והרכיבים האחרים מעבירים ביניהם נתונים ופקודות, כמו כביש שמחבר בין שכונות המחשב.
תדר שעון - Clock Speed
הקצב שבו המעבד "מתקתק" ומבצע פעולות, נמדד בגיגה-הרץ. תדר גבוה יותר לא תמיד אומר מהירות אמיתית גבוהה יותר, כי זה תלוי גם כמה עבודה נעשית בכל תקתוק.
זיכרון וניהולו¶
ביט ובייט - Bit/Byte
ביט הוא היחידה הקטנה ביותר של מידע במחשב, אפס או אחד. בייט הוא קבוצה של שמונה ביטים, והיחידה הבסיסית שבה בדרך כלל מודדים ומאחסנים נתונים. אות אחת בטקסט אנגלי תופסת בדרך כלל בייט אחד.
בינארי והקסדצימלי - Binary/Hex
בינארי הוא ייצוג מספרים בבסיס 2, בעזרת אפסים ואחדים בלבד, וכך המחשב "חושב" בפועל. הקסדצימלי הוא בסיס 16 שמשמש כקיצור נוח יותר לבני אדם לכתיבת ערכים בינאריים ארוכים, כמו כתובת זיכרון בסגנון 0x1A3F.
מצביע - Pointer
משתנה שלא שומר ערך בעצמו, אלא את הכתובת בזיכרון שבה נמצא הערך האמיתי. במקום להעביר עותק שלם של נתונים גדולים, מעבירים רק את הכתובת שלהם. בשפת C, כתיבה כמו int *p = &x יוצרת מצביע שמצביע על הכתובת של המשתנה x.
מחסנית מול ערימה - Stack vs Heap
המחסנית היא אזור זיכרון מסודר שמנוהל אוטומטית, ובו נשמרים משתנים מקומיים וקריאות לפונקציות, בסדר של אחרון נכנס ראשון יוצא. הערימה היא אזור גמיש יותר, שבו המתכנת מבקש ומשחרר זיכרון באופן ידני, למשל דרך malloc. משתנה רגיל בתוך פונקציה יושב על המחסנית, ומבנה נתונים גדול שנוצר דינמית יושב על הערימה.
זיכרון וירטואלי - Virtual Memory
שכבת הפשטה שמערכת ההפעלה יוצרת, ובה כל תוכנית "חושבת" שיש לה גישה לכל טווח הזיכרון לבדה, גם אם בפועל היא משתפת RAM פיזי מוגבל עם תוכניות אחרות. זו הסיבה שתוכניות שונות יכולות להשתמש באותה כתובת "וירטואלית" בלי להתנגש אחת בשנייה.
Segmentation Fault
שגיאה שקורית כשתוכנית מנסה לגשת לאזור זיכרון שאין לה הרשאה אליו, למשל דרך מצביע שגוי או שכבר שוחרר. מערכת ההפעלה עוצרת את התוכנית מיד כדי למנוע נזק. דוגמה קלאסית היא מצביע שמצביע ל-NULL וניסיון לקרוא ממנו ערך.
תוכנה שמדברת עם החומרה¶
אסמבלי - Assembly
שפת תכנות ברמה נמוכה מאוד, שבה כל שורה מתארת בערך פקודה אחת שהמעבד מבצע, כמו "טען ערך לרגיסטר". היא צמודה לארכיטקטורה הספציפית של המעבד, ולכן תוכנית באסמבלי עבור x86 לא תרוץ כמו שהיא על ARM.
קוד מכונה - Machine Code
הייצוג הבינארי הסופי של תוכנית, סדרת אפסים ואחדים שהמעבד קורא ומבצע ישירות. אסמבלי הוא בעצם כתיב קריא יותר לבני אדם של קוד מכונה, עם התאמה כמעט אחד לאחד בין השניים.
קומפיילר מול אינטרפרטר - Compiler vs Interpreter
קומפיילר לוקח את כל הקוד שלכם ומתרגם אותו מראש לקוד מכונה, ורק אחר כך מריצים את הקובץ המתורגם. אינטרפרטר קורא ומבצע את הקוד שורה אחרי שורה בזמן ריצה, בלי שלב תרגום נפרד מראש. C היא שפה שעוברת קומפילציה, בעוד פייתון בדרך כלל מתפרשת.
ארכיטקטורת סט הפקודות - ISA
ה"שפה" הבסיסית שמעבד יודע לדבר, כלומר קבוצת הפקודות שהוא יכול לבצע ואופן הקידוד שלהן. קוד מכונה שנכתב לארכיטקטורה אחת לא ירוץ על ארכיטקטורה אחרת.
Endianness
קובע באיזה סדר בייטים נשמר מספר רב-בייטי בזיכרון. ב-Little Endian הבייט הכי פחות משמעותי נשמר ראשון, וב-Big Endian הבייט הכי משמעותי נשמר ראשון. כשמעבירים נתונים בינאריים בין מערכות שונות, טעות בסדר הבייטים הופכת מספר תקין לזבל.
x86 מול ARM
שתי משפחות ארכיטקטורות מעבד נפוצות, עם סטי פקודות שונים לגמרי. x86 נפוצה במחשבים ניידים ושרתים מסורתיים, ו-ARM שלטת בטלפונים וגם הפכה נפוצה יותר במחשבים בזכות יעילות אנרגטית. מעבדי Apple Silicon מבוססים על ARM, ורוב מחשבי Windows הישנים מבוססים על x86.
תהליכים ומערכת ההפעלה¶
קרנל - Kernel
הליבה של מערכת ההפעלה, החלק שמדבר ישירות עם החומרה ומנהל גישה אליה עבור כל שאר התוכניות. כל בקשה לקרוא קובץ, להקצות זיכרון או לשלוח נתונים ברשת עוברת דרכו, בהרשאות הכי גבוהות במערכת.
תהליך מול תהליכון - Process vs Thread
תהליך הוא תוכנית שרצה עם מרחב זיכרון משלה, מבודד משאר התהליכים. תהליכון הוא "זרם ביצוע" שרץ בתוך תהליך, ומשתף זיכרון עם תהליכונים אחרים באותו תהליך. דפדפן יכול להריץ כל טאב כתהליך נפרד, ובתוך כל טאב להריץ כמה תהליכונים במקביל.
החלפת הקשר - Context Switch
הפעולה שבה המעבד עוצר תהליך שרץ, שומר את המצב המלא שלו, וטוען את המצב של תהליך אחר כדי להריץ אותו. כך מערכת ההפעלה יוצרת אשליה של ריבוי משימות גם על מעבד עם מספר מוגבל של ליבות, על ידי קפיצה מהירה מאוד בין תהליכים.
קושחה - Firmware
תוכנה קבועה שמוטמעת ישירות בחומרה, ומריצה את הפעולות הבסיסיות ביותר של המכשיר עוד לפני שמערכת ההפעלה בכלל עולה. בנתב הביתי שלכם, למשל, הקושחה היא שמריצה את כל הלוגיקה הבסיסית של הניתוב.
BIOS/UEFI
שני סוגים של קושחה שרצה ברגע שמדליקים מחשב, עוד לפני שמערכת ההפעלה נטענת, ותפקידם לזהות את החומרה ולהעביר שליטה לטעינת מערכת ההפעלה. UEFI הוא הממשק המודרני שהחליף בהדרגה את ה-BIOS הישן, ותומך בדיסקים גדולים יותר ואבטחה משופרת.
מושגים כאלה נשמעים מפחידים בהתחלה, אבל הם בסך הכל מתארים איך מחשב אמיתי בנוי משכבות שמסתירות זו את זו. אם אתם רוצים להבין את זה לעומק, עם תרגול אמיתי ולא רק הגדרות יבשות, מוזמנים להעיף מבט בקורס ליבת המחשב החינמי שלנו, שמיועד בדיוק למי שרוצה להפסיק לפחד מהמושגים האלה.