לדלג לתוכן

פתרון תרגום כתובות ותקלות דף

הסריקה הראשונה יכולה לכלול הכנת מיפויים ותוכן, בעוד השנייה יכולה ליהנות מתרגומים ומ־cache שכבר התחממו. ההפרש אינו שייך רק ל־page faults; גם cache hierarchy ו־TLB יכולים להשתתף. לכן יש להסביר את גבולות המסקנה.

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

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

unsigned sum = 0;
const auto* input = static_cast<const volatile unsigned char*>(memory);
for (unsigned i = 0; i < pages; ++i)
    sum += input[static_cast<SIZE_T>(i) * system.dwPageSize];
std::printf("sum=%u\n", sum);

ב־TLB miss המעבד מחפש תרגום בטבלאות, ואם הוא תקף ומאפשר גישה הוא יכול להמשיך בלי page fault. ב־demand zero מערכת ההפעלה מספקת דף שמקיים את הבטחת האיפוס. ב־hard fault נדרשת הבאת מידע ממקור אחסון, ולכן המסלול כולל גם עבודה של I/O והמתנה אפשרית.

מונה faults כללי מערבב סוגים שונים. הוא יכול לגדול בזמן שכל הנתונים שנדרשו כבר נמצאים ב־RAM או נוצרו כאפסים. כדי למדוד I/O צריך counters או trace שמתארים את מסלול האחסון עצמו.

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

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