סמפור (מדעי המחשב) – הבדלי גרסאות

תוכן שנמחק תוכן שנוסף
Luckas-bot (שיחה | תרומות)
אין תקציר עריכה
שורה 1:
ב[[מדעי המחשב]]], '''סמפור''' (semaphore) הוא מנגנון ל[[סנכרון (מדעי המחשב)|סנכרון]] (תאום פעולה) בין כמה תהליכים הפועלים ב[[מחשב]] במקביל. מנגנון זה בא לפתור את הבעיה הנוצרת כאשר קיימים מספר תהליכים אשר קיימת ביניהם [[השפעה הדדית]], לרוב בשל גישה למשאב משותף כלשהו (למשל - אותו תא [[זיכרון (מחשב)|זיכרון]], אותו [[קובץ]] וכך הלאה). את הבעיה פותרים על ידי הגדרת '''[[קטע קריטי|קטע קוד קריטי]]''', אשר כל אחד מן התהליכים יכנס אליו רק לאחר ביצוע מספר פעולות כניסה, הנועד להבטיח שרק תהליך אחד יכנס לקטע הקוד הקריטי שלו בכל נקודת זמן, וכן ביצוע מספר פעולות ביציאה מהקטע הקריטי.
 
==תאור הבעיה==
פתרונות לבעיה יכללו תמיד המתנה עד אשר תנאי כלשהו יתקיים, כתנאי לכניסת התהליך לקטע הקריטי (עד אשר תנאי כלשהו יתקיים, אל תבצע פעולה). מימוש המתנה כזו יעשה על ידי [[לולאה|לולאת]] WHILE. אולם, המתנה בתוך [[לולאה|לולאת]] WHILE, דורשת זמן [[מעבד]]. בנוסף לכך, קיימת סכנה כי בעת ביצוע קטע הקוד לכניסה לקטע הקריטי, אשר מורכב ממספר פקודות (או מפקודה אחת אשר מורכבת ממספר פקודות מכונה), "יחטף" המעבד מהתהליך וכך עלול לקרות מצב כי המשך הביצוע יסתמך על נתונים לא מעודכנים. אחד הפתרונות שהוצעו לבעיה היה הוספת רכיב [[חומרה]] אשר מבצע סדרת פקודות ב[[פעולה אטומית|צורה אטומית]], אשר לא מאפשרת ל[[מערכת הפעלה|מערכת ההפעלה]] (או למתזמן) לקטוע את ביצוע סדרת הפקודות. אולם פתרון זה לא מנע את בזבוז משאבי המעבד בהמתנה לקיום התנאי לכניסה לקטע הקריטי.
כאשר קיימים מספר תהליכים אשר קיימת ביניהם [[השפעה הדדית]], לרוב בשל גישה למשאב משותף כלשהו (למשל, תא [[זיכרון (מחשב)|זיכרון]] או [[קובץ]] משותפים). את הבעיה פותרים על ידי הגדרת "[[קטע קריטי]]", אשר כל אחד מן התהליכים יוכל להיכנס אליו או לצאת ממנו רק לאחר ביצוע מספר פעולות, שמטרתן להבטיח כי בכל נקודת זמן רק תהליך אחד נמצא בתוך קטע הקוד הקריטי שלו.
 
==פתרון באמצעות לולאה==
כיום נהוג לפתור בעיה זו על ידי שימוש ב'''סמפורים''': מעין דגל אשר כדי לשנות את ערכו התהליך נדרש לבקש ממערכת ההפעלה. במידה והדגל כבר "נתפס" על ידי תהליך אחר, מערכת ההפעלה תעביר את התהליך למצב שינה (SLEEPING או WAITING בהתאם לסוג מערכת ההפעלה), ותעיר אותו על ידי משלוח [[פסיקה (מחשב)|פסיקה]]
פתרונות לבעיה יכללו תמיד המתנה עד אשר תנאי כלשהו יתקיים, כתנאי לכניסת התהליך לקטע הקריטי (עד אשר תנאי כלשהו יתקיים, אל תבצע פעולה). מימוש המתנה כזו יעשה על ידי [[לולאה|לולאת while]] WHILE. אולם,הבעיה המתנהבפתרון זה היא שההמתנה בתוך [[לולאה|לולאת]] WHILE,הלולאה דורשת זמן [[מעבד]]. בנוסף לכך, קיימת סכנה כי בעת ביצוע קטע הקוד לכניסה לקטע הקריטי, אשר מורכב ממספר פקודות (או מפקודה אחת אשר מורכבת ממספר פקודות מכונה), "יחטף" המעבד מהתהליך וכך עלול לקרות מצב כיבו המשך הביצועביצוע יסתמךהתוכנית מסתמך על נתונים לא מעודכנים. אחד הפתרונות שהוצעו לבעיה היה הוספת רכיב [[חומרה]] אשר מבצע סדרת פקודות ב[[פעולה אטומית|צורה אטומית]], אשר לא מאפשרת ל[[מערכת הפעלה|מערכת ההפעלה]] (או למתזמן) לקטוע את ביצוע סדרת הפקודות. אולם פתרון זה לא מנע את בזבוז משאבי המעבד בהמתנה לקיום התנאי לכניסה לקטע הקריטי.
(INTERRUPT) ברגע שהדגל "משוחרר" על ידי התהליך שתפס אותו. בצורה כזו מתאפשר סנכרון ללא בזבוז זמן מעבד, וכן מובטח לנו כי מערכת ההפעלה מפקחת על מצב הדגל ושינוי של ערכו מבוצע בצורה אטומית (לא ניתן לחטוף לתהליך את המעבד בזמן שינוי ערך הדגל).
 
אחד הפתרונות שהוצעו לבעיה היה הוספת רכיב [[חומרה]] אשר מבצע סדרת פקודות ב[[פעולה אטומית|צורה אטומית]], אשר לא מאפשרת ל[[מערכת הפעלה|מערכת ההפעלה]] (או למתזמן) לקטוע את ביצוע סדרת הפקודות. אולם פתרון זה לא מנע את בזבוז משאבי המעבד בהמתנה לקיום התנאי לכניסה לקטע הקריטי.
 
==פתרון הבעיה באמצעות סמפור==
כיום נהוג לפתור בעיה זו על ידי שימוש ב'''סמפורים'''בסמפורים: מעין דגל אשר כדי לשנות את ערכו התהליך נדרש לבקש ממערכת ההפעלה. במידה והדגל כבר "נתפס" על ידי תהליך אחר, מערכת ההפעלה תעביר את התהליך למצב שינה (SLEEPING או WAITING בהתאם לסוג מערכת ההפעלה), ותעיר אותו על ידי משלוח [[פסיקה (מחשב)|פסיקה]]
(INTERRUPT) ברגע שהדגל "משוחרר" על ידי התהליך שתפס אותו.
 
(INTERRUPT) ברגע שהדגל "משוחרר" על ידי התהליך שתפס אותו. בצורה כזו מתאפשר סנכרון ללא בזבוז זמן מעבד, וכן מובטח לנו כי מערכת ההפעלה מפקחת על מצב הדגל ושינוי של ערכו מבוצע בצורה אטומית (לא ניתן לחטוף לתהליך את המעבד בזמן שינוי ערך הדגל).
 
[[קטגוריה:תהליכים (מדעי המחשב)]]