לדלג לתוכן

8.8 - הוגנות עומס ואימות מנוע אסינכרוני - פתרון

פתרון מדיניות התזמון

פתרון ראשון - מחיר הסבב

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

assert_eq!(simulate(1), [23, 2, 3]);
assert_eq!(simulate(2), [23, 3, 4]);
assert_eq!(simulate(7), [23, 8, 9]);

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

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

פתרון שני - היכן הגוף נמצא

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

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

פתרון שלישי - הכרעה מתוך עובדות

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

#[derive(Debug, PartialEq, Eq)]
enum Decision { Accepted, Expired }

fn decide(deadline: u64, completed_at: u64) -> Decision {
    if completed_at <= deadline { Decision::Accepted } else { Decision::Expired }
}

fn main() {
    assert_eq!(decide(100, 99), Decision::Accepted);
    assert_eq!(decide(100, 100), Decision::Accepted);
    assert_eq!(decide(100, 101), Decision::Expired);
}

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