سنبدأ بشرح الدور المهم، الذي يلعبه طاقم التعليمات (instruction set)، ثم ننتقل إلى إلقاء نظرة فاحصة على تطور عائلة معالجات إنتل. ونشرح أيضاً، بعض المصطلحات الأخرى، التي قد تجد الإلمام بها مفيداً.
التعليمات
تعمل الكمبيوترات بناءً على أوامر متدنية المستوى (low-level commands)، تُدعى التعليمات (instructions). ونقصد بعبارة "متدنية المستوى"، أن هذه الأوامر تعمل بشكل مباشر مع المعالج، وتتصل مع أجزائه الأساسية. ويحتوي كل نوع من أنواع المعالجات، على مجموعة محددة من هذه التعليمات، التي يعمل بموجبها. وتسمّى هذه المجموعة طاقم التعليمات (instruction set).
يمكن للمبرمجين الوصول إلى تعليمات المعالج من خلال لغات البرمجة المختلفة. وتكتب زمرة التعليمات بلغة الآلة (machine language)، التي تحتل أدنى مستوى من بين جميع اللغات، وتتألف من أرقام فقط (الصفر والواحد)، ولذلك يندر استخدامها من قبل المبرمجين. وللتغلب على هذه المشكلة، يلجأ المبرمجون عادة، إما إلى اللغة التجميعية (assembly language)، التي تستخدم التعليمات ذاتها، لكنها تعطي تسميات محددة لتسهيل التعامل معها (مثل add و inc)، وإما إلى لغة عالية المستوى (high-level language , HLL)، تندرج فيها تعليمات الآلة ضمن أوامر على نطاق أوسع. ويبيّن الشكل المستويات المختلفة للغات البرمجة.
لا تستغني اللغات عالية المستوى (HLL) عن تعليمات الآلة بأي شكل، لكنها تجعل التعامل معها أسهل، نسبياً. يجب تحويل البرنامج المكتوب بلغة عالية المستوى، إلى لغة الآلة، ويتم ذلك عن طريق البرنامج المترجم (compiler) الخاص بهذه اللغة، ويقوم برنامج المترجم عادة بتحويل تعليمات البرنامج إلى لغة داخلية وسيطة أولاً، ثم إلى لغة الآلة. وتسمّى هاتان المرحلتان: الواجهة الأمامية (front end)، والواجهة الخلفية (back end) للمترجم. ويمكن لمصممي البرنامج المترجم (compiler) أن يفصلوا الأجزاء التي لا تتعلق بمعمارية منصة العمل، عن الأجزاء المتعلقة بها. ويجب في نهاية المطاف، أن تصل التعليمات إلى المعالج على هيئة أرقام، لكي يتمكّن من القيام بعمله.
تتضمن التعليمات النموذجية في طاقم تعليمات x86، التي شكّلت حجر الأساس لبيئة الكمبيوترات الشخصية لسنين طويلة، أوامر لفعاليات مختلفة، مثل التوابع الحسابية، ونقل البيانات، والتعليمات المنطقية، وتعليمات الدخل والخرج. وتتضمن التعليمات الحسابية أمر add، الذي يضيف محتويات المسجّلات (registers) المختلفة إلى بعضها البعض، وأمر inc (increment) الذي يضيف واحداً إلى القيمة الموجودة في المسجّل. وتتضمّن تعليمات نقل البيانات أمر mov الذي ينقل البيانات من مسجّل إلى مسجّل آخر، أو إلى عنوان ذاكرة، وأمر xchng (exchange) الذي يقوم بتبديل محتويات مسجّلين مختلفين بين بعضهما البعض، أو محتويات عنواني ذاكرة. وتتألف كافة البرامج من مزيج متنوع من هذه التعليمات التي "يفهمها" المعالج وينفذها.
التصاميم فائقة التدرج
تحدثنا في الجزء السابق عن خطوط المعالجة (pipelines)، وهي التقنية التي تمكّن المعالج من البدء في تنفيذ تعليمة جديدة، قبل أن ينتهي من تنفيذ التعليمة الحالية. وتمكّننا هذه التقنية من توفير الوقت، عن طريق التأكّد من أن المعالج لن يتوقف في انتظار التعليمات. ولا يستطيع المعالج في جميع الأحوال، إنهاء سوى تعليمة واحدة خلال دورة الساعة الواحدة. ولزيادة المردود، وتسريع المعالجة، تمتاز معالجات اليوم (مثل معالج Alpha، من شركة كومباك -بعد أن اشترت ديجيتال- ومعالج Power PC من شركتي IBM وموتورولا، ومعالجات بينتيوم من إنتل، ومعالج SPARC من صن) باحتوائها على معمارية التدرج الفائق (superscalar). وتكمن الفائدة الرئيسية لمعمارية التدرج الفائق في أنها تسمح للمعالج بتنفيذ أكثر من تعليمة في دورة الساعة الواحدة، باستخدام عدة خطوط معالجة.
يبحث المعالج ذو التصميم فائق التدرج، عن التعليمات التي يمكن معالجتها خلال دورة الساعة ذاتها، ويعالجها مع بعضها البعض. فيمكن، مثلاً، لمعالج بينتيوم، العمل على تعليمات بسيطة، مثل mov و or و add، بهذه الطريقة، تحت ظروف خاصة فقط (يجب أن لا تكون إحدى التعليمات بحاجة إلى نتيجة التعليمات الأخرى). لكن التعليمات الأكثر تعقيداً، كالتي تتضمّن عمليات الفاصلة العائمة، لا يمكن معالجتها معاً.
تقدّم المعالجة المتوازية (parallel processing) فوائد واضحة في مجال السرعة، لكن تقنية التدرج الفائق (superscalar) لها نقادها. ويعتقد البعض أنها تضيّع العديد من الفرص على التنفيذ المتوازي، لأن دمج التعليمات المنفصلة يأخذ وقتاً كبيراً نسبياً، ولأن التعليمات المنفصلة غالباً ما تتأخر أثناء إنتظارها للموارد. لنفرض، مثلاً، أن التعليمة A تنفذ في أحد خطوط المعالجة، فيما تنفذ التعليمة B في خط آخر، وتنتظر التعليمة C أن ينتهي خط التنفيذ الأول من تنفيذ التعليمة A. وعند الإنتهاء من تنفيذ التعليمة A، فإن الشيء الواضح هو استبدالها بالتعليمة C، وهي التعليمة التالية على خط التنفيذ. لكن، إذا كانت التعليمة C تحتاج إلى نتائج التعليمة B، التي يتم تنفيذها في خط التنفيذ المتتابع الآخر، فعليها أن تنتظر. وهذا ما يقضي على فكرة التنفيذ المتوازي، ويقضي على أية فرصة لزيادة السرعة. ويصبح، بذلك، لمعالجك الجديد المكلف دور محدود نسبياً، في زيادة الأداء.
وحتى في البرنامج المصمم بشكل جيد -الذي يحاول أن يحصل على الفائدة القصوى من خطوط المعالجة والتنفيذ المتوازي- يمكن أن تعاني خطوط المعالجة من تأخيرات زمنية. وللتغلب على هذه المشكلة، صمم المهندسون معالجات التدرج الفائق، لتقوم بأداء التنفيذ غير المرتّب (out-of-order execution). فإذا كان أحد خطوط المعالجة حراً، نظراً لأن التعليمة C تحتاج لنتائج التعليمة B، فإن المعالج يمكنه أن يبحث عن أول تعليمة في البرنامج لا تعتمد على التعليمة B (ولتكن التعليمة H). ويبدأ المعالج بالعمل على التعليمة H والتعليمات المرتبطة بها، إلى أن تنتهي التعليمة B، حيث يعود بعدها إلى التعليمة C. وبدلاً من إرسال نتائج التعليمة غير المرتّبة إلى المسجّلات (حيث يتعامل المعالج بشكل مباشر مع البيانات)، فإن المعالج يرسلها إلى ذاكرة وسيطة لتخزينها، ثم يقوم بترتيب كل شيء بانتظام، قبل تحريره.
تظهر إحدى مشاكل التنفيذ غير المرتّب إذا احتاجت تعليمتان إلى المسجّل ذاته. وللتغلب على هذه المشكلة، فإن معالجات اليوم يمكنها أن تغيّر أسماء المسجّلات بشكل فوري، ضمن عملية "إعادة تسمية المسجّلات" (register renaming). ومن الواضح أن التنفيذ غير المرتّب يتطلب تصميماً دقيقاً جداً للمعالج، لأن البرامج قد تفشل في عملها، إذا لم يتم تنفيذ التعليمات بالترتيب الصحيح.
طواقم التعليمات: ريسك وسيسك
يمكن تعريف طاقم التعليمات أنه مجموعة خاصة من الأوامر، التي يمكن لمعالج معيّن أن يتعرّف عليها وينفّذها. ودار خلال السنين، حوار طويل حول فلسفتين لتصميم المعالج، وكيفية تنفيذ طاقم التعليمات. تسمّى الطريقة الأولى، والتي عرفت في البداية باسم الشيفرة الميكروية (microcode)، بتقنية "طاقم التعليمات المعقدة للحوسبة"، أو اختصاراً "سيسك" (complicated instruction-set computing , CISC). وتسمى الطريقة الثانية، "طاقم التعليمات المختصرة للحوسبة"، أو "ريسك" (reduced instruction-set computing , RISC). تستخدم أجهزة الألعاب Nintendo 64، وكمبيوترات ماكنتوش باور بي سي، ومحطات العمل سيليكون جرافيكس، تقنية ريسك، فيما تستخدم الأجهزة الشخصية المرتكزة على معالجات إنتل ونظائرها، وكمبيوترات ماكنتوش 680x0 تصاميم سيسك. وعلى الرغم من تناقص الفروقات الفعلية بين هاتين التقنيتين، إلا أن النقاش لا يزال مستمراً بشأن التصميم الأفضل.
استخدمت الأجيال الأولى من المعالجات، الدارات الإلكترونية مباشرة لتنفيذ كل تعليمة. وقد كانت تلك المعالجات سريعة نسبياً نظراً لعدم وجود تعليمات برمجية، لتعمل من خلالها. وكما قد يخيّل إليك، فإن هذه الطريقة سببت مشكلة كبيرة، وهي أن أي تغيير في العتاد يتطلب تغيير الدارات التي تمثل التعليمات (أو البرمجيات) أيضاً، والعكس بالعكس. وقد أمكن تنفيذ برامج بسيطة بهذه الطريقة، أما البرامج المعقدة فكانت شبه مستحيلة. وللتغلب على هذه المشكلة، وضعت شركة IBM الشيفرة الميكروية (microcode)- وهي برمجيات بسيطة مخزّنة على رقاقة، يحصل منها المعالج على تعليماته.
تكمن إحدى فوائد الشيفرة الميكروية لمعالجات سيسك، في إمكانية تعديل طاقم التعليمات، بسهولة أكبر بكثير من السابق، مما سمح باستخدام تعليمات أكثر تعقيداً. ونظراً لأن التعليمة البرمجية الواحدة قد أخذت مكان عدة تعليمات عتادية بسيطة، أصبح بإمكاننا كتابة البرامج بعدد أقل من التعليمات. والفائدة الأخرى هي أن برامج سيسك أخذت مساحات أقل من الذاكرة، التي كانت مكلفة جداً، في الستينيات والسبعينيات. لكن التعامل مع هذه التعليمات المعقدة فرض عملاً إضافياً على المعالج. وتحتاج التعليمات المعقدة المختلفة، إلى عدد مختلف من دورات الساعة لتنفيذها، ولهذا فإن للشيفرة الميكروية مساوئها أيضاً.
البساطة هي بالطبع، الحل المناسب للقضاء على التعقيدات، وهذا ما حاولت معالجات ريسك أن تفعله في منتصف السبعينيات. والأساس الذي اعتمدته تقنية ريسك، هو أن المعالج، حتى مع تصاميم الشيفرة الميكروية (microcode)، يقضي معظم وقته في تنفيذ تعليمات بسيطة. وقد أدرك الباحثون أن تنفيذ سلسلة من التعليمات البسيطة قد يكون في معظم الأحيان أسرع من تنفيذ تعليمة واحدة معقدة. يتضمن تصميم ريسك، عدداً أقل من التعليمات، وجميعها بطول موحد (32 بت)، ويمكن أن تنفّذ بدورة ساعة واحدة. واختفت الشيفرة الميكروية (microcode) في معظم التعليمات شائعة التنفيذ، وعادت معالجات ريسك إلى نظام ما قبل الشيفرة الميكروية (pre-microcode)، أي إلى المنطق العتادي. واحتلت ذاكرة كاش عالية السرعة الخاصة بالمعالج، محل الشيفرة الميكروية، حيث تخزّن فيها سلسلة متتابعة من التعليمات. يجب ترجمة البرامج بعناية، في تصميم ريسك، للاستفادة القصوى من طاقم التعليمات، كما يجب الاستفادة من تقنية خطوط المعالجة (pipelining) إلى حدودها القصوى.
حالما ظهر تصميم ريسك، أُعيد تسمية الشيفرة الميكروية إلى اسم "سيسك". وأكثر تصاميم سيسك انتشاراً هي بالطبع، في عائلة معالجات إنتل ومعالجات المينفريم لشركة IBM، ومعالجات موتورولا 680x0. وأكثر طواقم التعليمات شعبية هو طاقم تعليمات x86، الذي صمم أساساً، لمعالج إنتل 8086، ولا يزال مستخدماً حتى الآن في معالجات بينتيوم. وأحدث الإضافات التي طرأت على تعليمات x86، تعليمات MMX، وهي عبارة عن 57 تعليمة جديدة تتعلق بشكل رئيسي ببرمجة الملتيميديا. وقد يختفي طاقم التعليمات x86 مع ظهور معمارية طاقم التعليمات IA-64 المقبل من شركة إنتل. وسوف تظهر هذه المعمارية أولاً، في معالج Merced (P7)، عيار 64 بت، الذي يعتمد على مجموعة جديدة من طواقم التعليمات لأول مرة في تاريخ الكمبيوترات الشخصية. وأعلنت إنتل أن معالج Merced سيدعم طاقم التعليمات x86، لكنها لم تقدم حتى الآن، فكرة عن كيفية تحقيق التوافق.
عائلة معالجات إنتل
على الرغم من أن مصطلح PC يرمز إلى "الكمبيوتر الشخصي" (personal computer)، إلا أنه يعني اليوم، تلك الكمبيوترات التي تعمل على معالجات إنتل والمعالجات المتوافقة معها، في ظل نظام تشغيل من شركة مايكروسوفت (دوس، أو ويندوز 3.x، أو ويندوز95، أو ويندوز إن.تي). ولم يكن الأمر بهذا الشكل من قبل: فقد كانت كمبيوترات Apple II تسمى كمبيوترات شخصية أيضاً، وكذلك كمبيوترات كومودور 64، وجميع الكمبيوترات الأصغر حجماً من كمبيوترات الميني (minicomputers).
لكن، عندما دخلت شركة IBM إلى الأسواق عام 1981، أسمت منتجها IBM-PC، وأصبحت الكمبيوترات التي تنتجها الشركات الأخرى معروفة باسم IBM-PC-Compatibles، أي الكمبيوترات الشخصية المتوافقة مع كمبيوترات IBM. واختصر هذا التعبير مع الزمن، ليصبح IBM-compatible (متوافق مع IBM)، أو PC-compatible (متوافق مع الكمبيوترات الشخصية)، ثم أصبح بعد فترة قصيرة، PC فقط. ولم يكن ضرورياً أن تعمل بنظام تشغيل من شركة مايكروسوفت، لأن الكمبيوترات التي تعمل بنظام OS/2 كانت تسمى، أيضاً، PCs (كمبيوترات شخصية). وقد اشتركت هذه الكمبيوترات مع بعضها البعض في شيء واحد: هو أن معالجاتها من شركة إنتل. أما اليوم، فيمكنك شراء كمبيوترات شخصية بمعالجات متوافقة مع معالجات إنتل (وسنلقي نظرة على هذه المعالجات في العدد القادم)، لكن معظم الكمبيوترات الشخصية لا تزال تستخدم رقاقات إنتل، مثلما كان الأمر في الأيام الخوالي.
من معالج 4004 إلى معالج 80286
كان المعالج 4004 أول تصميم تطرحه إنتل، ويعود إلى العام 1971. وكان من العيار 4 بت، ولم يكن باستطاعته القيام سوى بالقليل من العمليات الحسابية الأساسية. وبعد عام من ذلك التاريخ، طرحت إنتل إصدارة عيار 8 بت من معالج 4004، وهو معالج 8008، الذي كان يعمل بسرعة 0.2 MHz تقريباً. وبعد بضع سنوات، جاء معالج 8080 بطاقم تعليمات أكثر قوة. وشكّل معالج 8080، الأساس الذي بني عليه معالج Z80، من شركة Zilog (وليس إنتل)، والذي كان يعمل بنظام التشغيل CP/M، وهو أول نظام تشغيل للكمبيوترات الشخصية. وأول معالج فعال قدمته إنتل كان المعالج 8086، الذي طرح في الأسواق عام 1978، وكان ناقل البيانات فيه من عيار 16 بت. لكن النواقل من عيار 16 بت كانت مكلفة جداً آنذاك. ولم يكن يوجد سوى القليل من العتاد الذي يدعم عيارات 16 بت، بما فيها الألواح-الأم. وأعادت، لذلك، شركة إنتل هندسة هذا المعالج، بتصميم خارجي من عيار 8 بت، وأطلقته عام 1979، وأسمته المعالج 8088. وكانت المسجّلات فيه من عيار 16 بت، من حيث السعة (مثل معالجات 8086)، لكن ناقل البيانات كان من عيار 8 بت، ليؤمن التوافق مع العتاد المتوفر في نهاية السبعينيات. وأصبح معالج 8088 قلب كمبيوتر IBM-PC، بينما لعب المعالج 8086 الأكثر قوة، دوراً ثانوياً في الأجهزة المتوافقة مع IBM. وكان المعالج 8088 يعمل بسرعتين: 4.77 ميجاهرتز، و 8 ميجاهرتز، فيما استطاع المعالج 8086 العمل بهاتين السرعتين، بالإضافة إلى 10 ميجاهرتز.
أصدرت إنتل عام 1982، معالجاً في غاية الأهمية، وهو 80286. وعندما وجد هذا المعالج طريقه إلى كمبيوتر IBM PC-AT الجديد عام 1984، بدأنا ندرك إمكانات الكمبيوترات الشخصية، حيث قدّم هذا المعالج ناقل بيانات عيار 16 بت، وإمكانيات عنونة للذاكرة من العيار 24 بت، ومسجّلاً بقياس 16 بت. وكان مردوده أكثر تطوراً بكثير، من مردود معالج 8088، حيث أنه حتى مع سرعته الأولى 6 ميجاهرتز، كان أداؤه أسرع بأربع مرات من أداء معالج 8088 ذو السرعة 4.77 ميجاهرتز. وظهر المعالج 286، الذي أصبح معروفاً بهذا الاسم، بسرعات 8 و 10 و 12 ميجاهرتز. وكان بإمكانه التعامل مع 16 ميجابايت من الذاكرة، وهو تطور كبير عن الميجابايت الواحد التي يتعامل معها معالج 8088. وقدّم توافقاً كاملاً مع المعالج الذي سبقه، عن طريق تضمينه نمطين من التشغيل: النمط الحقيقي (real mode)، والنمط المحمي (protected mode)، حيث يقوم النمط الأول بمحاكاة معالج 8088 (مع قيود الميجابايت الواحد المفروضة عليه)، بينما يسمح النمط الثاني بعزل مجالات الذاكرة المحمية عن بعضها البعض، لتجنب حدوث تضارب بين البرامج. لكن نظام التشغيل دوس لم يتمكّن من التعامل مع النمط المحمي بشكل جيد، فبقي هذا الخيار بدون فائدة عملية، إلى أن تم توسيع نظام دوس، وظهور نظام OS/2.
عانى معالج 286 من سلبية كبيرة، تسببت في تقصير عمره، حيث أن الكمبيوترات الشخصية المبنية على معالجات 286، كانت تقلع في النمط الحقيقي، ولم يكن من الممكن تحويلها إلى النمط المحمي عبر البرمجيات، والطريقة الوحيدة لتغيير النمط، هي إعادة الإقلاع. وقد حد هذا الأمر، بالطبع، من فائدة معالجات 286، من حيث توافقها التراجعي مع برامج النمط الحقيقي، والتي كانت تؤلف الغالبية العظمى من البرامج التجارية وغير التجارية، المتوفرة في ذلك الوقت.
معالج 80386
أعطانا المعالج 80286 فكرة عن إمكانات طاقم التعليمات x86، ومعمارية "سيسك". وبدأت ظاهرة الحوسبة الشخصية تتبلور عند ظهور المعالج 80386 عام 1985 (في كمبيوترات كومباك وليس IBM). فقد كان معالج 386 أول معالج تطرحه إنتل من عيار 32 بت، مع ناقل بيانات ومسجّلات من عيار 32 بت أيضاً. ويمكنه أن يتعامل مع 4 جيجابايت من الذاكرة، بسرعات تتراوح من 16 إلى 32 ميجاهرتز (وصلت معالجات شركتي AMD و سايركس إلى40 ميجاهرتز)، مما جعله أسرع معالجات إنتل في ذلك الحين. وسمّيت أول رقاقة طرحت من هذا النوع في الأسواق معالج 80386، لكن إنتل أنتجت بعده مباشرة، المعالج 80386SX (سنتحدث عنه فيما بعد). فأطلق على الرقاقة الأصلية الاسم 80386DX، للتمييز بشكل أفضل بين النموذجين. وانتقلت تسميات DX وSX إلى عائلة معالجات 80486، لكنها لم تنتقل إلى عائلة بينتيوم.
لم تقتصر مزايا المعالج 386 على إمكانية التعامل مع ذاكرة أكبر من الذاكرة التي يمكن أن يتعامل معها المعالج 286، بل أمكنه أيضاً مخاطبة الذاكرة ككتلة واحدة ضخمة. فقد تعامل المعالج 286 مع الذاكرة على شكل أقسام سعة كل منها 64 كيلوبايت فقط، على الرغم من أن بإمكانه التعامل مع 16 ميجابايت. وتكمن فائدة التعامل مع الذاكرة ككتلة واحدة ضخمة، في أنه يمكن تحميل التطبيقات وبياناتها في جميع خلايا الذاكرة المتوفرة في الكمبيوتر، أي الوصول إليها بشكل أسرع. وامتاز معالج 386 باحتوائه على كتل صغيرة (16 بايت) من صفوف التعليمات المبيتة فيه، وبقدرته على تحميل البيانات التالية التي قد يطلبها الكمبيوتر.
وفيما كان المعالج 286 يعمل بنمطين، امتاز المعالج 386 بنمط ثالث. يسمح النمط الحقيقي (real mode) بالتوافق الكامل مع البرامج المصممة لمعالجات 8086، ويدخل مثل معالج 286، النمط الحقيقي عند الإقلاع. وبقي النمط المحمي (protected mode) فعالاً، حيث يعمل المعالج 386 مثل المعالج 286، في هذا النمط. أما النمط الجديد، فسمّي نمط معالج 8086 الافتراضي (virtual 8086)، حيث يمكن لمعالج 386، في هذا النمط، محاكاة عمل عدة رقاقات 8086، كل منها في منطقة معزولة من الذاكرة. وأصبح معالج 386 بهذه الطريقة، أول رقاقة عملية متعددة المهام في عائلة معالجات إنتل. كان بإمكان المعالج 286 القيام بتعددية المهام للبرامج العاملة بالنمط المحمي، لكن أنظمة التشغيل والبرامج لم تقدم، في حينها، سوى القليل من الدعم لهذه الميزة.
كانت رقاقات 386DX الأولى مكلفة جداً، ولم تقدّم سوى القليل من التحسينات عند استخدامها مع البرمجيات المبنية على نظام دوس، والمتوفرة في ذلك الحين. وهذا ما دفع إنتل إلى طرح المعالج 386SX، وهو ذو تصميم فيزيائي مختلف عن تصميم 386DX، يمكنه أن يستخدم دارات أبسط على الألواح-الأم. استخدم المعالج 386SX ناقل بيانات عيار 16 بت، بدلاً من 32 بت، على الرغم من أن المسجلات فيه كانت من عيار 32 بت. وسبّب استخدام ناقل عيار 16 بت بطئاً في عمل الكمبيوتر، لأنه لم يعد بالإمكان قذف البيانات إلى المعالج، بالسعة القصوى التي يمكن للمعالج العمل عليها.
أما بالنسبة للمستخدمين، فكانت الفوائد الرئيسية لعائلة معالجات 80386، تكمن في استخدامه للذاكرة وتعددية المهام، والتي أدت إلى تطوير واجهة استخدام رسومية (graphical user interface , GUI) مبنية على الكمبيوتر الشخصي. وتم تشغيل نظام مايكروسوفت ويندوز 3.0 على معالج 286، لكن بشكل بطيء وغير فعال. ومع عائلة 386 فقط -بإمكانياتها في التعامل مع كميات كبيرة من الذاكرة، واستخدامها القوي للذاكرة الإفتراضية، وإمكانية استخدام النمط المحمي ونمط 8086 الإفتراضي- تمكّن نظام ويندوز من الحصول على مايحتاجه من قوة المعالجة.
التعليمات
تعمل الكمبيوترات بناءً على أوامر متدنية المستوى (low-level commands)، تُدعى التعليمات (instructions). ونقصد بعبارة "متدنية المستوى"، أن هذه الأوامر تعمل بشكل مباشر مع المعالج، وتتصل مع أجزائه الأساسية. ويحتوي كل نوع من أنواع المعالجات، على مجموعة محددة من هذه التعليمات، التي يعمل بموجبها. وتسمّى هذه المجموعة طاقم التعليمات (instruction set).
يمكن للمبرمجين الوصول إلى تعليمات المعالج من خلال لغات البرمجة المختلفة. وتكتب زمرة التعليمات بلغة الآلة (machine language)، التي تحتل أدنى مستوى من بين جميع اللغات، وتتألف من أرقام فقط (الصفر والواحد)، ولذلك يندر استخدامها من قبل المبرمجين. وللتغلب على هذه المشكلة، يلجأ المبرمجون عادة، إما إلى اللغة التجميعية (assembly language)، التي تستخدم التعليمات ذاتها، لكنها تعطي تسميات محددة لتسهيل التعامل معها (مثل add و inc)، وإما إلى لغة عالية المستوى (high-level language , HLL)، تندرج فيها تعليمات الآلة ضمن أوامر على نطاق أوسع. ويبيّن الشكل المستويات المختلفة للغات البرمجة.
لا تستغني اللغات عالية المستوى (HLL) عن تعليمات الآلة بأي شكل، لكنها تجعل التعامل معها أسهل، نسبياً. يجب تحويل البرنامج المكتوب بلغة عالية المستوى، إلى لغة الآلة، ويتم ذلك عن طريق البرنامج المترجم (compiler) الخاص بهذه اللغة، ويقوم برنامج المترجم عادة بتحويل تعليمات البرنامج إلى لغة داخلية وسيطة أولاً، ثم إلى لغة الآلة. وتسمّى هاتان المرحلتان: الواجهة الأمامية (front end)، والواجهة الخلفية (back end) للمترجم. ويمكن لمصممي البرنامج المترجم (compiler) أن يفصلوا الأجزاء التي لا تتعلق بمعمارية منصة العمل، عن الأجزاء المتعلقة بها. ويجب في نهاية المطاف، أن تصل التعليمات إلى المعالج على هيئة أرقام، لكي يتمكّن من القيام بعمله.
تتضمن التعليمات النموذجية في طاقم تعليمات x86، التي شكّلت حجر الأساس لبيئة الكمبيوترات الشخصية لسنين طويلة، أوامر لفعاليات مختلفة، مثل التوابع الحسابية، ونقل البيانات، والتعليمات المنطقية، وتعليمات الدخل والخرج. وتتضمن التعليمات الحسابية أمر add، الذي يضيف محتويات المسجّلات (registers) المختلفة إلى بعضها البعض، وأمر inc (increment) الذي يضيف واحداً إلى القيمة الموجودة في المسجّل. وتتضمّن تعليمات نقل البيانات أمر mov الذي ينقل البيانات من مسجّل إلى مسجّل آخر، أو إلى عنوان ذاكرة، وأمر xchng (exchange) الذي يقوم بتبديل محتويات مسجّلين مختلفين بين بعضهما البعض، أو محتويات عنواني ذاكرة. وتتألف كافة البرامج من مزيج متنوع من هذه التعليمات التي "يفهمها" المعالج وينفذها.
التصاميم فائقة التدرج
تحدثنا في الجزء السابق عن خطوط المعالجة (pipelines)، وهي التقنية التي تمكّن المعالج من البدء في تنفيذ تعليمة جديدة، قبل أن ينتهي من تنفيذ التعليمة الحالية. وتمكّننا هذه التقنية من توفير الوقت، عن طريق التأكّد من أن المعالج لن يتوقف في انتظار التعليمات. ولا يستطيع المعالج في جميع الأحوال، إنهاء سوى تعليمة واحدة خلال دورة الساعة الواحدة. ولزيادة المردود، وتسريع المعالجة، تمتاز معالجات اليوم (مثل معالج Alpha، من شركة كومباك -بعد أن اشترت ديجيتال- ومعالج Power PC من شركتي IBM وموتورولا، ومعالجات بينتيوم من إنتل، ومعالج SPARC من صن) باحتوائها على معمارية التدرج الفائق (superscalar). وتكمن الفائدة الرئيسية لمعمارية التدرج الفائق في أنها تسمح للمعالج بتنفيذ أكثر من تعليمة في دورة الساعة الواحدة، باستخدام عدة خطوط معالجة.
يبحث المعالج ذو التصميم فائق التدرج، عن التعليمات التي يمكن معالجتها خلال دورة الساعة ذاتها، ويعالجها مع بعضها البعض. فيمكن، مثلاً، لمعالج بينتيوم، العمل على تعليمات بسيطة، مثل mov و or و add، بهذه الطريقة، تحت ظروف خاصة فقط (يجب أن لا تكون إحدى التعليمات بحاجة إلى نتيجة التعليمات الأخرى). لكن التعليمات الأكثر تعقيداً، كالتي تتضمّن عمليات الفاصلة العائمة، لا يمكن معالجتها معاً.
تقدّم المعالجة المتوازية (parallel processing) فوائد واضحة في مجال السرعة، لكن تقنية التدرج الفائق (superscalar) لها نقادها. ويعتقد البعض أنها تضيّع العديد من الفرص على التنفيذ المتوازي، لأن دمج التعليمات المنفصلة يأخذ وقتاً كبيراً نسبياً، ولأن التعليمات المنفصلة غالباً ما تتأخر أثناء إنتظارها للموارد. لنفرض، مثلاً، أن التعليمة A تنفذ في أحد خطوط المعالجة، فيما تنفذ التعليمة B في خط آخر، وتنتظر التعليمة C أن ينتهي خط التنفيذ الأول من تنفيذ التعليمة A. وعند الإنتهاء من تنفيذ التعليمة A، فإن الشيء الواضح هو استبدالها بالتعليمة C، وهي التعليمة التالية على خط التنفيذ. لكن، إذا كانت التعليمة C تحتاج إلى نتائج التعليمة B، التي يتم تنفيذها في خط التنفيذ المتتابع الآخر، فعليها أن تنتظر. وهذا ما يقضي على فكرة التنفيذ المتوازي، ويقضي على أية فرصة لزيادة السرعة. ويصبح، بذلك، لمعالجك الجديد المكلف دور محدود نسبياً، في زيادة الأداء.
وحتى في البرنامج المصمم بشكل جيد -الذي يحاول أن يحصل على الفائدة القصوى من خطوط المعالجة والتنفيذ المتوازي- يمكن أن تعاني خطوط المعالجة من تأخيرات زمنية. وللتغلب على هذه المشكلة، صمم المهندسون معالجات التدرج الفائق، لتقوم بأداء التنفيذ غير المرتّب (out-of-order execution). فإذا كان أحد خطوط المعالجة حراً، نظراً لأن التعليمة C تحتاج لنتائج التعليمة B، فإن المعالج يمكنه أن يبحث عن أول تعليمة في البرنامج لا تعتمد على التعليمة B (ولتكن التعليمة H). ويبدأ المعالج بالعمل على التعليمة H والتعليمات المرتبطة بها، إلى أن تنتهي التعليمة B، حيث يعود بعدها إلى التعليمة C. وبدلاً من إرسال نتائج التعليمة غير المرتّبة إلى المسجّلات (حيث يتعامل المعالج بشكل مباشر مع البيانات)، فإن المعالج يرسلها إلى ذاكرة وسيطة لتخزينها، ثم يقوم بترتيب كل شيء بانتظام، قبل تحريره.
تظهر إحدى مشاكل التنفيذ غير المرتّب إذا احتاجت تعليمتان إلى المسجّل ذاته. وللتغلب على هذه المشكلة، فإن معالجات اليوم يمكنها أن تغيّر أسماء المسجّلات بشكل فوري، ضمن عملية "إعادة تسمية المسجّلات" (register renaming). ومن الواضح أن التنفيذ غير المرتّب يتطلب تصميماً دقيقاً جداً للمعالج، لأن البرامج قد تفشل في عملها، إذا لم يتم تنفيذ التعليمات بالترتيب الصحيح.
طواقم التعليمات: ريسك وسيسك
يمكن تعريف طاقم التعليمات أنه مجموعة خاصة من الأوامر، التي يمكن لمعالج معيّن أن يتعرّف عليها وينفّذها. ودار خلال السنين، حوار طويل حول فلسفتين لتصميم المعالج، وكيفية تنفيذ طاقم التعليمات. تسمّى الطريقة الأولى، والتي عرفت في البداية باسم الشيفرة الميكروية (microcode)، بتقنية "طاقم التعليمات المعقدة للحوسبة"، أو اختصاراً "سيسك" (complicated instruction-set computing , CISC). وتسمى الطريقة الثانية، "طاقم التعليمات المختصرة للحوسبة"، أو "ريسك" (reduced instruction-set computing , RISC). تستخدم أجهزة الألعاب Nintendo 64، وكمبيوترات ماكنتوش باور بي سي، ومحطات العمل سيليكون جرافيكس، تقنية ريسك، فيما تستخدم الأجهزة الشخصية المرتكزة على معالجات إنتل ونظائرها، وكمبيوترات ماكنتوش 680x0 تصاميم سيسك. وعلى الرغم من تناقص الفروقات الفعلية بين هاتين التقنيتين، إلا أن النقاش لا يزال مستمراً بشأن التصميم الأفضل.
استخدمت الأجيال الأولى من المعالجات، الدارات الإلكترونية مباشرة لتنفيذ كل تعليمة. وقد كانت تلك المعالجات سريعة نسبياً نظراً لعدم وجود تعليمات برمجية، لتعمل من خلالها. وكما قد يخيّل إليك، فإن هذه الطريقة سببت مشكلة كبيرة، وهي أن أي تغيير في العتاد يتطلب تغيير الدارات التي تمثل التعليمات (أو البرمجيات) أيضاً، والعكس بالعكس. وقد أمكن تنفيذ برامج بسيطة بهذه الطريقة، أما البرامج المعقدة فكانت شبه مستحيلة. وللتغلب على هذه المشكلة، وضعت شركة IBM الشيفرة الميكروية (microcode)- وهي برمجيات بسيطة مخزّنة على رقاقة، يحصل منها المعالج على تعليماته.
تكمن إحدى فوائد الشيفرة الميكروية لمعالجات سيسك، في إمكانية تعديل طاقم التعليمات، بسهولة أكبر بكثير من السابق، مما سمح باستخدام تعليمات أكثر تعقيداً. ونظراً لأن التعليمة البرمجية الواحدة قد أخذت مكان عدة تعليمات عتادية بسيطة، أصبح بإمكاننا كتابة البرامج بعدد أقل من التعليمات. والفائدة الأخرى هي أن برامج سيسك أخذت مساحات أقل من الذاكرة، التي كانت مكلفة جداً، في الستينيات والسبعينيات. لكن التعامل مع هذه التعليمات المعقدة فرض عملاً إضافياً على المعالج. وتحتاج التعليمات المعقدة المختلفة، إلى عدد مختلف من دورات الساعة لتنفيذها، ولهذا فإن للشيفرة الميكروية مساوئها أيضاً.
البساطة هي بالطبع، الحل المناسب للقضاء على التعقيدات، وهذا ما حاولت معالجات ريسك أن تفعله في منتصف السبعينيات. والأساس الذي اعتمدته تقنية ريسك، هو أن المعالج، حتى مع تصاميم الشيفرة الميكروية (microcode)، يقضي معظم وقته في تنفيذ تعليمات بسيطة. وقد أدرك الباحثون أن تنفيذ سلسلة من التعليمات البسيطة قد يكون في معظم الأحيان أسرع من تنفيذ تعليمة واحدة معقدة. يتضمن تصميم ريسك، عدداً أقل من التعليمات، وجميعها بطول موحد (32 بت)، ويمكن أن تنفّذ بدورة ساعة واحدة. واختفت الشيفرة الميكروية (microcode) في معظم التعليمات شائعة التنفيذ، وعادت معالجات ريسك إلى نظام ما قبل الشيفرة الميكروية (pre-microcode)، أي إلى المنطق العتادي. واحتلت ذاكرة كاش عالية السرعة الخاصة بالمعالج، محل الشيفرة الميكروية، حيث تخزّن فيها سلسلة متتابعة من التعليمات. يجب ترجمة البرامج بعناية، في تصميم ريسك، للاستفادة القصوى من طاقم التعليمات، كما يجب الاستفادة من تقنية خطوط المعالجة (pipelining) إلى حدودها القصوى.
حالما ظهر تصميم ريسك، أُعيد تسمية الشيفرة الميكروية إلى اسم "سيسك". وأكثر تصاميم سيسك انتشاراً هي بالطبع، في عائلة معالجات إنتل ومعالجات المينفريم لشركة IBM، ومعالجات موتورولا 680x0. وأكثر طواقم التعليمات شعبية هو طاقم تعليمات x86، الذي صمم أساساً، لمعالج إنتل 8086، ولا يزال مستخدماً حتى الآن في معالجات بينتيوم. وأحدث الإضافات التي طرأت على تعليمات x86، تعليمات MMX، وهي عبارة عن 57 تعليمة جديدة تتعلق بشكل رئيسي ببرمجة الملتيميديا. وقد يختفي طاقم التعليمات x86 مع ظهور معمارية طاقم التعليمات IA-64 المقبل من شركة إنتل. وسوف تظهر هذه المعمارية أولاً، في معالج Merced (P7)، عيار 64 بت، الذي يعتمد على مجموعة جديدة من طواقم التعليمات لأول مرة في تاريخ الكمبيوترات الشخصية. وأعلنت إنتل أن معالج Merced سيدعم طاقم التعليمات x86، لكنها لم تقدم حتى الآن، فكرة عن كيفية تحقيق التوافق.
عائلة معالجات إنتل
على الرغم من أن مصطلح PC يرمز إلى "الكمبيوتر الشخصي" (personal computer)، إلا أنه يعني اليوم، تلك الكمبيوترات التي تعمل على معالجات إنتل والمعالجات المتوافقة معها، في ظل نظام تشغيل من شركة مايكروسوفت (دوس، أو ويندوز 3.x، أو ويندوز95، أو ويندوز إن.تي). ولم يكن الأمر بهذا الشكل من قبل: فقد كانت كمبيوترات Apple II تسمى كمبيوترات شخصية أيضاً، وكذلك كمبيوترات كومودور 64، وجميع الكمبيوترات الأصغر حجماً من كمبيوترات الميني (minicomputers).
لكن، عندما دخلت شركة IBM إلى الأسواق عام 1981، أسمت منتجها IBM-PC، وأصبحت الكمبيوترات التي تنتجها الشركات الأخرى معروفة باسم IBM-PC-Compatibles، أي الكمبيوترات الشخصية المتوافقة مع كمبيوترات IBM. واختصر هذا التعبير مع الزمن، ليصبح IBM-compatible (متوافق مع IBM)، أو PC-compatible (متوافق مع الكمبيوترات الشخصية)، ثم أصبح بعد فترة قصيرة، PC فقط. ولم يكن ضرورياً أن تعمل بنظام تشغيل من شركة مايكروسوفت، لأن الكمبيوترات التي تعمل بنظام OS/2 كانت تسمى، أيضاً، PCs (كمبيوترات شخصية). وقد اشتركت هذه الكمبيوترات مع بعضها البعض في شيء واحد: هو أن معالجاتها من شركة إنتل. أما اليوم، فيمكنك شراء كمبيوترات شخصية بمعالجات متوافقة مع معالجات إنتل (وسنلقي نظرة على هذه المعالجات في العدد القادم)، لكن معظم الكمبيوترات الشخصية لا تزال تستخدم رقاقات إنتل، مثلما كان الأمر في الأيام الخوالي.
من معالج 4004 إلى معالج 80286
كان المعالج 4004 أول تصميم تطرحه إنتل، ويعود إلى العام 1971. وكان من العيار 4 بت، ولم يكن باستطاعته القيام سوى بالقليل من العمليات الحسابية الأساسية. وبعد عام من ذلك التاريخ، طرحت إنتل إصدارة عيار 8 بت من معالج 4004، وهو معالج 8008، الذي كان يعمل بسرعة 0.2 MHz تقريباً. وبعد بضع سنوات، جاء معالج 8080 بطاقم تعليمات أكثر قوة. وشكّل معالج 8080، الأساس الذي بني عليه معالج Z80، من شركة Zilog (وليس إنتل)، والذي كان يعمل بنظام التشغيل CP/M، وهو أول نظام تشغيل للكمبيوترات الشخصية. وأول معالج فعال قدمته إنتل كان المعالج 8086، الذي طرح في الأسواق عام 1978، وكان ناقل البيانات فيه من عيار 16 بت. لكن النواقل من عيار 16 بت كانت مكلفة جداً آنذاك. ولم يكن يوجد سوى القليل من العتاد الذي يدعم عيارات 16 بت، بما فيها الألواح-الأم. وأعادت، لذلك، شركة إنتل هندسة هذا المعالج، بتصميم خارجي من عيار 8 بت، وأطلقته عام 1979، وأسمته المعالج 8088. وكانت المسجّلات فيه من عيار 16 بت، من حيث السعة (مثل معالجات 8086)، لكن ناقل البيانات كان من عيار 8 بت، ليؤمن التوافق مع العتاد المتوفر في نهاية السبعينيات. وأصبح معالج 8088 قلب كمبيوتر IBM-PC، بينما لعب المعالج 8086 الأكثر قوة، دوراً ثانوياً في الأجهزة المتوافقة مع IBM. وكان المعالج 8088 يعمل بسرعتين: 4.77 ميجاهرتز، و 8 ميجاهرتز، فيما استطاع المعالج 8086 العمل بهاتين السرعتين، بالإضافة إلى 10 ميجاهرتز.
أصدرت إنتل عام 1982، معالجاً في غاية الأهمية، وهو 80286. وعندما وجد هذا المعالج طريقه إلى كمبيوتر IBM PC-AT الجديد عام 1984، بدأنا ندرك إمكانات الكمبيوترات الشخصية، حيث قدّم هذا المعالج ناقل بيانات عيار 16 بت، وإمكانيات عنونة للذاكرة من العيار 24 بت، ومسجّلاً بقياس 16 بت. وكان مردوده أكثر تطوراً بكثير، من مردود معالج 8088، حيث أنه حتى مع سرعته الأولى 6 ميجاهرتز، كان أداؤه أسرع بأربع مرات من أداء معالج 8088 ذو السرعة 4.77 ميجاهرتز. وظهر المعالج 286، الذي أصبح معروفاً بهذا الاسم، بسرعات 8 و 10 و 12 ميجاهرتز. وكان بإمكانه التعامل مع 16 ميجابايت من الذاكرة، وهو تطور كبير عن الميجابايت الواحد التي يتعامل معها معالج 8088. وقدّم توافقاً كاملاً مع المعالج الذي سبقه، عن طريق تضمينه نمطين من التشغيل: النمط الحقيقي (real mode)، والنمط المحمي (protected mode)، حيث يقوم النمط الأول بمحاكاة معالج 8088 (مع قيود الميجابايت الواحد المفروضة عليه)، بينما يسمح النمط الثاني بعزل مجالات الذاكرة المحمية عن بعضها البعض، لتجنب حدوث تضارب بين البرامج. لكن نظام التشغيل دوس لم يتمكّن من التعامل مع النمط المحمي بشكل جيد، فبقي هذا الخيار بدون فائدة عملية، إلى أن تم توسيع نظام دوس، وظهور نظام OS/2.
عانى معالج 286 من سلبية كبيرة، تسببت في تقصير عمره، حيث أن الكمبيوترات الشخصية المبنية على معالجات 286، كانت تقلع في النمط الحقيقي، ولم يكن من الممكن تحويلها إلى النمط المحمي عبر البرمجيات، والطريقة الوحيدة لتغيير النمط، هي إعادة الإقلاع. وقد حد هذا الأمر، بالطبع، من فائدة معالجات 286، من حيث توافقها التراجعي مع برامج النمط الحقيقي، والتي كانت تؤلف الغالبية العظمى من البرامج التجارية وغير التجارية، المتوفرة في ذلك الوقت.
معالج 80386
أعطانا المعالج 80286 فكرة عن إمكانات طاقم التعليمات x86، ومعمارية "سيسك". وبدأت ظاهرة الحوسبة الشخصية تتبلور عند ظهور المعالج 80386 عام 1985 (في كمبيوترات كومباك وليس IBM). فقد كان معالج 386 أول معالج تطرحه إنتل من عيار 32 بت، مع ناقل بيانات ومسجّلات من عيار 32 بت أيضاً. ويمكنه أن يتعامل مع 4 جيجابايت من الذاكرة، بسرعات تتراوح من 16 إلى 32 ميجاهرتز (وصلت معالجات شركتي AMD و سايركس إلى40 ميجاهرتز)، مما جعله أسرع معالجات إنتل في ذلك الحين. وسمّيت أول رقاقة طرحت من هذا النوع في الأسواق معالج 80386، لكن إنتل أنتجت بعده مباشرة، المعالج 80386SX (سنتحدث عنه فيما بعد). فأطلق على الرقاقة الأصلية الاسم 80386DX، للتمييز بشكل أفضل بين النموذجين. وانتقلت تسميات DX وSX إلى عائلة معالجات 80486، لكنها لم تنتقل إلى عائلة بينتيوم.
لم تقتصر مزايا المعالج 386 على إمكانية التعامل مع ذاكرة أكبر من الذاكرة التي يمكن أن يتعامل معها المعالج 286، بل أمكنه أيضاً مخاطبة الذاكرة ككتلة واحدة ضخمة. فقد تعامل المعالج 286 مع الذاكرة على شكل أقسام سعة كل منها 64 كيلوبايت فقط، على الرغم من أن بإمكانه التعامل مع 16 ميجابايت. وتكمن فائدة التعامل مع الذاكرة ككتلة واحدة ضخمة، في أنه يمكن تحميل التطبيقات وبياناتها في جميع خلايا الذاكرة المتوفرة في الكمبيوتر، أي الوصول إليها بشكل أسرع. وامتاز معالج 386 باحتوائه على كتل صغيرة (16 بايت) من صفوف التعليمات المبيتة فيه، وبقدرته على تحميل البيانات التالية التي قد يطلبها الكمبيوتر.
وفيما كان المعالج 286 يعمل بنمطين، امتاز المعالج 386 بنمط ثالث. يسمح النمط الحقيقي (real mode) بالتوافق الكامل مع البرامج المصممة لمعالجات 8086، ويدخل مثل معالج 286، النمط الحقيقي عند الإقلاع. وبقي النمط المحمي (protected mode) فعالاً، حيث يعمل المعالج 386 مثل المعالج 286، في هذا النمط. أما النمط الجديد، فسمّي نمط معالج 8086 الافتراضي (virtual 8086)، حيث يمكن لمعالج 386، في هذا النمط، محاكاة عمل عدة رقاقات 8086، كل منها في منطقة معزولة من الذاكرة. وأصبح معالج 386 بهذه الطريقة، أول رقاقة عملية متعددة المهام في عائلة معالجات إنتل. كان بإمكان المعالج 286 القيام بتعددية المهام للبرامج العاملة بالنمط المحمي، لكن أنظمة التشغيل والبرامج لم تقدم، في حينها، سوى القليل من الدعم لهذه الميزة.
كانت رقاقات 386DX الأولى مكلفة جداً، ولم تقدّم سوى القليل من التحسينات عند استخدامها مع البرمجيات المبنية على نظام دوس، والمتوفرة في ذلك الحين. وهذا ما دفع إنتل إلى طرح المعالج 386SX، وهو ذو تصميم فيزيائي مختلف عن تصميم 386DX، يمكنه أن يستخدم دارات أبسط على الألواح-الأم. استخدم المعالج 386SX ناقل بيانات عيار 16 بت، بدلاً من 32 بت، على الرغم من أن المسجلات فيه كانت من عيار 32 بت. وسبّب استخدام ناقل عيار 16 بت بطئاً في عمل الكمبيوتر، لأنه لم يعد بالإمكان قذف البيانات إلى المعالج، بالسعة القصوى التي يمكن للمعالج العمل عليها.
أما بالنسبة للمستخدمين، فكانت الفوائد الرئيسية لعائلة معالجات 80386، تكمن في استخدامه للذاكرة وتعددية المهام، والتي أدت إلى تطوير واجهة استخدام رسومية (graphical user interface , GUI) مبنية على الكمبيوتر الشخصي. وتم تشغيل نظام مايكروسوفت ويندوز 3.0 على معالج 286، لكن بشكل بطيء وغير فعال. ومع عائلة 386 فقط -بإمكانياتها في التعامل مع كميات كبيرة من الذاكرة، واستخدامها القوي للذاكرة الإفتراضية، وإمكانية استخدام النمط المحمي ونمط 8086 الإفتراضي- تمكّن نظام ويندوز من الحصول على مايحتاجه من قوة المعالجة.