<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5308579786568951428</id><updated>2011-04-21T16:57:48.230-07:00</updated><title type='text'>Few Tips &amp; Tricks @ .Net</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lirane.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308579786568951428/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lirane.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>tresp4sser</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5308579786568951428.post-2572899336964917085</id><published>2008-09-22T04:58:00.000-07:00</published><updated>2008-09-22T04:59:17.862-07:00</updated><title type='text'>להספיק הכל בבת אחת: תכנות מרובה מטלות (Multithreaded Programming)</title><content type='html'>בקרוב...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308579786568951428-2572899336964917085?l=lirane.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lirane.blogspot.com/feeds/2572899336964917085/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5308579786568951428&amp;postID=2572899336964917085' title='0 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308579786568951428/posts/default/2572899336964917085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308579786568951428/posts/default/2572899336964917085'/><link rel='alternate' type='text/html' href='http://lirane.blogspot.com/2008/09/multithreaded-programming.html' title='להספיק הכל בבת אחת: תכנות מרובה מטלות (Multithreaded Programming)'/><author><name>tresp4sser</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5308579786568951428.post-8995452530203059833</id><published>2008-08-27T03:51:00.000-07:00</published><updated>2008-08-27T15:14:41.543-07:00</updated><title type='text'>Garbage Collection in .NET - על שום מה ולמה?</title><content type='html'>&lt;span style="font-family:arial;"&gt;פעמים רבות עולה בלבול מסוים שמדברים על עניין "איסוף הזבל" בשפות מבוסוסת NET.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;מתכנתים שהגיעו מ C++ ודומיה פוחדים פחות מפצצה איראנית בדרך לארץ מאשר מזליגות זיכרון שונות משונות. הפחד התמידי של לשכוח משפט free קטן פה, לשחרר הקצאה שם... סיוט.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;המתכנתים של מיקרוסופט החליטו לשאול מ- Java מאפיין נוסף - למה לסמוך על המתכנת שיוציא את הזבל שלו? בואו נשכור לו מנקה...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;כך הגיע לעולם ה- Garbage Collector. המנגנון שאחראי לנקות את כל הזבל שהשארתם ב- Heap שלכם.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;אז לפני ההסבר איך הוא עובד, הקדמה קצרה...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:Arial;font-size:130%;"&gt;חלק א': מי ולמה?&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;כידוע, ישנם שני סוגי טיפוסים עיקריים בשפות מבוססות Net. - טיפוסים מבוססי ערך(Value Type) כגון int, struct ודומיהם וטיפוסים מבוססי יחס(Reference Type) כמו מחלקות למיניהן.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;טיפוסים מבוססי ערך הם טיפוסים שקטים יחסית ולא בעייתיים, שכן הם מוקצים על המחסנית ומשתחררים אוטומטית בסוף חייה של הפונקציה - ולכן אין בעיות בשחרור הזיכרון שלהם.&lt;br /&gt;עם אובייקטים סטטיים גם אין בעיה שכן הם נשמרים באזור הזיכרון הגלובלי של ה Process ומשתחררים כאשר התוכית הגיעה לקיצה.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;הבעיה מגיעה בטיפוסי ה-Ref(טיפוסים מבוססי התייחסות). כאן נדרש מנגנון שישחרר את האובייקטים שאין בהם עוד שימוש.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:Arial;font-size:130%;"&gt;חלק ב': תהליך ניקוי זבל&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;בתהליך ניקוי הזבל יש אלגוריתם שאחראי על ניקוי נכון ויעיל(עד כמה שאפשר).&lt;br /&gt;תהליך הקריאה למנגנון ה- GC קורה בד"כ כאשר אנחנו מנסים לבצע פעולת new(הקצאה דינמית לצורך העניין) ואין מספיק זיכרון בשביל לעשות זאת. במצב כזה, מתבצע אלגוריתם ה-GC(שלבים ב' וד' יוסברו מיד):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;א. הקפאת כל הת'ראדים הפועלים בתהליך הנוכחי(מלבד כמובן ת'ראדים שקשורים ל Unmanaged Code).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;ב. בניית גרף האובייקטים.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;ג. שחרור כל האובייקטים שלא נמצאים בגרף.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;ד. דיחוס הזיכרון.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;ה. עדכון כל ההצבעות(References) כך שיצביעו על האובייקטים בצורה נכונה.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:Arial;"&gt;בניית גרף האובייקטים&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;גרף האובייקטים הוא גרף שאחראי להכיל בתוכו את כל האובייקטים שאינם צריכים להתנקות.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;הגרף נבנה באמצעות התייחסות ל Root References, כלומר: הגרף מסתכל על כל Root Reference ובונה מסלול של הצבעות לאוביקטים הקשורים אליו. האוביקטים האלו לא ישתחררו.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;em&gt;מהו Root Reference?&lt;/em&gt; כל האובייקטים הגלובלים/סטטיים בתכנית, כל אובייקט שמצביע על מחסנית של ת'ראד, כל אוגר שמכיל הפניה למקום כלשהו ב- Heap וכל אובייקט שהמצביע שלו נמצא ב F-reachable queue - אובייקטים שיש להם פונקציה הורסת.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;דיחוס הזיכרון&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;התהליך מעביר את כל האובייקטים ש"שרדו" את הניפוי לתחתית הערימה, כך שיהיה מקום חדש ונקי בהתחלתה. הדבר קורה בצורה הבאה:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;1. האלגוריתם סורק את הערימה בצורה ישרה ומחפשים חלקים סמוכים של אשפה(חלקים שאין בהם צורך עוד).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;2. ה-GC מוריד את כל האובייקטים שאינם זבל לתחתית הרשימה, ומוריד את כל ה"רווחים" בערימה.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;3. ה-GC מעדכן את ה References כך שיצביעו על האובייקטים במקומם החדש.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;4. ה-GC מצביע כעת לאובייקט האחרון שאינו זבל, כך שידע שהמקום הבא בזכרון הוא מקום שיש בו זבל וניתן לשמור בו כל שרוצים.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;חשוב לציין שקיימת ערימה נוספת - Large Managed Heap. בערימה זו מוקצים האובייקטים הגדולים(יותר מ-20K) והאובייקטים בערימה זו לא מועתקים למניעת רווחים בזיכרון, מכיוון שהעתקת אובייקטים גדולים כל כך תצרוך זמן יקר.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:Arial;"&gt;פונקציות של מחלקת Garbage Collection&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;במחלקה הדוטנטית של GC יש מספר פעולות סטטיות שמאפשרות שליטה קלה ב- GC.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#999999;"&gt;GC.Collect()&lt;/span&gt; - &lt;/em&gt;&lt;/strong&gt;הפונקציה הנ"ל מאלצת הפעלת תהליך GC, על כל האובייקטים. שימוש טוב לפונקציה הזו היא לפני פעולה חשובה שאיננו מעוניינים שתעצר על ידי מנגנון ה GC(כמובן שזה לא נותן לנו הבטחה שאכן לא יפעל ה GC שכן כמו שאמרנו, איננו יכולים לדעת מתי יפעל בודאות, אך זה יצמצם את הסיכויים).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#999999;"&gt;GC.WaitForPendingFinalizers()&lt;/span&gt; - &lt;/em&gt;&lt;/strong&gt;לאחר תהליך ה- GC הפנימי של NET. בת'ראד של ה-G, מתחילות לעבוד הפונקציות ההורסות בשאר הת'ראדים. פקודת ה GC.Collect() לא מחכה עד שפעולות אלו יסתיימו, ולכן נוצרה הפעולה הנ"ל. הפעולה הזו מחכה עד שכל הפונקציות ההורסות יסיימו פעולתן.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#999999;"&gt;GC.SuppressFinalize(object obj)&lt;/span&gt; - &lt;/em&gt;&lt;/strong&gt;הפונקציה הנ"ל אומרת למנגנון ה- GC שבאובייקט שמועבר אליו כפרמטר השתמשנו בפונקצית Dispose, ואין צורך להפעיל את הפונקציה הורסת עבור האוביקט הנ"ל.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#999999;"&gt;GC.ReRegisterForFinalize(object obj)&lt;/span&gt; - &lt;/em&gt;&lt;/strong&gt;פעולה הפוכה לפונקציה הקודמת. יש לרשום שוב את האובייקט כך שהפונקציה ההורסת שלו תופעל.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;&lt;span style="font-family:Arial;"&gt;חלק ג': מסקנות&lt;/span&gt;&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;1. ההקצאה ב- NET. היא מהירה מאוד. בניגוד לב C++ שבכל הקצאה יש לחפש מקום פנוי על מנת להקצות בו זכרון, ב NET. ההקצאה תמיד מתבצעת בראש הערימה.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;2. ניתן להבין כעת מדוע ב NET. אין אפשרות לקבל כתובת של אובייקט: אין לו כתובת קבועה! הכתובת של האובייקט משתנה כל הזמן על ידי ה-GC. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;3. מנגנון ה- GC לא מתאים למערכות Realtime, שכן אסור שבזמן אמת בכל פעם שיופעל מנגנון ה-GC תהיה הקפאה של כל הת'ראדים, רגעית ככל שתהיה. יודגש, שלא ניתן למנוע GC אך ניתן לאלץ אותו לפעול.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;בפוסט זה לא נכנסתי לעניין של F-reachable Queue מהסיבה שלרוב אין צורך להשתמש בדיסטרקטור(אלא אם יש עבודה ב Unmanaged Code, או כאשר רוצים לתת אבטחה נוספת לפונקצית Dispose).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308579786568951428-8995452530203059833?l=lirane.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lirane.blogspot.com/feeds/8995452530203059833/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5308579786568951428&amp;postID=8995452530203059833' title='0 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308579786568951428/posts/default/8995452530203059833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308579786568951428/posts/default/8995452530203059833'/><link rel='alternate' type='text/html' href='http://lirane.blogspot.com/2008/08/garbage-collection-in-net.html' title='Garbage Collection in .NET - על שום מה ולמה?'/><author><name>tresp4sser</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5308579786568951428.post-2831971537698803270</id><published>2008-08-26T14:16:00.000-07:00</published><updated>2008-08-26T14:30:35.367-07:00</updated><title type='text'>אהלן.</title><content type='html'>&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;אהלן וברוכים הבאים :)&lt;/strong&gt;&lt;br /&gt;מדי פעם אני אשתדל לפרסם כאן טיפים או דברים שנראים לי חשובים...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;קורה הרבה שאני רוצה לכתוב על משהו בפורום כלשהו אבל אני יודע שתוך יומיים זה יעלם וחבל על ההשקעה.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;אולי פה לא? :)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308579786568951428-2831971537698803270?l=lirane.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lirane.blogspot.com/feeds/2831971537698803270/comments/default' title='תגובות לפרסום'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5308579786568951428&amp;postID=2831971537698803270' title='0 תגובות'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308579786568951428/posts/default/2831971537698803270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308579786568951428/posts/default/2831971537698803270'/><link rel='alternate' type='text/html' href='http://lirane.blogspot.com/2008/08/blog-post.html' title='אהלן.'/><author><name>tresp4sser</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
