P01NT
0x0 01/08

معمارية وتنظيم الحاسوب

مدخل السلسلة: الفرق بين معمارية الحاسوب وتنظيمه، الوظائف الأساسية الأربع، المكونات الرئيسية من CPU وذاكرة وأجهزة I/O، ودورة تنفيذ التعليمة Fetch–Decode–Execute.

· 7 دقائق قراءة · 1332 كلمة
المحتويات

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

قلة المصادر العربية التي تتناول هذه الموضوعات وضعفها كان أحد أهم أسباب كتابة السلسلة القادمة؛ فالهدف هو رفع الجهل عن الإخوة، وأسأل الله تعالى أن يجعل هذا العمل خالصاً لوجهه الكريم.

بإذن الله وحوله وقوته ستكون هذه المقالات حجر الأساس المتين الذي تستطيع البناء فوقه. سنناقش كل موضوع بطريقة عملية: نكتب كوداً بلغة C ثم ننظر إلى أثره في لغة الـ Assembly. على بركة الله.

ملاحظة: سنتوقف مؤقتاً عن إضافة دروس جديدة إلى ورشة لغة C؛ فالمواضيع القادمة فيها تحتاج إلى أساس متين في الذاكرة وطريقة عملها، ومن هنا جاءت فكرة هذه السلسلة التي تعالج معمارية الحاسوب وتنظيمه.

المعمارية مقابل التنظيم (Organization vs Architecture)

تنظيم الحاسوب ومعماريته مفهومان يكمل أحدهما الآخر في تصميم النظام الحاسوبي.

• معمارية الحاسوب (Computer Architecture): تشير إلى التصميم الوظيفي والمنطقي لنظام الحاسوب، مثل اختيار مجموعة التعليمات (Instruction Set) ووظائف وحدة المعالجة — أي «ما يستطيع الحاسوب فعله».

• تنظيم الحاسوب (Computer Organization): يهتم بالتنفيذ المادي لهذا الهيكل وكيفية توصيل العتاد — أي كيف يُنفَّذ ما تستطيع الحاسوب فعله، عبر وصلات وحدة المعالجة المركزية (CPU) والذاكرة (Memory) والإدخال والإخراج (I/O).

على سبيل المثال: تحدد المعمارية أن معالج x86 يستخدم تعليمة الجمع add بصيغة معينة، بينما تستخدم معمارية ARM التعليمة نفسها بصيغة مختلفة. أما التنظيم فيتعلق بكيفية تنفيذ وحدة المعالجة لهذه التعليمة فعلياً (مثل وجود خطوط أنابيب Pipelining أو حجم الذاكرة المخبئية Cache) — وهي تفاصيل لا تظهر للمبرمج لكنها تؤثر مباشرة في أداء التنفيذ.

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

وعلى سبيل المثال: قد نلاحظ في Machine Code تعليمة تضع قيمة في مسجل (Register)؛ فهم تنظيم الحاسوب يتيح لنا معرفة أي مسجل — مثل eax و ebx — تستخدمه تلك التعليمة ولماذا.

مثال

نفرض الدالة البسيطة التالية بلغة C:

int sum(int a, int b) {
    return a + b;
}

بمعمارية x86 (وبنمط الاستدعاء cdecl) قد يكون تجميعها:

sum:
    mov  eax, [esp+4]   ; تحميل المعامل الأول a إلى المسجل EAX
    add  eax, [esp+8]   ; جمع المعامل الثاني b مع EAX
    ret                 ; العودة من الدالة؛ القيمة المرجعة جاهزة في EAX

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

بينما بمعمارية ARM:

sum:
    ADD  R0, R0, R1     ; جمع محتويات R0 و R1 ووضع النتيجة في R0
    BX   LR             ; العودة من الدالة

حيث يستخدم R0 عادة لحمل أول معاملات الدالة وناتجها المرجع وفق اتفاقية استدعاء ARM.

هذا الاختلاف في بنية الأوامر (Instruction Format) يعكس اختلاف المعمارية: فالمعمارية تحدد شكل هذه التعليمات (add، mov…)، بينما يحدد التنظيم آلية تنفيذها داخلياً على العتاد.

الوظائف الأساسية للحاسوب (Basic Computer Functions)

لأي حاسوب أربع وظائف لا غنى عنها: الإدخال (Input)، المعالجة (Processing)، الإخراج (Output)، والتخزين (Storage).

• الإدخال (Input): تأتي البيانات إلى الحاسوب من الخارج. مثال: يدخل المستخدم رقماً من لوحة المفاتيح Keyboard أو صورة عبر الماسح الضوئي Scanner.

• المعالجة (Processing): تنفذ وحدة المعالجة المركزية CPU العمليات الحسابية والمنطقية على البيانات المدخلة لإنتاج النتائج المطلوبة. مثال: ضرب عددين أو جمعهما.

• الإخراج (Output): بعد المعالجة يتم عرض نتائج العمليات أو إرسالها إلى الخارج. مثال: قد يرسل الحاسوب النتائج إلى شاشة العرض أو يطبعها على الطابعة.

• التخزين (Storage): حفظ البيانات والمعلومات؛ ويشمل ذلك التخزين المؤقت في الـ RAM أثناء التنفيذ، أو التخزين الدائم على الأقراص الصلبة HDD أو وحدات SSD. حفظ المتغيرات وقيمها في الذاكرة يعد أيضاً من طرق التخزين.

مثال

الكود التالي بلغة C يوضح دورة حياة البيانات:

int x = 10;              // التخزين: حفظ القيمة 10 في المتغير x
int y = 20;              // التخزين: حفظ القيمة 20 في المتغير y
int sum = x + y;         // المعالجة: جمع x و y
printf("%d\n", sum);     // الإخراج: طباعة ناتج الجمع

وبتجميع x86:

mov  eax, [x]     ; جلب قيمة x من الذاكرة إلى المسجل EAX
add  eax, [y]     ; جمع قيمة y (الموجودة في الذاكرة) مع EAX
mov  [sum], eax   ; تخزين ناتج الجمع الموجود في EAX في المتغير sum

نظرة عامة على المكونات الرئيسية (CPU, Memory and I/O Overview)

المكونات الرئيسية للنظام الحاسوبي شكل (1): المكونات الرئيسية للنظام الحاسوبي

وحدة المعالجة المركزية (Central Processing Unit)

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

  • وحدة الحساب والمنطق (ALU) لتنفيذ التعليمات.
  • وحدة التحكم (Control Unit) التي تنسق تنفيذ التعليمات.
  • مجموعة من المسجلات (Registers) للتخزين المؤقت للبيانات.

أي أنها المعالج الرئيسي للمهام: تنقل التعليمات من الذاكرة وتنفذها واحدة تلو الأخرى.

مثال: تعليمة add eax, 1 تعني أن وحدة الـ ALU ستضيف واحداً إلى المسجل eax داخل الـ CPU.

الذاكرة (Memory)

أنواع الذاكرة شكل (2): تقسم الذاكرة إلى رئيسية Primary وثانوية Secondary

وهي المكان الذي تُحفظ فيه البيانات والتعليمات، وتقسم إلى قسمين:

• الذاكرة الرئيسية (Primary Memory): وتشمل ذاكرة الوصول العشوائي RAM التي تخزن البيانات المؤقتة أثناء التشغيل، وذاكرة القراءة فقط ROM التي تحمل برامج الإقلاع (Boot).

• الذاكرة الثانوية (Secondary Memory): مثل الأقراص الصلبة HDD ووحدات SSD، وتستخدم لتخزين البيانات على المدى الطويل.

أثناء المعالجة تُنقل البيانات والتعليمات من الذاكرة الرئيسية إلى الـ CPU.

مثال: mov eax, [address] — عند التنفيذ يقوم المعالج بجلب البيانات من عنوان الذاكرة المحدد إلى المسجل eax.

أجهزة الإدخال والإخراج (I/O Devices)

هي الوسيط الذي يتصل بالحاسوب ويمده بالبيانات ويستقبل منه النتائج:

  • أجهزة الإدخال مثل لوحة المفاتيح Keyboard والفأرة Mouse.
  • أجهزة الإخراج مثل الشاشة والطابعة.

وتعمل واجهة الإدخال والإخراج (I/O Interface) على تنسيق نقل البيانات بين سرعة الـ CPU وسرعات الأجهزة الخارجية، وتراقب الأخطاء أثناء ذلك.

مثال

كود C:

int a = 5;      // تعريف المتغير a في الذاكرة
int b = 3;      // تعريف المتغير b في الذاكرة
int c = a + b;  // نقل a و b إلى الـ CPU وجمعهما، ثم تخزين الناتج في c

وبتجميع x86:

mov  eax, [a]    ; جلب قيمة a من الذاكرة إلى المسجل EAX
add  eax, [b]    ; إضافة قيمة b (الموجودة في الذاكرة) إلى EAX
mov  [c], eax    ; تخزين ناتج الجمع في المتغير c بالذاكرة

هذه الأوامر توضح كيف يتفاعل الـ CPU مع الذاكرة، أما أجهزة الإدخال والإخراج فهي تتعامل مع العالم الخارجي؛ وهي جزء أساسي لفهم أين وكيف تصل البيانات إلى الحاسوب وكيف يمكن استخراجها منه.

دورة التعليمة (Instruction Cycle)

دورة التعليمة شكل (3): دورة جلب التعليمة وفكها وتنفيذها

دورة التعليمة أو دورة (Fetch–Decode–Execute) هي العملية المتكررة التي يقوم بها المعالج المركزي لتنفيذ كل تعليمة من البرنامج. تتكون هذه الدورة من ثلاث مراحل أساسية:

1. جلب التعليمة (Fetch): في هذه المرحلة يستخدم المعالج عداد البرنامج (Program Counter – PC) لتحديد موقع التعليمة التالية في الذاكرة. يقوم المعالج بقراءة التعليمة الثنائية من ذلك العنوان ووضعها في سجل التعليمة (Instruction Register – IR)، ثم يزيد قيمة PC للإشارة إلى التعليمة التالية.

2. فك التعليمة (Decode): بعد الجلب يفسر المعالج التعليمة المحملة في سجل التعليمة: يحدد رمز العملية (Opcode) والمعاملات (Operands) اللازمة. فإذا كانت التعليمة تعني «أضف محتوى مسجلين» فإن المعالج يحدد نوع العملية (إضافة) والمسجلين المعنيين.

3. التنفيذ (Execute): أخيراً ينفذ المعالج العملية المطلوبة. قد يكون ذلك عملية حسابية أو منطقية في الـ ALU (مثل الجمع أو الطرح)، أو نقل بيانات بين المسجلات والذاكرة، أو تغيير قيمة عداد البرنامج في الحالات الخاصة (مثل القفز jmp)، أو أي عملية تحكم أخرى.

مثال

int x = 5;
int y = 3;
int z = x + y;

وبتجميعها:

mov  eax, 5       ; التعليمة الأولى: نقل القيمة الفورية 5 إلى EAX
mov  ebx, 3       ; التعليمة الثانية: نقل القيمة الفورية 3 إلى EBX
add  eax, ebx     ; التعليمة الثالثة: جمع EBX على EAX
mov  [z], eax     ; تخزين النتيجة في المتغير z

المهم أن تدرك هنا أن كل تعليمة من هذه التعليمات تمر بالمراحل الثلاث كاملة، وليس أن تأخذ كل تعليمة مرحلة واحدة. خذ تعليمة add eax, ebx مثالاً:

  1. Fetch: يجلب المعالج بايتات التعليمة من العنوان الذي يشير إليه PC ويضعها في IR.
  2. Decode: يحدد فاكّ الشفرة أن رمز العملية هو ADD وأن المعاملين هما المسجلان EAX و EBX.
  3. Execute: تجري وحدة الـ ALU عملية الجمع، ويخزن الناتج في EAX وتحدث الأعلام.

ثم ينتقل المعالج إلى التعليمة التالية ويعيد الدورة نفسها، وهكذا دواليك حتى نهاية البرنامج. وأثناء هذه الدورة تتفاعل أجزاء مختلفة من النظام (الذاكرة، المسجلات، وحدة الحساب) لتحقيق التنفيذ.


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

اذكروني بدعوة في ظهر الغيب.