בסעיף מדעי המחשב, סמפור (Semaphore; בעברית: אתת) הוא מנגנון לסנכרון תהליכים שפועלים במקביל. מטרתו לפתור את בעיית המניעה ההדדית, מניעה ששני תהליכים ישנו בו זמנית את אותו משאב משותף.
הסמפור הוא הרחבה של מנעול. ערכו הוא מספר שלם אי־שלילי. סמפור בינארי יכול לקבל רק 0 ו־1, ולכן פועל כמו מנעול רגיל. המנגנון הומצא על ידי אדסחר דייקסטרה באמצע שנות ה־60 ומשמש ברבים ממערכות ההפעלה.
כשכמה תהליכים (תהליך = תוכנית שרצה במחשב) משתפים משאב, הם עלולים לשנות אותו בו־זמנית. כדי למנוע זאת מגדירים "קטע קריטי", חלק קוד שיש להבטיח שרק תהליך אחד ירוץ בו בכל רגע.
ניסיונות לפתור זאת באמצעות לולאת המתנה (while) מובילים לבזבוז זמן מעבד. גם שימוש ברכיב חומרה שנותן סדרה אטומית של פקודות חסם חלק מהבעיות, אך עדיין עלול לגרום לבזבוז מעבד.
הפתרון הנפוץ הוא סמפור, מעין דגל שהמערכת שולטת בו. כשתהליך רוצה לשנות את הדגל הוא מבקש זאת ממערכת ההפעלה. אם הדגל תפוס, המערכת מעבירה את התהליך למצב שינה (השהיה), ולא מבזבזת מעבד. כשהדגל משוחרר, המערכת מעירה את התהליך באמצעות פסיקה.
בצד החיובי, כסנכרון סמפור מפחית בזבוז מעבד ומבטיח שהשינוי בערכו נעשה אטומית, כלומר, לא ניתן לקטוע את הפעולה באמצעה. אם הסמפור אינו "הוגן" ולא משחרר לפי הסדר, עלולה להווצר בעיית רעבה (תהליך לא מקבל גישה במשך זמן רב).
סמפור יכול להיות מספר שלם אי־שלילי. עליו מוגדרות שתי פעולות אטומיות: אחת שממתינה עד שערכו גדול מ־0 ואז מקטינה אותו ב־1 וממשיכה; והשנייה שמגדילה את ערכו ב־1.
לדוגמה, לשני תהליכים החולקים משאב משתמשים בסמפור בינארי המאותחל ל־1. כל תהליך מפעיל את הפעולה הראשונה לפני הכניסה לקטע הקריטי, ואת הפעולה השנייה ביציאה. כך מובטח שרק תהליך אחד יהיה בתוך הקטע הקריטי בכל רגע.
סמפור (שמו באנגלית Semaphore) הוא דגל שמערכת ההפעלה שומרת עליו. הדגל עוזר לתאים של תוכניות לא להתנגש כשניגשים לאותו משאב.
לפעמים כמה תוכניות רצות ביחד ומנסות לשנות אותו קובץ או זיכרון. זה עלול ליצור בלגן. לכן עושים "קטע קריטי". רק תוכנית אחת צריכה להיות שם בכל פעם.
המתנה ב"לולאה" מבזבזת את כוח המחשב. זה כמו לעמוד ולחכות בלי להירגע.
הסמפור הוא דגל שמי שמחזיק בו אומר "אני בתוך הקטע הקריטי". אם הדגל תפוס, המערכת שמה את התוכנית לישון. כשהדגל משוחרר, המערכת מעירה את התוכנית.
הסמפור הוא מספר קטן, או רק 0 ו־1 בסמפור בינארי. יש שתי פעולות חשובות: לחכות עד שהדגל פנוי ואז לקחת אותו, ולשחרר את הדגל כשהסוף. לדוגמה, אם הסמפור מתחיל ב־1, כל תוכנית לוקחת אותו לפני הכניסה ונותנת חזרה אחרי היציאה.
תגובות גולשים