פתרון תזמון וטופולוגיית מעבדים¶
עם Sleep צפוי פער ברור בין זמן קיר לזמן CPU. בלי Sleep הפער יכול להצטמצם, אך עומס מערכת ותזמון עדיין יכולים להוסיף המתנה. אין לחסר שני מספרים ולהכריז שכל ההפרש הוא I/O; הניסוי עצמו כולל גם scheduling ורזולוציית מדידה.
הקטע הבא מצטרף לתוכנית במערכת בעלת group יחיד. הוא מדגים שמירה והחזרה של affinity עבור ה־thread הנוכחי. יש לשים את העבודה הנמדדת בין קביעת המסכה לבין החזרתה.
if (GetActiveProcessorGroupCount() == 1) {
DWORD_PTR allowed = 0;
DWORD_PTR system = 0;
if (!GetProcessAffinityMask(GetCurrentProcess(), &allowed, &system) ||
allowed == 0)
return 3;
const DWORD_PTR selected = allowed & (~allowed + 1);
const DWORD_PTR previous = SetThreadAffinityMask(GetCurrentThread(), selected);
if (previous == 0) return 4;
// Execute the bounded measurement here.
if (SetThreadAffinityMask(GetCurrentThread(), previous) == 0)
return 5;
}
ההערה מסמנת את מקום שילוב קטע המדידה הקיים, ולא תוכנית חדשה בפני עצמה. בגרסה עם חריגות או מסלולי יציאה נוספים צריך RAII שיחזיר את המדיניות גם בכשל. המסכה נלקחת מההרשאה בפועל של התהליך, ולא מהנחה שמעבד מספר אפס תמיד מותר.
ה־trace של שני עובדים צריך להראות לא רק את זמן הביצוע אלא גם את המעבד שעליו רץ כל אחד. המונח ready delay מתאר זמן שבו העבודה יכולה להתקדם אבל ממתינה לבחירת המתזמן. זמן wait אומר שהתנאי שמאפשר התקדמות עדיין לא התקיים.
בתרחיש היפוך עדיפויות, הגבוה תלוי בנמוך שמחזיק lock. העלאת עדיפות הגבוה אינה עוזרת כל עוד הוא חסום. צמצום החזקת lock, הימנעות מ־I/O תחתיו ותכנון תור עבודה מתאים יכולים לשנות את מבנה התלות.
ה־affinity רק מגבילה יעדים מותרים. תהליכונים אחרים עדיין יכולים לרוץ על אותו מעבד, interrupts עדיין יכולים להתרחש, ומדיניות צריכת חשמל יכולה להשפיע. מספר המעבדים הלוגיים יכול לכלול אחים שחולקים משאבי ליבה, ולכן אינו מדד יחיד ליכולת חישוב.
הדוח מציין אם הניסוי באמת הוקלט ובאיזו תצורה. אין להפוך פקודות מוצעות לראיה על תזמון שלא נצפה.