درک نحوه کارکرد اکثر اجزای کامپیوتر کار نسبتا آسانی است. رم، حافظه ذخیرهسازی، لوازمجانبی و نرمافزار همگی با هدف شکل دادن به یک عملیات کامپیوتری با یکدیگر همکاری میکنند. اما CPU قلب تپنده سیستم شما بهشمار میآید و ظاهرا عملکرد آن حتی به عقیده بسیاری از افراد فنی نیز اسرارآمیز بهنظر میرسد. در ادامه تلاش شده تا چگونگی عملکرد CPU بهطور کامل تشریح شود. اکثر منابع تحقیقاتی برای این مقاله از کتاب “But How Do It Know” نوشته جیکلارک اسکات استخراج شدهاند.
پیش از آغاز کار بایستی یک نکته را مدنظر قرارداد. CPUهای مدرن در مقایسه با نمونههای بررسی شده در این مقاله به مراتب پیچیدهتر هستند. تقریبا غیرممکن است که یک نفر قادر به درک کلیه ظرافتهای تراشهای با بیش از یک میلیارد ترانزیستور باشد. با اینحال اصول پایه برای نحوه قرارگیری این اجزا در کنار یکدیگر، یکسان باقی میماند و فهم این اصول، امکان درک بهتر عملکرد سیستمهای مدرن را برای شما فراهم خواهد کرد.
شروع با اجزای کوچک
کامپیوترها در مبنای دودویی عمل میکنند و تنها قادر به درک 2 وضعیت روشن و خاموش هستند. این سیستمها به منظور اجرای محاسبات باینری از المانی موسوم به ترانزیستور بهره میگیرند. ترانزیستور تنها در صورت وجود جریان در سراسر گیت به جریان منبع اجازه عبور و تخلیه خواهد داد. این المان اساسا یک سوئیچ دودویی را ایجاد نموده و بسته به سیگنال ورودی دوم، جریان سیم را قطع میکند. کامپیوترهای مدرن به منظور انجام محاسبات از میلیاردها ترانزیستور استفاده میکنند. اما در پایینترین سطح شما بایستی نسبت به عملکرد چند نمونه از بنیادیترین اجزا که با نام گیت نیز شناخته میشوند، آگاهی پیدا کنید.
گیتهای منطقی
برای دستیابی به درکی درست از نحوه کارکرد ترانزیستور بایستی با المانهایی موسوم به گیتهای منطقی آشنا شویم. گیتهای منطقی، 2 ورودی باینری را دریافت نموده و پس از انجام عملیات بر روی آنها، یک خروجی را بازگردانی میکنند. بهعنوان مثال در صورتیکه یکی از ورودیها صحیح باشند، گیت OR مقدار صحیح را بازمیگرداند. گیت AND صحیح بودن هر 2 ورودی را بررسی میکند. گیت XOR صحت تنها یکی از ورودیها را ارزیابی نموده و گیتهای منفی شامل NOR، NAND و XNOR نیز نسخههای معکوس شده گیتهای پایهای خود محسوب میشوند.
اجرای عملیات ریاضی با گیتها
با وجود تنها 2 گیت شما قادر به انجام عملیات ابتدایی جمع دودویی خواهید بود. نمودار بالا یک نیم جمعکننده (half adder) را نمایش میدهد. این دیاگرام با استفاده از Logicly که یک بستر رایگان و آنلاین برای طراحی گیتهای منطقی است، ایجاد شده است. در اینجا تنها در صورت روشن شدن یکی از ورودیها و نه هر دو آنها، گیت XOR روشن خواهد شد. در صورت روشن بودن هر 2 ورودی، گیت AND روشن میشود؛ اما با عدم وجود ورودی در وضعیت خاموش باقی خواهد ماند. بنابراین اگر هر 2 ورودی روشن باشند، گیت XOR در وضعیت خاموش باقی مانده و گیت AND روشن میشود. این وضعیت در 2 حالت به پاسخ درست منجر خواهد شد:
این موضوع یک پیکرهبندی ساده با 3 خروجی متمایز 0، 1 و 2 را در اختیار ما قرار خواهد داد. اما یک بیت قادر به ذخیرهسازی مقادیر بزرگتر از 1 نیست و این دستگاه چندان مفید نخواهد بود؛ زیرا تنها یکی از سادهترین مسائل ریاضی ممکن را حل میکند. اما این مدار تنها نمایانگر یک نیم جمعکننده است و در صورتیکه 2 عدد از آنها را به یک ورودی دیگر متصل نمایید، یک جمعکننده کامل (full adder) ایجاد خواهد شد:
جمعکننده کامل دارای 3 ورودی است که 2 عدد از آنها برای جمع و یکی بهعنوان رقم نقلی (carry) استفاده میشود. هنگامیکه فضای لازم برای ذخیرهسازی عدد نهایی از ظرفیت یک بیت فراتر میرود، رقم نقلی بهکارگیری خواهد شد. جمعکنندههای کامل در یک زنجیره متصل خواهند شد و رقم نقلی از یک جمعکننده به جمعکننده بعدی منتقل میشود. این رقم به نتیجه گیت XOR در اولین نیم جمعکننده اضافه خواهد شد و برای مدیریت هر 2 حالتی که ورودیهای ترانزیستور بایستی روشن باشند نیز از یک گیت OR اضافی استفاده میشود.
زمانیکه هر 2 ورودی روشن هستند، رقم نقلی روشن شده و به جمعکننده کامل بعدی در زنجیره ارسال خواهد شد.
این موضوع موجب ایجاد پیچیدگی مضاعف میشود. افزایش تعداد بیتها، اساسا به معنای افزایش تعداد جمعکنندههای کامل در یک زنجیره طولانیتر است.
اکثر عملیاتهای ریاضی دیگر به کمک عمل جمع قابل اجرا خواهند بود. عملیات ضرب تنها همان عمل جمعی است که بارها تکرار میشود. تفریق از طریق معکوس نمودن یک بیت خیالی قابلانجام بوده و تقسیم در واقع همان تکرار عمل تفریق خواهد بود. اگرچه تمامی کامپیوترهای مدرن به منظور افزایش سرعت اجرای اعمال پیچیدهتر مجهز به راهحلهای مبتنی بر سختافزار هستند؛ اما به لحاظ فنی شما با استفاده از یک جمعکننده کامل قادر به انجام کلیه آنها خواهید بود.
مفهوم گذرگاه و حافظه
تا اینجا کامپیوتر ما چیزی بیش از یک ماشینحساب بد نیست. چرا که نمیتواند هیچ چیزی را بهخاطر بسپارد و با خروجیهای خود نیز هیچ کاری انجام نمیدهد. دیاگرام بالا یک سلول حافظه که قادر به انجام کلیه امورات مذکور است را نمایش میدهد. در دل این سلول از تعداد زیادی گیت NAND استفاده میشود. این سلول در دنیای واقعی و بسته به تکنیک ذخیرهسازی میتواند کاملا متفاوت باشد؛ اما عملکرد آن یکسان خواهد بود. شما چندین ورودی را به حافظه ارایه نموده و بیت “نوشتن” را روشن میکنید. بدین ترتیب ورودیها در داخل سلول ذخیره خواهند شد. این تنها یک سلول حافظه نیست؛ چرا که ما به روشی برای خواندن اطلاعات از آن نیز احتیاج خواهیم داشت. اینکار با استفاده از یک فعالساز انجام میشود که مجموعهای از گیتهای AND برای هر بیت موجود در حافظه است. همگی اینها به یک ورودی دیگر با نام بیت “خواندن” متصل هستند. بیتهای نوشتن و خواندن غالبا تحت عنوان set و enable نیز نامگذاری میشوند.
تمامی این پکیج در قالب مجموعهای با نام رجیستر یا ثبات قرار میگیرد. این رجیسترها به گذرگاه یا باس متصل هستند. گذرگاه مجموعهای از ارتباطات است که در سراسر سیستم پیاده شده و به کلیه اجزاء متصل میشود. حتی کامپیوترهای مدرن امروزی نیز دارای یک گذرگاه هستند؛ اگرچه این ماشینها به منظور بهبود عملکرد مالتیتسکینگ احتمالا مجهز به چندین باس خواهند بود.
هر رجیستر همچنان دارای یک بیت خواندن و نوشتن است؛ اما در این پیکرهبندی، ورودی و خروجی موجودیتهای یکسانی هستند. این موضوع واقعا خوب است. بهعنوان مثال در صورتیکه مایل باشید محتوای ثبات R1 را در رجیستر R2 کپی نمایید، بیت خواندن ثبات R1 را روشن میکنید. بدین ترتیب محتوای ثبات R1 بر روی گذرگاه قرار میگیرد. در حالیکه بیت خواندن روشن است، بیت نوشتن ثبات R2 را روشن خواهید کرد. با این اقدام، محتوای گذرگاه بر روی ثبات R2 کپی میشود.
ثباتها برای ساخت حافظههای رم نیز بهکار گرفته میشوند. رم غالبا در بستر یک شبکه با سیمهایی در 2 جهت قرار میگیرد:
دیکدرها یک ورودی باینری را دریافت نموده و سیم با شماره مربوطه را فعال میکنند. بهعنوان مثال عدد 11 در مبنای 2 معادل 3 در مبنای 10 بوده و بزرگترین عدد 2 بیتی بهشمار میآید؛ بنابراین دیکدر بالاترین سیم را روشن خواهد کرد. در هر تقاطع، یک رجیستر وجود دارد و تمامی آنها به گذرگاه مرکزی و یک ورودی مرکزی خواندن و نوشتن متصل هستند. هر 2 ورودی خواندن و نوشتن تنها در صورتی روشن خواهند شد که 2 سیم عبورکننده از ثبات نیز روشن باشند. این موضوع بهطور موثر اجازه میدهد تا به انتخاب خود، عملیات خواندن یا نوشتن روی ثبات را تعیین نمایید. مجددا بایستی یادآوری کرد که یک رم مدرن، بسیار پیچیدهتر است؛ اما این پیکرهبندی همچنان عمل میکند.
مفهوم ساعت، Stepper و دیکدر
ثباتها در همهجا مورد استفاده قرار میگیرند و ابزاری اساسی جهت انتقال داده و ذخیرهسازی اطلاعات در CPU بهشمار میآیند. اما چه چیزی فرمان جابهجایی اطلاعات را به آنها ارسال میکند؟
کلاک یا ساعت، نخستین قسمت در هسته CPU است که در فواصل زمانی معین خاموش و روشن خواهد شد. این مشخصه بر حسب واحد هرتز یا سیکل برثانیه سنجیده شده و همان سرعتی است که در تبلیغات CPUها نیز به چشم میخورد. یک تراشه 5 گیگاهرتزی قادر به اجرای 5 میلیارد چرخه در هر ثانیه است. سرعت کلاک غالبا یک معیار بسیارمناسب برای سنجش سرعت CPU محسوب میشود.
کلاک دارای 3 وضعیت متفاوت است: ساعت پایه (base)، ساعت فعال (enable) و ساعت تنظیم (set)
ساعت پایه برای نیمی از یک چرخه روشن و برای نیمی دیگر خاموش خواهد بود. ساعت فعال به منظور روشن نمودن ثباتها بهکار گرفته میشود. جهت اطمینان از فعال شدن داده، این ساعت برای مدت زمان طولانیتری روشن خواهد ماند. ساعت تنظیم نیز همزمان با ساعت فعال همواره بایستی روشن باشد؛ در غیر اینصورت دادهها میتوانند به شکل نادرست نوشته شوند.
کلاک به یک Stepper متصل میشود که از عدد 1 تا گام بیشینه را شمارش نموده و با انجام کار مجددا به عدد 1 باز خواهد گشت. بعلاوه برای هر ثباتی که CPU قادر به نوشتن اطلاعات بر روی آنها است، کلاک به گیتهای AND نیز اتصال پیدا میکند:
این گیتهای AND به خروجی یک جزء دیگر با نام رمزگشای دستورالعملها متصل هستند. دیکدر دستوراتی نظیر “SET R2 TO R1” را دریافت نموده و آنرا به شکلی که برای CPU قابلفهم باشد، رمزگشایی میکند. دیکدر از رجیسترهای داخلی خاص خود موسوم به “ثبات دستورالعمل” بهره میگیرد و عملیات جاری نیز در این ثبات ذخیره میشود. نحوه دقیق انجام اینکار به سیستم در حال اجرا توسط شما وابسته خواهد بود. اما با رمزگشایی دستورالعمل، بیتهای set و enable مناسب برای رجیستر مربوطه روشن شده و مطابق با ساعت پردازنده، خاموش خواهند شد.
دستورالعملهای برنامه در حافظه رم (یا در سیستمهای پیشرفتهتر بر روی حافظه کش L1 که به CPU نزدیکتر است) ذخیره خواهند شد. از آنجا که دادههای برنامه در ثباتها ذخیره میشوند، لذا دقیقا همانند هر متغیر دیگری میتوانند حین فرآیند انتقال یا پرش دچار تغییر شوند. به این ترتیب برنامهها در ساختار خود از حلقهها و گزارههای if استفاده میکنند. یک دستور پرش، موقعیت فعلی در حافظه را تعیین میکند؛ موقعیتی که دادههای موجود در آن توسط دیکدر دستورالعمل خوانده شده و به مکانی متفاوت منتقل میشوند.
چگونگی کارکرد کلیه اجزا در کنار یکدیگر
اکنون تحلیل بسیار پیش پا افتاده ما از نحوه عملکرد CPU تکمیل شده است. گذرگاه اصلی تمامی فضای سیستم را فرا گرفته و به کلیه ثباتها متصل میشود. جمعکنندههای کامل به همراه مجموعهای از عملیاتهای دیگر در قالب واحد محاسبات منطقی یا ALU گنجانده شدهاند. این ALU دارای ارتباطاتی با گذرگاه بوده و برای ذخیرهسازی عمل ثانویه خود نیز از ثباتهای داخلی بهره خواهد برد.
به منظور انجام محاسبات، دادههای برنامه از حافظه رم سیستم دریافت شده و در قسمت کنترل بارگذاری میشوند. واحد کنترل 2 عدد را از RAM میخواند. سپس اولین رقم را در ثبات دستورالعمل ALU بارگذاری نموده و در ادامه رقم دوم را بر روی گذرگاه قرار میدهد. در همینحال، یک کد دستورالعمل نیز به ALU ارسال شده و مشخص میکند که ALU بایستی چه کاری را انجام دهد. در ادامه ALU کلیه محاسبات را انجام داده و نتیجه را در ثبات متفاوتی ذخیره میکند. CPU قادر است دادهها را از این ثبات خوانده و سپس ادامه فرآیند را دنبال نماید.
نوشته تمام چیزی که باید در مورد نحوه عملکرد CPU بدانید اولین بار در وبسایت فناوری پدیدار شد.