לדלג לתוכן

פתרון תזמון והוגנות

פתרון ראשון

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

פתרון שני

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

use std::sync::mpsc;
let (ready_tx, ready_rx) = mpsc::channel::<Result<(), i32>>();
let (start_tx, start_rx) = mpsc::channel::<()>();
let worker = std::thread::spawn(move || {
    let prepared: Result<(), i32> = Ok(());
    ready_tx.send(prepared).unwrap();
    if prepared.is_ok() && start_rx.recv().is_ok() {
        println!("work may start");
    }
});
match ready_rx.recv().unwrap() {
    Ok(()) => { start_tx.send(()).unwrap(); }
    Err(code) => eprintln!("preparation failed: {code}"),
}
drop(start_tx);
worker.join().unwrap();

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

פתרון שלישי

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