یادگیری امروزم از معماری کامپیوتر موریس مانو (۲)

خب دیروز نشد که پست معماری کامپیوتر رو بنویسم. امروز سعی می‌کنم دوتا پست راجع به معماری کامپیوتر موریس مانو بنویسم.

این پست درباره‌ی تفاوت های ساده‌ی معماری سیسک و ریسک هست.

در حالت خیلی ساده به کامپیوتر هایی که تعداد زیادی دستورات پیچیده دارن میگن Complex Instruction Set Computer یا CISC.

ایده‌ی RISC از اینجا اومد که اوایل دهه هشتاد یه سری طراحای کامپیوتر اومدن گفتن بیاین کامپیوتری داشته باشیم که تعداد دستورات کمتر و با ساختار ساده تری داشته باشه. پس اسم این سری کامپیوتر هارو گذاشتن Reduced Instruction Set Computer یا RISC.

معماری CISC

یکی از اهداف این معماری، ساده کردن کامپایل از زبان های سطح بالا به زبان ماشینه. بنابراین این معماری تعداد دستورات زیادی داره.

درواقع سعی شده statement هایی که به زبان های سطح بالا نوشته میشن یه معادل مستقیم توی دستوراتِ این معماری داشته باشند.

یکی دیگه از ویژگی های این معماری، variable-length بودن قالب دستوراتشه. یعنی دستورات طول یکسانی ندارند(طول دستورات یعنی معادل باینری یک instruction)؛ یک دستور ممکنه ۵ بایت جا بگیره و یک دستور دیگه ممکنه ۲ بایت جا بگیره. بنابراین به عنوان مثال در یک سیستم با کلمه های ۳۲ بیتی (32bit words) یک دستور ممکنه نصف یک کلمه جا بگیره و دستور دیگه ممکنه یک کلمه به علاوه‌ی یک بایت از کلمه‌ی بعدی رو اشغال کنه. در این معماری یک بار باید عمل decode برای مشخص کردن طول دستور انجام بشه و یکبار هم برای پردازشِ خودِ دستور(مثل مشخص کردن opcode و …).

خلاصه ویژگی های این معماری به این صورته:

  • تعداد دستورات زیاد
  • مد های آدرس دهی بسیار وسیع
  • variable-length بودن دستور ها
  • امکان manipulate کردن مستقیم در مموری فراهمه

معماری RISC

این معماری بیشتر روی ساده تر بودن دستورات تاکید داره

ویژگی های این معماری به این صورته:

  • تعداد دستورات نسبتا کمی داره
  • تعداد مد های آدرس‌دهی نسبتا کمی داره
  • دستورات توی یک سیکل اجرا میشن
  • طول دستورات یکسانه
  • تعداد رجیسترهای بیشتری داره
  • مثل اینکه پایپلاین ها موثر تر هستن(چراش رو نمیدونم)

ثابت بودن طول دستور ها این امکان رو فراهم میکنه که کدگشایی دستورات خیلی راحت تر و سریعتر صورت بگیره و از اونجایی که دسترسی به حافظه محدوده، پردازش ها در رجیستر ها انجام میشن(که خیلی سریعتر از حافظه‌ست) و صرفا از حافظه برای دریافت operand ها و یا قرار دادن نتایج استفاده میشه.

در آخر

حجم کدها توی ریسک بیشتر از سیسکه، کمتر از حافظه و بیشتر از رجیستر ها استفاده میشه و مصرف حافظه کمتر و سرعت بالاتری داره.

چرا امروز نتونستم به کارهام برسم

چرا امروز(و روز های مشابه) نتونستم به کارهام برسم؟ چیزی که فکر میکنم vs چیزی که احساس می‌کنم.

احساس

امروز که بیدار شدم احساس کردم حس هیچکاری رو ندارم. نمیدونم، فقط احساس میکنم دلم میخواد استراحت کنم. چون خسته شدم از بس همش کار کردم و یا استرس داشتم که باید برای ادامه‌ی زندگیم چیکار کنم. و بخاطر این خستگی و احساس کردن هام، احساس سرخوردگی و شکست میکنم. حس میکنم یه لوزر به تمام معنام. کارایی که براشون برنامه ریزی کردم رو نتونستم درست انجام بدم. الان ساعت نزدیک ۷ غروبه و من حتی ۱ ساعت هم طبق برنامه پیش نرفتم. امروز مثلا باید پست دوم راجع به چیزایی که از معماری کامپیوتر یاد گرفتم رو مینوشتم. خلاصه‌ی فصل نمیدونم چندم از سی++ رو می‌نوشتم. اما جاش چیکار کردم؟ هیچی. توی خیالات گنگ خودم گشتم و راجع به گذشته ها فکر کردم. روی تخت دراز کشیدم و وقتمو تلف کردم. انگار یک نیروی سیاهی من رو از انجام کارهام بازمیداشت. و حالا که احساس سرخوردگی میکنم این نیرو بهم میگه که باید غصه بخورم و ناراحت باشم. برم توی تختم و بذارم افکارم بدنمو تحت کنترل دربیارن، بگیرن زیر مشت و لگد. عجیبه که ذهن کسی، بدنش رو سیاه و کبود کنه. ولی من اینطوری ام. سیاه و کبود نمیشم اما حس کوفتگی بدن بعد از کتک خوردن رو میشناسم. ازبس که ننوشتم قوه‌ی نوشتنم ضعیف شده. میدونم که قبلا خیلی بهتر میشنتم و الان دیگه هیچوقت نمیتونم مثل اونموقع باشم. چشمامو میبندمو و اجازه میدم که کلمه ها خودشون به دستم برسن اما بخاطر اینکه سرعت تایپ کردنم از سرعت فکر کردنم کمتره باعث میشه که از فکرم عقب بیوفتم و در این بین یک سری کلمات ازبین میرن و دیگه نمیشه فهمید که دقیقا به چی فکر میکردم. احساس میکنم که تلاش هایی که تا الان کردم بیهوده بوده. چون واقعا نتیجه ای دربر نداشته. اما شاید هم نه. نتیحه ها زود بدست نمیان. پس غصه میخورم که چرا انقدر دیر شروع کردم تا نتیجه ها بخوان دیر بدست بیان.گاهی وقتا از فرط احساس کمبود وقت و سرخوردگی و ناتوانی از انجام کارهام دلم میخواد دنیارو توی دستم بگیرم و به در و دیوار بکوبونم.آه. به همین دلایل هیچوقت درباره وضعیتم غر نزدم که چرا مقلان فلان نمره‌م کم شد و یا فلان کار رو دست انجام ندادم. چون دلیلش رو میدوم. تنبلی خودم. تلاش نکردن خودم، کافی نبودنم و اینکه همه چیزایی که سرم میاد نتیجه ی کار خودمه.

این حسیه که همیشه گریبان منو میگیره. بالاخره یک روز هم آدم خسته میشه. امروز من خسته‌م. اونقدری که فقط دلم میخواد استعمال دخانیات بکنم. کاریه که ضعیفا برای نجات میکن. فرار.

مسئله اینه که من اونقدر خفن، باهوش و یا نابفه نبودم که بشه گفت از فرط هوش و ذکاوت زیاد به این روز افتاده. که بشه گفت آره یه چیز عادیه، معمولا آدمایی که خیلی باهوشن به این احساسات دچار میشن و امثالهم. نه، من هیچکاری انجام ندادم. ۲۰ سالم شد و هیچ غلطی نکردم. کارهایی هم که قبلا انجام میدادم رو ول کردم و کارهایی که الان دارم انجام میدم در پایین ترین کیفیت خودش قرار داره.

چقدر چسناله. حالم بهم خورد.

فکر

فکرم چی میگه؟ بهم میگه که اینا فقط بخاطر تنبلیه و تنبلی هم از سر بی برنامگی رخ میده.من واقعا کاری نکردم، پس چرا میگم «ازبس که کار کردم»؟! مغز مزخرف آدم دوست داره که استراحت کنه. اگر برنامه نداشته باشی سخت میشه که متقاعدش کنی تا کاری رو انجام بده. من صبحا دیر بلند میشم چون شبا دیر میخوابم. اولین مشکلم همینه. آدم که دیر(و از همه مهم تر، نامنظم) بیدار بشه، زندگیش بهم میریزه. با اینکه ساعت ۷ غروب شده اما بازهم میتونم بخشی از کارهای عقب افتاده‌م رو جبران کنم. بجای غصه خوردن سعی میکنم با این نیروی تاریک(که خودمم) بجنگم. برنامه داشته باشم، به چیزای خوب فکر کنم و یادم باشه که چیزهای خوب زمان می‌برن. منم از اون استثنا ها نیستم که میانبر بزنم. الان شروع میکنم که معماری کامپیوتر رو بخونم.

در پایان

چیزی که اذیتم میکنه این «همیشه در حال جنگ بودن» عه. اینکه همیشه باید با خودم درحال مشاجره باشم. بین افسردگی و خوشحالی. بین استراحت و کار. بین منزوی بودن و ارتباط اجتماعی. بین زنده بودن و نبودن. و از خودم میپرسم آیا کسی هست که با این شدت درحال جنگ باشه؟

یادگیری امروزم از کتاب معماری کامپیوتر موریس مانو(۱)

امروز درباره‌ی اینتراپت(وقفه) ها در معماری کامپیوتر خوندم. امیدوارم مطالبی که فهمیدم درست باشن 🙂

متاسفانه توی مطالعه معماری خیلی کًند پیش میرم 🙁

اینتراپت با ساب‌روتین ها سه تا تفاوت مهم داره:

  • اینتراپت معمولا بجای اینکه از طریق اجرای یک instruction اجرا بشه، با انتشار یک سیگنال درونی/بیرونی اجرا میشه
  • آدرس سرویسِ اینتراپت برخلاف instruction ها معمولا توسط سخت افزار مشخص میشه نه توسط address field
  • در فرآیند اینتراپت برای مشخص کردن CPU state مقدار بیشتری اطلاعات(مثل رجیستر ها، شمارنده‌ی برنامه، و یه سری status condition ها) ذخیره میشه درحالی که در ساب‌روتین ها شمارنده‌ی برنامه ذخیره میشه.

کِی اینتراپت اتفاق میوفته؟

اینتراپت فقط اتفاق میوفته که دستور قبلی به صورت کامل انجام شده باشه و اگر CPU در حین انجام یک دستور باشه، به اینتراپت جواب نمیده. وقتی یک دستور تموم میشه، سی پی یو چک میکنه که آیا اینتراپتی در حالت pending هست یا نه. اگر بود، CPU وارد hardware interrupt cycle میشه. توی این سیکل محتویات PC و PSW(Program Status Word) توی استک قرار میگیره و آدرس برنچ سرویسی که قراره اجرا بشه بجای PC قرار میگیره. همچنین PSW جدید هم توی جای خودش قرار میگیره و اجرای دستورات آغاز میشه.

آخرین دستور اینتراپت، interrupt return cycle هست که طی اون سی پی یو به حالت قبل از وقوع وقفه برمیگرده و روتین خودش رو ادامه میده.

چند نوع اینتراپت داریم؟

سه نوع وقفه داریم که به صورت زیر هستن:

  • External Interrupt
  • Internal Interrupt
  • Software Interrupt

اینتراپت های اکسترنال و اینترنال تحت تاثیر انتشار سیگنال های سخت افزاری اتفاق میوفتن اما اینتراپت های نرم افزاری از طریق اجرای دستورات در برنامه اتفاق می‌افتن.

اینتراپت های نرم افزاری یک سری فراخوانی دستورات هستند که بیشتر بجای اینکه شبیه ساب‌روتین باشن، شبیه اینتراپت هستن. درواقع برنامه نویس با این وقفه ها میتونه CPU رو به حالت supervisor ببره و از دستورات اون بخش استفاده کنه. به عنوان مثال، استفاده از دستورات I/O نیازمند مد supervisor هست. برنامه در حالت یوزر مود هست و هنگامی که بخواد از انتقال I/O استفاده کنه از طریق supervisor call instruction موجب میشه که سی پی یو به حالت سوپروایزر بره.

بخش بعدی

بخش بعدی ای که قراره بخونم(فردا) درباره‌ی معماری RISC هست.

از فصل نهم کتاب برنامه نویسی سی++ دایتل چی یادگرفتم

فصل نهم از کتاب C++ How To Program (نگارش ۲۰۱۷) رو تموم کردم و توی این پست نکاتی که از این فصل یادگرفتم(و یادم مونده=) ) رو می‌نویسم.

تابع نابودگر (Destructor)

علاوه بر ترتیب اجرا شدنش برای اشیاء مختلف که به صورت «از بیرون به داخل» عه، وظیفه‌ی دیستراکتور درواقع Termination housekeeping عه. مثالش میشه کلاس file از STL که قبل از نابود شدن، فایل هایی که باز موندن توسط این تابع بسته میشن.

ممبر فانکشن های const

علاوه بر رعایت Least privilege principle در هنگام نوشتن توابع که موجب میشه تابع هایی که دیتا ممبر های کلاس رو تغییر نمیدن رو به صورت const تعریف کنیم، اگر شئ ای رو به صورت const توی کدِ کلاینت‌مون تعریف کنیم اونوقت تنها از متود هایی میتونیم استفاده کنیم که قبلا const تعریف شدن.

یک شئ به عنوان عضوی از کلاس (Composition)

نکته‌ی اول اینکه دیتا ممبر های یک کلاس به ترتیب تعریف شدنشون ساخته(کانستراکت) میشن نه به ترتیب نوشتنشون توی member-initializer list (ولی بهتره برای خوانایی کد به همون ترتیبی که تعریف شدن توی لیست شروع کننده هم نوشته بشن). همچنین، دیتا ممبر ها قبل از کانستراکت شدنِ شئ ای که داخلش قرار دارن ساخته میشن.

دیتا ممبر ها قبل از کانستراکت شدنِ شئ ای که داخلش قرار دارن ساخته میشن.

برای همینه که مهمه وقتی از Composition استفاده می‌کنیم حتما از member-initializer list استفاده کنیم. اگر اینکار رو انجام ندیم و داخل بدنه‌ی کانستراکتور اشیاء رو بسازیم، درواقع داریم اون ها رو دوباره مقدار دهی میکنیم.

چون یکبار دیفالت کانستراکتور خودشون موقع ساخته شدن شئ اصلی(= Enclosing Object) صدا زده میشه و بعد یکبار هم ما مقدار دهیشون میکنیم.

با استفاده از member-initializer list میتونیم از این دوباره کاری جلوگیری کنیم.

اشاره گر this

یه نکته ای که راجع به این اشاره گر فهمیدم این بود که اگر بر فرض اسم کلاس ما Test باشه، اشاره گر this از نوع const Test* عه

فصل بعدیِ کتاب

فصل بعدی درباره‌ی Operator Overloading عه.

نوشته‌ی اول

نمیدونم چرا همچین چیزی درست کردم. ولی جالبه. پست اول معمولا قراره اینطوری باشه که «خوشحالم که اولین پستم رو گذاشتم و میتونم تجربه‌هام رو با بقیه به اشتراک بذارم».

حقیقت اینه که اونقدرا مهم نیستیم که اصلا نیاز باشه تجربه هامون رو به اشتراک بذاریم. حداقل من اونقدری تجارب درخشان نداشتم که بخوام به اشتراک بذارم. همه‌ش مسخره بازی و وقت تلف کردن بوده.

اما ایندفعه اون چیزی که درسته رو می‌نویسم: تجربه‌هامون برای هیچکس اهمیت نداره. من فقط اینجا می‌نویسم چون خوندم که نوشتن مطالبی که خونده شدن باعث میشه یادگیری چندبرابر بشه. فقط برای اینکه یکاری کرده باشم و هی به خودم نگم چرا هیچکار نمی‌کنی. برای اینکه مشغول یکاری باشم تا از تنها شدن، از تامل و تفکر درباره‌ی خودم جلوگیری کنم.