الدرس 19: I/O المُخطَّط في الذاكرة مقابل I/O المُخزَّن مؤقتًا
عند تحميل غيغابايتات من مجموعات البيانات لتدريب GPU، تهمّ كل ميلي ثانية من الـ I/O. هناك ثلاثة أساليب رئيسية: buffered I/O (stdio)، و mmap الذي يُخطِّط ملفًا مباشرةً في الذاكرة الافتراضية، و sendfile للتشبيك بلا نسخ (zero-copy). في NVIDIA، عند تحميل model weights ودفعات التدريب — يمنح mmap أفضلية كب
القراءة المُخزَّنة مؤقتًا (buffered read) تشبه استعارة كتب من المكتبة وتصويرها قبل الاستخدام. أما mmap فيشبه الجلوس في المكتبة مباشرةً — لا نسخ، بل قراءة من الأصل. و sendfile يشبه إرسال كتاب من المكتبة بالبريد مباشرةً إلى صديق دون أن تلمسه أنت أبدًا.
- Buffered I/O
- I/O عبر stdio (fread, fwrite) يُراكِم البيانات في buffer داخل user space قبل النقل إلى kernel. يقلّل من system calls لكنه يضيف نسخة بيانات إضافية.
- Direct I/O
- I/O يتجاوز الـ page cache الخاص بالنواة (kernel). يُفعَّل باستخدام O_DIRECT. يتطلّب محاذاة الـ buffer إلى 512 بايت. مفيد عندما يدير التطبيق الـ cache الخاص به.
- zero-copy
- تقنية I/O تنقل البيانات مباشرةً بين kernel buffers دون نسخها إلى user space. يُعدّ sendfile() و mmap تطبيقين شائعين لها.
- sendfile
- system call ينقل البيانات من FD ملف إلى FD socket مباشرةً داخل النواة (kernel) — دون نسخها إلى user space. يُستخدَم في Nginx وخوادم الويب لتقديم الملفات الساكنة.
- page cache
- مخزن buffer في ذاكرة RAM ضمن النواة (kernel) يحفظ محتويات الملفات التي جرى الوصول إليها مؤخرًا. تُقدَّم القراءات المتكررة من الملف نفسه من الـ RAM بدلاً من القرص.