جميع وحدات المعالجة المركزية لأي جهاز كمبيوتر ، سواء كان جهاز كمبيوتر محمول رخيصًا أو خادمًا بملايين الدولارات ، لديها جهاز يسمى ذاكرة التخزين المؤقت. ومع وجود احتمالية عالية جدًا فإن لها عدة مستويات.
ربما يكون من المهم ، وإلا لماذا تثبيته؟ ولكن ماذا تفعل ذاكرة التخزين المؤقت ، ولماذا لها مستويات مختلفة؟ وماذا يعني "12 طريقة مجموعة النقابية"؟
ما هو الكاش؟
TL ؛ DR: هذه ذاكرة صغيرة ولكنها سريعة جدًا وتقع بالقرب من الكتل المنطقية لوحدة المعالجة المركزية.
ومع ذلك ، يمكننا بالطبع معرفة المزيد عن ذاكرة التخزين المؤقت ...
لنبدأ بنظام تخزين سحري خيالي: إنه سريع للغاية ، ويمكنه التعامل مع عدد لا حصر له من عمليات نقل البيانات في نفس الوقت ، ويوفر دائمًا تخزينًا موثوقًا وآمنًا. بالطبع ، لا يوجد شيء من هذا القبيل في أي مكان قريب ، ولكن إذا كان الأمر كذلك ، فسيكون هيكل المعالج أبسط بكثير .
ستحتاج المعالجات بعد ذلك فقط إلى كتل منطقية للإضافة ، والضرب ، وما إلى ذلك ، بالإضافة إلى نظام التحكم في نقل البيانات ، لأن نظام التخزين النظري لدينا قادر على إرسال واستقبال جميع الأرقام اللازمة على الفور ؛ لا يجب أن تقف الكتل المنطقية خامدة في انتظار نقل البيانات.
ولكن ، كما نعلم ، لا توجد تقنية تخزين سحرية. بدلاً من ذلك ، لدينا محركات أقراص ثابتة أو محركات أقراص صلبة ، وحتى أفضلها لا يرقى إلى مستوى قدرات المعالجة المطلوبة للمعالج الحديث.

The Great T'Fon of Storage
والسبب في ذلك هو أن المعالجات الحديثة سريعة بشكل لا يصدق - فهي تحتاج فقط إلى دورة ساعة واحدة لإضافة عددين صحيحين 64 بت ؛ إذا كان المعالج يعمل بسرعة 4 جيجاهرتز ، فهذه ليست سوى 0.00000000025 ثانية ، أو ربع نانوثانية.
في الوقت نفسه ، يستغرق القرص الصلب الدوار آلاف النانو ثانية فقط للعثور على البيانات الموجودة على الأقراص ، ناهيك عن نقلها ، وتستغرق محركات الأقراص ذات الحالة الصلبة عشرات أو مئات النانوثانية.
من الواضح ، لا يمكن بناء مثل هذه المحركات في الداخلالمعالجات ، لذلك سيكون هناك فصل مادي بينهما. لذلك ، يتم إضافة الوقت لنقل البيانات ، مما يؤدي إلى تفاقم الوضع.

للأسف ، هذا هو A'Tuin الرائع لتخزين البيانات
ولهذا نحتاج إلى نظام تخزين آخر يقع بين المعالج ومحرك الأقراص الرئيسي. يجب أن يكون أسرع من جهاز التخزين ، وقادرًا على التعامل مع عمليات نقل بيانات متعددة في وقت واحد ، ويكون أقرب بكثير إلى المعالج.
حسنًا ، لدينا بالفعل مثل هذا النظام ، ويسمى RAM ؛ إنه موجود في كل جهاز كمبيوتر ويقوم بهذه المهمة بالضبط.
جميع هذه المخازن تقريبًا من نوع DRAM (ذاكرة الوصول العشوائي الديناميكية) ؛ فهي قادرة على نقل البيانات أسرع بكثير من أي جهاز تخزين.

ومع ذلك ، على الرغم من سرعته الهائلة ، فإن DRAM غير قادر على تخزين مثل هذه الكميات من البيانات. تخزن
بعض أكبر شرائح ذاكرة DDR4 من Micron 32 جيجابت في الثانية أو 4 جيجابايت من البيانات؛ أكبر محركات الأقراص الصلبة تخزن 4000 مرة أكثر.
لذلك ، على الرغم من أننا قمنا بزيادة سرعة شبكة البيانات الخاصة بنا ، فإننا سنحتاج إلى أنظمة إضافية (أجهزة وبرامج) لمعرفة البيانات التي يجب تخزينها في كمية محدودة من DRAM ، جاهزة للمعالجة بواسطة المعالج.
يمكن تصنيع DRAM في حزمة شرائح (وهذا ما يسمى بالذاكرة الحيوية المدمجة). ومع ذلك ، فإن المعالجات صغيرة جدًا ، لذا لا يمكنها استيعاب قدر كبير من الذاكرة.

10 ميجا بايت DRAM على يسار وحدة معالجة الرسومات Xbox 360. المصدر: CPU Grave Yard
تقع الغالبية العظمى من DRAM على مقربة من المعالج ، ومتصلة باللوحة الأم ، ودائمًا ما تكون المكون الأقرب للمعالج. ومع ذلك ، لا تزال هذه الذاكرة غير سريعة بما يكفي ...
يستغرق DRAM حوالي 100 نانوثانية للعثور على البيانات ، ولكنه على الأقل قادر على نقل مليارات البتات في الثانية. يبدو أننا بحاجة إلى مرحلة ذاكرة أخرى يمكن وضعها بين كتل وحدة المعالجة المركزية والذاكرة الحيوية.
تظهر المرحلة المتبقية على المشهد: SRAM ( ذاكرة الوصول العشوائي الثابتة). يستخدم DRAM المكثفات المجهرية لتخزين البيانات في شكل شحنة كهربائية ، بينما يستخدم SRAM الترانزستورات لنفس المهمة ، والتي تعمل بنفس سرعة الكتل المنطقية للمعالج (حوالي 10 مرات أسرع من DRAM).

بالطبع ، SRAM لها عيب ، ومرة أخرى يتعلق الأمر بالمساحة.
تشغل ذاكرة الترانزستور مساحة أكبر بكثير من ذاكرة DRAM: بنفس حجم شريحة DDR4 بسعة 4 جيجابايت ، يمكنك الحصول على أقل من 100 ميجابايت من SRAM. ولكن نظرًا لتصنيعها باستخدام نفس عملية التصنيع مثل وحدة المعالجة المركزية ، يمكن دمج SRAM مباشرة داخل المعالج ، في أقرب وقت ممكن من الكتل المنطقية.
مع كل خطوة إضافية ، قمنا بزيادة سرعة البيانات المنقولة على حساب الحجم المخزن. يمكننا المضي قدمًا وإضافة خطوات جديدة ، والتي ستكون أسرع ولكن أصغر.
وهكذا توصلنا إلى تعريف أكثر صرامةمفاهيم ذاكرة التخزين المؤقت: مجموعة من ذاكرة الوصول العشوائي SRAM الموجودة داخل المعالج ؛ تزيد من استخدام المعالج إلى أقصى حد عن طريق نقل البيانات وتخزينها بسرعات عالية جدًا. هل أنت راض عن هذا التعريف؟ رائع ، لأن الأمور ستصبح أكثر تعقيدًا من الآن فصاعدًا!
النقدية: مواقف متعددة المستويات
كما قلنا أعلاه ، فإن ذاكرة التخزين المؤقت ضرورية لأننا لا نملك نظام تخزين سحري يمكنه التعامل مع استهلاك البيانات للكتل المنطقية للمعالج. تحتوي وحدات المعالجة المركزية ووحدات معالجة الرسومات الحديثة على العديد من وحدات ذاكرة الوصول العشوائي (SRAM) ، مرتبة في تسلسل هرمي داخلي - سلسلة من ذاكرات التخزين المؤقت بالهيكل التالي:

في الصورة أعلاه ، يُشار إلى المعالج (CPU) بواسطة مستطيل متقطع. على اليسار توجد ALUs (وحدات المنطق الحسابي) ؛ هذه هي الهياكل التي تؤدي عمليات حسابية. على الرغم من أنها ليست ذاكرة تخزين مؤقت ، إلا أن أقرب مستوى ذاكرة إلى ALU هو السجلات (يتم ترتيبها في ملف تسجيل ).
كل واحد منهم يخزن رقمًا واحدًا ، على سبيل المثال ، عدد صحيح 64 بت ؛ يمكن أن تكون القيمة نفسها عنصرًا في بعض البيانات ، أو رمزًا لتعليمات معينة ، أو عنوان ذاكرة لبعض البيانات الأخرى.
ملف التسجيل في معالجات سطح المكتب صغير جدًا ، على سبيل المثال ، في كل من مراكز Intel Core i9-9900Kهناك بنكان من هذه الملفات ، والآخر للأعداد الصحيحة يحتوي فقط على 180 عددًا صحيحًا 64 بت. يحتوي ملف تسجيل آخر للمتجهات (مصفوفات صغيرة من الأرقام) على 168 عنصرًا من 256 بت. أي أن إجمالي ملف التسجيل لكل نواة أقل بقليل من 7 كيلوبايت. للمقارنة ، يبلغ حجم ملف تسجيل Nvidia GeForce RTX 2080 Ti لتدفق المعالجات المتعددة (كما تسمي وحدات معالجة الرسومات نظائر وحدة المعالجة المركزية الأساسية) 256 كيلوبايت.
السجلات ، مثل ذاكرة التخزين المؤقت ، هي SRAM ، لكن سرعتها لا تتجاوز سرعة وحدات ALU التي تخدمها ؛ ينقلون البيانات في دورة ساعة واحدة. لكنها ليست مصممة لتخزين كميات كبيرة من البيانات (عنصر واحد فقط) ، لذلك توجد دائمًا كتل أكبر من الذاكرة بجانبها: هذا هو المستوى الأول من ذاكرة التخزين المؤقت (المستوى 1).

نواة معالج Intel Skylake واحد. المصدر: Wikichip
الصورة أعلاه عبارة عن عرض مكبر لأحد نوى معالج سطح المكتب Intel Skylake .
توجد ملفات ALU والتسجيل على اليسار وتحيط بها إطار أخضر. في الجزء العلوي من الصورة ، يشار إلى ذاكرة التخزين المؤقت لبيانات المستوى 1 باللون الأبيض. لا يحتوي على الكثير من المعلومات ، فقط 32 كيلو بايت ، ولكن مثل السجلات ، فهو قريب جدًا من الكتل المنطقية ويعمل بنفس سرعتها.
يظهر مستطيل أبيض آخر على اليمين ذاكرة التخزين المؤقت لتعليمات المستوى 1 ، بحجم 32 كيلوبايت أيضًا. كما يوحي الاسم ، فإنه يخزن أوامر مختلفة جاهزة للتقسيم إلى عمليات صغيرة أصغر .(يشار إليها عادةً بـ μops) التي يجب أن تنفذها ALU. هناك أيضًا ذاكرة تخزين مؤقت لها ، والتي يمكن تصنيفها على أنها المستوى 0 ، لأنها أصغر (تحتوي فقط على 1500 عملية) وأقرب من مخابئ L1.
قد تتساءل لماذا تكون هذه الذاكرة العشوائية الصغيرة الحجم صغيرة جدًا؟ لماذا ليس حجمها ميغا بايت؟ معًا ، تشغل مخابئ البيانات والتعليمات نفس المنطقة تقريبًا على الشريحة مثل الكتل المنطقية الرئيسية ، لذا ستؤدي زيادتها إلى زيادة في إجمالي مساحة القالب.
لكن السبب الرئيسي لحجمها البالغ عدة كيلوبايت هو أنه مع زيادة سعة الذاكرة ، يزداد الوقت المطلوب للبحث عن البيانات واستردادها. يجب أن تكون ذاكرة التخزين المؤقت L1 سريعة جدًا ، لذلك هناك مفاضلة بين الحجم والسرعة - في أفضل الأحوال ، يستغرق الأمر حوالي 5 دورات على مدار الساعة للحصول على البيانات من ذاكرة التخزين المؤقت هذه (المزيد لقيم النقطة العائمة).

ذاكرة التخزين المؤقت Skylake's L2: 256KB SRAM
ولكن إذا كانت هذه هي ذاكرة التخزين المؤقت الوحيدة داخل المعالج ، فإن أدائها سيواجه عقبة غير متوقعة. هذا هو السبب في وجود طبقة أخرى من الذاكرة في النواة: المستوى 2. مخبأ هذا هو كتلة تخزين عامة تحتوي على تعليمات وبيانات.
دائمًا ما يكون أكبر من المستوى 1: في معالجات AMD Zen 2 ، يستغرق الأمر ما يصل إلى 512 كيلو بايت لتوفير بيانات كافية لذاكرة التخزين المؤقت ذات المستوى الأدنى. ومع ذلك ، يتطلب الحجم الكبير التضحية - يستغرق الأمر حوالي ضعف الوقت للعثور على البيانات ونقلها من ذاكرة التخزين المؤقت هذه مقارنة بالمستوى 1.
في أيام Intel Pentium الأول ، كانت ذاكرة التخزين المؤقت من المستوى 2 عبارة عن شريحة منفصلة ، إما مثبتة على لوحة صغيرة منفصلة (مثل DIMM RAM) ، أو مدمجة في اللوحة الأم الرئيسية. تدريجيًا ، انتقل إلى حالة المعالج نفسه ، وأخيراً تم دمجه بالكامل في رقاقة الكريستال ؛ حدث هذا في عصر المعالجات مثل Pentium III و AMD K6-III.
سرعان ما تبع هذا الإنجاز مستوى آخر من ذاكرة التخزين المؤقت اللازمة لدعم المستويات الأدنى ، وقد وصل في الوقت المناسب تمامًا في ذروة الرقائق متعددة النواة.

رقاقة إنتل كابي ليك. المصدر: Wikichip تُظهر
هذه الصورة لشريحة Intel Kaby Lake أربعة نوى على اليسار (تأخذ وحدة معالجة الرسومات المدمجة ما يقرب من نصف القالب وهي على اليمين). كل نواة لها مجموعتها "الشخصية" الخاصة بها من مخابئ المستوى 1 و 2 (مظللة في المربعات البيضاء والصفراء) ، ولكن لديها أيضًا مجموعة ثالثة من كتل SRAM.
ذاكرة التخزين المؤقت من المستوى الثالث (المستوى 3) ، على الرغم من أنها تقع بجوار نواة واحدة مباشرة ، فهي شائعة تمامًا لجميع الآخرين - يمكن لكل نواة الوصول بحرية إلى محتويات ذاكرة التخزين المؤقت L3 لنواة أخرى. إنه أكبر بكثير (من 2 إلى 32 ميجابايت) ، ولكنه أيضًا أبطأ بكثير ، حيث يبلغ متوسطه أكثر من 30 دورة ، خاصةً عندما تحتاج النواة إلى استخدام البيانات الموجودة في كتلة ذاكرة تخزين مؤقت بعيدة.
الموضح أدناه هو أحد نواة بنية AMD Zen 2: ذاكرة تخزين مؤقت للبيانات والتعليمات من المستوى 1 بسعة 32 كيلوبايت (في المربعات البيضاء) ، وذاكرة التخزين المؤقت للمستوى 2 بسعة 512 كيلوبايت (في المربعات الصفراء) ، وكتلة ذاكرة التخزين المؤقت الضخمة L3 بحجم 4 ميجابايت (في المربع الأحمر)

تكبير في نواة واحدة لمعالج AMD Zen 2. المصدر: Fritzchens Fritz
لكن انتظر: كيف يمكن أن يشغل 32 كيلوبايت مساحة فعلية أكبر من 512 كيلوبايت؟ إذا كان المستوى 1 يخزن القليل جدًا من البيانات ، فلماذا يكون كبيرًا بشكل غير متناسب مقارنةً بمخازن L2 و L3؟
ليس مجرد أرقام
تعمل ذاكرة التخزين المؤقت على تحسين الأداء من خلال تسريع نقل البيانات إلى الكتل المنطقية والاحتفاظ بنسخة من الإرشادات والبيانات المستخدمة بشكل متكرر في مكان قريب. تنقسم المعلومات المخزنة في ذاكرة التخزين المؤقت إلى جزأين: البيانات نفسها والمكان الذي توجد فيه في الأصل في ذاكرة / تخزين النظام - يسمى هذا العنوان علامة ذاكرة التخزين المؤقت .
عندما ينفذ المعالج عملية تحتاج إلى قراءة البيانات أو كتابتها من / إلى الذاكرة ، فإنه يبدأ بالتحقق من العلامات في ذاكرة التخزين المؤقت للمستوى 1. إذا كانت البيانات المطلوبة موجودة (حدثت نتيجة ذاكرة التخزين المؤقت ) ، فإن هذه البيانات تقريبًا ذات مرة. يحدث خطأ في ذاكرة التخزين المؤقت عندما لا يتم العثور على العلامة المطلوبة في أدنى مستوى في ذاكرة التخزين المؤقت.
يتم إنشاء علامة جديدة في ذاكرة التخزين المؤقت L1 ، وتتولى بقية بنية المعالج ، البحث في مستويات أخرى من ذاكرة التخزين المؤقت (حتى وحدة التخزين الرئيسية ، إذا لزم الأمر) لبيانات تلك العلامة. ولكن لإخلاء مساحة في ذاكرة التخزين المؤقت L1 لهذه العلامة الجديدة ، يجب إلقاء شيء ما في L2.
ينتج عن هذا خلط شبه ثابت للبيانات ، يتم إجراؤه في بضع دورات على مدار الساعة. الطريقة الوحيدة لتحقيق ذلك هي عن طريق إنشاء بنية معقدة حول SRAM للتعامل مع إدارة البيانات. بعبارة أخرى ، إذا كان نواة المعالج يتكون من وحدة ALU واحدة فقط ، فإن ذاكرة التخزين المؤقت L1 ستكون أبسط بكثير ، ولكن نظرًا لوجود العشرات منها (والعديد منها يتلاءم مع دفقين من التعليمات) ، فإن ذاكرة التخزين المؤقت تتطلب العديد من الاتصالات لنقل البيانات.

يمكنك استخدام برامج مجانية مثل CPU-Z لفحص معلومات ذاكرة التخزين المؤقت في معالج الكمبيوتر . لكن ماذا تعني كل هذه المعلومات؟ من العناصر المهمة تسمية المجموعة الترابطية ، والتي تشير إلى القواعد المستخدمة لنسخ كتل البيانات من ذاكرة النظام إلى ذاكرة التخزين المؤقت.
معلومات ذاكرة التخزين المؤقت أعلاه مخصصة لـ Intel Core i7-9700K . تنقسم كل من ذاكرات التخزين المؤقت من المستوى 1 إلى 64 كتلة صغيرة ، تسمى مجموعات ، ويتم تقسيم كل من هذه الكتل أيضًا إلى خطوط ذاكرة تخزين مؤقت.(حجم 64 بايت). "مجموعة ترابطية" تعني أن كتلة من البيانات من النظام مرتبطة بخطوط ذاكرة التخزين المؤقت في مجموعة معينة ، ولا يمكن ربطها بمكان آخر بحرية.
تعني "8-way" أنه يمكن ربط كتلة واحدة بـ 8 أسطر من ذاكرة التخزين المؤقت في المجموعة. كلما ارتفع مستوى الارتباط (أي ، كلما زادت "الطريقة") ، زادت فرص وصول ذاكرة التخزين المؤقت أثناء البحث عن المعالج وتقليل الخسارة الناتجة عن أخطاء ذاكرة التخزين المؤقت. تتمثل عيوب هذا النظام في زيادة التعقيد واستهلاك الطاقة ، فضلاً عن الأداء المنخفض ، لأنه يجب معالجة المزيد من خطوط التخزين المؤقت لكل كتلة من البيانات.

ذاكرة التخزين المؤقت الشاملة L1 + L2 ، ذاكرة التخزين المؤقت للضحية L3 ، سياسات إعادة الكتابة ، حتى أن هناك ECC. المصدر: Fritzchens Fritz
هناك جانب آخر من جوانب تعقيد ذاكرة التخزين المؤقت له علاقة بكيفية تخزين البيانات بين طبقات مختلفة. يتم تعيين القواعد في سياسة التضمين . على سبيل المثال ، تحتوي معالجات Intel Core على مخابئ L1 + L3 شاملة بالكامل . هذا يعني أن بعض البيانات في المستوى 1 ، على سبيل المثال ، قد تكون موجودة في المستوى 3. قد يبدو الأمر وكأنه مضيعة لمساحة ذاكرة التخزين المؤقت القيمة ، ولكن الميزة هي أنه إذا فات المعالج العلامة في المستوى الأدنى ، فإنه لا يحتاج ابحث في المستوى الأعلى عن البيانات.
في نفس المعالجات ، تكون ذاكرة التخزين المؤقت L2 غير شاملة: لا يتم نسخ جميع البيانات المخزنة هناك إلى أي طبقة أخرى. يوفر هذا مساحة ، ولكنه يتسبب في قيام نظام ذاكرة الشريحة بالبحث عن علامة مفقودة في L3 (والتي تكون دائمًا أكبر بكثير). تتشابه مخابئ الضحايا من حيث المبدأ ، لكنها تُستخدم لتخزين المعلومات المنقولة من المستويات الأدنى. على سبيل المثال ، تستخدم معالجات AMD Zen 2 ذاكرة التخزين المؤقت للضحية L3 ، والتي تقوم ببساطة بتخزين البيانات من L2.
توجد سياسات ذاكرة تخزين مؤقت أخرى ، مثل كتابة البيانات إلى ذاكرة التخزين المؤقت وذاكرة النظام الرئيسية. هذه تسمى سياسات الكتابة ؛ تستخدم معظم المعالجات الحديثة مخابئ إعادة الكتابة- هذا يعني أنه عند كتابة البيانات في طبقة ذاكرة التخزين المؤقت ، هناك تأخير قبل كتابة نسخة منها في ذاكرة النظام. في أغلب الأحيان ، يستمر هذا الإيقاف المؤقت طالما بقيت البيانات في ذاكرة التخزين المؤقت - لا تتلقى ذاكرة الوصول العشوائي هذه المعلومات إلا عندما "تنبثق" من ذاكرة التخزين المؤقت.

وحدة معالجة الرسومات Nvidia GA100 مع ذاكرة تخزين مؤقت L1 سعة 20 ميجابايت وذاكرة تخزين مؤقت سعة 40 ميجابايت L2
بالنسبة لمصممي المعالجات ، فإن اختيار حجم ذاكرة التخزين المؤقت ونوعها وسياستها هي مسألة موازنة محرك الأقراص لزيادة قوة المعالج مع زيادة التعقيد ومساحة الشريحة. إذا كان من الممكن إنشاء مخابئ ارتباطية بحجم 1000 قناة 20 ميغا بايت من المستوى 1 بحيث لا تشغل منطقة مانهاتن (ولم تستهلك نفس القدر من الطاقة) ، فسنمتلك جميعًا أجهزة كمبيوتر بها هذه الرقائق!
ظل أدنى مستوى من ذاكرات التخزين المؤقت في المعالجات الحديثة دون تغيير فعليًا خلال العقد الماضي. ومع ذلك ، يستمر حجم ذاكرة التخزين المؤقت من المستوى 3 في النمو. إذا كان لديك 999 دولارًا مقابل Intel i7-980X قبل عشر سنوات ، فقد يكون لديك ذاكرة تخزين مؤقت سعة 12 ميجابايت. اليوم مقابل نصف هذا المبلغمتاح للشراء 64 ميجا بايت .
للتلخيص ، ذاكرة التخزين المؤقت هي جهاز أساسي ورائع للغاية. لم نأخذ في الاعتبار أنواعًا أخرى من ذاكرات التخزين المؤقت في وحدة المعالجة المركزية ووحدة معالجة الرسومات (على سبيل المثال ، المخازن المؤقتة للترجمة الترابطية أو ذاكرات التخزين المؤقت للنسيج) ، ولكن نظرًا لأنها تتمتع جميعها بنفس البنية البسيطة وترتيب المستويات ، فلن يكون من الصعب فهمها.
هل كان لديك جهاز كمبيوتر به ذاكرة تخزين مؤقت L2 على اللوحة الأم؟ ماذا عن اللوحات الأم بنتيوم 2 وسيليرون المشقوقة (مثل 300 أ )؟ تذكر أول معالج L3 مشترك لك؟
إعلان
تقدم شركتنا تأجير خوادم مع معالجات من Intel و AMD. في الحالة الأخيرة ، هذه خوادم ملحمية! VDS مع AMD EPYC ، تردد مركزي لوحدة المعالجة المركزية يصل إلى 3.4 جيجا هرتز. الحد الأقصى للتهيئة هو 128 نواة وحدة المعالجة المركزية ، وذاكرة وصول عشوائي 512 جيجابايت ، و 4000 جيجابايت من ذاكرة الوصول العشوائي NVMe
