چگونه پردازنده ها اطلاعات را پردازش می کنند ؟

پردازنده یا بعبارت دیگر CPU به قطعه ای سخت افزاری در یک کامپیوتر اتلاق می شود که بواسطه محاسبات ریاضی دستورات یک برنامه را اجرا و نتایج را بصورت خروجی ارائه می دهد سخت افزار CPU از یک چیپ سیلیکنی تشکیل شده است که به آن میکروپروسسور گفته می شود و مساحتی حدود چهار سانتی متر مربع دارد که از دو مدار کلیدی با نام های واحد محاسبه و منطق (ALU) و واحد کنترل (CU) تشکیل شده است .
واحد کنترل (Control unit) این قسمت فعالیت بقیه قسمت‌ها را کنترل می‌کند. واحد کنترل یک ماشین حالت متناهی است. واحد کنترل مداری است که جریان داده‌ها در پردازنده را کنترل می‌کند و اعمال سایر واحدها را کنترل می‌کند. در حالتی آن یک مغز داخل مغز است زیرا آنچه را در پردازنده اتفاق می‌افتد را کنترل می‌کند.
واحد محاسبه ومنطق (Arithmetic & Logic Unit) به اختصار (ALU)، مداری دیجیتالی است که عملیات حساب و منطق را انجام می‌دهد. یک قطعه اساسی از واحد پردازش مرکزی در کامپیوتر است. و حتی ساده‌ترین میکروپردازنده‌ها نیز دارای یک واحد محاسبه و منطق برای کارهایی از قبیل نگهداری زمان هستند. پردازنده‌های موجود در سی پی یو‌های مدرن و و پردازنده‌های گرافیکی(GPU) داری واچد محاسبه و منطق قدرتمند ودر عین حال پیچیده‌ای هستند. ممکن است هر قطعه دارای بیش از یک واحد محاسبه و منطق باشد.

در حالت کلی تمامی پردازنده ها از فارق از شکل مدارات داخلیشان وظیفه اجرا کردن دسته ای از دستورات موجود در یک برنامه که درون حافظه ای کامپیوتری قرار دارد را بر عهده دارند . این شگرف در غالب چهار عمل ساده صورت می پذیرد که در زیر به شرح آن می پردازیم ؛
Fetch یا واکشی :
این عمل شامل گرفتن دستورات از درون فهرستی شماره گذاری شده از حافظه هایی که برنامه در آن ذخیره شده است می باشد که شماره دستور مورد نظر در بخشی بنام شمارنده برنامه (PC) ذخیره شده است . اندازه طول اعداد باینری (مبنای دو) که باید در پردازنده اجرا شود نشان دهنده واحد حافظه های آن سیستم است حال آنکه گرفتن این دستورات از حافظه به حدی زمانبر است که باعث می شود پردازشگر برای دریافت دستور جدید بیکار مانده و سرعت پردازش آن هرز رود که با استفاده از حافظه های نهان (Cache) طراحی یارانش (Pipeline Architecture) این مشکل تقریبا بر طرف می شود .
Decode یا رمزگشایی :
در این مرحله داده های شامل دستورات که از حافظه گرفته شده بودند را به دستورات قابل درک برای پردازنده تبدیل می کنیم . به روشی که این داده ها به دستورات و داده ها تبدیل می شوند طرح مجموعه دستورات یا Instruction Set Architecture یا بصورت خلاصه ISA گفته می شود . این دستورات شامل بخشی به نام Opcode یا کد عملیات و بخش داده ها تقسیم می شوند که بخش اول مشخص کننده عملیاتی است که باید بر روی داده های بخش دوم انجام شود است . بخش دوم که مشخص کننده عملوند های عملیات ریاضی می باشد یا بصورت عددی ثابت و یا بصورت آدرس خانه ای از حافظه است . در طراحی های اولیه پردازنده ها بخش مسئول رمز گشایی یک قطعه سخت افزاری غیر قابل تغییر بود که با پیشرفت های کنونی از یک میکروبرنامه نیز برای کمک به رمزگشایی استفاده می شود که گاها می توان آنرا تغییر داد که باعث تغییر ISA در CPU حتی پس از تولید می شود


Execute یا اجرا :
برای توضیح عملکرد این بخش بایستی از یک مثال استفاده کنیم تا درک مطلب آسان تر شود  در این مرحله بخش های مختلف پردازنده به یکدیگر متصل می شوند تا عملیات اجرا شود به طریقی که بعنوان مثال اگر یک عمل جمع در حال انجام باشد واحد ALU به دو ورودی و یک خروجی متصل می شود و ALU عملوندهای جمع را از ورودی ها می گیرد و حاصل را در خروجی ذخیره می کند حال آنکه در صورتیکه جواب بزرگتر از حافظه خروجی باشد یک پیغام برای اعلام سرریز شدن حافظه فرستاده می شود .


Write Back یا ذخیره :

در این مرحله حاصل ذخیره شده در خروجی ALU در حافظه هایی خارج از پردازنده و یا حافظه های درون پردازنده ذخیره می شوند که دوباره در عملیات دیگری استفاده شوند . برخی دستورالعمل ها بجای خروجی دادن اعداد ثابت حاصل را بصورت مکانی در حافظه در شمارنده برنامه ذخیره می کنند که به این عمل یک پرش گفته می شود و باعث بهبود عملکرد حلقه ها ، دستورات شرطی و سایر اعمال در برنامه ها می شود . در برخی حالات نیز ممکن است خروجی یک دستورالعمل بر روی یک علامت اثر بگذارد که باعث تغییر نحوه عملکرد برنامه شود . برای مثال در یک عمل مقایسه بعد از انجام عملیات یک علامت برای نشان دادن بزرگتر یا کوچکتر بودن یک عملوند از دیگری در نظر گرفته می شود که حاصل آن در یک عملیات شرطی باعث تغییر نحوه ادامه کار برنامه خواهد شد .
پس از انجام این چهار مرحله این عملیات برای دستور بعدی در دسته دستورات موجود در برنامه که در شمارنده برنامه ذکر شده تکرار می شود و در صورتی که دستور اجرا شده یک پرش بوده باشد ، شمارنده برنامه به مکان جدید دستور می رود و آنگاه برنامه به کار خود ادامه می دهد . این نمونه از عملیات ها که عموما نقش حافظه های نهان را در پردازش نادیده می گیرند طرح یارانش RISC نامیده می شوند که عموما در میکروکنترلرها بکار برده می شوند و در مقابل پردازنده های کنونی قادر به انجام چندین رشته از این عملیات در هر لحظه می باشند .
در طرح بسیاری از پردازنده ها مجموعه دستورات موجود برای عمل فراخوانی داده ها از حافظه و مجموعه دستوراتی که برای انجام عملیات محاسباتی بکار می روند کاملا متفاوتند که در این حالت اطلاعات فراخوانی شده در حافظه هایی بنام ثبات یا Register ذخیره می شوند و در هنگام انجام اعمال محاسباتی ALU تنها دو عملوند خود را از درون ثبات ها بیرون کشیده و پس از بدست آوردن نتیجه ، جواب را به ثباتی دیگر می فرستد ، همچنین در سخت افزار پردازنده بخشی به نام واحد کنترل وجود دارد که وظیفه آن برقراری ارتباط میان حافظه و ALU می باشد اینکار را بوسیله سیگنال هایی که در مدار پردازنده ارسال می کند انجام می دهد .
 

در پردازنده های اولیه از اعداد ریاضی مبنای ده یا دهدهی استفاده می شد و در مواردی هم از اعداد مبنای سه بهره گرفته شد ولیکن تمامی پردازنده های کنونی از اعداد مبنای دو یا دودویی (Binary) استفاده می کنند که هر یک از این دو عدد تشکیل دهنده این مبنا بوسیله واحدی فیزیکی مثل ولتاژ بالا و پایین مشخص می شدند . در علم کامپیوتر به هر بخشی که بتواند مقداری مانند یک یا صفر در خود نشان دهد یک بیت گفته می شود و تعداد بیت هایی که یک پردازنده برای نمایش یک عدد استفاده می کند اندازه کلمه آن پردازنده خطاب می شود که عدد نشان داده شده در نهایت بسته به طراحی می تواند متفاوت باشد . برای مثال یک طراحی هشت بیتی هر عدد را با هشت بیت نشان می دهد که می تواند در کل 28 حالت داشته باشد که برابر است با 256 حالت که تنها اعدادی بین 0 تا 255 را شامل می شود و در نتیجه برنامه ها نخواهد توانست اعدادی بزرگتر از این محدوده را پردازش کند که به آن محدوده عملکرد عددی یا Integer Range پردازنده اتلاق می شود .
پردازنده های با محدوده عملکرد عددی بزرگتر با اعداد بزرگتری سروکار دارند و از اینرو پیچیدگی آن و متعاقب این اثر انرژی بیشتری مصرف می شود که هزینه نگهداری را افزایش می دهد . پس غیر منطقی نیست که در بسیاری از لوازم الکترونیکی کنونی از میکروکنترلرهای چهار بیتی یا هشت بیتی استفاده کنیم این در حالی است که اعداد بزرگتر بکار رفته در محدوده عملکردهای بزرگتر بسیار کاربردی هستند که باعث شده است تا برخی پردازنده ها از چند طرح برای عمل به دستورات استفاده کنند تا بسته به گونه دستور مصرف انرژی را بهینه سازی کنند .
به سرعتی که پردازنده دستورات را اجرا می کند نرخ زمان یا Clock Rate یک پردازنده گفته می شود و هر برد یک کامپیوتر (Mainboard) دارای یک نوسان ساز یا اسیلاتور می باشد که سرعت کار تمامی قطعات را هماهنگ می کند و سرعت پردازش داده ها را کنترل می کند و با بالا رفتن نرخ نوسانات تولید شده در واحد زمان سیستم دستورات بیشتری را در واحد زمان انجام می دهد که از آنها بعنوان سیستم های با نرخ هماهنگ یا Synchronous یاد می شود . در هنگام تولید پردازنده با محاسبه بالاترین سرعت وارد شدن داده و خارج شدن آن از کندترین بخش های پردازنده نرخ زمان آن بگونه ای تعیین می کنند که از مقدار محاسبه شده مقداری بیشتر باشد تا در شرایط متفاوت بهترین عملکرد را تجربه کنیم . البته این باعث می شود تا زمانی معطلی بخش های سریعتر برای اجرای دستور بعدی بالا رود که این مسئله را بواسطه تکنیک های موازی سازی بهبود داده اند گرچه تنها بهبود ساختار پردازنده نمی تواند در رفع اینگونه مشکلات کارساز باشد و از اینرو در برخی موارد که نرخ رمان بالا می رود یک نوسان ساز ثانویه نیز بکار برده می شود تا بتوانند سیگنال ها را در سرتاسر مدار همزمان نگه دارند .
مشکل دیگری که با بالا رفتن نرخ زمان بوجود می آید بالارفتن حرارت در تمامی قطعاتی است که از نرخ زمان متناسب با پردازنده استفاده می کنند و از اینرو برای جلوگیری از بروز مشکل در این قطعات بایستی از روش های مناسب تری برای خنک کردن سیستم بهره ببریم .
در مقابل این تلاشها تکنولوژی هدایت سیگنال زمان یا Clock Gating قرار دارد که به ما این امکان را می دهد تا از فرستاده شدن سیگنال زمان به برخی قطعات که نیازمند آنها نیستیم جلوگیری کنیم و در نتیجه آنها را در مواقعی که نیاز نیستند از فعالیت باز داریم که بهترین نمونه این عملکرد در پردازنده های کنسول بازی Xbox بکار رفته که تولید شرکت IBM است . حالاتی نیز وجود دارند که در آنها نرخ زمان به کل از میان برداشته می شود که به آنها پردازنده های فاقد زمان یا Asynchronous گفته می شود که با اینکار علیرقم پیچیده تر شدن طراحی پردازنده به میزان زیادی در مصرف انرژی و تولید حرارت بهبود حاصل می شود که از نمونه های کاربردی این تکنولوژی می توان به پردازنده های AMULET با طراحی ARM که در تبلت ها بکار می روند و پردازنده های MIPS که در کنسول های بازی سونی استفاده می شوند نام برد . در طرحی که به تازگی ارائه شده ما را قادر ساخته تا بخش هایی از پردازنده را بدون زمان ساخته تا در مصرف انرژی صرفه جویی کنیم و سایر بخش های آنرا با استفاده از نرخ زمان کنترل کنیم تا به بهترین کاربری ممکن دست پیدا کنیم .
توضیحاتی که تا کنون ارائه شد مربوط به ساده ترین نوع پردازنده ها بود که باعث می شد پردازنده در هر لحظه تنها بتواند یک دستورالعمل را در لحظه اجرا کند که از آنها بعنوان Subscalar یاد می شود . نقص این سیستم بدین دلیل است که تا یک دستور در خروجی دریافت نشود دستور دیگری نمی تواند شروع به کار نماید و به همین دلیل دستوری که اجرای آن چندین نرخ زمان بطول می انجامد پردازنده را اشغال می کند . حتی در صورتی که یک واحد پردازنده دیگر به سیستم اضافه نماییم نیز مشکل پابرجا می ماند , با این تفاوت که اکنون تعداد اجزای بیکار در پردازنده به دو برابر افزایش پیدا کرده است . در این حالت پردازنده در تئوری تنها می تواند یک دستور را در لحظه اجرا کند (Scalar) , چنانچه در عمل این مقدار به کمتر از یک دستور در لحظه کاهش می یابد که به همین دلیل آنها را Subscalar می نامند . برای رفع این مشکل طراحی های متفاوت کمک کرده اند تا پردازش از حالت خطی خارج شده و بصورت موازی صورت پذیرد که معمولا به دو روش انجام می شود که در زیر به توضیح آن می پردازیم :


موازی سازی اجرای دستورات
یکی از ساده ترین روش های رسیدن به تکنولوژی موازی سازی انجام دو مرحله واکشی و رمزگشایی دستور در حالی است که دستور دیگری در حال اجرا است که این شگرف نمونه ساده ای از رایانش دستورات یا Instruction Pipelining است . این روش با تقسیم کردن مراحل اجرای یک دستور به بخش های متفاوت به ما این امکان را می دهد که بمانند یک خط مونتاژ از پردازنده استفاده کنیم . حال مسئله دیگری مطرح می شود که اگر دستوری که در حال اجرای آن هستیم نیازمند نتیجه دستوری پیشتر از خود باشد چه می توان کرد ؟! برای مقابله با این حالات راه حلی که ارائه می شود به تأخیر انداختن اجرای دستور تا لحظه مورد نیاز می باشد که برای حصول این خواسته از مداراتی اضافه بر پردازنده های عادی استفاده می شود که تولید آنها را تا حدی پیچیده تر می کند . البته در صورت بطول انجامیدن اجرای دستوری به بیشتر از چند نرخ زمان عملکرد اینگونه پردازنده ها نیز محدود به یک دستور در لحظه خواهد شد که باز هم زمان معطلی واحد هایی از پردازنده را بالا خواهد برد . برای مقابله با این نقص طرح پردازنده های Superscalar ارائه شد که از یک مسیر رایانش طولانی و چندین واحد اجرای دستورات مشابه بهره می برند . در این روش چندین دستور بصورت همزمان خوانده شده و به یک واحد آماده سازی (Dispatcher) ارائه می شوند که با بررسی دستورات تصمیم می گیرد که آیا می توان این دستورات را همزمان اجرا کرد یا خیر و در صورت مثبت بودن پاسخ این دستورات همزمان به واحد های اجرا فرستاده می شوند که نرخ اجرای دستورات را در لحظه بالا خواهد برد . با این تفاسیر سخت ترین بخش طرح پردازنده های Superscalar تولید یک Dispatcher کارآمد است که بتواند به سرعت تصمیم گیری کرده و بگونه ای آنها را به واحدهای اجرا بدهد که بیشترین تعداد آنها در هر لحظه مشغول اجرای دستورات باشند . برای بهبود کارکرد Dispatcher ما نیاز داریم تا مقادیر زیادی از دستورات را هرچه سریعتر واکشی و رمزگشایی کنیم و بهمین دلیل مقادیر زیادی حافظه نهان نیاز داریم . همچنین با استفاده از روش های پیشگیری از خطا مانند پیشبینی مسیر دستورات شرطی و یا اجرای پیش از نیاز دستور و یا اجرای خارج از صف از حداکثر عملکرد پردازنده اطمینان حاصل می شود . با پیشبینی مسیر یک دستور شرطی می توانیم تعداد دفعاتی که یک پردازش باید متوقف شود تا دستور شرطی کاملا اجرا شود را کاهش داد . با اجرای پیش از نیاز دستورات بعد از یک دستور شرطی می توانیم سرعت اجرای دستورات را تا میزان زیادی افزایش داد و در نهایت با اجرای خارج از صف دستورات می توانیم ترتیب اجرای دستورات را تغییر دهیم تا باعث شویم تأخیرهای ناشی از انتظار برای داده های حاصل از اینگونه دستورات را به حداقل برسانیم . همچنین در مواردی که باید با استفاده از دستوری مشخص مقدار زیادی داده را پردازش کنیم می توانیم بخش هایی از مسیر پردازش را غیر فعال کنیم تا مراحل واکشی و رمزگشایی را انجام نداده و سرعت را افزایش دهیم که از این روش در پردازش تصاویر و ویدئو ها به وفور استفاده می شود .
در پردازنده هایی که بخشی از آن Superscalar می باشد و بخشی از آن چنین خاصیتی نداشته باشد بخش فاقد این توانایی بعلت وقفه های ناشی از ناکارآمدی پردازه ها دچار افت کارایی می شود . برای مثال در پردازنده های پنتیوم P5 که دارای دو ALU بودند که در هر نوسان یک دستور را قبول می کردند ولی واحد پردازش اعداد اعشاری (FPU) آنها نمی توانست یک دستور در نوسان را بپذیرد که باعث افت سرعت فراوانی می شد که این نقص را در سری پنتیوم P6 برطرف نمودند که باعث افزایش سرعت پردازنده می شد . در سالهای اخیر طراحی ها باعث شده اند تا پردازش موازی از سخت افزار پردازنده خارج شده و در واسط نرم افزاری آن و یا حتی ISA قرار گیرد که بواسطه سبک نمودن وظایف پردازنده میزان پیچیدگی طراحی آنان را به شدت کاهش داده است .
موازی سازی اجرای برنامه ها
در این روش از پردازش موازی برنامه ها و یا ریزبرنامه ها برای دستیابی به سرعت بیشتر استفاده می کنیم که از آن بعنوان پردازش موازی یاد می شود و که به این استراتژی MIMD می گویند . یکی از تکنولوژی هایی که برای این منظور بکار می رفت چندپردازشی بود که نمونه تکامل یافته ای از چندپردازشی متقارن بود که در آن تعداد معدودی پردازنده یک حافظه مشترک داشتند و هر پردازنده بخشی مجزا برای بررسی حافظه داشت و بدین ترتیب برنامه ها می توانستند از یک پردازنده به پردازنده دیگری منتقل شوند . در دهه نود با ارائه طرح هایی برای بهبود اشتراک گذاری حافظه های نهان در پردازنده ها این امکان فراهم شد تا از تعداد بیشماری پردازنده برای پردازش موازی استفاده کرد . در نمونه های اولیه پردازش متقارن این عملکرد بواسطه اتصال چندین پردازنده به یکدیگر حاصل می شد ولیکن در نمونه های کنونی که پردازنده ها بر روی یک چیپ سیلیکنی واحد قرار می گرفتند این تکنولوژی را فراگیرتر کرده که از آن بعنوان پردازنده های چند هسته ای یاد می شود . در نمونه های آینده این تکنولوژی طرح بر این نکته تکیه داشت که یک برنامه از چندین ریزبرنامه یا Thread تشکیل می شود و از اینرو با پردازش ریزبرنامه ها بصورت موازی می توانستیم نتیجه ای مشابه را شاهد باشیم که در طراحی پردازنده نیز از پردازنده های با تکنولوژی چندپردازشی بسیار به صرفه تر می بود . در این طرح واحدهای اجرا و حافظه های نهان در اختیار چندین ریزبرنامه قرار می گرفتند که باعث می شد با مدیریت صحیح آنها به پردازش موازی دست پیدا کنیم ولیکن این امکان تنها به واسطه توانایی های برنامه مدیریت منابع یا همان سیستم عامل بستگی داشت که بایستی با ایجاد تغییراتی بنیادین پشتیبانی از این تکنولوژی را اثر بخش تر می نمودند .

همانگونه که شاهد هستید در گذشته طرح ها بیشتر بر مبنای بالابردن موازی سازی در سطح دستورات می بودند که نیازمند طراحی پیشرفته و هزینه بالای تولید و مصرف انرژی بالا می بود ولی با توجه به اینکه فرکانس کاری پردازنده ها و حافظه ها یکسان نمی بود امکان پیشرفت میسر نبود . پس با توجه به محدودیت موجود طراحان تمرکز خود را بر روی بهبود عملکرد چند برنامه ای معطوف کردند که منجر به تولید پردازنده های چند هسته ای شد . در حالت کلی توانایی یک پردازنده بوسیله تعداد دستورانی که در لحظه می تواند اجرا کند سنجیده می شود که البته با توجه به توضیحات بالا متوجه می شویم که یک پردازنده هرچقدر که با سرعت فرکانس بالایی عمل نماید ، باز هم دستوراتی وجود دارند که در عملکرد پردازنده اختلال بوجود می آورند که از این نکته می توان به این صورت برداشت کرد که به هیچ عنوان نمی توان از قدرت واقعی یک پردازنده آگاه شد . اما توانایی پردازش برنامه ها در پردازنده ها با افزایش هسته های پردازنده افزایش می یابد که البته بهره وری این روش نیز به میزان زیادی به سیستم عامل و نحوه مدیریت پردازه ها توسط آن بستگی دارد .


در اين آزمايش واحد کنترل کامپيوتر پايه طراحي مي شود. مهمترين بخشهاي يک پردازنده در کامپيوتر پايه عبارتند از :

١- ثباتها
٢- گذرگاهها
٣- واحد محاسبه و منطق
٤- واحد کنترل
در اين آزمايش به طراحي واحد کنترل که شامل مدارهاي زمانبندي و کنترل پايههاي عناصر مختلف است مي پردازيد.

 
دستورالعملهاي ماشين به فرم زير هستند.



سه نوع دستورالعمل براي ماشين تعريف مي شود.





در هر چرخه دستورالعمل در کامپيوتر پايه فازها طبق فلوچارت زير دنبال ميشود:


 
اجراي دستورات حافظه اي از پالس ساعت چهارم به بعد طبق چارت زير ادامه مييابد.
 
اجراي دستورات ثباتي در پالس ساعت سوم اتفاق مي افتد و طبق جدول زير خواهد بود.
 


همچنين، دستورات I/O طبق جدول زير انجام خواهد شد.
 
جدوال زير کليه ريزعمليات مورد نياز براي پياده سازي اين کامپيوتر را در بر دارد.
 
 

منابع:
1- http://www.goorcan.com