P01NT
0x1 02/08

بنية المعالج ووظائفه

نتعمق داخل المعالج: مسار البيانات ووحدة التحكم، تنظيم النواقل من أحادي الناقل إلى تعدد النواقل، تنظيم السجلات في x86، ودورة التعليمة الكاملة بخمس مراحل.

· 6 دقائق قراءة · 1121 كلمة
المحتويات

بسم الله الرحمن الرحيم.

في المقال السابق تحدثنا عن معمارية الحاسوب وتنظيمه وعن أجزائه الأساسية. اليوم إن شاء الله سنتعمق قليلاً داخل المعالج Processor نفسه: مكوناته ووظائفه وكيف تعمل معاً.

مسار البيانات ووحدة التحكم (Data Path & Control Unit)

يتكون المعالج من وحدات أساسية:

  • وحدة الحساب والمنطق (Arithmetic Logic Unit – ALU) التي تنفذ العمليات الحسابية والمنطقية.
  • وحدة التحكم (Control Unit – CU) التي تولّد إشارات التحكم اللازمة لتنظيم عمل المكونات.
  • بالإضافة إلى مجموعة من السجلات ذات الوصول السريع.

وتقسم هذه المكونات إلى قسمين رئيسيين:

• مسار البيانات (Data Path): هو مجموعة المكوّنات المسؤولة عن نقل البيانات ومعالجتها داخل المعالج، ويشمل الـ ALU والسجلات Registers والحافلات الناقلة Buses.

مثال: معالجة البيانات تمر بخطوات مثل: نقل الأعداد من الذاكرة إلى المسجلات، وتنفيذ عملية الجمع أو الطرح في الـ ALU، ثم تخزين النتيجة في سجل آخر.

• وحدة التحكم (Control Unit – CU): تفسر التعليمة الحالية وتولّد إشارات التحكم اللازمة لتنفيذها (مثل إشارات القراءة والكتابة على المسجلات والذاكرة، واختيار العملية التي ينفذها الـ ALU).

خطوط الأنابيب (Instruction Pipeline)

في المعالجات الحديثة تُنفذ دورات التعليمات بشكل متزامن Synchronized ومتوازٍ Parallel عبر تقنية تعرف باسم خط الأنابيب (Instruction Pipeline) لتحسين الأداء؛ إذ يمكن أن تبدأ مرحلتا جلب وفك تعليمة جديدة قبل انتهاء المعالجة النهائية للتعليمة السابقة.

طيب، كيف حدث هذا التطور وما الذي تغير؟ تتمحور الفكرة حول تنظيم النواقل (Bus Organization) — وإذا كنت مطّلعاً على طوبولوجيات الشبكات (Network Topology) فلعل الصورة وصلت إليك منذ الآن.

تنظيم الناقل الواحد (Single-Bus Organization)

في المعالجات البسيطة اعتمد تنظيم النواقل على ناقل واحد يشترك فيه جميع المكونات (السجلات العامة، سجل البرنامج PC، سجل التعليمة IR… إلخ). يتيح الناقل الواحد تحريك البيانات بين المسجلات والذاكرة، لكن قيمة واحدة فقط تنتقل في كل دورة. ترتبط فيه جميع المسجلات — مثل PC وIR وسجل عنوان الذاكرة MAR وسجل بيانات الذاكرة MDR — بالناقل نفسه، وبما أن الناقل الواحد لا يستطيع نقل أكثر من قيمة واحدة في اللحظة ذاتها، فإن ذلك يبطئ نقل المعطيات.

تنظيم الناقلين (Two-Bus Organization)

تم تحسين ذلك باستخدام أكثر من ناقل: ففي تنظيم الناقلين يستطيع المعالج مثلاً قراءة قيمتين من سجلين في الوقت نفسه، مما يقلل عدد الدورات المطلوبة ويسرّع النقل وتنفيذ العمليات.

وهذا ما تجده في المعالجات الحديثة — وليس بناقلين فقط: فعدد النواقل الداخلية يختلف بحسب التصميم، ولكل نواة Core مسار بياناتها ونواقلها الخاصة بها.

مثال:

int a = 5, b = 3;
int c = a + b;

ينفذ المعالج ذلك بخطوات: تحميل 5 و3 في مسجلين (مثلاً eax وebx في معمارية x86)، ثم تنفيذ عملية الجمع في الـ ALU. قد تكون التعليمات:

mov  eax, 5      ; تحميل الثابت 5 في السجل EAX
mov  ebx, 3      ; تحميل الثابت 3 في السجل EBX
add  eax, ebx    ; الـ ALU تجمع eax مع ebx والنتيجة في eax (أي c = 8)

تنظيم السجلات (Register Organization)

السجلات Registers هي ذاكرة صغيرة جداً وفائقة السرعة داخل المعالج، تستخدم لتخزين القيم الوسيطة وعناوين الذاكرة والنتائج. ولها أكثر من نوع:

• سجل البرنامج (Program Counter – PC): يخزن عنوان التعليمة التالية التي يجب تنفيذها.

• سجل التعليمة (Instruction Register – IR) أو (CIR): يحمل نسخة من التعليمة الجارية حالياً، ليقوم المعالج بفك شيفرتها ومعرفة وظيفتها.

• سجل عنوان الذاكرة (Memory Address Register – MAR): يخزن العناوين في الذاكرة أثناء عمليات الجلب Fetch والتخزين Store.

• سجل بيانات الذاكرة (Memory Data Register – MDR) أو (Memory Buffer Register – MBR): يحمل البيانات المقروءة من الذاكرة أو المطلوب كتابتها إليها.

• السجلات ذات الأغراض العامة (General Purpose Registers): سجلات يستخدمها المترجم أو المبرمج لتخزين قيم مؤقتة أثناء تنفيذ البرامج، ويختلف عددها وقدراتها باختلاف المعمارية. ففي معمارية x86 مثلاً نجد سجلات مثل eax وebx وecx وedx، وسعتها التخزينية 32 بتاً.

وتتميز هذه السجلات بإمكانية استخدام السجل بأكمله أو جزء منه في العمليات: فـ EAX يتكون من 32 بتاً، ويمكن تقسيمه إلى نصفين كل منهما 16 بتاً، ويمكن تقسيم كل نصف بدوره إلى قسمين كل منهما 8 بتات. وهذه صورة توضيحية:

بنية السجل EAX وتقسيماته شكل (1): تقسيمات السجل EAX في معمارية x86

المهم هنا أن تصميم تنظيم السجلات يشمل: عددها، وحجمها (عدد البتات)، وكيفية الوصول إليها (قراءة/كتابة)، والغرض منها.

مثال: إذا كتبنا في C:

int a = 4, b = 5;

فقد يكون الأمر في x86:

mov  eax, 4      ; تخزين القيمة 4 في السجل EAX
mov  ebx, 5      ; تخزين القيمة 5 في السجل EBX

دورة التعليمة بالتفصيل (Instruction Cycle — Detailed)

شرحنا في المقال السابق أن دورة التعليمة تمر بثلاث مراحل أساسية (Fetch، Decode، Execute)، لكن أحياناً تضاف إليها عمليتان أخريان:

  • الوصول إلى الذاكرة (Memory Access).
  • الكتابة العائدة (Write Back).

ولنتوسع في شرح كل واحدة:

• الجلب (Fetch): تبدأ الدورة بنقل العنوان الحالي للتعليمة من سجل PC إلى سجل MAR. يطلب المعالج من الذاكرة قراءة التعليمة من العنوان المحدد، فيوضع الناتج في سجل MDR. بعد ذلك تنتقل التعليمة إلى سجل IR ليتم تفسيرها. وفي النهاية يُحدَّث سجل PC ليشير إلى التعليمة التالية (إما بزيادته بمقدار حجم التعليمة، أو بتغييره كلياً في حالة القفزات Jumps).

• الفك (Decode): بعد تحميل التعليمة في IR، تقوم وحدة التحكم CU بتحليلها لتحديد نوع العملية والسجلات أو مواقع الذاكرة المطلوبة. وترسل CU إشارات تحكم تحدد مصدر البيانات وجهتها (مثل: أي سجلات ستستخدم، وهل نحتاج الوصول إلى الذاكرة، وما العملية التي سينفذها الـ ALU).

• التنفيذ (Execute): في هذه المرحلة تُجرى العملية الحسابية أو المنطقية بواسطة الـ ALU؛ فإذا كانت العملية جمعاً أو طرحاً تقرأ الـ ALU القيم من سجلات المصدر وتخرج النتيجة. وبشكل عام تنفذ الـ ALU عملياتها بناءً على رموز العمليات (Opcodes) الواردة في التعليمة.

• الوصول إلى الذاكرة (Memory Access): إذا كانت العملية تتطلب تحميل بيانات من الذاكرة أو تخزينها فيها (مثل أوامر load/store)، فهذه المرحلة هي محلها؛ إذ تستخدم العنوان الذي حسبته الـ ALU للوصول إلى الذاكرة.

• الكتابة العائدة (Write Back): أخيراً تُكتب نتيجة العملية في الوجهة المناسبة: إذا كانت التعليمة حسابية خُزنت نتيجة الـ ALU في السجل الهدف، وإذا كانت من نوع التحميل نُقلت البيانات المقروءة من الذاكرة إلى السجل. بهذه الطريقة تكتمل دورة التعليمة وتصبح البيانات جاهزة للاستخدام في التعليمات التالية.

مثال

فلنفترض أن لدينا هذا الكود بلغة Assembly معمارية x86:

mov  eax, 5
mov  ebx, 2
sub  eax, ebx

لنفصل أول تعليمة خطوة بخطوة:

  1. Fetch: يأخذ المعالج عنوان التعليمة الأولى من PC، ثم يقرأها من الذاكرة، فتنتقل إلى سجل IR.
  2. Decode: يفسر الـ CU التعليمة الموجودة في IR على أنها «نقل القيمة 5 إلى السجل eax»، ويضبط إشارات التحكم لكتابة القيمة في eax.
  3. Execute: لا تحتاج هذه التعليمة إلى عملية ALU معقدة (قد تتعامل معها كتحميل فوري)، فتُمرر القيمة 5 لتجهيزها للكتابة.
  4. Write Back: تُكتب القيمة 5 فعلياً في السجل eax.

لاحظ أننا لم نحتج إلى مرحلة Memory Access لأن التعليمة لا تتعامل مع الذاكرة.

ثم تتكرر الدورة نفسها مع mov ebx, 2، أما عند sub eax, ebx فتدخل الـ ALU حيز العمل: تقرأ القيمتين من eax وebx وتخرج الفرق (3)، فتُكتب النتيجة في eax عند الكتابة العائدة.


بهذا تكون قد رأيت ما يدور داخل المعالج من تنظيم للمكونات ودورة لتدفق التعليمات، ونلتقي في الدرس القادم بإذن الله.

لا تنسونا من صالح دعائكم.