شام فیلسوفان

به نام خدا

در بحث الگوریتم های موازی یا به اصطلاح Concurrent یا همروند ، مساله ای با نام شام فیلسوفان توسط

بنیان گذار اکثر مسائل مهندسی کامپیوتر یعنی ادگار دایجسترا یا دیکسترا ، مطرح گردید که به شرح زیر است:

در عکس بالا آیزاک ، یک مهمونی ترتیب داده و ماکارانی درست کرده و دوستان هم عصر و قبل از آیزاک 

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

همه میان با هم شروع کنند به خوردن ماکارونی که می بینن ، ای وای چنگال کمه ...  چون نیاز به دو چنگال

دارند تا بتوانند بخورند.(فرض شود یک چنگاله قبول نیست...)

مساله اینطور است که این فیلسوف ها باید دو کار انجام دهند : 1- فکر کنند ، 2- بخورند با دو چنگال

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

در اصل ، ماکارونی و چنگال ها به عنوان Resource و فیلسوفان به عنوان Process یا Thread هستند.

یک الگوریتم حل اینست که:

گام 1 : یک فیلسوف آنقدر فکر کند تا چنگال سمت چپ آزاد شود و آنرا بردارد.

گام 2 : باز آنقدر فکر کند تا چنگال سمت راست آزاد شود و آن را بردارد.

گام 3 : تا مقدار زمان خاص مثل کوانتوم یا Q از ماکارانی بخورد. ( اگر زمانبدی CPU از نوع 

  Round Robin باشد.)

گام 4 :چنگال راست را رها کند . (Flush Right)

گام 5 : چنگال چپ را نیز رها کند . ( Flush Left)

گام 6 : برو به گام 1.

الگوریتم ضعیف بالا ، باعث میشود ما به deadlock برسیم. چرا ؟ چون فرض کنید همه فیلسوف ها بیایند و

چنگال سمت چپ را بردارند ، چون چنگال سمت راست هر فیلسوف ، چنگال سمت چپ فیلسوف دیگر است

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

فیلسوف دیگر است، آزاد شود ، و چون این حالت هیچگاه رخ نمیدهد ، به بن بست یا deadlock میرسیم

و سیستم عاملی که با این الگوریتم کار کند ، در این مورد ، به حالت Not Responding میرود.

در الگوریتم فوق حتی ممکن است گرسنگی منبع هم رخ دهد.

به هر حال ، راه حل هایی برای حل این بحران ارائه گردیده است که در زیر من به راه حل Conductor و

نیز راه حل Chandy/Misra اشاره میکنم :

راه حل اول  : Conductor یا راهنما

استفاده از یک خدمتکار یا waiter است که از تعداد چنگال های مانده و در حال استفاده آگاهی دارد ، هر

فیلسوفی که می خواهد ماکارونی بخورد، به خدمتکار میگوید تا برای خود نوبت بگیرد و سپس خدمتکار

چنگال را در اختیارش می گذارد . ( چنگال سمت چپ را به او میدهد)

واضح است که این همان سمافور است .

در سی شارپ برای استفاده از سمافور ها باید از کلاس زیر استفاده کرد :

System.Threading.Semaphore

راه حل دوم  : راه Chandy/Misra

اساس این الگوریتم روش Message Passing است ، یعنی فیلسوف ها با هم حرف بزنند یا به بیان تخصصی

هر Process به Process های جانبی خود ( حالا میتواند از PCB شماره ID آنها را بیابد ) یک پیغام و درخواست

برای انحصار منبع یا Resource Allocation بفرستد و آن پرسه ای که منبع را به انحصار خود در آورده است ، آنرا

آزاد نماید برای پرسه درخواست کننده.

الگوریتم به شرح زیر است :

گام 1 :چنگال ها دو حالت دارند : 1-کثیف ، 2-تمیز

گام 2 : هنگامیکه یک فیلسوف می خواهد از ماکارونی اش بخورد ، باید چنگال هایش را از فیلسوف 

 های اطرفش بگیرد ، پس به ازای هر چنگالی که ندارد ، به فیلسوف های کناری اش ، درخواست

 میدهد.

گام 3 : وقتی یک فیلسوف ، پیغام  ، چنگال بده را دریافت میکند ، اگر چنگالش تمیز باشد ، آن را 

نگاه  میدارد.اما اگر چنگال کثیف باشد ، آنرا تمیز میکند و به فیلسوف درخواست کننده میدهد.

گام 4 : بعد از اتمام خوردن یک فیلسوف ، همه چنگالهایش کثیف میشود ، اگر در صف 

درخواست ها ،چشم فیلسوف دیگری به چنگالهایش بود ، باید آن چنگال درخواست شده 

را تمیز کند و در اختیار  فیلسوف درخواست کننده منتظر در صف waiting  ، قرار دهد.


یک راه دیگر هم وجود دارد ، که آنرا ان شا الله بعدا می گویم.


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

بافر چیست

به نام خدا

 یک پست راجع به سخت افزار....

گیت زیر یک گیت NOT است :

این گیت یک معکوس کننده است ، یعنی هرچه بگیرد ، عکسش میکند و میدهد بیرون، صفر بگیرد ، یک میدهد

یا برعکس.

حتما از خودتان میپرسید ، چه ربطی به Latch یا بافر دارد ؟ (از من بپرسید نه از خودتان...)

خوب عکس زیر یک بافر است :

عجب پس بافر یک گیت Not است بدون دایره ؟ بله ، بافر هرچه را بگیرد ، همان را میدهد ، جدول حالات

آن به صورت زیر است :

چه مسخره ، پس بافر چه بدرد میخورد؟ یک سیم هم که اینکار را میکند...

آره ، نه خیر ، مدار زیر را ببینید :

در مدار فوق اگر از جعبه سیاه ، جریان i خارج شود ، به هر جعبه آبی ، i/3 میلی آمپر طبق قوانین KCL میرسد.

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

اگر مدار به صورت زیر بافر شود چه ؟

بله ، پس بافر یک تقویت کننده است ، یک تقویت کننده جریان.

در پست بعد هم ان شا الله ، راجع به لچ صحبت میکنم....

در حال حاضر هم چشمهایم به زور بازند ....

پانویس :

یک نوع بافر به اسم بافر سه زمانه داریم ، که علاوه بر یک ورودی ، یک ورودی کنترلی C نیز دارد.


ویدئو های هوش مصنوعی

به نام خدا

باز هم این وبلاگ شروع به کار مجدد کرد ....

ضمن عرض تسلیت شهادت امام عالم ، امام روشنی بخش ، امام محمد باقر (ع) ، 

از آدرس زیر می توانید ویدئو های مربوط به درس هوش مصنوعی را که توسط استاد گرانقدر دکتر رامین رهنمون

ارائه شده اند را مورد بازدید قرار دهید.

بازدید صفحه حاوی ویدئوها

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

ویدئو های فوق برای داوطلبان کارشناسی ارشد می تواند مفید باشد

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

تدریس درس هوش مصنوعی را دارند.

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

زبانهای برنامه نویسی

به نام خدا

یک سوال که تا به حال خیلی با آن برخورد کرده ام و خیلی ها از من پرسیدند اینست که کدام زبان را یاد بگیرم ؟

دکتر نصیری خیلی خوب پاسخ این سوال را میدهد: "که اگر از من بپرسند ، کدام ماشین بهتر است ، میدانم بنز

بهترین است . چه کسی جگر دارد بگوید بنز بد است ؟ اگر از من بپرسند کدام بانک اطلاعاتی بهتر است ؟ میدانم

اوراکل خیلی خوب است ؟ چه کسی جنم دارد بگوید اوراکل بد است ؟ اما برای چه کار و چه هزینه ای ؟"

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

در مهندسی نرم افزار و متدولوژی RUP که فاز اول آن Business Area است ، مهندسان نرم افزار و سخت افزار

و حتی IT و Business Expert ها ، دور هم جمع میشوند و کار را کامل می سنجند و ابزار را انتخاب میکنند.

مثلا برای ایجاد یک روبات ، مهندس نرم افزار ، مهندس سخت افزار ، مهندس میکانیک ، مهندس الکترونیک

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

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

نوشتن صفحات وب یا موبایل ، زیاد با هم تفاوت ندارند ، اما در نوشتن برنامه های سیستمی و یا Device Driver

و یا پورت های مختلف ، هیچ کدام بدرد نخواهند خورد.

در جدول زیر ، کاربرد هر زبان آمده است :

Haskellبرنامه های Functional
++C/Cبرنامه های سیستمی و یا آزمایشگاهی،شبکه
#Cبرنامه های تحت وب ، موبایل ، ویندوز،شبکه
VBبرنامه های تحت وب ، موبایل ، ویندوز،شبکه
Javaبرنامه های تحت وب ، موبایل ، ویندوز،سیستم های Embed،شبکه
Rubyبرنامه های Text Processing مانند پارسر ، برنامه های تحت وب ، ویندوز
Pythonبرنامه های امنیتی ، سیستمی ، آزمایشگاهی،برنامه های تحت وب،ویندوز،شبکه
Perlبرنامه های تحت وب ، برنامه های سطح بالا و نه سیستمی
PHPبرنامه های تحت وب
CURLبرنامه های تحت شبکه HTTP

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

سنجید و با انتخاب ابزار غلط ، خود را به زحمت نیاندازیم...