انجمن علمی ریکا – Telegram
انجمن علمی ریکا
2.06K subscribers
1.69K photos
101 videos
146 files
791 links
انجمن علمی ریاضی و علوم کامپیوتر دانشگاه اصفهان

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

انتقادات و پیشنهادات👇🏻
📎 https://app.epoll.pro/31821200
اطلاعات بیشتر👇🏻
📎 https://rika.yek.link
ارتـبــاط بـا مـا👇🏻
📎 @AMCSSup
Download Telegram
با سلام خدمت دوستان عزیز، وکیلی هستم با سری آموزش های سیستم عامل در خدمت شما می باشم.

در جلسات قبل با مفاهیم پایه سیستم عامل و تاریخچه ای مختصر از روند پیشرفت سیستم عامل آشنا شدیم.

در این جلسه مفاهیم اصلی سیستم عامل را شروع می کنیم.


فرآیند:
مهمترین مفهوم هر سیستم عاملی فرآیند است، می توان گفت که فرآیند شامل یک برنامه متشکل از دستورات یا به عنوان دیگر یک برنامه در حال اجرا می باشد.
مفهوم job با فرآیند متفاوت است، job شامل برنامه و داده های ورودی می باشد ولی فرآیند برنامه در حال اجرا است. وقتی که یک فرآیند ایجاد می کنیم یک فریم با یک قالب دارد که عناصر فرآیند در آن مشخص است که به آن process context گفته می شود
فرآیند از سه بخش تشکیل می شود:
کد (متن)
قسمت اجرایی
منابع
فرآیندها به صورت درخت می باشند یعنی یکی از فرآیندها ریشه و مابقی فرآیندها فرزندان و نوادگان ریشه هستند به عنوان مثال در unix فرآیند ریشه init نام دارد که هنگام روشن کردن سیستم شروع می شود.
فرآیند ها وضعیت های مختلفی دارند که در سه دسته اصلی : در حال اجرا، مسدود و آماده جای میگیردند.

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

فرآیندهای درحال اجرا فرآیندهایی هستند که توسط پردازنده اجرا می شود .

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

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

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

فرآیندهای در قسمت آماده داده های خود را دریافت کرده و منتظر هستند تا پردازنده به آنها تخصیص یابد و در صورت تخصیص پردازنده به حالت اجرا می روند. همانگونه که میدانیم پردازنده برنامه ها را به صورت زمانبندی انجام میدهد و وقتی که زمانبندی پردازنده برای یک فرایند به پایان می رسد فرایند مجددا از حالت اجرا به حالت آماده بر می گردد اگر در حالت آماده فضای کافی نباشد به حالت تازه ایجاد شده بر میگردد.
فرآیندهایی در حالت مسدود قرار می گیرند که منتظر یک رویداد می باشند و اگر پردازنده بیکار بماند بازهم نمی توانند اجرا شوند.
ایجاد فرآیندها :
1.توسط سیستم عامل و در هنگام راه اندازی
2.ایجاد فراخوان سیستمی توسط فرایندهای دیگر مانند فراخوان سیستمی fork در unix
3.درخوات کاربر برای ایجاد فرایند جدید
4.آغاز کار دسته ای ( که این حالت فقط در سیستم های دسته ای کاربرد دارد)

اتمام فرایندها:
1.خروجی عادی: زمانیکه کار فرایند تمام می شود (اختیاری)
2.خروجی با خطا: زمانیکه فرایند یک خطا را کشف کرده و اتمام می یابد (اختیاری)
3.خطای مهلک: مانند درخواست دسترسی به حافظه سایر فرایند ها (اجباری و توسط پردازنده)
4. کشته شدن توسط سایر

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

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

پردازنده خود نقش انتخاب و تعویض فرایند ها را بر عهده دارد که باعث سربار برای پردازنده می باشد.
برای نخ ها 3 حالت داریم : سطح کاربر ، سطخ هسته و ترکیبی.

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

نخ های سطح هسته دقیقا مقابل نخ های سطح کاربر قرار دارند و مزیت آنها این است که چون توسط پردازنده تعویض می شوند بلوکه شدن یکی از نخ ها باعث مسدود شدن سایر نخ ها نمی شود و ایراد وارده این است که برای پردازنده سربار همراه دارد.

اما نخ های ترکیبی به این صورت است که در یک فرایند نخ هایی که شامل دستورات ورودی خروجی یا فراخوانی فرایند های دیگر می باشد به صورت سطح هسته تعریف شده و سایر نخ ها به صورت سطح کاربر تعریف می شوند. به این صورت مزیت های هردو نوع سطح کاربر و سطح هسته را به ارث می برد.
امیدوارم آموزش این جلسه مطلوب شما بوده باشه در جلسه آینده به زمانبندی فرایندها برای اجرا می پردازیم.
تشکر و خسته نباشید.
@AMCSUI
@AMCSUI

سلام دوستان خوبم
خوب هستید؟ یا نیستید؟ عصبانی هستید به خاطر تأخیر آموزش؟
بله حق دارید! باید ببخشید امیدوارم کم‌کم نظم و روال ثابتی بتوانیم به آموزش‌ها بدهیم.

نکته: از بالا به ما دستور دادن که در آموزش‌ّهامون از تگ‌ها و کلمات کلیدی استفاده کنیم، پس اگر زیاد با این علامت # مواجه شدید تعجب نکنید مال لکنت انگشت و واردکردن مکرر شارژ نیست ;)

اگر درست به خاطر بیارم طبق سرفصل‌ها، از مقدمات #کیوت شروع کردیم و بعد از بررسی محیط #Qt_Creator رسیدیم به کار با #widgets و #المان‌ها یعنی سرفصل سوم.

در ضمن برای راحتی کار شما و خودم و هم برای اینکه دلخوری اخیرتان از دلتان دربیارم! فهرست مطالب این دوره‌ی مقدماتی رو براتان خوشگل طراحی کردم و گذاشتم توی کانال، انتهای آموزش(تصویر 10).
مِن بعد هر فصلی رو تمام کردیم رنگش رو سبز خواهیم کرد. امید که مقبول افتد.


فصل سوم: کار با ویجت‌ها و المنت‌ها در کیوت
-کلمات کلیدی این فصل: #widgets #Buttons #Qt_Creator #LineEdit #ComboBox #Qt #کیوت# دکمه #طرح

مقدمات تئوری:
تعریف ویجت: به‌طورکلی هر چیزی رو که بشه با چشم سر دید در کیوت ما بهش میگیم ویجت! و هر آنچه را که بشه با چشم دل دید... نه دیگِ همچین چیزی ندارم، کلاس ادبیات نیست که.
پس کلیه‌ی اجزای فیزیکی(در دنیای نرم‌افزار البته) و قابل‌مشاهده در برنامه ازجمله #دکمه‌ها، برچسب‌ها، طرح‌بندی‌ها، تکست‌ادیتورها، تصاویر و ... و ... را ویجت می‌نامیم. این‌ها اجزای فرم‌ها و پنجره‌ها و پیغام‌ها و ...ی ما خواهند بود و ما در بخش طراحی ظاهری(#UI) به آن خواهیم پرداخت. ویجت‌ها کلاس‌هایی هستند که در ظاهر برنامه هم نمایش داده می‌شوند.

#سیگنال (#Signals): هر ویجت یا به‌صورت کلی هر کلاسی، می‌تواند مثل یک فرستنده‌ی رادیویی یا مثل یک بلندگو از خود امواجی منتشر کنند. سیگنال‌ها در کیوت همان رویدادها در زبان‌هایی مثل C# است.

#اسلات (#Slots): هر ویجت یا کلاسی می‌تواند مثل یک گیرنده‌ی رادیویی یا مثل یک گوش عمل کند و امواجی را از یک فرستنده‌ی خاص بگیرد و متناسب با آن عکس‌العملی(مثل پخش کردن یا هر چیزی) انجام دهد.
اصلاً این دو تا چه ربطی به هم داشتند؟ هیچی! من و دوستانم هم نمی‌دانیم اما همین‌قدر کافی است که بدانیم این‌یک انقلاب در صنعت توسعه‌ی نرم‌افزار است.

با این امکان شما می‌توانید به‌راحتی دست کلاس‌های مختلف را تو دست هم بذارید و بینشان تشریک‌مساعی برقرار کنید(یعنی همان ارتباط خودمان)!

مثال بدنی: وقتی فردی گرسنه است و با یک غذای لذیذ مواجه می‌شود، شکمش سیگنال قاروقور ساطع میکنه! و اسلات سیستم اعصاب این سیگنال را می‌گیرد و واکنش متناسب با آن را که ترشح بزاق است نشان می‌دهد.

مثال فنی: فرض کنید که کیوت دست دکمه‌ی ۱ را در دست پنجره‌ی ۲ گذاشته است. یعنی اومده سیگنال کلیک شدن دکمه‌ی ‍۱ (بلندگو) را در دست اسلات(گوش) باز شدنِ پنجره ۲ گذاشته. حالا وقتی دکمه‌ی 1 کلیک می‌شود، سیگنال کلیک شدن را در برنامه صادر می‌کند(داد میزند که کلیک شدم)، سپس اسلات باز شدن پنجره‌ی 2 فعال می‌شود و پنجره‌ی ۲ را باز می‌کند.
یا مثلاً سیگنال «کلیک شدن» دکمه‌ی ۱ را به اسلات «بسته شدن» در پنجره‌ی ۲ وصل می‌کند. چه اتفاقی می‌افتد؟ وقتی دکمه‌ی دکمه‌ی ۱ کلیک شد، پنجره‌ی ۲ متوجه می‌شود و بسته می‌شود. همین.

به این میگن سیستم سیگنال و اسلات در کیوت. یک‌جور جان‌بخشی به اشیاء!

به تصویر ۱ دقت کنید. هر کلاس در کیوت جدا از بخش‌های اصلی‌اش(private و public و ...) دارای دو بخش دیگر هم هست: سیگنال‌ها و اسلات‌ها.
همان‌طور که در شکل می‌بینید Signal 1 در Class X به Slot A در Class Y وصل است و متقابلاً Signal 1 در Class Y به Slot A در Class 1 وصل شده است.
این معنی خودمانی‌اش چی میشه؟ توضیح با شما.

اما این سیگنال و اسلات‌ها چی هستند؟ متغییرن؟ کلاسن؟
هیچ‌کدام. دقیقا از جنس تابع اند! اما دسته بندیشون اسمش سیگنال و اسلاتِ همین.

اینا رو گفتیم که بریم یه مثال عملی بزنیم.

مثال:
می‌خواهیم برنامه‌ای طراحی کنیم که یه فرم ساده‌ی ورود (login) رو شبیه‌سازی کنه و با واردکردن
نام کاربری: admin
و
رمز: admin
پیغام خوش‌آمد گویی به کاربر نشان بده.

مرحله‌ی ۱: مطابق آموزش جلسه سوم یک پروژه از نوع Qt Widget Application بسازید.

مرحله‌ی ۲: در پنل سمت چپ، روی پوشه‌ی Forms و سپس روی mainwindow.ui کلیک کنید.

صفحه‌ای مطابق تصویر ۲ که شامل یک فرم خالی در وسط و یکسری ویجت‌ها(یا کنترل‌ها) در سمت چپ است جلوی رویتان ظاهر می‌شود.

مرحله ۳: چهارتا Label رو برای نمایش متن روی فرم بکشید. برای تغییر متن روی Label ها روی آن‌ها دابل کلیک کنید ( مطابق تصویر 4)
مرحله 4: دو LineEdit روی فرم بکشید.(تصویر 5)

مرحله 5: یک PushButton روی فرم بکشید. برای تغییر متن روی PushButton روی آن دابل کلیک کنید(تصویر 6)
خب تا اینجا یک فرم ساده طراحی کردیم.

نوبت این است که به دکمه مون رفتار یاد بدیم! روی دکمه‌ای که ساخته‌اید راست کلیک کنید و Go to slot… رو برنید. در پنجره‌ی بازشده زیر قسمت Select signal گزینه‌ی Clicked و درنهایت Ok را بزنید. (تصویر 7)

با این کار درواقع داریم یک اسلاتِ به گوش درست می‌کنیم برای سیگنال Clicked دکمه. یعنی به فارسی‌اش میشه این: یک تابع از نوع Slot تعریف می‌کنیم که هر وقت دکمه کلیک شد فراخوانی بشه.

کدهای زیر را مطابق شکل 8 الف وارد کرده و کلید Ctrl + R یا دکمه‌ی سبز پایین سمت چپ کیوت کریتور را بزنید تا برنامه اجرا شود. (اگر احیاناً پنجره‌ی Save Changes ظاهر شد Save All رو بزنید)

درصورتی‌که کدهایتان را به‌درستی نوشته باشید خروجی‌ای شبیه تصویر 9 مشاهده خواهید کرد. زیباست نه؟! دیدید که هم‌زمان با کد C++ چگونه از HTML و CSS هم داخل کدمان برای زیباتر شدن کار استفاده کردیم. این کار ضرورتی نداشت لذا می‌توانستید به‌جای تگ، متن ساده بنویسید.(مثل تصویر 8 ب)

خب تبریک عرض می‌کنم اولین برنامه‌ی کیوت خودتان رو نوشتید!
#تصویر3. اضافه کردن 4 عدد #label
#تصویر5. اضافه کردن یک عدد #PushButton
#تصویر6. راست کلیک کردن روی دکمه و انتخاب #go_to_slot
#تصویر7. انتخاب نوع #سیگنال #clicked برای دکمه
#تصویر_8_الف. نوشتن کد برای عکس العمل دکمه (نوشتن html و css در متن پیغام)