تمرین دوم سیستم عامل – نیمسال اول ۹۳-۹۴

 

به نام خدا

تمرینات Process

استاد: دکتر محسن ابراهیمی مقدم

کمک تدریس: جواد زندی زهرا خوبی

 

لطفا در ارسال تمرینات خود به نکات‌ مهم زیر توجه داشته باشید:

1-     مهلت این سری تمرینات تا ۵ آبان قبل از شروع کلاس حل تمرین می‌باشد.

2-     برای دریافت نسخهPDF تمرین از لینک استفاده نمایید.

3-     نحوه تحویل تمرینات شما به دو صورت می‌تواند باشد:

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

ب) سوالاتی از تمرین که شامل برنامه‌نویسی است: در این مورد باید متن برنامه‌(source code) که حتما باید قابل اجرا باشد را به ایمیل حل‌تمرین به‌نشانی sbuos93a@gmail.com با درنظرگرفتن عنوان مناسب با فرمول [sbuos93a][hw#][student#][full name] ارسال کنید. مثلا این عنوان برای تمرین سری اول به صورت زیر خواهد بود: [sbuos93a][hw1][89213191][hasan hasani]. همچنین به خاطر داشته باشید که درصورتی که قصد دارید چندین فایل برای حل تمرین بفرستید، ابتدا باید آنها را zip کنید و نام فایل زیپ شده را به فرمول فوق درآورید و سپس ضمیمه ایمیل کرده و ارسال کنید. درپایان اگر همه مراحل فوق را به درستی انجام دهید یک ایمیل تاییدیه دریافت تمرین از طرف سیستم به طور خودکار برای شما ارسال می‌شود.

4-     تمریناتی که شامل نوشتن کد برنامه  هست: نوشتن توضیحات comment به من کمک می‌کند تا بهتر بتوانم منظور شما را بفهمم. به هیچ وجه فایل اجرایی را برای من نفرستید و همواره باید متن اصلی برنامه تان را به همراه دیگر فایل های توضیحی شما که ممکن است pdf باشد به صورت فقط یک فایل zip شده ارسال کنید. نام فایل زیپ شده باید عینا مطابق با عنوان ایمیل باید، به مثال زیر توجه کنید: [sbuos93a][hw#][student#][full name]. از ارسال تمرینات به گروه اجتناب کنید.

5-     همچنین هرگونه مشکل در روند کلاس و پیشنهادات خود را می‌توانید از این طریق پیگیری نمایید.

6-     از آنجایی که پاسخ‌های شما بادقت صحیح‌می‌شود، ایده‌های‌خلاقانه و پاسخ‌های هوشمندانه در حل‌سوالات طبیعتا نمره‌ای فراتر از تمرین دارد.

سوالات مفهومي:

1-     به طور اجمال توضيح دهيد هدف از وجود syscall در سيستم‌عامل‌هاي امروزي چيست؟

2-     به تکه کد زير با دقت نگاه کنيد و بگوييد که در کل چند بار پيام Hello World چاپ مي‌شود؟ اگر جاي خط سوم و چهارم عوض شود چطور؟ پاسخ خود را محاسبه کنيد و توضيح دهيد(فرض کنيد منابع سيستم‌عامل نامحدود است).

int main () {

for(int i=0; i<1000000; ++i) {

          cout << “Hello World\n”;

fork();}

return EXIT_SUCCESS;

}

3-     در سيستم‌عامل‌هاي اشتراک زماني، پايان زمان کوانتوم‌(فرايند context-switch) را چه مرجعي اعلام مي‌کند؟

4-     به نظر شما چرا تغيير وضعيت‌هاي (ready به Block) و (Block به Running) و (ready به terminated) مجاز نيست؟

5-     یک فرآیند از حالت running به چه حالت‌هایی ممکن است برود؟ علت این تغییر حالت را ذکر کنید.

6-     یک ماشین حالت از تغییر گذار فرآیندها رسم کنید و در آن شکل توضیح دهید در هر تغییر حالت کدام زمان‌بند (کوتاه‌مدت، میان‌مدت، بلندمدت) باید اجرا شود. ماشین حالت شما فقط باید دارای حالت‌هایی نظیر (start, terminated, ready, block, running, ready/suspend, block/suspend) باشد ‌(راهنمایی: به عنوان مثال زمان‌بند کوتاه‌مدت حتما در تغییر حالت از running به ready اجرا خواهد شد).

7-     تفاوت process contention scope با system contention scope را شرح دهید. به چه دلیل در اکثر سیستم‌عامل‌های امروزی از SCS استفاده می‌شود؟

8-     باتوجه به توضیحات کتاب با فراخوان fork() آشنا شدید. اکنون توضیح دهید بعد از fork()، فرزند به وجود آمده به  کدامیک از قطعات برنامه پدر code, data, stack, shared memory دسترسی دارد؟ همچنین پدر به کدام قطعات فرزند دسترسی دارد؟ آیا قطعه‌ای‌(از پدر یا فرزند) وجود دارد که میان هردو مشترک باشد؟

9-     انواع روش‌های ارتباط میان فرآیندی (IPC) را شرح دهید و با رسم یک جدول مناسب آنها را با یکدیگر مقایسه کنید.

 

 

سوالات برنامه نويسي:

10-  مي‌دانيد که در ماشين‌هاي مبتني بر استاندارد POSIX مانند Unix, Linux, Mach در ترمينال براي اين که يک دستور را اجرا کنيم به راحتي نام آن را نوشته و آرگومان‌هاي ورودي آن را جلوي آن مي‌نويسيم. سپس اين برنامه اجرا شده و تا زماني که اجراي آن خاتمه نيابد خط فرمان هيچ فرمان جديدي را نمی‌گیرد. به مثال بارز ping localhost دقت کنيد. براي مثال مي‌توانيد اين دستور را اجرا کنيد. به خاطر داشته باشيد  که از کليد ترکيبي ctrl + c براي بستن درجا می‌توانید استفاده کنيد. بعضي اوقات اين ويژگي براي کاربران حرفه‌اي لينوکس آزاردهنده است و مي‌خواهند براي اجراي برنامه جديد مجبور به باز کردن يک پنجره جديد نشوند، در اين صورت آنها در انتهاي نام برنامه و همه آرگومان‌ها يک & قرار مي‌دهند تا اين مشکل ‌حل‌شود. براي مثال شما مي‌توانيد ping localhost > /dev/null & را اجرا کنيد. توضيح دهيد چرا با اضافه کردن & ترمينال هم مي‌تواند برنامه قبلي را مي‌تواند اجرا کند و هم منتظر ورودي بعدي باشد؟‌ سپس توضيح دهيد چرا استفاده از ctrl + c موجب بسته‌شدن برنامه فوق نمي‌شود؟

11-  توضيح فوق را کد کنيد! يعني برنامه‌اي بنويسيد که نام يک برنامه يا آدرس آن‌را از کاربر دريافت کند و سپس آن‌را اجرا کند. برنامه شما بايد داراي قابليت دريافت آرگومان‌هاي ورودي برنامه کاربر باشد. همچنين برنامه با دريافت & رفتاري مشابه توضيح فوق(براي مثال به لينوکس اوبونتو مراجعه کنيد) بايد داشته باشد. در آخر نيز برنامه هنگامي که ورودي $? را ديد بايد returnکد آخرين برنامه اجرا شده را نشان دهد. زبان برنامه نويسي شما C مي‌باشد و حق استفاده از تابع system() را نداريد!‌ (از توابع سيستم عامل‌تان مثل … , exec, wait,fork استفاده کنيد).

12-   برنامه‌ای به زبان C متناسب با سکوی لینوکس بنویسید که pipe میان دوفرآیند دلخواه‌(با رابطه پدر و فرزندی یا بدون رابطه پدر و فرزندی) و سپس یک فرآیند به دیگری پیام “hello world” را بفرستد و دیگری پس از دریافت چنین پیامی، پیامی با عنوان “delivered” برای فرایند فرستنده ارسال کند.

13-   برنامه‌ای بنویسید که در ابتدا یک حافظه مشترک با اندازه مورد نیاز ۴ بایت به وجود بیاورد و آن را با صفر مقدار دهی کند. پس از اینکه حافظه مشترک با موفقیت ساخته‌شد با استفاده از fork() یک فرزند به‌وجود بیاورید. از این به بعد پدر وظیفه دارد مقدار حافظه مشترک که یک ‌integer است را یک واحد اضافه کند و مقدار آن را چاپ کند و فرآیند فرزند وظیفه دارد یک واحد از آن کم کند و مقدار آن را چاپ کند. پدر و فرزند هرکدام اینکار را ۱۰۰۰۰۰ بار انجام می‌دهند. در توضیحات comment پایانی برنامه، توضیح دهید چرا این نتیجه فراتر از حد انتظار است؟ متن برنامه‌تان را به همراه خروجی‌های پدر و فرزند ارسال کنید.

14-  (امتیازی) ارسال سیگنال‌ یک روش بسیار ساده و کارامد برای ارتباط فرايندها با یکدیگر و سیستم‌عامل با فرآیندها است. با آگاهی از این روش برنامه‌ای تحت ترمینال بنویسید که:

a. اگر ctrl+c فشار داده شد برنامه بسته نشود و در عوض با کلید ترکیبی دلخواه شما بسته شود‌(با استفاده از سیگنال‌ها).

b. حتی اگر دسترسی غیرمجاز (memory violation) حافظه داشت بازهم برنامه بسته نشود (با استفاده از try & catch).

c. سپس تفاوت‌های دو روش فوق را شرح دهید و بگویید کاربرد‌ هرکدام در چه مورد است؟

   

پاسخ تمرین اول سیستم عامل – نمیسال اول ۹۳-۹۴

پاسخ‌نامه‌ی تکلیف سری اول سیستم عامل:

1- اسلاید فصل اول – صفحه 4 – Operating system goals

 

2- API واسط نرم افزاری هست که هدفش برقراری ارتباط کاربر و سیستم عامل است. http://en.wikipedia.org/wiki/Application_programming_interface

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

 

3- روش pooling برای زمانی مناسب است که اتفاقی مکررا در بازه های زمانی رخ می دهد.

روش interrupt برای زمانی که اتفاقی خارج از روال رخ بدهد.

و DMA برای زمانی که داده هایی مطمئن با حجم زیاد قرار است منتقل شوند.

 

4- صرفه اقتصادی

قابلیت اطمینان

قابلیت پردازش موازی -> سرعت )صفحه 14 کتاب(

 

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

ماجرای IVT (صفحه ی 8 کتاب)

 

6- بزرگترین مزیت ایجاد امنیت در استفاده از منابع است.

 

7- Timer interrupt

 

8- Reg & Mem & stack  (اسلایدها 2.18)

 

9- اسلایدها (2.20 الی 2.23)

 

10- Fork & exec

 

#include <unistd.h>

int link(const char *oldpath, const char *newpath);

http://www.tutorialspoint.com/unix_system_calls/link.htm

int system(const char *command)

http://www.tutorialspoint.com/c_standard_library/c_function_system.htm

 

11- الف) صفحه ی 12 کتاب: بافر – و هماهنگی با درایور همان ابزار برای انتقال داده در عین استراحت پردازنده

 

ب) IVT (صفحه ی 8 کتاب)

 

ج) In computing, a shell is a user interface for access to an operating system‘s services. In general, operating system shells use either a command-line interface (CLI) or graphical user interface (GUI), depending on a computer’s role and particular operation.

http://en.wikipedia.org/wiki/Shell_(computing)

 

12- الف)نادرست ->DMA

ب)نادرست-> بستگی به کاربرد دارد.

ج)بافر و DMA و نیز نگهداری وضعیت دیسک و ارتباط با سیستم عامل از طریق درایور

د)باید در حافظه ی اصلی قرار بگیرند.

   

تمرین اول سیستم عامل – نمیسال اول ۹۳-۹۴

 

به نام خدا

تمرینات سری اول درس سیستم عامل

استاد: دکتر محسن ابراهیمی مقدم

کمک تدریس: جواد زندی   –   زهرا خوبی

 

لطفا در ارسال تمرینات خود به نکات‌ مهم زیر توجه داشته باشید:

1-     مهلت ارسال این تمرین تا 28 مهرماه قبل از کلاس حل تمرین می‌باشد.

2-     برای دریافت نسخهPDF تمرین از لینک استفاده نمایید.

3-     نحوه تحویل تمرینات شما به دو صورت می‌تواند باشد:

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

ب) سوالاتی از تمرین که شامل برنامه‌نویسی است: در این مورد باید متن برنامه‌(source code) که حتما باید قابل اجرا باشد را به ایمیل حل‌تمرین به‌نشانی sbuos93a@gmail.com با درنظرگرفتن عنوان مناسب با فرمول [sbuos92b][hw#][student#][full name] ارسال کنید. مثلا این عنوان برای تمرین سری اول به صورت زیر خواهد بود: [sbuos93a][hw1][89213191][hasan hasani]. همچنین به خاطر داشته باشید که درصورتی که قصد دارید چندین فایل برای حل تمرین بفرستید، ابتدا باید آنها را zip کنید و نام فایل زیپ شده را به فرمول فوق درآورید و سپس ضمیمه ایمیل کرده و ارسال کنید. درپایان اگر همه مراحل فوق را به درستی انجام دهید یک ایمیل تاییدیه دریافت تمرین از طرف سیستم به طور خودکار برای شما ارسال می‌شود.

4-     تمریناتی که شامل نوشتن کد برنامه  هست: نوشتن توضیحات comment به من کمک می‌کند تا بهتر بتوانم منظور شما را بفهمم. به هیچ وجه فایل اجرایی را برای من نفرستید و همواره باید متن اصلی برنامه تان را به همراه دیگر فایل های توضیحی شما که ممکن است pdf باشد به صورت فقط یک فایل zip شده ارسال کنید. نام فایل زیپ شده باید عینا مطابق با عنوان ایمیل باید، به مثال زیر توجه کنید: [sbuos92b][hw#][student#][full name]

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

 

سوالات مفهومي:

1-     حسن اين ترم درس سيستم عامل را انتخاب کرده‌است. او هيچ تصوري از اينکه سيستم‌عامل براي چه وجود دارد را نمي‌داند. براي حسن سه هدف اصلی هر سیستم عامل را مختصری توضیح دهید.

2-     Application Programing Interface (API) و Application Binary Interface(ABI) را هریک جداگانه براي حسن  توضیح دهید و تفاوت های هرکدام با یکدیگر را براي او بنویسید.

3-     حسن هنوز سوالاتي در مورد  I/O structureدارد. براي حسن در مورد روش Polling ، interrupt و DMA‌ هريک به اختصار توضيح دهيد و همچنين قيد کنيد علت استفاده از هرکدام چه بوده و براي رفع چه مشکلي ايجاد شدند؟ همچنين مختصرتوضيح دهيد درکنار مزيت‌هاي خود چه اشکالات ديگري را به وجود آوردند؟

4-     سه مزيت اصلي multiprocessor system ها را توضیح دهید.

5-     حسن قصد دارد تا يک برنامه را اشکال زدايي Debug کند. اما نمي‌داند چطور ممکن است روند اجراي يک برنامه دستور به دستور کنترل شود. لطفا براي حسن در مورد کاربرد‌هاي ‌trap يا exception در سيستم عامل‌هاي  interrupt drivenرا به اختصار توضيح دهيد. به نظر شما interrupt vector table(IVT) در سيستم عامل به چه منظور طراحي شده است؟

6-     همانطور که در درس خوانده‌ايد ضامن اجراي صحيح يک سيستم‌عامل وجود دو حالت(از طريق تعيين يک بيت) در سخت افزار/پردازنده مي‌باشد. نام‌هاي اين دو حالت را براي حسن ذکر کنيد و براي او توضيح دهيد تفکيک کردن اين دو حالت چه ضرورتي دارد؟

7-     هر برنامه براي اجرا شدن نياز دارد تا کنترل (قسمت‌هاي محدود سخت‌افزار) سخت‌افزار/پردازنده را در دست بگيرد. حال که پردازنده به دست برنامه افتاده است، بايد پس از مدتي پردازنده را به سيستم‌عامل پس بدهد تا سيستم‌عامل بتواند پردازنده را به ديگر برنامه‌ها بدهد. بنا به دلايل متنوع ممکن است برنامه کاربر سخت‌افزار را پس ندهد. حال بگوييد سيستم‌عامل با پشتيباني از کدام قسمت سخت‌افزار/پردازنده قادر است پردازنده را از برنامه‌شورشي! پس بگيرد و به ديگر برنامه‌ها بدهد؟ روال پس‌گيري را در مورد برنامه شورشي حسن به نام P1 را توضيح دهيد و به او نشان دهيد هرگز نمي‌تواند برنامه‌اي بنويسد که هميشه کنترل پردازنده حل تمرين اش را به عهده بگيرد!

8-     سه روش بسيار مهم براي ارسال پارامترهاي يک فراخوان API را مختصري توضيح دهيد و مزايا و معايب آن‌ها را با يکديگر مقايسه کنيد.

9-  لطفا براي حسن انواع فراخواني‌هاي سيستم (syscall) را نام ببريد.

10-   کارکرد هريک از فراخواني‌هاي‌ (system, fork, exec, exit, open, close, read, write, link) را براي حسن به اختصار توضيح دهيد.

11-   هریک از مفاهیم زیر را با درنظرگرفتن اختصار توضیح دهید:

الف) Device Controller          ب) Interrupt Vector        ج) Shell

۱۲- درستی یا نادرستی گذاره‌های زیر را با علت توضیح دهید:

الف) دستگاه‌های جانبی و پردازنده امکان انجام کار همزمان ندارند.

ب) همواره استفاده از سسله مراتب حافظه مقرون به صرفه‌ترین راه است.

ج) تنها کاربرد Disk Controller نگه‌داری وضعیت دیسک است.

د) برنامه‌ها برای اجرا شدن می‌توانند در یکی از سسله مراتب حافظه قرار بگیرند.