לדלג לתוכן

פתרון מכסות ולחץ

פתרון ראשון

נחשב את השימוש בעזרת הנוסחה הבאה, כאשר שתי המדידות נלקחות מאותה קבוצה ובאותה ריצה.

cpu_seconds = (usage_usec_after - usage_usec_before) / 1_000_000
fraction_of_one_cpu = cpu_seconds / wall_seconds

במכסה של רבע מעבד נצפה לערך סביב רבע כאשר המשימה דורשת מעבד כל הזמן. סטיות קצרות נובעות מחלונות האכיפה, עבודה נוספת בקבוצה ועלות המדידה. מספר האיטרציות תלוי במעבד, בבנייה ובאופטימיזציה, בעוד חשבונאות הזמן מודדת ישירות את המשאב שהגבלנו.

פתרון שני

בריצה של ארבעים ושמונה מגה־בתים ייתכנו אירועי חריגה מהגבול הגבוה גם כאשר התהליך מסיים. בריצה של תשעים ושישה מגה־בתים מול גבול קשיח של שישים וארבעה נצפה לכשל, אך נשמור את התוצאה בפועל ולא נכתוב מראש מספר אירועי הרג. הסיום יכול למנוע מהתוכנית להדפיס את המונה הסופי.

הגדלת הגבול רק מרחיקה את הנקודה שבה תור בלתי מוגבל ממלא את הזיכרון. תיקון התוכנית כולל מכסת פריטים ובתים, החזרת לחץ ליצרנים ומדיניות דחייה. מגבלת הקרנל היא שכבת הגנה על המערכת כאשר התוכנית חורגת מהחוזה שלה.

פתרון שלישי

נוסיף אחרי הלולאה שמצטרפת לילדים את ההדפסה הבאה. המשתנה root מוגדר בתוכנית ההרצאה.

println!("after joins:");
snapshot(&root);

המדד pids.current אמור לרדת כאשר התהליכונים מסיימים, והמדד pids.events מתעד ניסיונות שנחסמו. ניסיון יצירת תהליכון נכשל מסיבה שיכולה להיות גם מגבלה אחרת, ולכן נשווה את הודעת השגיאה לעלייה במונה המתאים.

לבדיקת משקל ניצור שתי קבוצות אחיות בעלות עבודה קבועה, נגביל את שתיהן לאותו מעבד ונקבע משקלים שונים בלי מכסת זמן. נמדוד זמן מעבד בכל קבוצה תחת תחרות, ואז נפסיק אחת מהן ונבדוק שהשנייה יכולה לנצל זמן פנוי. שינוי היחס רק בניסוי התחרות הוא התוצאה שמבדילה משקל ממכסה.