קטע קריטי – הבדלי גרסאות

הוסרו 127 בתים ,  לפני 3 חודשים
שינויים ועריכה רחבה בפתיח ובדוגמה., שכתוב
(שינויים ועריכה רחבה בפתיח ובדוגמה., שכתוב)
ב[[מחשב]]ים, '''קטע קריטי''' הוא פעילות של מערכות [[עיבוד מקבילי|מקביליות]], שמשתמשות ללא תיאום ב[[משאב מערכת|משאב]] משותף, באופן העלול לגרום לתוצאות לא רצויות.
'''קטע קריטי''' הוא מושג{{הבהרה|סיבה=מה ההגדרה של קטע קריטי?}} ב[[מחשב]]ים ובפרט מתחום [[מערכת הפעלה|מערכות הפעלה]] אשר מתייחס למערכות [[עיבוד מקבילי|מקביליות]], שעושות שימוש ב[[משאב מערכת|משאב]] משותף. השימוש במשאב המשותף מבלי שהמערכות מתואמות ביניהם, יכול להביא לתוצאות לא רצויות. [[מדען מחשב|מדען המחשב]] [[אדסחר דייקסטרה]] תיאר זאת במאמרו משנת 1965 – "פתרון בעיית השליטה בתכנות מקבילי",{{הערה|{{cite journal|last=Dijkstra|first=E. W.|title=Solution of a problem in concurrent programming control|journal=Communications of the ACM|volume=8|issue=9|pages=569|doi=10.1145/365559.365617|year=1965}}}} כבעיה שמוכרת כבר משנת 1962 והוא אף מנסה להתמודד איתה במאמר הזה.
 
ב[[מערכת הפעלה|מערכות הפעלה]], התוצאות הלא רצויות יכולות להיווצר בזמן [[מערכת הפעלה|שמערכת ההפעלה]] שמריצה את [[פקודה (מחשב)|קטעי הקוד]] מבצעות [[החלפת הקשר]] (באנגלית – Context switch) במהלך הרצת הקטע הקריטי או משום שהקטע הקריטי רץ במקביל לַגורם הנוסף (בעזרת [[עיבוד מקבילי]] או [[חישוב מבוזר]]). כיוון שהשליטה בתזמון בין הקטע הקריטי לגורם הנוסף, נעשית על ידי גורם שלישי – לרוב מערכת ההפעלה. נדרשים אמצעים כדי לוודא שהקוד יבצע את מטרתו.
 
[[מדען מחשב|מדען המחשב]] [[אדסחר דייקסטרה]] סקר את הנושא לראשונה במאמרו משנת 1965 – "פתרון בעיית השליטה בתכנות מקבילי".{{הערה|{{cite journal|last=Dijkstra|first=E. W.|title=Solution of a problem in concurrent programming control|journal=Communications of the ACM|volume=8|issue=9|pages=569|doi=10.1145/365559.365617|year=1965}}}}
 
== דוגמה לקטע קריטי ==
כדוגמה לקטע קריטי ניתן לקחת בתור קטע קריטי, קטע קודמפעולתם של שני [[תהליכון|תהליכונים]] <small>(המערכתהמערכות)</small>, שמשתמשים ללא שמקדםתיאום ב[[משתנה (תכנות)|משתנה]] משותף <small>(המשאב)</small>. באחד,תהליכון והגורםראשון הנוסףיוסיף יהיה1 תהליכוןלמשתנה, שניואחר שמפחיתיפחית מהמשתנהממנו אחד.
 
ניתן להציג את הקודקטע פעולתם ב[[פסאודו קוד]], כך:
:{|
|
|}
|}
התוצאה שאנחנו מצפים לה היא הערךשערך הראשוניהמשתנה שלישאר המשתנהכפי שהיה, מאחר שהוספת 1 והורדת 1 משאירההן פעולות שמבטלות זו את המשתנהזו, ללאומחזירות את המשתנה שינוילערכו בערכוהמקורי.
 
אולם, אם התהליכון השני ירוץ במהלך ריצת קטע הקוד הראשון, ייתכן שהתוצאה תהיה שונה, כמו בדוגמתכבדוגמת ההרצה הזאת:
:{| class="wikitable"
!
| משותף = k-1, מקומי = k-1
|}
כפי שניתן לראותכך, בניגוד למצופה, ערכו של המשתנה המשותף בסוף הרצת הקטע הקריטי קטן ב–1 מערכו המקורי.
 
התוצאות הלא רצויות יכולות להיווצר בזמן [[מערכת הפעלה|שמערכת ההפעלה]] שמריצה את קטעי הקוד מבצעות [[החלפת הקשר]] (באנגלית – Context switch) במהלך הרצת הקטע הקריטי או משום שהקטע הקריטי רץ במקביל לַגורם הנוסף (בעזרת [[עיבוד מקבילי]] או [[חישוב מבוזר]]). כיוון שהשליטה בתזמון בין הקטע הקריטי לגורם הנוסף, נעשית על ידי גורם שלישי – לרוב מערכת ההפעלה. נדרשים אמצעים כדי לוודא שהקוד יבצע את מטרתו.
 
== פתרון בעיית הקטע הקריטי ==
* '''[[הרעבה (מדעי המחשב)|המתנה מוגבלת]]''' (Bounded Waiting) – יש לוודא שכל גורם שמבקש לרוץ, יעשה את זה תוך מספר מוגבל של קטעים קריטיים שירוצו לפניו.
 
קיימים מספר פתרונות לבעיית הקטע הקריטי. חלקם משתמשים בכלים שמערכת ההפעלה מספקת (מנעול, סמפור וכוליוכדומה) וחלקם לא.
 
=== האלגוריתם של פטרסון ===
13,091

עריכות