انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: fery در 05 آبان 1391، 09:49 ب‌ظ

عنوان: ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: fery در 05 آبان 1391، 09:49 ب‌ظ
سلام. استاد به من گفته باید مسئله ناهار خوردن فیلسوفان را تو لینکس پیاده کنی. اما من متوجه نمی شم منظورشون اینه که با c بنویسم یا با همون دستورات مربوط به لینکس. من تو لینکس کد نزدم.
 کدشو تو c++  بنویسم . می تونم به کد لینکس تبدیل کنم و قابل اجرا باشه؟
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: حامد سپهر در 05 آبان 1391، 09:52 ب‌ظ
ماشاالله چقدر غلط نوشتاری  ;D این مسئله حالا چی هست؟!
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: جادی در 06 آبان 1391، 10:28 ق‌ظ
سلام. اشتاد به من گفته باید مسله ناهار خوردن فیلسوفان را تو لینکس پیاده کنی. اما من متوجه نمی شم منظرشون اینه که با c بنویسم یا با همون دستورات مربوط به لینکس. من تو لینکس کد نزدم.
 کدشو تو c++  بنویسم . مس تونم به کد لینکس تبدیل کنم و قابل اجرا باشه؟

((:

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

معقوله از استاد بپرسی منظورش چیه و اگر گفت منظورش زبان سی است، بپرسی که مگر زبان سی در ویندوز و مک و لینوکس فرقی داره؟ شاید هم می خواد کمپایل کردن توی لینوکس یاد بگیرین.
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: Plugin در 06 آبان 1391، 11:03 ق‌ظ
سلام. اشتاد به من گفته باید مسله ناهار خوردن فیلسوفان را تو لینکس پیاده کنی. اما من متوجه نمی شم منظرشون اینه که با c بنویسم یا با همون دستورات مربوط به لینکس. من تو لینکس کد نزدم.
 کدشو تو c++  بنویسم . مس تونم به کد لینکس تبدیل کنم و قابل اجرا باشه؟

سلام.
همانطور که دوستان نیز فرمودند سعی بفرمایید سوالتون کامل، واضح و بدون غلط فنی و املایی بپرسید.
در کل من که منظورتون از کد لینوکس نفهمیدم ولی در لینک زیر مقاله ای مبتنی بر c++ نوشته شده، که الگوریتم پیاده سازی شده آن می باشد. این مقاله کمک می کند به یادگیری الگوریتم حل مسئله.
http://msdn.microsoft.com/en-us/magazine/dd882512.aspx
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: fery در 06 آبان 1391، 03:14 ب‌ظ
سلام. اشتباه املایی را من متوجه نشده بودم. ویرایش کردم.
راستش من هم متوجه منظور استاد نشدم. 3 شنبه کلاس داریم باز هم می پرسم. اما گفتند که برنامه نویسی تو حالت شل و کرنل هست.!! حالا این کد را که به زبان سی داریم. چطوری باید به صورت شل بشه.؟
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: doomhammer65ir در 06 آبان 1391، 04:12 ب‌ظ
شل یعنی مثلا با بش ( bash) یا پرل(Perl) بنویسید
کد سی را همینجا بگذارید تا دوستان تبدیل کنند
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: nixoeen در 06 آبان 1391، 04:54 ب‌ظ
البته Perl دیگه شل نیست، وگرنه Python هم شل محصوب میشه. اگر منظور واقعا شل بوده، باید با Bash بنویسید، که البته بعید می‌دونم.
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: حامد سپهر در 06 آبان 1391، 10:39 ب‌ظ
ماشاالله چقدر غلط نوشتاری  ;D این مسئله حالا چی هست؟!

کسی نمیخواد صورت مسئله رو بگه؟
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: سید مسعود امامیان در 06 آبان 1391، 10:47 ب‌ظ
تاپیک زدن دوستان هم جالب شده ! جواب که حتماً با شما, سوال هم خودتون از جملات بیرون بکشید !
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: nixoeen در 06 آبان 1391، 10:48 ب‌ظ
کسی نمیخواد صورت مسئله رو بگه؟
غذا خوردن فیلسوفان یکی از مسائل معروف کامپیوتر مثل هشت‌وزیر هستش. اینجا می‌تونید در مورد اون بخونید: لینک (http://en.wikipedia.org/wiki/Dining_philosophers_problem)
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: حامد سپهر در 06 آبان 1391، 10:52 ب‌ظ
کسی نمیخواد صورت مسئله رو بگه؟
غذا خوردن فیلسوفان یکی از مسائل معروف کامپیوتر مثل هشت‌وزیر هستش. اینجا می‌تونید در مورد اون بخونید: لینک (http://en.wikipedia.org/wiki/Dining_philosophers_problem)

اگه اون صفحه زبون وطنی هم بود نمیخوندمش چه برسه به الآن که انگلیسی هم هست!!

الآن یه سوال دیگه هم پیش اومد، مسئله ۸وزیر چیه؟
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: nixoeen در 06 آبان 1391، 10:57 ب‌ظ
اگه اون صفحه زبون وطنی هم بود نمیخوندمش چه برسه به الآن که انگلیسی هم هست!!

الآن یه سوال دیگه هم پیش اومد، مسئله ۸وزیر چیه؟
این به زبان وطنی وجود داره: لینک (http://fa.wikipedia.org/wiki/%D9%85%D8%B3%D8%A6%D9%84%D9%87_%DA%86%D9%86%D8%AF_%D9%88%D8%B2%DB%8C%D8%B1)
ولی خوب از اونجا که انگار حال خوندن نداری، یک برنامه که تعداد حالت‌هایی رو نشون بده که ۸ تا وزیر رو در یک صفحه شطرنج گذاشت، بدون اینکه همدیگه رو بزنند.
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: سید مسعود امامیان در 06 آبان 1391، 11:01 ب‌ظ
کسی نمیخواد صورت مسئله رو بگه؟
غذا خوردن فیلسوفان یکی از مسائل معروف کامپیوتر مثل هشت‌وزیر هستش. اینجا می‌تونید در مورد اون بخونید: لینک (http://en.wikipedia.org/wiki/Dining_philosophers_problem)

اگه اون صفحه زبون وطنی هم بود نمیخوندمش چه برسه به الآن که انگلیسی هم هست!!

الآن یه سوال دیگه هم پیش اومد، مسئله ۸وزیر چیه؟

چگونه میشه 8 وزیر در یک صفحه شطرنج قرار بگیرند که همدیگر رو نزنن ! از بازگشتی میشه حلش کرد ! همین یه خورده یادم بود  :D یادمه استاد می خواست یکمی اذیت کنه 5 وزیر داده بود با سی شارپ بنویسیم  :D خدا حفظش کنه  :D
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: fery در 09 آبان 1391، 09:26 ب‌ظ
سلام. اشتباه املایی را من متوجه نشده بودم. ویرایش کردم.
راستش من هم متوجه منظور استاد نشدم. 3 شنبه کلاس داریم باز هم می پرسم. اما گفتند که برنامه نویسی تو حالت شل و کرنل هست.!! حالا این کد را که به زبان سی داریم. چطوری باید به صورت شل بشه.؟
سلام. دوستان استاد فرمودند به هر زبانی که دوست دارید بنویسید. فقط باید کد را دقیقا بتونید توضیح بدید.
حالا یه سوال: برای این مسله روش های حل مختلفی انگار وجود داره. به نظر شما کدام را من انتخاب کنم؟
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: feeruzy در 09 آبان 1391، 09:34 ب‌ظ
سلام. این دو تا مسئله جزء مسایل کلاسیک برنامه نویسی هستند. نهار خوردن فیلسوف ها اینه که n نفر دور یه میز نشستن و n-1 چنگال هست. اگر هر کسی چنگال سمت راست رو برداره یکی کم میاد و در مورد استفاده اشتراکی از منابع و بن بست و این جور حرفهاست. معمولا استادا برای سرکار گذاشتن و درگیرکردن مغز دانشجوها از این مسئله استفاده می کنند. یکی از روشهای حل این مسئله سمافور هست: S
یک جوابش رو هم من توی اینترنت سرچ کردم (زمان دانشجویی) و با یه سری توضیح ، شیر کردم. توی این لینک:


http://licence.mihanblog.com/post/127 (http://licence.mihanblog.com/post/127)
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: fery در 22 آبان 1391، 11:05 ب‌ظ
سلام.
من که این کد را پیدا کردم. باید توی اوبونتو اونرا اجرا کنم. توی ویندوز که
اصلا #include <pthread.h>
را نمی شناخت. باید چکارش کنم؟
http://rosettacode.org/wiki/Dining_philosophers#C
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: nixoeen در 22 آبان 1391، 11:39 ب‌ظ
باید کتابخانه pthread همراه برنامه لینک بشه.
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: دانیال بهزادی در 23 آبان 1391، 01:42 ق‌ظ
خب معلومه که ویندوز pthread رو نمی‌شناسه. pthread بسته‌ی مدیریتی نخ‌ها در یونیکسه و ویندوز شبه‌یونیکس نیست
توی اوبونتو هم اگه نصب نیست:
$ sudo apt-get install libpthread-*
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: fery در 25 آذر 1391، 01:14 ب‌ظ
سلام. pthread را هم نصب کردم و هنگام کامپایل خطا داد.
این کد:
http://rosettacode.org/wiki/Dining_philosophers#C

پیغام:
نقل‌قول
gcc -Wall -W -Werror phil.c -o compiledc
/tmp/ccAR95RS.o: In function `main':
phil.c:(.text+0x457): undefined reference to `pthread_create'
phil.c:(.text+0x477): undefined reference to `pthread_join'
collect2: ld returned 1 exit status
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: fery در 25 آذر 1391، 01:23 ب‌ظ
این دستور را زدم . انجام شد:
gcc -pthread -o phil phil.c
------------------------
حالا یه موضوع مهمتر. اینکه استاد فرمودند که کد را باید خط به خط توضیح بدهم ::) لطف می کنید توضیح بدید؟ من ۳ تا کتاب های مرجع سیستم عامل مربوط به این بخش را خوندم. اما کدشون با این فرق می کرد.
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: دانیال بهزادی در 26 آذر 1391، 01:37 ق‌ظ
دقیقاً با کدوم خطّش مشکل داری؟
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: fery در 28 آذر 1391، 11:51 ق‌ظ
سلام. اول اینکه هدرهای زیر کارشون چیه:
#include <stdlib.h>
#include <unistd.h>
#include <stdarg.h>
بعد این آرایه کارش چیه و نوع pthread_mutex_t چی هست:
pthread_mutex_t forks[N];
موضوع بعد هم کاری که در تابع PRINT داره رخ می ده. این تابع وظیفه اش چیه و ارگومانهاش چیند و ...

عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: دانیال بهزادی در 28 آذر 1391، 03:03 ب‌ظ
اون سه تا سرپرونده که استانداردهای سی در کتاب‌خانه‌ها، یونیکس و آرگومان‌ها هستن.
pthread_mutex_t سمافور انحصار متقابل برای غذا خوردنه
pthread_mutex_t forks سمافور انحصار متقابل برای برداشتن چنگاله
تابع print هم مخل کارهایی که انجام می‌شه رو به ما می‌ده. به خود مسأله ربطی نداره.

من به کد نگاه نکردم، از روی اسم متغیّرها چنین چیزی برمی‌آد. امکان داره جایی هم اشتباه کرده باشم
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: fery در 28 آذر 1391، 03:33 ب‌ظ
سلام. این تابع چی. کار این چیه؟
نقل‌قول
void* philosophize(void *a)
{
   int id = *(int*)a;
   print(id, 1, "%10s", names[id]);
   while(1) think(id), eat(id);

این خط چه کار می کنه؟
int id = *(int*)a;
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: vandu در 28 آذر 1391، 03:57 ب‌ظ
کسی که میخواد مسئله عذاخوردن فیلسوفان رو حل کنه دیگه نباید دغدغه syntax کدنویسی داشته باشه.
این مسئله مربوط میشه به درس سیستم عامل و فکر کنم پیش‌نیاز این درس برنامه نویسی پیشرفته باشه (که هست / اما با این مدل آموزش‌های امروزی عملا دانشجو چیزی یاد نمی‌گیره!)
شکل صحیح مسئله این هست:
پنچ نفر فیلسوف دور یه میز نشستن. اینها یا فکر می کنن یا اینکه غذا میخورن. جلوی هر کدوم یه بشقاب هست. و سمت چپ بشقاب هرکدوم یک عدد چوب برای غذا خوردن (مثل ژاپنی‌ها) به این چوب ها chopstick میگن. پس در حالت کلی برای n فیلسوف n بشقاب و n چوب برای غذا خوردن وجود داره. مثل این شکل:

(http://cs.mtu.edu/~shene/NSF-3/e-Book/MUTEX/DIAGRAM-philosopher.jpg)

در هر زمان ممکنه یکی از فیلسوفان بخواد غذا بخوره و از اونجایی که برای غذا خوردن به دوتا chopstick نیاز داره در دو مرحله اقدام به برداشتن چوب‌ها میکنه.
چند حالت پیش میاد.
یا اینکه هیچ چوبی رو نمی بینه یا فقط یه چوب رو می بینه که در این حالت چون عذاخوردن با یه چوب ممکن نیست بی‌خیال میشه و دوباره میره تو فکر.
حالت دوم اینه که هر دوتا چوب رو می‌بینه. پس در دو گام اقدام به برداشتن چوب ها می کنه.
در گام اول یک چوب رو برمیداره و در گام دوم چوب بعدی رو.
حالا مسئله مورد نظر همین جا شکل میگیره. فیسلوفی تا وقتی که کارش با چوب ها تموم نشه پسشون نمیده. در عین حال کسی هم نمی تونه مجبورش کنه که چوبی که برداشته رو پس بده. (مثل منبع چاپگر در سیستم که وقتی فرستادی برای چاپ دیگه رفته و نمیشه وسط کار که نصف صفحه چاپ شده قضیه رو کنسل کنی).
اما کجاش مسئله ساز میشه؟ فرض کنید که هر n تا فیلسوف با هم گرسنه‌شون بشه و همه‌گی با هم ببینن که دو تا چوب غذاخوری وجود داره و برن توی پروسه برداشتن چوب‌ها. بدتر از اون اینکه همگی همزمان با هم در گام اول چوب های یک سمت (مثلا سمت چپ) رو برمیدارن و در گام دوم که میخوان اقدام به برداشتن چوب دوم (سمت راست) کنن همه شون با هم به بن بست میرسن. در این حالت نه کسی می‌تونه غذابخوره و نه کسی چوبش رو پس میده. در حالت کلی فقط کسی چوبش رو پس میده که عذاش رو خورده باشه.

یک راه حل این مسئله استفاده از سمافور هست که دوستان هم اشاره کردن. اما سمافورها نمیتونن مسئله گرسنگی رو حل کنن (یعنی یه فیلسوف مادام منتظر بمونه تا بقیه غذاشون رو بخورن)
راه حل دیگه استفاده از ناظر (monitor) هست که به مراتب بهتر از سمافور قضیه رو حل می‌کنه.
شما برای حل این مسئله می‌بایست بحث مناطق بحرانی رو خوب بلد باشید و بعد اقدام به دادن نظریه و یا استفاده از ساختارهایی مثل سمافور یا ناظر برای حلش کنید.
موفق باشید.
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: دانیال بهزادی در 28 آذر 1391، 11:06 ب‌ظ
یک راه حل این مسئله استفاده از سمافور هست که دوستان هم اشاره کردن. اما سمافورها نمیتونن مسئله گرسنگی رو حل کنن (یعنی یه فیلسوف مادام منتظر بمونه تا بقیه غذاشون رو بخورن)
راه حل دیگه استفاده از ناظر (monitor) هست که به مراتب بهتر از سمافور قضیه رو حل می‌کنه.

اطّلاعات غلط نده دیگه! اگه نوبت‌بندی صف سمافور FIFO باشه هیچ وقت قحطی پیش نمی‌آد. در کتاب سیستم‌های عامل دکتر حقیقت، صفحه‌ی ۲۰۴ نوشته:
نقل‌قول
نکته: مزایای انحصار متقابل با استفاده از سمافور عبارت‌اند از:
۱. شرط انحصار متقابل را رعایت می‌کند.
۲. شرط پیشرفت را رعایت می‌کند.
۳. شرط انتظار مقیّد را رعایت می‌کند
۴. عادلانه است (اگر نوبت‌بندی صف آن FIFO باشد).
۵. «چند فرایندی» است.
۶. CPU را تلف نمی‌کند.
۷. مشکل اولویت معکوس ندارد.

بعد ناظر خودش داره در پشت صحنه‌ی قضیه از سمافور استفاده می‌کنه و تنها فرقش با حالت قبلی اینه که برنامه‌نویس سطح پایین خودش رو مستقیماً با سمافورها درگیر نمی‌کنه و کامپایلر خودش سمافورها رو براش جاسازی می‌کنه. چه‌طور می‌تونه «بهتر» از سمافور قضیه رو حل کنه؟
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: vandu در 29 آذر 1391، 02:00 ب‌ظ
آقای بهزادی عزیز برای اینکه تفاوت بین سمافور و مانیتور رو متوجه بشید این اسلاید رو ببینید. جواب سوال دوستمون هم توش هست:
http://www.engin.umd.umich.edu/~jinhua/winter03/cis450/lectures/semaphoresMonitors.ppt
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: دانیال بهزادی در 29 آذر 1391، 11:38 ب‌ظ
آقای بهزادی عزیز برای اینکه تفاوت بین سمافور و مانیتور رو متوجه بشید این اسلاید رو ببینید. جواب سوال دوستمون هم توش هست:
http://www.engin.umd.umich.edu/~jinhua/winter03/cis450/lectures/semaphoresMonitors.ppt

اون رو خوندم و درست هم بود. فقط چندتا نکته داره:
۱. صفحه‌ی ۱۱ داره می‌گه اگه درست از سمافور استفاده نشه ممکنه به بن‌بست یا قحطی بخوریم که خب برای ناظر هم همین قاعده برقراره. در واقع اگه بن‌بست یا قحطی پیش اومد به سمافور برنمی‌گرده، به اشتباه برنامه‌نویس برمی‌گرده.
۲. صفحه‌ی ۲۷ داره تفاوت‌ها رو از دیدگاه برنامه‌نویس رده‌پایین بررسی می‌کنه. کسی که نمی‌دونه در پشت صحنه چه خبره. و بلافاصله در صفحه‌ی ۲۸ نشون می‌ده که خود ناظر چه‌طور توسّط کامپایلر با همون سمافور پیاده سازی می‌شه
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: fery در 01 دی 1391، 11:11 ق‌ظ
سلام. این تابع چی. کار این چیه؟
نقل‌قول
void* philosophize(void *a)
{
   int id = *(int*)a;
   print(id, 1, "%10s", names[id]);
   while(1) think(id), eat(id);

این خط چه کار می کنه؟
int id = *(int*)a;
لطف می کنید اینرا پاسخ بدید.
عنوان: پاسخ : ناهار خوردن فیلسوفان در لینکس
ارسال شده توسط: vandu در 03 دی 1391، 08:18 ب‌ظ
سلام. این تابع چی. کار این چیه؟
نقل‌قول
void* philosophize(void *a)
{
   int id = *(int*)a;
   print(id, 1, "%10s", names[id]);
   while(1) think(id), eat(id);

این خط چه کار می کنه؟
int id = *(int*)a;
لطف می کنید اینرا پاسخ بدید.

یه بار پاسخ دادم ولی گویا پاک شده.
این خط محتویات محلی که آدرسش در ورودی تابع (اشاره‌گر a) هست رو به شکل عدد صحیح در متغیر id ذخیره می‌کنه...