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

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: ناهار خوردن فیلسوفان در لینکس  (دفعات بازدید: 13190 بار)

0 کاربر و 6 مهمان درحال مشاهده موضوع.

آفلاین fery

  • Jr. Member
  • *
  • ارسال: 66
  • جنسیت : پسر
پاسخ : ناهار خوردن فیلسوفان در لینکس
« پاسخ #15 : 22 آبان 1391، 11:05 ب‌ظ »
سلام.
من که این کد را پیدا کردم. باید توی اوبونتو اونرا اجرا کنم. توی ویندوز که
اصلا #include <pthread.h>
را نمی شناخت. باید چکارش کنم؟
http://rosettacode.org/wiki/Dining_philosophers#C
خدایا، این دنیا را بیهوده نیافریدی.

آفلاین nixoeen

  • ناظر انجمن
  • *
  • ارسال: 4872
  • جنسیت : پسر
  • masoft قدیم
پاسخ : ناهار خوردن فیلسوفان در لینکس
« پاسخ #16 : 22 آبان 1391، 11:39 ب‌ظ »
باید کتابخانه pthread همراه برنامه لینک بشه.

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19722
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
پاسخ : ناهار خوردن فیلسوفان در لینکس
« پاسخ #17 : 23 آبان 1391، 01:42 ق‌ظ »
خب معلومه که ویندوز pthread رو نمی‌شناسه. pthread بسته‌ی مدیریتی نخ‌ها در یونیکسه و ویندوز شبه‌یونیکس نیست
توی اوبونتو هم اگه نصب نیست:
$ sudo apt-get install libpthread-*
« آخرین ویرایش: 23 آبان 1391، 01:44 ق‌ظ توسط دانیال بهزادی »
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن

آفلاین fery

  • Jr. Member
  • *
  • ارسال: 66
  • جنسیت : پسر
پاسخ : ناهار خوردن فیلسوفان در لینکس
« پاسخ #18 : 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

  • Jr. Member
  • *
  • ارسال: 66
  • جنسیت : پسر
پاسخ : ناهار خوردن فیلسوفان در لینکس
« پاسخ #19 : 25 آذر 1391، 01:23 ب‌ظ »
این دستور را زدم . انجام شد:
gcc -pthread -o phil phil.c
------------------------
حالا یه موضوع مهمتر. اینکه استاد فرمودند که کد را باید خط به خط توضیح بدهم ::) لطف می کنید توضیح بدید؟ من ۳ تا کتاب های مرجع سیستم عامل مربوط به این بخش را خوندم. اما کدشون با این فرق می کرد.
خدایا، این دنیا را بیهوده نیافریدی.

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19722
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
پاسخ : ناهار خوردن فیلسوفان در لینکس
« پاسخ #20 : 26 آذر 1391، 01:37 ق‌ظ »
دقیقاً با کدوم خطّش مشکل داری؟
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن

آفلاین fery

  • Jr. Member
  • *
  • ارسال: 66
  • جنسیت : پسر
پاسخ : ناهار خوردن فیلسوفان در لینکس
« پاسخ #21 : 28 آذر 1391، 11:51 ق‌ظ »
سلام. اول اینکه هدرهای زیر کارشون چیه:
#include <stdlib.h>
#include <unistd.h>
#include <stdarg.h>
بعد این آرایه کارش چیه و نوع pthread_mutex_t چی هست:
pthread_mutex_t forks[N];
موضوع بعد هم کاری که در تابع PRINT داره رخ می ده. این تابع وظیفه اش چیه و ارگومانهاش چیند و ...

خدایا، این دنیا را بیهوده نیافریدی.

آفلاین دانیال بهزادی

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

من به کد نگاه نکردم، از روی اسم متغیّرها چنین چیزی برمی‌آد. امکان داره جایی هم اشتباه کرده باشم
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن

آفلاین fery

  • Jr. Member
  • *
  • ارسال: 66
  • جنسیت : پسر
پاسخ : ناهار خوردن فیلسوفان در لینکس
« پاسخ #23 : 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

  • Hero Member
  • *
  • ارسال: 741
  • جنسیت : پسر
پاسخ : ناهار خوردن فیلسوفان در لینکس
« پاسخ #24 : 28 آذر 1391، 03:57 ب‌ظ »
کسی که میخواد مسئله عذاخوردن فیلسوفان رو حل کنه دیگه نباید دغدغه syntax کدنویسی داشته باشه.
این مسئله مربوط میشه به درس سیستم عامل و فکر کنم پیش‌نیاز این درس برنامه نویسی پیشرفته باشه (که هست / اما با این مدل آموزش‌های امروزی عملا دانشجو چیزی یاد نمی‌گیره!)
شکل صحیح مسئله این هست:
پنچ نفر فیلسوف دور یه میز نشستن. اینها یا فکر می کنن یا اینکه غذا میخورن. جلوی هر کدوم یه بشقاب هست. و سمت چپ بشقاب هرکدوم یک عدد چوب برای غذا خوردن (مثل ژاپنی‌ها) به این چوب ها chopstick میگن. پس در حالت کلی برای n فیلسوف n بشقاب و n چوب برای غذا خوردن وجود داره. مثل این شکل:


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

یک راه حل این مسئله استفاده از سمافور هست که دوستان هم اشاره کردن. اما سمافورها نمیتونن مسئله گرسنگی رو حل کنن (یعنی یه فیلسوف مادام منتظر بمونه تا بقیه غذاشون رو بخورن)
راه حل دیگه استفاده از ناظر (monitor) هست که به مراتب بهتر از سمافور قضیه رو حل می‌کنه.
شما برای حل این مسئله می‌بایست بحث مناطق بحرانی رو خوب بلد باشید و بعد اقدام به دادن نظریه و یا استفاده از ساختارهایی مثل سمافور یا ناظر برای حلش کنید.
موفق باشید.
Nothing is particularly hard if you divide it into small jobs

Henry Ford

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19722
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
پاسخ : ناهار خوردن فیلسوفان در لینکس
« پاسخ #25 : 28 آذر 1391، 11:06 ب‌ظ »
یک راه حل این مسئله استفاده از سمافور هست که دوستان هم اشاره کردن. اما سمافورها نمیتونن مسئله گرسنگی رو حل کنن (یعنی یه فیلسوف مادام منتظر بمونه تا بقیه غذاشون رو بخورن)
راه حل دیگه استفاده از ناظر (monitor) هست که به مراتب بهتر از سمافور قضیه رو حل می‌کنه.

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

بعد ناظر خودش داره در پشت صحنه‌ی قضیه از سمافور استفاده می‌کنه و تنها فرقش با حالت قبلی اینه که برنامه‌نویس سطح پایین خودش رو مستقیماً با سمافورها درگیر نمی‌کنه و کامپایلر خودش سمافورها رو براش جاسازی می‌کنه. چه‌طور می‌تونه «بهتر» از سمافور قضیه رو حل کنه؟
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن

آفلاین vandu

  • Hero Member
  • *
  • ارسال: 741
  • جنسیت : پسر
پاسخ : ناهار خوردن فیلسوفان در لینکس
« پاسخ #26 : 29 آذر 1391، 02:00 ب‌ظ »
آقای بهزادی عزیز برای اینکه تفاوت بین سمافور و مانیتور رو متوجه بشید این اسلاید رو ببینید. جواب سوال دوستمون هم توش هست:
http://www.engin.umd.umich.edu/~jinhua/winter03/cis450/lectures/semaphoresMonitors.ppt
Nothing is particularly hard if you divide it into small jobs

Henry Ford

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19722
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
پاسخ : ناهار خوردن فیلسوفان در لینکس
« پاسخ #27 : 29 آذر 1391، 11:38 ب‌ظ »
آقای بهزادی عزیز برای اینکه تفاوت بین سمافور و مانیتور رو متوجه بشید این اسلاید رو ببینید. جواب سوال دوستمون هم توش هست:
http://www.engin.umd.umich.edu/~jinhua/winter03/cis450/lectures/semaphoresMonitors.ppt

اون رو خوندم و درست هم بود. فقط چندتا نکته داره:
۱. صفحه‌ی ۱۱ داره می‌گه اگه درست از سمافور استفاده نشه ممکنه به بن‌بست یا قحطی بخوریم که خب برای ناظر هم همین قاعده برقراره. در واقع اگه بن‌بست یا قحطی پیش اومد به سمافور برنمی‌گرده، به اشتباه برنامه‌نویس برمی‌گرده.
۲. صفحه‌ی ۲۷ داره تفاوت‌ها رو از دیدگاه برنامه‌نویس رده‌پایین بررسی می‌کنه. کسی که نمی‌دونه در پشت صحنه چه خبره. و بلافاصله در صفحه‌ی ۲۸ نشون می‌ده که خود ناظر چه‌طور توسّط کامپایلر با همون سمافور پیاده سازی می‌شه
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن

آفلاین fery

  • Jr. Member
  • *
  • ارسال: 66
  • جنسیت : پسر
پاسخ : ناهار خوردن فیلسوفان در لینکس
« پاسخ #28 : 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

  • Hero Member
  • *
  • ارسال: 741
  • جنسیت : پسر
پاسخ : ناهار خوردن فیلسوفان در لینکس
« پاسخ #29 : 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 ذخیره می‌کنه...
Nothing is particularly hard if you divide it into small jobs

Henry Ford