פרויקט סורק קבצים מוגבל זיכרון¶
נבנה כלי שסופר את הופעתו של כל ערך בית בקובץ בלי להעתיק את הקובץ כולו לערמה. הכלי מיועד לקובץ מקומי יציב במעבדה, ונפתח לקריאה בלבד. העבודה מחברת טווחי כתובות, חלונות מיפוי, בעלות, כישלון ותקציב מפורש.
החוזה הנדרש¶
הכלי מקבל נתיב בשורת הפקודה ומחזיר את גודל הקובץ ואת מספר המופעים של כל בית שהופיע. קובץ ריק הוא קלט תקין. בכל רגע מותר להחזיק חלון מיפוי אחד בלבד, וגודלו הלוגי המרבי הוא מגה־בית אחד. גודל המיפוי הפיזי בכתובות עשוי לכלול תוספת יישור; דווחו עליה בנפרד.
היסטוגרמת התוצאה תוקצה דרך משאב תקציב מקומי שמגביל את מספר הבתים המבוקשים. אין לקרוא למגבלה הזו מגבלת הזיכרון הכוללת של התהליך. המשאב חי עד שההיסטוגרמה נהרסת, והקובץ והמיפוי נסגרים גם כאשר חלון חדש נכשל.
בחרו מדיניות שמונעת כתיבה רגילה לקובץ בזמן הסריקה באמצעות הרשאות השיתוף של פתיחת הקובץ. הסבירו מדוע אין להסתמך רק על קריאת הגודל בתחילת הפעולה כאשר הכתיבה במקביל מותרת. אין לשנות הרשאות של קבצים קיימים ואין לכתוב לקובץ הקלט.
שלבי העבודה¶
א. כתבו סריקה של קובץ קטן בחלון יחיד ובדקו את סכום כל המונים.
ב. הוסיפו חלונות רבים, חישוב offset מיושר ופירוק offset לשני חלקים עבור WinAPI. בדקו סוף קובץ שאינו מיושר וגודל קטן מגודל חלון.
ג. הוסיפו משאב תקציב, דיווח peak ובדיקת כשל כאשר התקציב קטן מדי אפילו להיסטוגרמה. הוכיחו שכישלון אינו משאיר handle או view חיים.
ד. צרו קבצי בדיקה חדשים בתיקיית מעבדה, כולל קובץ ריק, קובץ עם כל ערכי הבתים וקובץ שמסתיים באמצע חלון. השוו את התוצאה לסריקה פשוטה עם stream, ושמרו את שתי התוצאות.
ה. חקרו בנפרד את ה־working set ואת גודל החלון. הריצו את אותו קובץ בשני גדלי חלון ותעדו מדוע תושבות התהליך אינה חייבת להיות שווה לגודל החלון.
תנאי קבלה¶
ההיסטוגרמה חייבת להיות זהה לפתרון ההשוואה, וסכום המונים חייב להיות גודל הקובץ. הכישלונות שנבדקים כוללים נתיב לא קיים, קובץ שנפתח לכתיבה באופן שאינו מתאים לשיתוף ותקציב קטן. הדוח מציג חוזה חיים לכל משאב ומבחין בין כשל API, כשל הקצאה וכשל גישה לדף ממופה.
הרחבת החובה המחקרית היא תכנון טיפול ב־in-page error בעת גישה לקובץ ממופה, כולל גבול התאוששות שבו אין ממשיכים להשתמש במצב חלקי. אין צורך להכניס טיפול SEH לכל לולאת C++ או להמציא תקלה בדיסק אמיתי. אפשר להציע תהליך עובד נפרד ולהסביר כיצד ההורה מזהה כשל ומבטל את התוצאה.