לדלג לתוכן

פרויקט מנוע קריאה אסינכרוני

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

התוצאה הנדרשת

הכלי מקבל נתיב לקובץ מקומי יציב ומחשב את מספר הבתים ואת סכום ערכי הבתים. הסכום אינו hash קריפטוגרפי; הוא תוצאה פשוטה שאפשר להשוות לסריקה סינכרונית. החלוקה בין הקורוטינות צריכה לכסות את הקובץ בלי חפיפה ובלי חורים.

ממשק ה־awaiter צריך להחזיק OVERLAPPED ו־buffer בעלי כתובת יציבה. ה־dispatcher מסיר את הבקשה מטבלת הפעילות לפני resume, ואינו נוגע בה אחריו. המסגרת נשארת חיה עד שהפעולה הסתיימה והקורוטינה הגיעה לסיום.

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

הגבלות מכוונות

ההגשה וריקון IOCP מתבצעים על thread יחיד. אין להרחיב למספר dispatchers בלי להוסיף פרוטוקול שמטפל במרוץ בתוך await_suspend. גודל כל buffer מוגבל לארבעת אלפים תשעים ושישה בתים, ומספר הבקשות הפעילות מוגבל לארבע.

הקובץ נפתח לקריאה עם מדיניות שיתוף שאינה מאפשרת כתיבה רגילה במקביל. שגיאת הקמת קורוטינה שנייה אינה רשאית להרוס את הראשונה בזמן שה־I/O שלה פעיל. מסלול rollback צריך לבקש עצירה ולרוקן את המנוע לפני הרס המשימות.

בדיקות והגשה

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

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

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