לדלג לתוכן

פתרון מסלול קריאה ומשימה

פתרון ראשון

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

פתרון שני

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

פתרון שלישי

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

let byte = [42_u8];
let result = unsafe { libc::syscall(libc::SYS_write,
    writer.as_raw_fd(), byte.as_ptr(), byte.len()) };
assert_eq!(result, 1);

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