محمد لینوکس

همه چیز به غیر از لینوکس!

محمد لینوکس

همه چیز به غیر از لینوکس!

قسمت یعدی

با سلامی دوباره

آنچه گذشت،

روز اول در مورد خود لینوکس صحبت کردیم که ببینیم آیا اصلا به ما می خوره یا نه. یعنی آیا نیازهای مارو برطرف می کنه و آیا استفاده از اون در سازمان

یا شرکت ما باعث بهبود در راندمان کاری یا بازدهی بیشتر میشه یا نه.

در قسمت دوم کمی در مورد کارهای ساده سیستم عامل صحبت کردیم که افرادی که می خوان با این سیستم عامل آشنا بشن حد اقل هارو بدونن و

در اصل اونارو هل دادیم تو محیط لینوکس. دستورات ساده، محیط گرافیکی و اطلاعات کلی.

قسمت سوم، افراد رو جدا کردم به 2 گروهی که می خوان همون در محیط لینوکس سرو کله بزنن و اصطلاحا با آزمون و خطا و تست برنامه ها خیلی

چیزهارو یاد بگیرن و افرادی که براشون جالب بود بشینن ببینن لینوکس چیه و آموزشی در این مورد ببینن. در قسمت قبلی از مجموعه آبکی با Kernel

آشنا شدیم. با Kernel لینوکس نه با Kernel. در چند بخش با Kernel لینوکس آشنا میشیم و بعد شرو می کنیم با خارج شده از محیط Kernel وارد محیط

کاربری بشیم و برنامه سازی لینوکس رو تجربه کنیم.

تا آخرین قسمت از این مجموعه آبکی قرار نیست کار با ماشین حساب لینوکس گفته شه، در اصل اینجا می خواهیم خود لینوکس رو یاد بگیریم و نه

اپراتوری با اون رو (مثل ICDL).

-------------------------------------------------------------------------------
قسمت چهارم از سریال آبکی لینوکس بیاموز،
مدیریت حافظه، مدیریت پردازه

همانطور که گفته شد یکی از مهمترین مسئولیت های سیستم عامل مدیریت یکی از منابع Critical سیستم به نام Physical Memory که ما اون رو به

عنوان RAM می شناسیم.
اگر بخواهیم برگردیم به خیلی قبل، زمانی که مدیران IBM سرو کله می زدن که از Motorolla M6000 استفاده کنیم یا از Intel 8086، گزینه مورد انتخاب

اونها CPU ساخت شرکت Intel بود. از دید CPU حافظه به صورت Flat دیده میشه. یعنی اگر شما RAM سیستمتون 1GB پس از دید CPU از شماره 0 تا

1GB-1 آدرس دهی میشه.
یکی از مشکلاتی که این Arch داره اینه که، زمانی که سیستم عامل می خواد برنامه های مختلف رو در حافظه Load کنه دچار یه مشکل بزرگ میشه

و اونم اینه که یکبار برنامه ممکنه در آدرس 1000 قرار بگیره و بار دیگه در آدرس 2000. زمانی که شما برنامه می نویسید، متغیرهاتون رو به صورت

Relative آدرس دهی می کنید. یعنی من میگم یه متغیر دارم به نام A در آدرس 100 و یه متغیر دارم به نام B در آدرس 200. زمانی که برنامه من در

حافظه آدرس 1000 قرار میگیره، آدرس متغیر A من تبدیل به 1100 و متغیر B به 1200 تغییر پیدا می کنه.

نظر Motorolla این بود که زبان های برنامه سازی، در جدولی به نام Variable Table متغیر های خود رو قرار بدن و سیستم عامل زمان Load برنامه، آدرس

شروع برنامه رو به کل اعضای این Table اضافه کنه. اینجا بود صاحب بچه پدر نویسنده زبان برنامه نویسی در مورد اشاره گر ها و متغیر های Runtime در

می اومد.

یکی از دلایلی که ما الان میریم بازار رضا و ایران و پایتخت CPU شرکت Intel رو می خریم (AMD اون موقع تو دعوا نبود) اینه که در همون زمان Intel اومد

گفت، هزینه این محاسبه با من. اومد با ساختن یک Arch جدید به نام Segmentation مشکل رو حل کرد. گفت من حافظه رو به صورت Flat نمی بینم

بلکه اون رو به بخش های مجزایی تقسیم می کنم به نام Segment. آدرس دهی تبدیل شد به دو بخش، یک بخش Segment که مثل کشور می مونه و

یه بخش Offset که مثل شهر می مونه. Offset فاصله مورد نظر از اول اون بخش بود. یعنی فرض کنید من 100 بایت حافظه دارم و این رو به بخش های

10 بایتی تقسیم کنیم. آدرس 46 دیگه وجود نداره، آدرس درست میشه Segment شماره 4 و Offset یا فاصله شماره 6.

این اتفاق باعث شد که برنامه در Segment های مجزا Load شن و سیستم عامل نیازی نبود که آدرس متغیر ها رو عوض کنه، زیرا زمانی که برنامه از

CPU درخواست نوشتن در متغیر A یا آدرس 100 رو میکرد، CPU در فاصله یا Offset شماره 100 ازدن عامل از Load کردن پروسس ها در هر بخشی از

حافظه راحت بود.

CPU این اجازه رو به برنامه ها میدید که به آدرس های خارج از Segment خودشون هم دسترسی داشته باشند یعنی من به عنوان یه برنامه C تحت

DOS می تونستم، بخشی از حافظه که در Segment من نبود رو عوض کنم. به این نوع آدرس دهی اصطلاحا Far Addressing گفته میشد و در اون زمان

نیاز بود.

دلیل اجازه دادن Far Addressing در CPU های Intel خانواده های قدیمی نبودن بخش مرکزی به نام Kernel بود. بعنی در اون زمان از نظر سازنده های PC

برنامه هایی که روی کامپیوتر ها اجرا می شد همگی مهم و حیاتی بودن و یک هدف رو دنبال می کردند.

خانواده 8086 پیشرفت کرد و رسید به 80186( اینجا کامپیوتر اومد ایران، منم نداشتم ) و بعد 80286.

قبل از اینکه Intel پردازنده جدید خودشو به نام 80286 بده بیرون فشار هایی بهش اومد، چه فشاری. خیلی محافل خصوصی، عمومی و دانشگاهی دم

از Multiprogramming می زدند. یعنی اجرای چند برنامه به صورت همزمان.

Intel زیر این فشار ها Arch جدیدی رو همراه 286 بیرون داد به نام Protected Mode که در مقابل سیستم های قدیمی به نام Real Mode عمل می کرد.

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

اون زمان می تونستن از Protected Mode استفاده کنن. هنوز هم در سیستم های Pentium IV سیستم به صورت Real بوت میشه و در لینوکس

Start.o و در Windows فایل ntoskrnl.exe سیستم رو به مد Protected می برن.

در مد Protected از سیستم Segmentation استفاده میشه. با چند تفاوت بسیار مهم:
1- سایز Segmentها بسته به دلخواه سیستم عامل تنظیم می شه و سایز ثابتی ندارند.
2- در Real Mode حداکثر میزان آدرس دهی 16 بیت بود که میشد 65536 بایت یعنی 65K که Intel با اضافه کردن سیستم A20 به CPU های خانواده

186 به بالا، قابلیت استفاده از 20 بیت آدرس یا 1MB آدرس رو به سیستم عامل میداد. پس یکی از مشکلات Real Mode پشتیبانی حداکثر از 1MB

حافظست، در حالی که در Protected Mode آدرس دهی به صورت 32 بیت انجام میشه یعنی 4GB حافظه.
3- در Real Mode سطح دسترسی وجود نداشت که باعث میشد برنامه های مختلف بر روی هم نفوذ داشته باشند در حالی که در Protected Mode با

اجرای سطح دسترسی شما می تونید از Far Addressing برای Segment های خاصی جلوگیری کنید و این امر باعث این شده که زمانی که شما در

سیستم عامل Windows به آدرس غیر مجازی دسترسی داشته باشید، سیستم عامل به شما خطای Segmentation Fault بده و برنامه شما رو ببنده.

حالا اینکه چطور این عمل انجام میشه، در قسمت های بعدی آبکی در بخش Interrupt and Exceptions بهش میرسیم.
4- در مد Protected امکان ساختن یک محیط امن و غیر قابل دسترسی از بیرون وجود داشت، یعنی سیستم های عامل یک محیط امن با حداکثر سطح

دسترسی به همه Segmentها ایجاد می کردند و کدهایی که در این بخش نوشته میشه به Kernel یا هسته معروفن. کدهایی که امکان دسترسی به

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

کاربران حق نداشته باشن که برای مثال به بخشی از حافظه مدیر سیستم دسترسی داشته باشند و اون رو خراب کنند. برای مثال دوستانی که با

برناهم نویسی آشنا هستند اگر از دید پروسس های سیستم حافظه Flat بود، امکان داشتن چند User بی معنی بود زیرا همشون به آدرس های هم

دسترسی داشتند و برای مثال فایلهای هم و Mail های یکدیگرو می خوندن.

مدتی گذشت و Intel شاداب از این قضیه که Segmentation داره، عمر خودشو سپری کرد. یه چیز رو فراموش نکنید، اینکه شما روی سیستم ویندوزتون

و لینوکستون چند کاربر بالا هستند و همشون چند برنامه رو دارند اجرا می کنن و به هم دسترسی ندارند 90% مدیون سیستم های حفاظتی سخت

افزاریه.

مدتی گذشت و سیستم جدید ارائه شد در زمینه بخش بندی حافظه به نام Paging. سیستم Segmentation از چرخه خارج شد به 2 دلیل:
1- قدرت Paging در ضمینه جدا سازی بخش های حافظه، امکان داشتن Virtual Addressing و امکان قرار نداشتن بخشی از اطلاعات بر روی Ram( ولی

دیده شدن به صورت آدرس های حافظه) و خیلی مسائل دیگر، وجود Segmentation رو زیر سوال می برد.
2- از نظر سیستم Linux که یک سیستم عامل Multiplatform استفاده از Segmentation که در خیلی از CPUها موجود نبود امری بی اساس بود.

الان در Windows و لینوکس از Paging استفاده میشه و استفاده از Segmentation در حد بسیار ناچیز و ابتدایی صورت می گیره و اصول کار بر روی اون

نیست.

Paging این قدرت رو به شما میده که برنامه خودتون رو به بخش های یکسان به نام Page تقسیم کنید و اون رو در حافظه Load کنید. در سیستم Paging

مسئله ای هست به نام Virtual Addressing. یعنی از دید هر Process حافظه از 0 شروع میشه تا برسه به 4GB. درحالی که آدرس 0 از دید پروسه،

ممکنه در هر بخشی از حافظه باشه. پس Virtual Addressing در سیستم Paging اون مشکل مربوط به بارگذاری برنامه در هرجایی از حافظه رو حل می

کنه. مورد بعدی اینکه در Segmentation بخش های مختلف حافظه در Physical Memory هم پشت سر هم قرار دارند که این باعث میشد که زمانی که

شما مقدار حافظه خالی معدل 1MB داشتید ولی به صورت Fragmented یعنی بخش بخش شده به صورت 2 تا 512KB برنامه شما که حجمش 1MB

بود در حافظه Load نشه. البته در این سیستم ها، سیستم عامل عملی رو انجام میده به نام Compaction یا جمع و جور کردن، یعنی Segmentهای

کوچک رو جمع می کرد بغل هم که فاصله خالی به انتها انتقال پیدا کنه، ولی با همه سرعت RAM این عمل خیلی وقتگیر بود.

در سیستم Paging شما نیازی نیست که آدرسی که از دید برنامه 0 تا 1MB دیده میشه رو در حافظه اصلی هم به همین صورت قرار دهید، بلکه

Pageهای مختلف می تونند در هر بخشی از حافظه اصلی و یا روی Disk قرار بگیرند.

پیدا کردن و رهگیری Pageها توسط CPU صورت می گیره ( یعنی همون 90%) کار. پس سیستم عامل چیکارس؟
سیستم عامل در جداولی به نام Page Directory و Page Table میاد این آدرس ها رو قرار می ده و CPU رو کمک می کنه در زمینه این که برای پیدا

کردن یک آدرس مجازی به چه بخشی از حافظه اصلی برو.

Paging یه خوبیه دیگم داره. چند آدرس مجازی می تونن به یه آدرس واقعی اشاره کنن. این مزیت باعث میشه که زمانی که من برای اولین بار برنامه

Office رو Load می کنم در حافظه و دارم نامه ای رو می خونم و در کنارش برنامه Office دیگه ای رو باز می کنم و اون نامه رو خلاصه می کنم، فقط یک

نسخه از برنامه Office در حافظه باشه. همانطور که گفته شد در جلسه قبلی حافظه به طور عمده دو نوع Data و Code داره. Code بخشهایی از

حافظه هستند که تغییر نمی کنن و فقط اجرا می شن پس چه نیازی هست به اینکه چند نسخه از برنامه office در حافظه باشه ؟

در ضمن لینوکس تلنولوژی دیگه ای داره به نام COW یا Copy On Write. یعنی زمانی که من برنامه Office رو دوباره اجرا می کنم، سیستم حتی بخش

داده رو هم بین من و Office قبلی Share می کنه. اههههههههههههههههههههه.
اینجوری که شیر تو شیر میشه، من تو این Office می نویسم، اون تو اونیکی ، بعد قاطی میشه، پاطی میشه و الی آخر.

لینوکس جواب می دهد خیر.

زمانی که شما Office رو برای بار دوم اجرا کردید به جای Copy گرفتن از 30-40 مگابایت آدرس داده ای که Word داره ازش استفاده می کنه، میاد همرو

به اشتراک می ذاره. فقط برای برنامه دوم این بخش از حافظه رو در همون جداول Page که گفتیم به صورت Read Only قرار میده. زمانی که من در

Office دوم شروع به نوشتن می کنم، CPU با یه Interrupt به سیستم عامل میگه، این برنامه رو ببند، این یه برنامه بی ادب فلان که می خواد بیاد بره

رو یه بخش از یه برنامه دیگه بنویسه. سیستم عامل لینوکس چک می کنه مینینه نه، خودش از قصد Read Only کرده بود. اینجا سریعا میاد فقط از اون

Page که Office دوم می خواد روش بنویسه یه کپی می گیره و داده های جدید رو تو اون بخش می نویسه و آدرس این Page جدید رو و فقط همین

Page رو در جدول مربوط به برنامه Office دوم وارد می کنه.

نتیجه اخلاقیش اینه که فقط بخش هایی از حافظه در Office دوم ایجاد می شن که دست خورده باشن.

به همین خاطر به این تکنیک گفته میشه کپی کردن در زمان نوشتن یا همان گاو (COW).

پس بدونید اگر مدیریت حافظه در سیستم های عامل به صورت سطحی دیده می شد شما با یک RAM 1GB محال بود بتونید برید Counter Strike بازی

کنید چه برسه به اینکه از پشت برید با چاقو بکنید شیکمش بپاشه به دیوار.

یه مدت گذشت دوباره به Intel فشار وارد کردن، و گفتن که بابا 32 بیت آدرس یا همون 4GB برای سرور های ما کمه. از CPU مدل 64 بیتم نمی خواهیم

استفاده کنیم. زیر این فشارها Intel تکنولوژی رو به خودش اضافه کرد به نام گسترش آدرس دهی فیزیکی . اومد پایه های حافظه رو از 32 کرد 36. یعنی

16 برابر، در ضمن Code Name مربوط به CPU هاشو عوض کرد به Intel Pentium Pro. این تکنولوژی ملغب به PAE است که مخفف Physical Address

Extension و یا Physical Address Expansion. حالا CPUهای Intel می تونستند به جای 4GB آدرس 64GB حافظه اصلی رو آدرس دهی کنن که خیلی

هم کافیه برای همه سرور ها.

مشکلی که بود، این بود که آدرس دهی هنوز در درون سیستم به صورت Virtual تنها 32 بیت بود، یعنی برنامه ها فقط می تونستند از 4GB از حافظه به

صورت شخصی استفاده کنند. این شخصی رو دقت کنیدا. ما می تونستیم از کل حافظه 64GB استفاده کنیم ولی هر برنامه، یعنی یه برنامه به صورت

تنها فقط می تونست 4GB استفاده کنه. Windows اومد گفت AWE استفاده می کنم (مایع دستشویی نه ها) لینوکس هم اومد با mmap سرو تهشو

هم اورد ( و هم میارن، چون الان هم همینه) یعنی مشکل به صورت نرم افراری حل شد، تا جایی که 64 بیتی ها اومدند و دیگه حافظه کیه. البته بگما

در سیستم های 64 بیت فقط از 48 بیت برای آدرس دهی استفاده می شه که میشه یه چیزی در حدود 280TB که اگه شما برای شن های کویر لوت

هم شناسنامه درست کنی که چند سالشونه و چند تا شتر لهشون کردن با چه خشونتی کم نمیاد.

خوب از مدیریت حافظه یه کم خارج می شیم چون اگر تخصصی بخواهیم در مورد Memory Management صحبت کنیم، 270 صفحه باید مورد Intel و

270 صفحه هم باید در مورد AMD صحبت کنیم که اینا چه می کنن با حافظه.

نتیجه گیری: لینوکس هیچکارس، همه چیز با سخت افزار
لینوکس به سخت افزار کمک می کنه که از حافظه بهینه استفاده کنه.
در CPU های جدید ما دیگه RAM رو نمی بینیم.
در CPU های جدید سیستم عامل نیست که جلوی مارو می گیره و نمی ذاره به بخش های دیگه حافظه دست بزنیم بلکه سخت افزار Processor این

کار رو می کنه.
در CPU های L2 Cache عمل Cache کردن Page ها در خود CPU انجام میشه و لینوکس هیچکارس و فقط Policy تعریف می کنه و می تونه برای خودش

Cache داشته باشه که مسخرس، RAM رو RAM کش کنه که پس Caching کامل به عهده CPU.

------------------------------------------------------------------------------------------------------------------------------------
بخش دوم در مورد مدیریت پردازه هاست:

زمانی که Protected Mode اومد 2 تا ارمغان برای ما داشت. یکی همین بخش بخش کردن حافظه و عدم دسترسی به بخش های دیگه بود. دیگریش

امکان داشتن کاربران زیاد و برنامه های همزمان بود.

اولا بریم سراغ اینکه چطور Winamp و Word باهم کار می کنن.

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

DISK می نوشت.

به Ram می گفت فلان بایت رو بده کلی طول می کشید.

به دیسک می گفت فلان بایت رو بگیر، کلی طول می کشید.

به فلان پورت میگفت چندی کلی طول می کشید.

سیستم عامل نویسان دیدن اینجوری نمیشه، مثلا برنامه ای مثل Winamp فقط 2% از CPU رو نیاز داره، ولی همیشه فعال. یعنی همش داره از روی

Disk می خونه و میده به کارت صدا.

پس اگه مدیریت Process نداشته باشیم، Word و Winamp که سهله، زمان پخش آهنگ Mouse رو نمی تونید تکون بدید.

فرض کنید Winampبه CPUبگه فلان اطلاعات رو به من از دیسک بده، CPU این دستور رو به کنترلر هارد میده و اون تنبل هم شروع می کنه به چرخیدن،

زمانی زیاد طول می کشه که اطلاعات رو به CPU برگردونه. زمانی که این اطلاعات میرسه به CPU، دوباره Winamp میگه خیلی خوب همرو کپی کن رو

آدرس کارت صدا. دوباره CPU آروم آروم باید این اطلاعات رو بده کارت صدا.

اولا از کارت صدا ممنونیم که یه بخش Buffer داره و می گه تو بده من تند تند من کم کم پخش می کنم ولی دیسک چی ؟

نتیجه این شد که اومدن گفتن، زمانی که هارد داره کار می کنه، CPU وای نسه، بره سراغ کارای بعدیش. پس از کجا CPU بفهمه که کار هارد تموم شد؟

ما دو روش اطلاع گیری در CPU داریم. یه روش معروف به Polling. یعنی CPU میگه اومد ؟ اومد ؟ اومد ؟ اومد ؟ آهان بده - مرسی - گرفتی ؟ گرفتی ؟

گرفتی ؟ گرفتی ؟

این روش در Port ها استفاده می شه. روش دیگه ای هست به نام Interrupt، یعنی جا اینکه CPU خودشو ناراحت کنه، هارد زمانی که کارش تموم شد

به CPU میگه خوندم یا نوشتم، حالا ازم بگیر. باز هم از DMA تشکر می کنیم که کارای حافظه ای رو هم از CPU گرفته و CPU فقط صرف پردازش می

شه.

در روش دوم، زمانی که Winamp به CPU میگه آهنگ رو یه تیکه بده من از دیسک، CPU به دیسک میگه آهنگ  رو بده. دیسک آهنگ رو به CPU نمیده،

این وسط DMA میاد کمک CPU و آهنگ رو از دیسک میگیره، میریزه رو RAM و بعدش به CPU میگه تموم شد. CPU در این مدت داشته Cursor برنامه

Word رو چشمک میزده و Mouse شما رو که تکون می دادید نقاشی می کرده. تو این زمان سریعا CPU میپره به کار قبلیش اطلاعات رو از RAM ور می

داره یه کله میده حافظه کارت صدا و میاد دوباره برای شما چشمک میزنه.

زمانی که یه برنامه به CPU میگه یه کار Interrupti برای من بکن، در اصل این درخواست رو از طریق سیستم عامل میگه. سیستم عامل درخواست رو

به CPU میده ( و قبلش چک می کنه اصلا این Winamp حق داره فلان آهنگ رو که مال خودش نیست پخش کنه) و Winamp رو از لیست برنامه ها

میندازه بیرون.

هر Interrupt ( که بعدا می گیم چیه) برای خودش یه لیست داره، سیستم عامل Winamp رو قرار می ده تو این لیست و دیگه اجراش نمی کنه، چون

Winamp از دیسک یه چیزی خواسته که طول می کشه. زمانی که اطلاعات از دیسک رفت تو DMA، و DMA ریخت تو RAM و بعد به CPU گفت، CPU

هم میاد به سیستم عامل میگه. اینجاست که سیستم عامل میاد همه برنامه های موجود در لیست اون Interrupt رو دوباره میاره تو لیست اجرایی.

دقت کنید اجراشون نمی کنه ها میاره تو لیست، تا اینکه زمان بهشون برسه و اجرا بشن.

در اصل عمل Switch کردن بین برنامه ها، زمانی که ما یه CPU داریم و در آن واحد می تونه یه کار کنه به این صورت انجام میشه، که به جز DIsk و DMA

و امثالهم، یکی دیگه هست که به CPU همش Interrupt میده و اون هم Timer سیستم شماست. CPU هم از خدا بی خبر این رو میده به سیستم

عامل، سیستم عامل این Tick هایی که میاد رو میشمره اگه رسید به یه عددی، کلیه متغیر های خودشو که اسمشون رجیستر، میریزه تو RAM، بعد از

یه بخش دیگه RAM یه برنامه دیگرو فعال میکنه، میگه حالا چند تا Tick هم تو برو. اینجاست که شما ساعت Windowsتون بازه داره ثانیه میزنه اون ور هم

Cursor برنامه Word شما داره چشمک میزنه.

سوال پیش میاد، که تو Task Manager که کلی برنامس، اگه بخواد به هر کدوم یه ذره بده، که کلی میشه، پس ثانیه باید دیر بره. اینطور نیست. بیشتر اون برنامه هایی که میبینید در لیست Task Manager، همشون خوابننننننننننننننننننننننننن. یکی منتظر شبکس، یکی منتظر Keyboard، یکی منتظر دیسک، یکی منتظر یه تغییر تو Registry و ... .

در هر زمان به صورت معمول شما 2 تا Process  از نوع Ready دارید. Ready یعنی Processهایی که خیلی هم هوشیارن، فقط هم CPU میخوان کار دیگه هم ندارن. مثل Photoshop زمانی که دارید Filter میدید. یعنی از تمام وقتش می خواد استفاده کنه. برنامه ای مثل Winamp حتی زمانی که Ready میشه و سیستم عامل میگه بیا چند تا Tick ماله تو، از وقتش استفاده نمی کنه و سریع میگه از دیسک چیزی می خوام و دوباره میره تو خواب و زمان میاد دوباره برای Photoshop.

به جز Process های Ready همیشه به تعداد CPU ها Process داریم به صورت Running. اگر شما یه CPU دارید پس همیشه یه Process هست که داره اجرا میشه، خوب زمانی که Winamp دیسک می خواد، Office هم یه چشمک میزنه میره تو لیست Timer که نیم ثانیه بگذره دوباره چشمک بزنه، این وسط چی ؟

پروسسی در لینوکس و ویندوز هست با شماره 0 - در لینوکس بهش میگن idle در ویندوز میگن System Idle Process. همیشه هم مصرفش بالاست یعنی 95% . زمانی که کسی CPU میخواد اول به اون داده میشه و بعد به IDLE.

بازم سوال پیش میاد، پس اگه این داره عین خوره CPU می خوره اونم 95% چرا وقتی Photoshop رو بالا میارم و اون هم 95% از CPU استفاده می کنه CPU داغ میشه و مثلا در Laptopها فن سیستم روشن میشه و الی آخر ؟

جواب می دیم که کدی که در کرنل Windows و لینوکس نوشته شده برای این برنامه که idle نام داره، یکی از Instruction های مخصوص CPU و یا در صورت عدم وجود Instruction تهی یا nop. زمانی که شما به CPU میگید nop یعنی استراحت کن، برای همینه در Laptopها زمانی که شما برنامه ای رو باز می کنید صدای فنتون زیاد میشه، چون دستوری که داره اجرا میشه دیگه استراحت نیست و CPU شروع می کنه به کار کردن.

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

گفتیم که سیستم عامل میاد Registerهارو میریزه در بخش های از حافظه. این بخش ها در لینوکس معروف هستند به Task Strcture. غیر از اینکه آخرین بار تا کجا رفته جلو و چیکار کرده، اینکه چه بخش هایی از حافظه رو اشغال کرده در چه Pageهایی و چه فایل های بازی داره و کدوم کاربر این رو اجرا کرده و خیلی چیز های دیگه در این ساختار ذخیره می شن.

سوال دیگه اینکه، اگر من می خوام یه کار مهم کنم، کاری که وسطش نباید قطعی داشته باشم، یعنی خیالم باید راحت باشه که سیستم یهو هوس نمی کنه وقت رو از من بگیره و چند ثانیه بعد به من بده، چیکار کنم. به این بخش ها اصطلاحا میگن Critical Section یا بخش های حیاتی. در روش ساده قبل از ورود به این بخش ها توسط دستور cli، کلیه Interruptها قطع میشن، این قطعی باعث این مشه که دیگه CPU صدای Timerرو که جیغ میزنه Tick، Tick نشنونه و چون نمی شنونه به سیستم عامل هم نمیگه و همینطوری راهشو ادامه میده و اون بخش Critical به صورت یکپارچه اجرا میشه. بعد که کار بخش Critical تموم میشه، دستور sti صدا زده میشه و پنبه از گوش CPU در میاد.

این بحث های Critical Section و Race Condition و Synchronization رو در بخش های بعدی داستان های آبکی لینوکس بیاموز آموزش می دیم.

خوب یه سری نکته می مونه که باید بگم:
1- کلیه عملیاتی که گفته شد، چه در بخش حافظه و چه در بخش CPU از دید کاربر مخفیه و فقط نتیجه مثبتش به اون میرسه.
2- مدیریت حافظه و پردازه ها خیلی خیلی خیلی سنگینتر از این نقشه ای که طرح شد، و اسناد مربوط بهش رو می تونید در کتابهای Intel Architecture و کتب مربوط به سیستم عامل پیدا کنید.
3- اضافه شدن یک CPU به سیستم کلی کلی کلی کلی مسائل رو پیچیده تر می کنه، چون قطع کردن Interrupt گوش یکی از CPU هارو می گیره و اون یکی هر کاری دلش بخواد می کنه، برای همین زمانی که شما Source kernel لینوکس رو مشاهده می کنید، پیچیدگی های خیلی زیادی داره که 90% مربوط به Synchronization و SMP یا همون Symmetric Multi Processing یا چند پروسسوریه.

خوب تا قسمت بعدی سریال آبکی لینوکس بیاموز
موفق باشید
از طرف EmadCT

نظرات 2 + ارسال نظر
mostafa جمعه 23 شهریور‌ماه سال 1386 ساعت 01:28 http://linuxeducation.blogsky.com

اقا محمد با سلام
از اینکه وبلاگ منو فراموش نکردید ممنونم منتظر پیشنهادات سازنده شما دوست عزیز هستم

امیرمسعود شنبه 24 شهریور‌ماه سال 1386 ساعت 13:48 http://dashboard.wordpress.com

این نوشته یه ذره سنگین بود و من نتونستم همش رو بفهمم. ولی در کل باز هم خیلی خوب بود و شهود خوبی به آدم می‌داد. راستی چرا متن این وبلاگ وسط خط‌ها شکسته می‌شه و یه‌هو می‌ره سر خط بعد؟ حدس می‌زنم مشکل از نوت‌پد ویندوز باشه! قبل از کپی کردن به کلیپ‌برد باید گزینهٔ Wrap رو خاموش کنی.

برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد