> ## Content Index
> Fetch the complete content index at: https://arabroot.io/llms.txt
> Use this file to discover other available public pages before exploring further.

# كيف تعمل الذاكرة RAM من الداخل، ولماذا تحتاج التحديث Refresh
- URL: https://arabroot.io/articles/كيف-تعمل-الذاكرة-ram-من-الداخل/
- Published: 2026-10-06T16:15:00.000Z
- Updated: 2026-10-09T13:02:51.000Z
- Description: نفتح وحدة الذاكرة من الشريحة إلى الخلية، لتفهم ما تعنيه الأرقام المكتوبة عليها عندما تشتري جهازاً أو تختار سيرفراً.
- Author: فريق عرب رووت
- Tags: الأدلة التقنية, الشبكات والبنية التحتية, هوم لاب, لينكس والسيرفرات, الاستضافة الذاتية

عندما تشتري ذاكرة لحاسبك أو تختار خطة لسيرفر فأنت تقرأ أرقاماً مثل `32GB 2Rx8 PC5-5600B` أو `DDR4-3200 CL22` أو «ECC Registered»، وغالباً تختار الأكبر والأسرع وتكمل يومك، إلى أن تجد أن الوحدة الجديدة تعمل بسرعة أقل مما كتب عليها، أو أن سيرفراً في مركز البيانات يسجل أخطاء ذاكرة «مصححة» ولا تعرف هل هذا خبر جيد أم سيئ، أو أن ذاكرة DDR5 الأسرع لم تجعل الطلبات أسرع كما توقعت. وكل هذه الأسئلة تجد إجابتها عندما تفتح وحدة الذاكرة RAM وترى ما الذي يحدث داخلها عندما يطلب المعالج بايتاً واحداً.

وهذا المقال من مرحلة [العتاد Hardware](https://arabroot.io/start/#stage-hardware) في خارطة عرب رووت، ويسير بجانب مقال [كيف يعمل المعالج CPU من الداخل](https://arabroot.io/articles/%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%85%D9%84-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC-cpu-%D9%85%D9%86-%D8%A7%D9%84%D8%AF%D8%A7%D8%AE%D9%84/)، فذلك يشرح من يطلب البيانات وهذا يشرح من أين تأتي. أما كيف يرى برنامجك الذاكرة، أي ال Stack وال Heap والمؤشرات وجامع القمامة، فقد شرحناه في [الذاكرة للمبرمجين](https://arabroot.io/articles/%D8%A7%D9%84%D8%B0%D8%A7%D9%83%D8%B1%D8%A9-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86-stack-%D9%88-heap-%D9%88%D8%A7%D9%84%D9%85%D8%A4%D8%B4%D8%B1%D8%A7%D8%AA/)، ولا تحتاج هذا المقال لتفهمه. وسوف نناقش في هذا المقال ما يلي:

- وحدة الذاكرة من الخارج بصور حقيقية، ثم مفككة قطعة قطعة.
- من الوحدة إلى الشريحة إلى البنوك Banks إلى الصفوف والأعمدة حتى الخلية الواحدة.
- دورة القراءة خطوة بخطوة بالأوامر ACTIVATE وREAD وPRECHARGE والتوقيتات tRCD وCL وtRP من ورقة بيانات حقيقية.
- لماذا تنسى الذاكرة إذا تركت، وما هو التحديث Refresh.
- كيف تصحح ذاكرة ECC في السيرفرات بتاً انقلب، وأين ترى ذلك في Linux.
- أجيال DDR3 وDDR4 وDDR5، والقنوات Dual Channel، وماذا يعني 5600 MT/s مع CL40 بالنانوثانية.
- تجربة على جهاز حقيقي: نقرأ معلومات الوحدات المركبة، ونقيس الفرق بين القراءة المتتابعة والعشوائية.

## من الخارج: ماذا ترى على وحدة الذاكرة؟

الذاكرة في الحاسب المكتبي والسيرفر تأتي على شكل وحدة طويلة اسمها DIMM، اختصاراً لـ Dual In-line Memory Module، وفي الحاسب المحمول على شكل وحدة أقصر اسمها SO-DIMM، أي Small Outline DIMM. والصورة التالية فيها وحدتان حقيقيتان من الجيل الحالي DDR5، الأولى وحدة UDIMM لحاسب مكتبي من SK hynix، والثانية وحدة SO-DIMM لحاسب محمول من Micron، وعليهما أرقام من رسمنا تشير إلى كل جزء:

![صورتان حقيقيتان: في الأعلى وحدة ذاكرة DDR5 UDIMM خضراء طويلة عليها ثماني شرائح سوداء في مجموعتين وفي وسطها مجموعة صغيرة من القطع، وفي الأسفل وحدة SO-DIMM أقصر عليها ملصق Micron، وعلى الصورتين أرقام تشير إلى شرائح DRAM ومنطقة PMIC وSPD Hub والموصل الذهبي وفتحة المفتاح واللوحة والملصق، وفي الأسفل شرح لكتابة الملصق 32GB 2Rx8 PC5-5600B](https://arabroot.io/content/images/2026/10/memory-basics-01-ram-outside.webp)

وحدة DDR5 UDIMM للحاسب المكتبي ووحدة DDR5 SO-DIMM للحاسب المحمول. الصورتان: ITEagle Europe (Sebastiaan Broekhoven)، بترخيص CC BY-SA 4.0، من Wikimedia Commons ([صورة SK hynix](https://commons.wikimedia.org/wiki/File:SK%5Fhynix%5F16GB%5FDDR5-5600%5FUDIMM%5FHMCG78AGBUA084N%5FBA.jpg?ref=arabroot.io) و[صورة Micron](https://commons.wikimedia.org/wiki/File:Micron%5F32%5FGB%5FDDR5-5600%5FSO-DIMM%5F-%5Ffront%5Fview.jpg?ref=arabroot.io))، تم قصهما ووضعت عليهما الأرقام والأسهم

1. **شرائح DRAM:** المربعات السوداء هي شرائح الذاكرة نفسها، واسمها DRAM اختصاراً لـ Dynamic Random Access Memory، وفيها تخزن البتات. وفي الوحدة العلوية 8 شرائح، والملصق يقول `1Rx8`، أي صف واحد من الشرائح وكل شريحة تعطي 8 بتات في كل عملية، فتعمل الثماني معاً لتعطي 64 بتاً من البيانات.
2. **منطقة PMIC وSPD Hub:** القطع الصغيرة في الوسط. الأولى دائرة إدارة الطاقة PMIC، اختصاراً لـ Power Management Integrated Circuit، وهي جديدة في DDR5 حيث أصبحت إدارة الطاقة على الوحدة نفسها كما تذكر [صفحة Micron عن DDR5](https://www.micron.com/products/memory/dram-components/ddr5-sdram?ref=arabroot.io)، ولها مواصفة خاصة من JEDEC هي [PMIC5100](https://www.jedec.org/standards-documents/docs/jesd301-2?ref=arabroot.io). والثانية شريحة SPD، اختصاراً لـ Serial Presence Detect، وهي ذاكرة صغيرة تحفظ معلومات الوحدة مثل حجمها وسرعاتها وتوقيتاتها، فيقرؤها الجهاز عند التشغيل ليعرف كيف يتعامل معها، وفي DDR5 أصبحت SPD5 Hub ومعها حساس حرارة Temperature Sensor كما في [مواصفة JEDEC](https://www.jedec.org/standards-documents/docs/jesd300-5?ref=arabroot.io).
3. **الموصل الذهبي Edge Connector:** الأطراف المطلية في أسفل الوحدة، وكل طرف منها Pin يحمل إشارة أو طاقة إلى المقبس Slot في اللوحة الأم Motherboard، وعددها في DDR5 هو 288 طرفاً في DIMM و262 في SO-DIMM بحسب [ملخص Kingston لمعيار DDR5](https://media.kingston.com/kingston/articles/MKF%5F954-DDR5-Collateral%5Fus.pdf?ref=arabroot.io).
4. **فتحة المفتاح Key Notch:** الشق الصغير بين الأطراف، وهو ليس في المنتصف بالضبط، ومكانه يختلف بين الأجيال، والملخص نفسه يذكر أنه يمنع تركيب وحدات DDR4 أو DDR3 في مقبس DDR5، بل إن مكانه في DDR5 يختلف بين UDIMM وRDIMM.
5. **اللوحة PCB:** اللوحة الخضراء نفسها، وهي طبقات فيها مسارات نحاسية Traces توصل كل طرف في الموصل إلى الشريحة المطلوبة.
6. **الملصق Label:** `32GB 2Rx8 PC5-5600B` تعني 32 جيجابايت، وصفين Ranks من الشرائح، وكل شريحة بعرض 8 بتات، والجيل DDR5، وسرعة 5600 مليون عملية نقل في الثانية MT/s، وسوف نرى معنى كل رقم منها في الأقسام التالية.

## الوحدة مفككة: كل قطعة في مكانها

الصورة الحقيقية تبين الشكل، ولكنها لا تبين كيف تجتمع القطع، لذلك رسمنا الوحدة نفسها مفككة، والقطع مرفوعة فوق اللوحة حتى ترى كل واحدة منها ووظيفتها. والرسم من عندنا وبأسلوب الرسوم المفككة Exploded View المعروف في كتب شرح العتاد، ولم ننقله من أي كتاب أو موقع:

![رسم أيزومتري لوحدة ذاكرة خضراء طويلة وفوقها ثماني شرائح سوداء مرفوعة بخطوط متقطعة تبين مكانها، وفي الوسط قطعة PMIC رمادية وقطعة SPD5 Hub بنفسجية، وعلى الحافة الأمامية أطراف ذهبية مع فتحة المفتاح، وستة أرقام تشرح كل جزء](https://arabroot.io/content/images/2026/10/ram-internals-02-module-exploded.webp)

رسم مفكك من عندنا لوحدة DDR5 UDIMM مثل التي في الصورة، والقطع مرفوعة عن اللوحة حتى ترى كل واحدة منها

ولاحظ في الرسم أن الشرائح الثماني هي الذاكرة الفعلية، أما بقية القطع فتخدمها: ال PMIC يعطيها الجهد الذي تحتاجه، وال SPD يعرف الجهاز بها، والموصل ينقل الإشارات بينها وبين المعالج. ولاحظ أيضاً أن الوحدة في الصورة والرسم لا يوجد عليها مشتت حرارة Heat Spreader، أي الغطاء المعدني الذي تراه على وحدات أجهزة الألعاب، فهو اختياري ويغطي الشرائح فقط ولا يغير طريقة عملها.

## من الداخل: من المعالج حتى البت الواحد

الآن نفتح الشرائح ونتبع الطلب من المعالج حتى يصل إلى البت الذي يريده. فالمعالج لا يتحدث مع الذاكرة مباشرة، وإنما عبر جزء داخله اسمه متحكم الذاكرة Memory Controller، وهذا المتحكم يدير قناة أو أكثر Channels، وكل قناة مسار مستقل إلى وحدة أو أكثر. ومن هنا يبدأ التكبير الذي تبينه الصورة التالية:

![أربع لوحات مرقمة في الأعلى: المعالج ومتحكم الذاكرة وقناتان، ثم وحدة DIMM فيها صفان Rank 0 وRank 1 من الشرائح، ثم شريحة DRAM مقسمة إلى 8 مجموعات Bank Groups في كل منها 4 Banks، ثم Bank واحد على شكل مصفوفة صفوف وأعمدة تحتها Row Buffer، وفي الأسفل خلية واحدة فيها ترانزستور ومكثف مع منحنى شحنة يتسرب، وقائمة بمسار العنوان](https://arabroot.io/content/images/2026/10/memory-basics-02-ram-inside.webp)

كل مستوى يكبر الذي قبله: القناة، ثم الوحدة وصفوفها، ثم الشريحة وبنوكها، ثم الصفوف والأعمدة، ثم خلية من ترانزستور ومكثف

1. **الصف Rank:** مجموعة من الشرائح تعمل معاً لتعطي عرض القناة كاملاً، ففي الوحدة `1Rx8` صف واحد من 8 شرائح، وفي `2Rx8` صفان، ويختار المتحكم صفاً واحداً في كل عملية. وفي DDR5 تنقسم الوحدة إلى قناتين فرعيتين مستقلتين Subchannels، وهذا مذكور في [إعلان JEDEC عن معيار DDR5](https://www.jedec.org/news/pressreleases/jedec-publishes-new-ddr5-standard-advancing-next-generation-high-performance?ref=arabroot.io) الذي يصف قناتين فرعيتين مستقلتين بعرض 40 بتاً على الوحدة نفسها.
2. **البنوك Banks:** كل شريحة مقسمة من الداخل إلى Banks تعمل بالتوازي، وفي شرائح DDR5 بعرض x4 أو x8 تكون 8 مجموعات Bank Groups في كل منها 4 Banks بحسب جدول Micron، بينما في DDR4 كانت 4 مجموعات في كل منها 4، والسبب أن المتحكم يستطيع أن يبدأ عملية في Bank بينما Bank آخر مشغول.
3. **الصفوف والأعمدة Rows and Columns:** كل Bank مصفوفة ضخمة من الخلايا، وللقراءة يفتح المتحكم صفاً كاملاً فينقل إلى مخزن مؤقت اسمه Row Buffer عبر مكبرات الإحساس Sense Amplifiers، ثم يقرأ منه الأعمدة التي يريدها، وهذا ما سوف نراه بالتفصيل في دورة القراءة.
4. **الخلية Cell:** وهنا نصل إلى البت الواحد، فخلية DRAM مكونة من ترانزستور Transistor ومكثف Capacitor، والبت يخزن كشحنة كهربائية في المكثف، والترانزستور مفتاح يوصله بخط البيانات Bit Line عند القراءة، كما تشرح [ورقة جامعة Maryland عن آليات التحديث](https://user.eng.umd.edu/~blj/papers/ieeetc65-1.pdf?ref=arabroot.io) المنشورة في IEEE Transactions on Computers، وتذكر الورقة نفسها أن الشرائح المتوافقة مع JEDEC منظمة في Banks وصفوف وأعمدة.

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

## دورة القراءة: فتح الصف ثم قراءة العمود ثم الإغلاق

عندما يطلب المعالج بيانات ليست في ال Cache، يترجم متحكم الذاكرة العنوان إلى قناة وصف Rank وBank وصف Row وعمود Column، ثم يرسل إلى الشريحة سلسلة من الأوامر، وكل أمر له زمن انتظار محدد في ورقة بيانات الشريحة. وسوف نأخذ الأرقام من ورقة بيانات Samsung لشريحة [DDR4 من نوع K4A8G165WC](https://www.samsung.com/semiconductor/global.semi/file/resource/2017/12/x16%20only%5F8G%5FC%5FDDR4%5FSamsung%5FSpec%5FRev1.5%5FApr.17.pdf?ref=arabroot.io)، بفئة السرعة DDR4-2666 التي يكتب توقيتها `19-19-19`، والورقة نفسها توضح أن هذا الترتيب هو CL ثم tRCD ثم tRP. والصورة التالية تبين الخطوات:

![أربع لوحات مرقمة لبنك واحد: بنك خامل وال Row Buffer فارغ، ثم ACTIVATE حيث ينسخ الصف الثالث إلى ال Row Buffer، ثم READ حيث يخرج العمود السادس إلى الناقل، ثم PRECHARGE حيث يغلق الصف، وتحتها خط زمني بالدورات عليه ACT ثم READ بعد 19 دورة ثم دفعة البيانات بعد 19 دورة أخرى ثم PRE ثم ACT جديد بعد tRP](https://arabroot.io/content/images/2026/10/ram-internals-04-read-cycle.webp)

القراءة من بنك مغلق تمر بثلاثة أوامر، وبين كل أمر والذي يليه زمن انتظار محدد في ورقة البيانات

1. **ACTIVATE (ACT):** يفتح الصف المطلوب، فتنقل شحنات كل خلايا الصف إلى ال Row Buffer. وقبل أن يستطيع المتحكم أن يقرأ عليه أن ينتظر tRCD، أي ACT to internal read or write delay، وقيمته في هذه الشريحة 14.25 ns.
2. **READ:** يختار العمود، وبعد CL دورة، أي CAS Latency، تبدأ البيانات بالخروج على الناقل، وفي هذه الفئة CL = 19 دورة، وطول الدورة tCK = 0.75 ns، أي 14.25 ns. وتخرج البيانات دفعة Burst من عدة عمليات نقل متتالية.
3. **PRECHARGE (PRE):** يغلق الصف ويجهز البنك لفتح صف آخر، ولا يمكن فتح صف جديد في البنك نفسه قبل مرور tRP، أي PRE command period، وقيمته 14.25 ns كذلك.

ومن هنا يأتي فرق مهم: إذا كان الطلب التالي في الصف المفتوح نفسه Row Hit فيكفي أمر READ جديد وانتظار CL فقط، أما إذا كان في صف آخر من البنك نفسه Row Miss فيجب الإغلاق ثم الفتح ثم القراءة، أي tRP ثم tRCD ثم CL، وهذا ثلاثة أضعاف الانتظار تقريباً. ولهذا السبب بالذات تكون قراءة بيانات متجاورة أسرع بكثير من القفز بين عناوين متباعدة، وسوف نقيس ذلك في التجربة.

## لماذا تنسى الذاكرة إذا تركت؟ التحديث Refresh

المشكلة في خلية الترانزستور والمكثف أن الشحنة في المكثف تتسرب مع الوقت، فإذا تركت الخلية فترة كافية لا يعود المتحكم يستطيع أن يميز إن كانت 1 أو 0، ولذلك تسمى الذاكرة ديناميكية Dynamic: يجب أن تقرأ كل خلية وتعاد شحنتها دورياً، وهذا ما يسمى التحديث Refresh. والصورة التالية تبين الخلية مفتوحة والشحنة تتسرب منها، وبجانبها ما يفعله المتحكم حتى لا تضيع:

![على اليسار مقطع مبسط لخلية: خط البيانات وبوابة الترانزستور على السيليكون ومكثف طويل فيه شحنة برتقالية تتسرب منها قطرات، وعلى اليمين منحنى شحنة ينخفض ثم يعود إلى الأعلى عند كل أمر REF، وخط متقطع لخلية لم تحدث تنزل تحت حد القراءة، وثلاث نقاط مرقمة بأرقام التحديث](https://arabroot.io/content/images/2026/10/ram-internals-05-refresh.webp)

الشحنة تتسرب، والمتحكم يرسل أوامر REFRESH بانتظام حتى يعيد شحن كل صف قبل أن يضيع

- **نافذة التحديث Refresh Window:** بحسب [ورقة IEEE نفسها](https://user.eng.umd.edu/~blj/papers/ieeetc65-1.pdf?ref=arabroot.io) فأغلب شرائح DRAM التجارية لها زمن احتفاظ Retention Time مقداره 32 أو 64 ميلي ثانية، يجب أن تحدث خلاله كل خلية، ويقصر هذا الزمن مع ارتفاع الحرارة.
- **الفاصل بين الأوامر tREFI:** في ورقة بيانات Samsung يجب أن يرسل المتحكم أمر REFRESH في المتوسط كل 7.8 ميكروثانية تحت 85 درجة مئوية، وكل 3.9 ميكروثانية بين 85 و95 درجة، وكل أمر يحدث مجموعة من الصفوف، فإذا قسمت 64 ms على 7.8 µs حصلت على نحو 8192 أمراً تغطي الشريحة كلها.
- **الثمن:** أثناء التحديث لا يستطيع ال Bank أن يخدم القراءة والكتابة، فالتحديث جزء من تكلفة الذاكرة في الأداء والطاقة، ولهذا أضافت DDR5 تحديث بنك واحد في كل مجموعة Same Bank Refresh حتى تعمل البنوك الأخرى في الوقت نفسه، كما في جدول Micron وإعلان JEDEC.

وهذا التسرب هو أيضاً سبب أن الذاكرة تفقد كل ما فيها عندما ينقطع التيار، فلا يوجد من يرسل أوامر التحديث، ولهذا تسمى RAM ذاكرة متطايرة Volatile Memory بعكس الأقراص.

## ذاكرة ECC: كيف يصحح السيرفر بتاً انقلب وحده؟

الخلية الصغيرة حساسة، وقد ينقلب بت واحد وهو مخزن بسبب خلية ضعيفة أو ضجيج كهربائي، وفي حاسبك الشخصي قد لا تلاحظ ذلك أبداً، أو يظهر كانهيار غريب لا يتكرر. أما في سيرفر قاعدة بيانات يعمل سنوات فبت واحد خاطئ في رقم حساب أو في فهرس قد يتحول إلى بيانات فاسدة تنسخ إلى النسخ الاحتياطية. والحل هو تصحيح الأخطاء ECC، اختصاراً لـ Error Correction Code، والصورة التالية تبين الخطوات:

![أربعة صفوف مرقمة من البتات الزرقاء للبيانات والبنفسجية للتحقق: الكتابة، ثم في الذاكرة حيث ينقلب بت واحد إلى الأحمر، ثم القراءة حيث يحسب المتحكم بتات التحقق من جديد ويعرف البت الخاطئ، ثم البيانات بعد التصحيح، وفي الأسفل مسارات Linux EDAC وعرض الكلمة في DDR4 وDDR5](https://arabroot.io/content/images/2026/10/ram-internals-06-ecc.webp)

المتحكم يخزن 8 بتات تحقق مع كل 64 بتاً، ويستخدمها عند القراءة ليجد البت الذي انقلب ويصححه

1. عند الكتابة يحسب متحكم الذاكرة 8 بتات تحقق Check Bits من كل 64 بتاً من البيانات، ويخزن الكلمة كاملة، أي 72 بتاً، كما يشرح [توثيق EDAC في نواة Linux](https://docs.kernel.org/driver-api/edac.html?ref=arabroot.io): الشرائح تجمع بالتوازي لتعطي غالباً 72 بتاً، منها 64 للبيانات و8 لل ECC. ولهذا تحتوي وحدة ECC على شرائح أكثر من الوحدة العادية.
2. عند القراءة يحسب المتحكم بتات التحقق من جديد ويقارنها بالمخزنة، والفرق بينهما يحدد البت الخاطئ.
3. يقلب المتحكم البت إلى قيمته الصحيحة، ويعطي المعالج البيانات الصحيحة، ويسجل خطأ مصححاً Corrected Error.
4. إذا كان عدد البتات الخاطئة أكبر من قدرة الكود فإنه يكتشف الخطأ ولا يستطيع تصحيحه، وهذا خطأ غير مصحح Uncorrected Error، كما يشرح [دليل RAS في Linux](https://docs.kernel.org/admin-guide/RAS/main.html?ref=arabroot.io) الذي يذكر أن أغلب الأنظمة تستخدم أكواداً مثل Hamming Codes.

وفي DDR5 أصبحت كل قناة فرعية بعرض 40 بتاً في وحدات ECC، أي 32 بتاً للبيانات و8 للتحقق، بحسب [إعلان JEDEC](https://www.jedec.org/news/pressreleases/jedec-publishes-new-ddr5-standard-advancing-next-generation-high-performance?ref=arabroot.io) و[ملخص Kingston](https://media.kingston.com/kingston/articles/MKF%5F954-DDR5-Collateral%5Fus.pdf?ref=arabroot.io). ويجدر الانتباه إلى خلط شائع هنا: شرائح DDR5 كلها فيها تصحيح داخلي اسمه On-die ECC، ولكن ملخص Kingston نفسه يوضح أنه يصحح الأخطاء داخل الشريحة فقط، ولا يصحح الأخطاء على الناقل بين الوحدة والمعالج، فوحدة DDR5 العادية ليست وحدة ECC. وإذا كنت تدير سيرفر Linux بذاكرة ECC فسوف تجد عدادات الأخطاء لكل وحدة في المسار `/sys/devices/system/edac/mc/mc0/dimm0/dimm_ce_count` للأخطاء المصححة و`dimm_ue_count` لغير المصححة، كما في دليل RAS.

⚠️

الخطأ المصحح ليس خبراً جيداً فقط، فهو يعني أن البيانات وصلت سليمة هذه المرة، ولكن دليل RAS في Linux يوضح أن الغرض من متابعة هذه الأخطاء هو أن ترى إن كان احتمال الخطأ يزيد، فتستبدل القطعة قبل أن تتحول أخطاؤها إلى أخطاء لا يمكن تصحيحها. لذلك راقب العداد `dimm_ce_count` لكل وحدة، وإذا كان يزيد باستمرار في وحدة واحدة فخطط لاستبدالها.

## أجيال الذاكرة DDR3 وDDR4 وDDR5

الاسم DDR اختصار لـ Double Data Rate، أي أن البيانات تنقل مرتين في كل دورة ساعة، على الحافة الصاعدة والهابطة، ولذلك تقاس السرعة بعدد عمليات النقل في الثانية MT/s وليس بالميجاهرتز. وكل جيل جديد يرفع السرعة ويخفض الجهد ويغير شكل الوحدة حتى لا تدخل في مقبس جيل آخر، والجدول التالي يلخص أهم الفروق من صفحات الشركات المصنعة:

| الخاصية           | DDR3                    | DDR4                   | DDR5                             |
| ----------------- | ----------------------- | ---------------------- | -------------------------------- |
| السرعات           | 800 إلى 2133 MT/s       | حتى 3200 MT/s          | 4800 إلى 8800 MT/s               |
| الجهد VDD         | 1.5 V، و1.35 V في DDR3L | 1.2 V                  | 1.1 V                            |
| البنوك في الشريحة | 8                       | 4 مجموعات × 4 (x4/x8)  | 8 مجموعات × 4 (x4/x8)            |
| القنوات في الوحدة | قناة 64 بت              | قناة 64 بت (72 مع ECC) | قناتان فرعيتان 32 بت (40 مع ECC) |
| إدارة الطاقة      | على اللوحة الأم         | على اللوحة الأم        | PMIC على الوحدة                  |
| On-die ECC        | لا يوجد                 | لا يوجد                | يوجد داخل كل شريحة               |

والمصادر: صفحة [Samsung عن DDR3](https://semiconductor.samsung.com/dram/ddr/ddr3/?ref=arabroot.io) للسرعات والجهد والبنوك، و[جدول Micron](https://www.micron.com/products/memory/dram-components/ddr5-sdram?ref=arabroot.io) للمقارنة بين DDR4 وDDR5، وإعلان JEDEC للقناتين الفرعيتين وانخفاض الجهد من 1.2 إلى 1.1\. ولاحظ أن السرعات في الجدول هي التي تعلنها هذه الشركات للشرائح، والوحدات التي تراها في المتاجر بسرعات أعلى من ذلك تعمل غالباً بإعدادات رفع السرعة من المصنع، ويجب أن يدعمها المعالج واللوحة الأم.

## القنوات Dual Channel: لماذا تركب الوحدات في أزواج متساوية؟

كل قناة مسار مستقل بين المتحكم والوحدات، وإذا كان في المعالج متحكم بقناتين فإن تركيب وحدة واحدة يترك نصف الطريق فارغاً. والطريقة التي يستخدم بها المتحكم القناتين تشرحها [ورقة بيانات Intel للجيل الثاني عشر](https://edc.intel.com/content/www/us/en/design/ipla/software-development-platforms/client/platforms/alder-lake-desktop/12th-generation-intel-core-processors-datasheet-volume-1-of-2/001/system-memory-controller-organization-mode-ddr4-5-only/?ref=arabroot.io): في الوضع المتماثل Dual-Channel Symmetric Mode، ويسمى أيضاً Interleaved Mode، تتوزع العناوين على القناتين بالتناوب بعد كل سطر Cache بحجم 64 بايتاً، فإذا طلب المعالج سطرين متجاورين جاء كل منهما من قناة مختلفة في الوقت نفسه:

![معالج في الوسط تخرج منه قناة A برتقالية إلى وحدتين DIMM_A1 وDIMM_A2 وقناة B زرقاء إلى DIMM_B1 وDIMM_B2، كل وحدة 16 GiB، وفي الأسفل صف من أسطر ال Cache من 0 إلى 11 تتناوب بين A وB](https://arabroot.io/content/images/2026/10/ram-internals-07-dual-channel.webp)

في الوضع المتماثل تتناوب أسطر ال Cache بين القناتين، فيصل سطران متجاوران في الوقت نفسه

والشرط الذي تذكره الورقة لهذا الوضع أن يكون مجموع الذاكرة في كل قناة متساوياً، فإذا ركبت 16 GiB في قناة و8 GiB في الأخرى فإن المتحكم يعمل بتقنية Intel Flex Memory: الجزء المتساوي من القناتين، أي 8 + 8، يعمل بالتناوب، والباقي يعمل بقناة واحدة. ولهذا تنصح دائماً بشراء الوحدات في أزواج متساوية وتركيبها في المنافذ التي يحددها دليل اللوحة الأم لكل قناة. أما في السيرفرات فعدد القنوات أكبر بكثير، ودليل اللوحة يحدد ترتيب التركيب لكل عدد من الوحدات.

## ماذا يعني 5600 MT/s مع CL40؟ السرعة والتأخير بالنانوثانية

الرقم الكبير على الوحدة هو عدد عمليات النقل في الثانية، وCL هو عدد دورات الساعة من أمر القراءة حتى أول بيانات، والخطأ الشائع أن تقارن CL بين جيلين كما هو، فـ CL40 يبدو أسوأ بكثير من CL19، ولكن الدورة في DDR5-5600 أقصر بكثير. والحساب بسيط: الساعة نصف عدد عمليات النقل لأن النقل مرتان في كل دورة، وزمن الدورة هو واحد على تردد الساعة، والتأخير هو CL مضروباً في زمن الدورة:

![صفان بمقياس زمني واحد: في الأعلى DDR4-2666 بموجة ساعة زرقاء من 19 دورة طول كل منها 0.75 ns ثم دفعة بيانات، وفي الأسفل DDR5-5600 بموجة برتقالية من 40 دورة أقصر طول كل منها 0.357 ns ثم دفعة بيانات، وكل صف ينتهي عند 14.25 و14.29 ns تقريباً](https://arabroot.io/content/images/2026/10/ram-internals-08-latency.webp)

ضعف السرعة تقريباً، والزمن حتى أول بايت نفسه تقريباً

```text
DDR4-2666 CL19:  2666.67 MT/s ÷ 2 = 1333.33 MHz  →  1 clock = 0.75 ns   →  19 × 0.75  = 14.25 ns
DDR5-5600 CL40:  5600 MT/s ÷ 2    = 2800 MHz     →  1 clock = 0.357 ns  →  40 × 0.357 = 14.29 ns
```

في الحساب أعلاه لاحظ التالي:

- أرقام DDR4-2666 من ورقة بيانات Samsung نفسها، التي تكتب tCK = 0.75 ns وCL = 19، فالناتج 14.25 ns هو القيمة المكتوبة فيها لكل من tRCD وtRP.
- CL40 مع 5600 MT/s مثال للحساب فقط وليس قيمة من JEDEC، والمهم الطريقة: اقسم CL على نصف السرعة بالجيجاهرتز.
- الزمن حتى أول بايت لم يتغير تقريباً بين الجيلين، أما الذي تضاعف فهو عرض النقل Bandwidth، أي كم بايتاً يصل في الثانية بعد أن يبدأ النقل. ولهذا تستفيد من DDR5 الأحمال التي تنقل كميات كبيرة متتابعة أكثر من الأحمال التي تقفز بين عناوين عشوائية.

## أين تقع RAM في هرم الذاكرة؟

14 نانوثانية تبدو قصيرة، ولكنها طويلة جداً بمقياس المعالج، ولذلك توجد بين المعالج وRAM طبقات أصغر وأسرع: المسجلات Registers، ثم ال Cache بمستوياته L1 وL2 وL3، ثم RAM، ثم القرص SSD. وقد رسمنا هذا الهرم بأرقامه التقريبية في [مقال Hello World](https://arabroot.io/articles/%D8%B1%D8%AD%D9%84%D8%A9-hello-world-%D9%85%D9%86-%D9%84%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D9%81%D8%A7%D8%AA%D9%8A%D8%AD-%D8%A7%D9%84%D9%89-%D8%A7%D9%84%D8%B4%D8%A7%D8%B4%D8%A9/#hardware) من القائمة المشهورة Latency Numbers Every Programmer Should Know، فلا نكرره هنا، ويكفي أن تحفظ النسبة التقريبية بحسب تلك القائمة: الوصول إلى RAM أبطأ من L1 بنحو مئتي مرة، والقراءة العشوائية من SSD أبطأ من RAM بنحو ألف وخمسمئة مرة. أما ال Cache نفسه وكيف تشترك فيه الأنوية فهو موضوع [مقال المعالج من الداخل](https://arabroot.io/articles/%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%85%D9%84-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC-cpu-%D9%85%D9%86-%D8%A7%D9%84%D8%AF%D8%A7%D8%AE%D9%84/).

وبقي سؤال يربط هذا المقال بالبرامج: عندما يطبع برنامجك عنواناً مثل `0x1B7057E248`، فهل هذا مكان الخلية في الشريحة؟ والإجابة لا، فهذا عنوان افتراضي Virtual Address خاص بالعملية، وفي كل وصول للذاكرة تترجمه وحدة إدارة الذاكرة MMU في المعالج إلى عنوان حقيقي Physical Address باستخدام جدول الصفحات Page Table الذي يحفظه نظام التشغيل، كما شرحنا في [مقال Hello World](https://arabroot.io/articles/%D8%B1%D8%AD%D9%84%D8%A9-hello-world-%D9%85%D9%86-%D9%84%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D9%81%D8%A7%D8%AA%D9%8A%D8%AD-%D8%A7%D9%84%D9%89-%D8%A7%D9%84%D8%B4%D8%A7%D8%B4%D8%A9/#loading)، ثم يأخذ متحكم الذاكرة العنوان الحقيقي ويوزعه على القناة والصف والبنك والصف والعمود، وطريقة هذا التوزيع تختلف من معالج إلى آخر ولا تنشرها أغلب الشركات بالتفصيل.

## تجربة عملية: ماذا يوجد في جهازنا، وكم يكلف القفز؟

شغلنا التجربة على جهاز مكتبي بنظام Windows 11 ومعالج Intel Core i7-7700K وأربع وحدات DDR4، ولم نستخدم أي أداة إضافية. الخطوة الأولى أن نقرأ معلومات الوحدات التي تخزنها اللوحة الأم في جدول SMBIOS، وهي متاحة في PowerShell عبر الكلاسين [Win32\_PhysicalMemory](https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-physicalmemory?ref=arabroot.io) و[Win32\_PhysicalMemoryArray](https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-physicalmemoryarray?ref=arabroot.io)، وفي Linux تحصل على المعلومات نفسها بالأمر `dmidecode -t memory`:

```powershell
Get-CimInstance Win32_PhysicalMemory |
  Format-Table DeviceLocator, Manufacturer, PartNumber, @{n='GiB';e={$_.Capacity/1GB}},
    Speed, ConfiguredClockSpeed, ConfiguredVoltage, DataWidth, TotalWidth, SMBIOSMemoryType -AutoSize
Get-CimInstance Win32_PhysicalMemoryArray |
  Format-List MemoryDevices, MaxCapacityEx, MemoryErrorCorrection
```

والمخرج سوف يكون كما يلي:

```text
DeviceLocator Manufacturer    PartNumber           GiB Speed ConfiguredClockSpeed ConfiguredVoltage DataWidth TotalWidth SMBIOSMemoryType
------------- ------------    ----------           --- ----- -------------------- ----------------- --------- ---------- ----------------
DIMM_A1       PNY             16GF2X08QFHH36-135-K  16  2667                 2400              1200        64         64               26
DIMM_A2       PNY             16GF2X08QFHH36-135-K  16  2667                 2400              1200        64         64               26
DIMM_B1       Team Group Inc. TEAMGROUP-UD4-3200    16  2400                 2400              1200        64         64               26
DIMM_B2       Team Group Inc. TEAMGROUP-UD4-3200    16  2400                 2400              1200        64         64               26

MemoryDevices         : 4
MaxCapacityEx         : 67108864
MemoryErrorCorrection : 3
```

في المخرج أعلاه لاحظ التالي:

- أربع وحدات من شركتين، اثنتان على القناة A واثنتان على القناة B كما تدل أسماء المنافذ، ومجموع كل قناة 32 GiB، وهذا هو شرط الوضع المتماثل الذي رأيناه في القسم السابق.
- العمود `Speed` هو أقصى سرعة تعلنها الوحدة و`ConfiguredClockSpeed` هو السرعة التي تعمل بها الآن، وكلاهما بوحدة MT/s بحسب [مواصفة SMBIOS](https://www.dmtf.org/sites/default/files/standards/documents/DSP0134%5F3.6.0.pdf?ref=arabroot.io) رغم أن توثيق Windows يكتب MHz. ووحدات PNY تعلن 2667 ولكنها تعمل مع البقية بسرعة 2400، أي أن اللوحة اختارت سرعة واحدة لكل الوحدات، والوحدة المكتوب في اسمها 3200 تعلن 2400 فقط، فالرقم في اسم المنتج ليس بالضرورة ما يقرؤه الجهاز منها.
- `ConfiguredVoltage` هو 1200 ميلي فولت، أي 1.2 V، جهد DDR4 كما في الجدول.
- `DataWidth` و`TotalWidth` كلاهما 64، والتوثيق يقول إن `TotalWidth` يشمل بتات التصحيح، فلو كانت الوحدات ECC لكانت 72، و`MemoryErrorCorrection` قيمته 3 أي None بحسب جدول القيم في التوثيق، فهذا الجهاز لا يوجد فيه ECC.
- `SMBIOSMemoryType` قيمته 26، أي `1Ah`، وهي في مواصفة SMBIOS تعني FBD2 وليست DDR4 التي قيمتها 27 أي `1Bh`. والوحدات DDR4 بلا شك من اسمها وجهدها، فهذا رقم خاطئ يكتبه BIOS هذه اللوحة، والدرس أن معلومات SMBIOS يكتبها مصنع اللوحة، فقارنها بالمصدر الآخر قبل أن تعتمد عليها.

والخطوة الثانية تقيس أثر ما رأيناه في دورة القراءة، فنقرأ 64 مليون رقم من مصفوفة بحجم 256 MiB مرتين، مرة بالترتيب ومرة بترتيب عشوائي، بنفس عدد القراءات ونفس العمليات، والذي يتغير هو ترتيب العناوين فقط. والبرنامج ملف C# واحد يعمل بالأمر `dotnet run -c Release access.cs` على .NET SDK 10.0.400:

```csharp
using System;
using System.Diagnostics;

// Read the same 64 Mi ints (256 MiB) twice: in order, then in a random order.
// Same number of reads and additions; only the order of addresses changes.
const int N = 64 * 1024 * 1024;
var data = new int[N];
for (int i = 0; i < N; i++) data[i] = i & 0xFF;

var order = new int[N];
for (int i = 0; i < N; i++) order[i] = i;
var rng = new Random(42);
for (int i = N - 1; i > 0; i--) { int j = rng.Next(i + 1); (order[i], order[j]) = (order[j], order[i]); }

long Sum(int[] idx)
{
    long s = 0;
    for (int i = 0; i < idx.Length; i++) s += data[idx[i]];
    return s;
}
var seq = new int[N];
for (int i = 0; i < N; i++) seq[i] = i;

Sum(seq); Sum(order); // warm-up
for (int run = 1; run <= 3; run++)
{
    var sw = Stopwatch.StartNew(); long a = Sum(seq); sw.Stop(); var t1 = sw.Elapsed.TotalMilliseconds;
    sw.Restart(); long b = Sum(order); sw.Stop(); var t2 = sw.Elapsed.TotalMilliseconds;
    Console.WriteLine($"run {run}: sequential {t1,7:F0} ms ({t1 * 1e6 / N,5:F2} ns/read) | random {t2,7:F0} ms ({t2 * 1e6 / N,6:F2} ns/read) | x{t2 / t1:F1} | sums equal: {a == b}");
}
```

والمخرج سوف يكون كما يلي:

```text
run 1: sequential     115 ms ( 1.71 ns/read) | random    3328 ms ( 49.60 ns/read) | x28.9 | sums equal: True
run 2: sequential     114 ms ( 1.69 ns/read) | random    2196 ms ( 32.73 ns/read) | x19.3 | sums equal: True
run 3: sequential     107 ms ( 1.59 ns/read) | random    2074 ms ( 30.91 ns/read) | x19.5 | sums equal: True
```

في المخرج أعلاه لاحظ التالي:

- القراءة بالترتيب أخذت نحو 1.6 ns لكل رقم، والعشوائية نحو 31 ns بعد التشغيل الأول، أي نحو عشرين ضعفاً، رغم أن عدد القراءات والجمع واحد، والمجموعان متساويان.
- القراءة بالترتيب تستفيد من كل طبقة: السطر نفسه في ال Cache يحمل 16 رقماً، والمعالج يجلب الأسطر التالية مسبقاً، والصف نفسه يبقى مفتوحاً في ال Row Buffer. أما القراءة العشوائية فتفوت ال Cache غالباً، وتفتح صفاً جديداً في كل مرة تقريباً، وتحتاج أيضاً ترجمة عنوان جديدة من جدول الصفحات.
- هذه أرقام توضيحية من جهاز واحد وتشغيل واحد، فهي تقيس الذاكرة وال Cache وترجمة العناوين معاً وليس CL وحده، والمهم النسبة بين الحالتين وليس الأرقام نفسها. وقد كان التشغيل الأول أبطأ من التاليين، وهذا متوقع في أول مرور على ذاكرة كبيرة.

## ماذا يعني هذا عند الشراء أو اختيار سيرفر؟

1. **الأزواج المتساوية:** ركب الوحدات بحيث يتساوى مجموع كل قناة، وفي المنافذ التي يحددها دليل اللوحة، والسبب أن الوضع المتماثل يتطلب ذلك.
2. **السرعة الحقيقية:** تأكد من السرعة التي تعمل بها الوحدات فعلاً، كما رأينا في التجربة، فالرقم على المنتج قد لا يكون ما يعمل به الجهاز.
3. **ECC للسيرفرات:** لأي سيرفر يحمل بيانات مهمة اختر وحدات ECC ومعالجاً ولوحة تدعمها، وراقب عدادات EDAC، ولا تعتبر On-die ECC في DDR5 بديلاً عنها.
4. **قارن بالنانوثانية:** عند المقارنة بين وحدتين احسب CL مقسوماً على نصف السرعة، ولا تقارن CL وحده.
5. **لا تخلط الأجيال:** فتحة المفتاح تمنعك أصلاً، ولكن تأكد قبل الشراء من الجيل الذي تدعمه اللوحة الأم والمعالج.

## تدريب عملي

- شغل أمر PowerShell أعلاه أو `sudo dmidecode -t memory` على جهازك أو سيرفرك، واعرف عدد القنوات المستخدمة والسرعة الحقيقية، وهل توجد ECC.
- احسب التأخير بالنانوثانية لوحدتين تفكر في شرائهما، مثل DDR4-3200 مع CL16 وDDR5-6000 مع CL30، وقارن الناتجين.
- إذا كان لديك سيرفر Linux بذاكرة ECC، اقرأ `dimm_ce_count` لكل وحدة في `/sys/devices/system/edac/mc/` وسجل القيم لترى إن كانت تزيد.

## الخلاصة

وصلنا لنهاية الموضوع، وأهم ما فيه:

- وحدة الذاكرة شرائح DRAM على لوحة، ومعها في DDR5 دائرة طاقة PMIC وشريحة SPD تعرف الجهاز بها، وموصل وفتحة مفتاح تمنع تركيب جيل آخر.
- الطلب ينزل من متحكم الذاكرة إلى القناة ثم الصف Rank ثم البنك ثم الصف Row والعمود حتى خلية من ترانزستور ومكثف.
- القراءة من بنك مغلق تمر بـ ACTIVATE ثم READ ثم PRECHARGE، وكل خطوة لها زمن tRCD وCL وtRP، والقراءة من صف مفتوح أسرع بكثير، ولهذا تكون القراءة المتتابعة أسرع من العشوائية.
- الشحنة تتسرب، فيرسل المتحكم أمر REFRESH كل 7.8 ميكروثانية تقريباً في DDR4 حتى يحدث كل صف خلال 32 أو 64 ميلي ثانية.
- ذاكرة ECC تخزن 8 بتات تحقق مع كل 64 بتاً، وتصحح البت الذي ينقلب وتسجله، وOn-die ECC في DDR5 ليس بديلاً عنها.
- السرعة بـ MT/s تحدد عرض النقل، والتأخير بالنانوثانية هو CL مقسوماً على نصف السرعة، وهو تقريباً نفسه بين الأجيال، والقنوات المتساوية تضاعف عرض النقل.

وفي مرحلة [العتاد](https://arabroot.io/start/#stage-hardware) نفسها سوف نتحدث بإذن الله عن المعالج من الداخل وبقية مكونات السيرفر، حتى تقرأ مواصفات أي جهاز وتعرف ما الذي تعنيه كل جملة فيها.

[![](https://arabroot.io/content/images/2026/10/memory-basics-cover-cover.webp)دليلالذاكرة للمبرمجين: كيف تعمل ال Stack وال Heapلماذا تتغير قائمة لم تطلب تغييرها، وكيف تتسرب الذاكرة في لغة فيها جامع قمامة Garbage Collector، بأمثلة حقيقية من عدة لغات.](https://arabroot.io/articles/%D8%A7%D9%84%D8%B0%D8%A7%D9%83%D8%B1%D8%A9-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86-stack-%D9%88-heap-%D9%88%D8%A7%D9%84%D9%85%D8%A4%D8%B4%D8%B1%D8%A7%D8%AA/)[![](https://arabroot.io/content/images/2026/10/cpu-internals-cover-cover.webp)دليلكيف يعمل المعالج CPU من الداخل ولماذا يهمك ذلكنتابع تعليمة واحدة داخل نواة المعالج، ونرى لماذا يصبح نفس الكود أبطأ بعشر مرات عندما تغير ترتيب المرور على البيانات.](https://arabroot.io/articles/%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%85%D9%84-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC-cpu-%D9%85%D9%86-%D8%A7%D9%84%D8%AF%D8%A7%D8%AE%D9%84/)[![](https://arabroot.io/content/images/2026/10/hello-world-cover-cover.webp)دليلماذا يحدث عندما تشغل برنامج Hello World؟نتتبع برنامج C صغيراً من المحرر إلى الشاشة، فترى كل طبقة يمر بها في الجهاز حتى تظهر الجملة أمامك.](https://arabroot.io/articles/%D8%B1%D8%AD%D9%84%D8%A9-hello-world-%D9%85%D9%86-%D9%84%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D9%81%D8%A7%D8%AA%D9%8A%D8%AD-%D8%A7%D9%84%D9%89-%D8%A7%D9%84%D8%B4%D8%A7%D8%B4%D8%A9/)[![](https://arabroot.io/content/images/2026/10/cpu-concurrency-cover-cover.webp)دليلالتزامن Concurrency والخيوط: ماذا يعني لسيرفرك وتطبيقاتكلماذا يكون المعالج عند 100% والتطبيق بطيئاً، ولا تسرع الخيوط كود Python، وكيف تضبط عدد العمال وحدود ال Containers.](https://arabroot.io/articles/%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC-%D9%88%D8%A7%D9%84%D8%AE%D9%8A%D9%88%D8%B7-%D9%88%D8%A7%D9%84%D8%AA%D8%B2%D8%A7%D9%85%D9%86-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86/)

## سجل التحديثات

- أكتوبر 2026: كتابة المقال من قسم تشريح الذاكرة الذي كان في مقال «الذاكرة للمبرمجين» بعد توسيعه، مع صور حقيقية من Wikimedia Commons ورسوم من عندنا، وتنفيذ التجربة على Windows 11 مع Intel Core i7-7700K وأربع وحدات DDR4 و.NET SDK 10.0.400.