واحد پردازش مرکزی یا CPU که اجرای تمام دستورالعملها را مدیریت میکند و اغلب از آن بهعنوان مغز کامپیوتر یاد میشود چطور کار میکند و چه اجزایی دارد؟
واحد پردازش مرکزی (CPU) عنصری حیاتی در هر کامپیوتر محسوب میشود و تمامی محاسبات و دستوراتی را که به سایر اجزای کامپیوتر و تجهیزات جانبی آن منتقل میشود، مدیریت میکند. تقریباً تمام وسایل الکترونیکی و گجتهاییها که استفاده میکنید؛ از دسکتاپ و لپتاپ و گوشی گرفته تا کنسولهای گیمینگ و ساعتهای هوشمند، همه و همه به واحدی برای پردازش مرکزی مجهز هستند؛ در واقع این واحد، پایه و اساسی برای کامپیوترها به حساب میآید که بدون آن، سیستم روشن نمیشود، چه برسد به اینکه قابل استفاده باشد. سرعت بالای واحد پردازش مرکزی تابعی از دستور ورودی است و اجزای کامپیوترها تنها در صورتی که به این واحد متصل باشند، قدرت اجرایی پیدا میکنند.
ازآنجاکه واحدهای پردازش مرکزی، دادههای تمام قسمتهای کامپیوتر را بهطور همزمان مدیریت میکنند، ممکن است با افزایش حجم محاسبات و پردازشها، کُند عمل کند یا حتی با بالا رفتن حجم کاری، از کار بیفتد یا به اصطلاح کِرَش کند. امروزه رایجترین واحدهای پردازش مرکزی موجود در بازار از قطعات نیمههادی در مدارهای مجتمع تشکیل شدهاند که در انواع مختلفی به فروش میرسند و تولیدکنندگان پیشرو در این صنعت نیز، AMD و Intel هستند که از 50 سال پیش تا به امروز در این حوزه با هم رقابت میکنند.
برای آشنایی با واحد پردازش مرکزی (CPU)، ابتدا بخشی از کامپیوتر به نام SoC را خیلی مختصر معرفی میکنیم. SoC یا سیستم روی یک تراشه، بخشی از سیستم است که تمام اجزای مورد نیاز کامپیوتر را برای پردازش در تراشهای سیلیکونی ادغام میکند. SoC ماژولهای مختلفی دارد که واحد پردازش مرکزی (به اختصار پردازنده) جزئی اصلی از آن و پردازندهی گرافیکی، حافظه، کنترلر USB، مدارهای مدیریت انرژی و رادیوهای بیسیم (WiFi، 3G، 4G LTE، و غیره) اجزایی متفرقه هستند که ممکن است لزوماً روی SoC وجود نداشته باشند. واحد پردازندهی مرکزی که از این به بعد و در این مقاله آن را به اختصار پردازنده خطاب میکنیم، نمیتواند مستقل از تراشههای دیگر، دستورالعملها را پردازش کند؛ اما ساخت کامپیوتری کامل تنها با SoC امکانپذیر است.
SoC از پردازنده کمی بزرگتر است و در عین حال عملکردهای بسیار بیشتری نیز ارائه میدهد. در واقع با وجود تأکید زیادی که روی فناوری و عملکرد پردازنده میشود، این بخش از کامپیوتر، به خودی خود کامپیوتر نیست و میتوان آن را در نهایت، ماشینحسابی بسیار سریع معرفی کرد که جزئی از سیستم روی تراشه یا SoC است؛ دادهها را از حافظه فراخوانی میکند و سپس نوعی عملیات حسابی (جمع، ضرب) یا منطقی (و، یا، نه) روی آنها انجام میدهد.
فراخوانی یا واکشی دستورالعملها از حافظه (Fetch): پردازنده ابتدا به منظور آگاهی از نحوهی مدیریت ورودی و دانستن دستورالعملهای مرتبط با آن، این دستورها را از حافظه دریافت میکند. این ورودی ممکن است یک یا بینهایت دستور باشد که باید در محلهای جداگانه آدرسدهی شوند. به این منظور واحدی به نام PC (مخفف Program Counter) یا شمارندهی برنامه، وجود دارد که ترتیب دستورهای ارسالشده را حفظ میکند؛ پردازنده نیز در تعاملی مشترک برای یافتن آدرس دستورالعمل دائماً با رم در ارتباط است (خواندن از حافظه).
رمزگشایی یا ترجمهی دستورالعملها (Decode): دستورالعملها به فرمی که برای پردازنده قابل درک باشند (زبان ماشین یا باینری) ترجمه میشوند. پردازنده پس از دریافت دستورها، برای درک آنها نیاز دارد تا این کدها به زبان ماشین (یا باینری) ترجمه شوند. نوشتن برنامهها به زبان باینری، از همان ابتدای امر، کار دشواری است و به همین دلیل کدها به زبانهای برنامهنویسی سادهتری نوشته میشوند و سپس واحدی به نام Assembler، این دستورها را به کدهای اجرایی و آماده برای پردازش پردازنده تبدیل میکند.
پردازش یا اجرای دستورهای ترجمهشده (Execute): مهمترین مرحله در عملکرد پردازنده، پردازش و اجرای دستورها است. در این مرحله دستورالعملهای رمزگشاییشده و باینری برای اجرا به کمک واحد ALU (مخفف Arithmetic & Logic Unit) یا واحد محاسبه و منطق، در آدرسی مخصوص پردازش میشوند.
ذخیرهی نتایج اجرا (Store): نتایج و خروجی دستورها به کمک واحد ثبات (Register) در حافظهی جانبی پردازنده ذخیره میشوند تا در دستورالعملهای آتی برای بالا بردن سرعت به آنها رجوع شود (نوشتن در حافظه).
فرایندی که در بالا توضیح داده شد، چرخهی واکشی-اجرایی نامیده میشود و میلیونها بار در ثانیه اتفاق میافتد؛ هربار پس از اتمام این چهار مرحلهی اصلی، نوبت به دستور بعدی میرسد و تمامی مراحل دوباره از اول اجرا شده تا زمانی که تمامی دستورالعملها پردازش شوند.
هر پردازنده از سه واحد عملیاتی تشکیل شده است که در فرایند پردازش دستورها نقش دارند:
واحد محاسبه و عملیات منطقی (ALU یا همان Arithmetic & Logic Unit): این واحد مدار دیجیتالی پیچیدهای است که عملیات ریاضی و مقایسهای را انجام میدهد؛ در برخی پردازندهها، ALU به دو بخش AU (برای انجام عملیات حسابی) و LU (برای انجام عملیات منطقی) تقسیم میشود.
واحد کنترل حافظه (CU یا همان Program Counter): این واحد مداری است که عملیات را درون پردازنده هدایت و مدیریت میکند و چگونگی پاسخ دادن به دستورالعملها را به واحد محاسبه و منطق و دستگاههای ورودی و خروجی، دیکته میکند. کارکرد واحد کنترل در هر پردازنده بسته به معماری طراحی آن، میتواند متفاوت باشد.
واحد ثبات (Register): واحد ثبات، واحدی در پردازنده است که وظیفهی نگهداری موقت دادههای پردازششده، دستورالعملها، آدرسها، توالی بیتها و خروجی را بر عهده دارد و باید برای نگهداری این دادهها ظرفیت کافی داشته باشد. پردازندههایی با معماری 64 بیتی، Registerهایی با ظرفیت 64 بیتی دارند و پردازندههایی با معماری 32 بیتی نیز دارای واحد ثباتی 32 بیتی هستند.
ارتباط میان دستورالعملها و طراحی سختافزار پردازنده، معماری پردازنده را شکل میدهد؛ اما معماری 64 یا 32 بیتی چیست؟ این دو معماری چه تفاوتهایی با یکدیگر دارند؟ برای پاسخ به این سؤال ابتدا باید با مجموعه دستورالعملها و نحوهی انجام محاسبات آنها آشنا شویم:
مجموعه دستورالعملها (Instruction Set)، مجموعه عملیاتی است که هر پردازنده میتواند بهطور طبیعی اجرا کند. این عملیات از چندین هزار دستورالعمل ساده و ابتدایی (مانند جمع، ضرب، جابهجایی و…) تشکیل شده که اجرای آن از پیش برای پردازنده تعریف شده است و اگر عملیاتی در خارج از محدودهی این مجموعه دستورالعمل باشد، پردازنده نمیتواند آن را اجرا کند.
همانطورکه اشاره شد، پردازنده وظیفهی اجرای برنامهها را بر عهده دارد. این برنامهها مجموعهای از دستورالعملهای نوشتهشده به زبان برنامهنویسی هستند که باید با ترتیبی منطقی و دقیقاً مرحلهبهمرحله اجرا دنبال شوند.
مقالههای مرتبط:
ازآنجاکه کامپیوترها زبانهای برنامهنویسی را مستقیماً درک نمیکنند، این دستورالعملها باید به فرم زبانِ ماشین یا باینری ترجمه شوند که درک آنها برای کامپیوترها آسانتر باشد. فرم باینری تنها از دو عدد صفر و یک تشکیل شده است و دو حالت ممکن روشن (یک) یا خاموش (صفر) ترانزیستورها را برای عبور جریان الکتریسیته نشان میدهد.
در واقع هر پردازنده را میتوان مجموعهای از مدارهای الکتریکی دانست که مجموعهی دستورالعملها را دراختیار پردازنده قرار میدهند و سپس مدارهای مربوط به آن عملیات به وسیلهی سیگنالی الکتریکی فعال شده و پردازنده آن را اجرا میکند.
دستورالعملها از تعداد معینی بیت تشکیل شدهاند. برای مثال، در دستورالعملی 8 بیتی؛ 4 بیت اول آن به کد عملیات و 4 بیت بعدی به دادههایی که باید استفاده شوند اشاره دارد. طول یک مجموعه دستورالعمل میتواند از چند بیت تا چند صد بیت متغیر بوده و در برخی از معماریها نیز طولهای متفاوتی داشته باشد.
بهطور کلی مجموعه دستورالعملها به دو دستهبندی اصلی زیر تقسیم میشوند:
RISC و CISC در دستهبندی مجموعهی دستورالعملها، دو نقطهی ابتدایی و انتهایی این طیف هستند و در این میان ترکیبهای مختلف دیگری نیز به چشم میخورند. در ابتدا به بیان تفاوتهای اساسی RISC و CISC میپردازیم:
RICS یا مجموعه دستورالعملهای کاهش یافته
CISC یا مجموعه دستورالعملهای پیچیده
مجموعه دستورالعملهای RISC ساده هستند؛ تنها یک عملیات را اجرا میکنند و پردازنده میتواند در طی یک چرخه، آنها را پردازش کند.
دستورالعملهای CISC چندین عملیات را اجرا میکنند، اما پردازنده نمیتواند آنها را طی یک چرخهی واحد، پردازش کند.
پردازندههای مبتنی بر RISC مسیرسازی بهینهتر و سادهتری برای اطلاعات دارند؛ طراحی این دستورها به قدری ساده است که میتوان آنها را بهصورت بخشبخش اجرا کرد.
پردازندههای مبتنی بر CISC ماهیت پیچیدهای دارند و اجرای دستورها در آن دشوارتر است.
پردازندههای مبتنی بر RISC برای اجرای دستورالعملها به دادههای ذخیرهشده نیاز دارند.
در پردازندههای مبتنی بر CISC بهصورت مستقیم و ازطریق رم میتوان با دستورها کار کرد و دیگر نیازی به بارگذاری جداگانهی عملیات نیست.
RISC به سختافزار پیچیدهای نیاز ندارد و تمام عملیات توسط نرمافزار انجام میشود.
نیازمندیهای سختافزاری طراحی CISC، بیشتر است. دستورالعملهای CISC با استفاده از سختافزار انجام میشوند و نرمافزارها غالباً سادهتر از RISC هستند. به همین دلیل است که برنامههایی مبتنی بر طراحی CISC، کدنویسی کمتری دارد و خود دستورالعملها، بخش بزرگی از عملیات را انجام میدهند.
همانطورکه گفته شد در طراحی پردازندههای مدرن امروزی، ترکیبی از این دو مجموعه (CISC یا RISC) استفاده میشود. برای مثال معماری x86 ایامدی در اصل از مجموعه دستورالعملهای CISC استفاده میکند، اما به میکروکدی برای سادهسازی دستورالعملهای پیچیده مشابه RISC نیز مجهز است. حال که تفاوتهای دو دستهبندی اصلی مجموعهی دستورالعملها را بیان کردیم، کاربرد آنها را در معماری پردازندهها بررسی میکنیم.
اگر هنگام انتخاب گوشی یا تبلت، به معماری پردازندهی آن دقت کنید، متوجه خواهید شد که برخی از مدلها از پردازندههای اینتل استفاده میکنند، درحالیکه برخی دیگر مبتنی بر معماری ARM هستند.
مقالههای مرتبط:
فرض کنید که پردازندههای مختلف، هر کدام مجموعه دستورالعملهای مختلفی داشته باشند، در این صورت برای اجرای برنامههای مختلف، هر کدام باید جداگانه برای هر پردازنده کامپایل شوند. برای مثال برای هر پردازنده از خانوادهی AMD، لازم بود تا ویندوزی جداگانه توسعه داده شود، یا هزاران نسخه از برنامهی فتوشاپ برای پردازندههای مختلف نوشته میشد. بههمیندلیل، معماریهای استانداردی مبتنی بر دستهبندیهای RISC یا CISC یا ترکیبی از این دو طراحی شد و مشخصات این استانداردها هم دردسترس همه قرار گرفت. ARM، PowerPC، x86-64 و IA-64 نمونههایی از این استانداردهای معماری هستند که در ادامه دو مورد از مهمترین آنها و تفاوتهایشان را معرفی میکنیم:
در سال 1823، فردی به نام بارون جونز جکوب برزلیوس، عنصر شیمیایی سیلیکون (نماد Si، عدد اتمی 14) را برای اولین بار کشف کرد. این عنصر به علت فراوانی و خاصیت نیمههادی قویای که دارد، بهعنوان ماده اصلی در ساخت پردازندهها و تراشههای کامپیوتری به کار میرود. تقریباً یک قرن بعد و در سال 1947، جان باردین، والتر براتین و ویلیام شاکلی اولین ترانزیستور را در آزمایشگاه بل اختراع و جایزهی نوبل دریافت کردند.
اولین مدار یکپارچهی (IC) کارآمد، سپتامبر 1958 رونمایی شد و دو سال بعد از آن IBM اولین مرکز تولید انبوه خودکار ترانزیستورها را در نیویورک توسعه داد. اینتل در سال 1968 پایهگذاری و AMD نیز یک سال بعد از آن تأسیس شد.
اولین پردازنده در اوایل دههی 1970، توسط اینتل اختراع شد؛ این پردازنده Intel 4004 نام داشت و با بهرهمندی از 2300 ترانزیستور، 60 هزار عملیات در ثانیه انجام میداد. قیمت CPU اینتل 4004 با 200 تعیین شده بود و تنها 640 بایت حافظه داشت:
CPU اینتل C4004 P0339
بعد از اینتل، موتورولا اولین پردازندهی 8 بیتی خود را (MC6800) با فرکانس یک تا دو مگاهرتز معرفی کرد و سپس MOS Technology، پردازندهای سریعتر و ارزانتر نسبت به پردازندههای موجود معرفی کرد که در کنسولهای گیمینگ آن زمان، یعنی آتاری 2600 و سیستمهای نینتندو مانند Apple II و Commodore 64 استفاده شد. اولین پردازندهی 32 بیتی را موتورولا در سال 1979 توسعه داد، البته این پردازنده تنها در کامپیوترهای مکینتاش اپل و آمیگا به کار رفت. کمی بعد National Semiconductor، اولین پردازندهای 32 بیتی را برای استفاده عموم عرضه کرد.
PowerPC در سال 1993، اولین پردازندهی مبتنی بر مجموعه دستورالعملهای 32 بیتی خود را عرضه کرد؛ این پردازنده توسط اتحادیهی AIM ( تشکیلشده از سه شرکت اپل، IBM و موتورولا) توسعه یافت و اپل در آن زمان از اینتل به PowerPC مهاجرت کرد. در ادامه دو ویدیوی تبلیغاتی را که اینتل و PowerPC در رقابت با یکدیگر منتشر کردند، مشاهده میکنید:
تبلیغ PowerPC برای نشان دادن ضعفهای اینتل
تبلیغ اینتل برای نشان دادن ضعفهای PowerPC
تفاوت پردازندهی 32 بیتی و 64 بیتی (x86 درمقابل x64): به بیان ساده، معماری x86 به خانوادهای از دستورالعملها اشاره دارد که در یکی از موفقترین پردازندههای اینتل، به نام 8086 به کار میرفت و اگر پردازندهای با معماری x86 سازگار باشد، آن پردازنده را بهعنوان x86-64 یا x86-32 میشناسند که برای نسخههای ویندوزی 32 (و 16) بیتی استفاده میشود؛ پردازندههای 64 بیتی را x64 و پردازندههای 32 بیتی را x86 معرفی میکنند.
بزرگترین تفاوت بین پردازندههای 32 بیتی و 64 بیتی، به میزان دسترسی متفاوت آنها به رم مربوط میشود:
حداکثر حافظهی فیزیکی معماری x86 یا پردازندههای 32 بیتی، به 4 گیگابایت محدود میشود؛ درحالیکه معماری x64 (یا پردازندههای 64 بیتی) میتواند به حافظهی فیزیکی 8، 16 و برخی مواقع حتی تا 32 گیگابایت دسترسی داشته باشد. یک کامپیوتر 64 بیتی میتواند هم با برنامههای 32 بیتی و هم با برنامههای 64 بیتی کار کند؛ درمقابل، یک کامپیوتر 32 بیتی تنها میتواند برنامههای 32 بیتی را اجرا کند.
در بیشتر موارد، پردازندههای 64 بیتی هنگام پردازش دادههای گسترده، از پردازندههای 32 بیتی کارآمدتر عمل میکنند. برای آگاهی از اینکه سیستمعامل شما از کدام برنامهها (32 بیتی یا 64 بیتی) پشتیبانی میکند، کافی است یکی از دو مسیر زیر را طی کنید:
(برگرفته شده از سایت زومیت)