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

תוכן שנמחק תוכן שנוסף
EmausBot (שיחה | תרומות)
מ r2.6.4) (בוט משנה: uk:Збір сміття
מאין תקציר עריכה
שורה 2:
'''איסוף זבל''' (באנגלית: '''Garbage collection''') הוא תהליך שבו סביבת הריצה של [[תוכנית מחשב]] מנקה מה[[זיכרון מחשב|זיכרון]] את ה[[אובייקט (הנדסת תוכנה)|אובייקטים]] שאין בהם עוד צורך.
 
המנגון הומצא ויושם לראשונה בשנת 1959 על ידי ג'ון מקארתי עבור שפת [[Lisp]].{{הערה| ג'ון מקארתי, [http://www-formal.stanford.edu/jmc/history/lisp.ps History Of Lisp], אוניברסיטת [[סטנפורד]], 1979}}. איסוף זבל נפוץ בשפות תכנות [[תכנות מונחה-עצמים|מוכוונות עצמים]] מודרניות כגון [[Java]] ו -[[C Sharp|#C{{כ}}]], וכן בשפות המורצות על ידי [[מפרש (תוכנה)|מפרש]] כמו [[Perl]], {{כ}}[[פייתון (שפת תכנות)|פייתון]], {{כ}}[[PHP]] ו-[[JavaScript]]. יש שפות כגון [[עדה (שפת תכנות)|עדה]] ו[[D (שפת תכנות)|שפת D]] (ובמידה מסוימת גם [[דלפי (שפת תכנות)|Delphi]]) המאפשרות למתכנת לבחור אם להשתמש במנגנון זה או לנהל הקצאות ושחרור זיכרון באופן עצמאי.
 
בהקשר הנוכחי, "זבל" הוא אובייקט שהזיכרון אותו הוא תופס [[הקצאת זיכרון דינמית|הוקצה באופן דינמי]], ואין אליו אף [[מצביע|הצבעה]] (באופן ישיר או עקיף) על יד אף משתנה הנמצא בשימוש, ולכן לא ניתן להגיע אליו. מצב בו חלק מאותם אובייקטים שאין בהם צורך לא נמחקים מכונה "[[דליפת זיכרון]]" (Memory leak) ועלול להביא למצב בו משאבי הזיכרון שהתוכנית משתמשת בהם הולכים וגדלים ואףובסופו של דבר אף לקריסה (הפסקת ריצה) של התוכנית.
 
איסוף זבל חוסך מן המתכנת את המעקב אחר אובייקטים להם הקצה זיכרון במהלך התוכנית ואת הצורך לשחרר את הזיכרון בצורה תקינה עם סיום השימוש בהם. כמו כן מונע שגיאות זמן ריצה הנובעות מניסיון לשחרר זיכרון שלא הוקצה. חסרונו הבולט הוא תוספת מסוימת של תקורות בביצועי התוכנית בפועל, היבט משמעותי במיוחד עבור תוכניות [[זמן אמת]].
שורה 10:
==יישום איסוף אוטומטי בשפות תכנות==
 
במספר [[שפת תכנות|שפות תכנות]] כגון [[Java]]{{כ}}, [[Basica]]{{כ}}, [[Lisp]] ו-[[C Sharp|C#{{כ}}]] (כחלק מכלל פלטפורמת ה-{{כ|ימינה=כן}}[[.NET]]) מתנהל איסוף הזבל באופן אוטומטי. איסוף הזבל מתבצע על ידי מחיקת אובייקטים חסרי קישור, כך המנגון יודע שהאובייקט מיותר ומשחררו אוטומטית. כתוצאה מכך, מהמתכנת נדרשות פעולות מעטות כדי לנהל את הזיכרון.
 
בשפת [[C (שפת תכנות)|C]] לא קיים איסוף זבל אוטומטי, ועל המתכנת מוטלת האחריות לדאוג לשחרר את הזיכרון שהוקצה באופן מפורש. מסיבה זו, דליפות זיכרון הן בעיה חמורה ושכיחה ביותר בתכנות בשפת C, וישנן תוכנות מיוחדות שמטרתן לעזור לאתר את דליפות הזיכרון.
 
בשפת [[C Plus Plus|++C]], בדומה לשפת [[C (שפת תכנות)|C]], לא קיים איסוף זבל אוטומטי, אבל ניתן לישםליישם איסוף זבל אוטומטי באמצעות טכניקה הקרויה "מצביעים חכמים" שהם למעשה אובייקטים שמתנהגים כמו מצביעים רגילים אבל מנהלים את איסוף הזבל של האובייקטים שהם מצביעים עליהם באופן אוטומטי. מנגנון זה פותר חלק מהבעיות הקשורות בדליפת זיכרון, אך לא את כולן.
 
==טכניקות איסוף זבל אוטומטי==
שורה 20:
 
===סימון ומחיקה===
טכניקה אחת, הקרויה "סימון ומחיקה" (Mark and sweep). בשיטה זו, אחת לכמה זמן מתעורר תהליך שעובר על האובייקטים שנמצאים בשימוש כרגע (בשפות תכנות בדרך כלל מדובר באובייקטים סטטיים וגלובליים ואובייקטים במחסנית). התהליך רץ על כל ההצבעות מהם אל אובייקטים אחריםהנמצאים בזיכרון (כלומרבאיזור ב-[[ערימה|ערימה]])הערימה ובין(heap) האובייקטיםהמכיל האלואובייקטים לאובייקטיםשהוקצו אחריםדינמית, ומסמן את כל האובייקטים שעבר דרכם כאובייקטים בשימוש. לבסוף, כל האובייקטים שאינם מסומנים נמחקים.
 
היתרונות העיקריים של שיטה זו:
שורה 33:
===מניית התייחסויות===
 
טכניקה נוספת קרויההקרויה "מניית התייחסויות" ('''Reference counting'''), מבוססת על כך שלכל אובייקט יש מונה הסופר את מספר המצביעים שמתייחסים אליו. ברגע שמספר ההתייחסויות יורד ל-0, האובייקט מוחק את עצמו באופן אוטומטי.
 
היתרונות של שיטה זו:
שורה 42:
 
החסרונות של שיטה זו:
# לא עובד נכון כאשר ישנה הצבעה מעגלית, כלומר אובייקט A מצביע על B ואובייקט B מצביע על A. ישנה דרך לתקן בעיה זו, אולם יש לכך עלות נוספת בביצועים.
# פחות יעיל מבחינת זיכרון בשל הצורך להחזיק מונה התייחסויות עבור כל אובייקט.
# יש צורך לשנות את ערכו של המונה בכל פעם שמוסיפים או מוחקים מצביע המתייחס לאותו האובייקט.
 
בשל פשטותה היא נמצאת בשימוש במספר רב של שפות, כגון המימושים המקובלים ל-LISP, [[פרל]], [[פייתון (שפת תכנות)|פייתון]], ועוד.{{מקור}}.
 
==איסוף זבל ב-[[{{כ|ימינה=כן}}.NET]] ו[[וב-Java]]==
כאמור לעיל, מספר שפות משתמשות במנגנון איסוף זבל אוטומטי. המכונה הווירטואלית מחייבת שכל האובייקטים יוקצו בערימה המנוהלת (managed heap). המתכנת לא משחרר אובייקטים מהערימה, אלא הם משוחררים אוטומטית כאשר לאפליקציה אין עוד שימוש בהם. האלגוריתם שבו מתבצע איסוף הזבל ב-{{כ|ימינה=כן}}.NET הוא סימון ומחיקה.{{מקור}}.
 
===Finalization===