ورود

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



Life24
12-03-2013, 11:03
سلام

شاید بشه گفت من هیچی گیر نیوردم :n03:
بستگی سرچ زدم . گوگل هم که داغونه نتایج جاهای دیگه هم زیاد جالب نیست.
میخوام فلان تابع رو که اسمش مثلا Test هست . حالا به واسطه ترد که مخصوص خودش داره.
بگم شما 4 ثانیه اجرا بشو و تمام.
ترد 2 مثلا 14 ثانیه اجرا بشو و هر چی میتونی مثلا یک پیغام تو این 14 ثانیه بده خروجی بعد دیگه تمام
یا suspend بشه. کلا دیگه قدرت اجرایی نداشته باشه تا وقتی ما نخواهیم.
فکر کنم باید راه حل ابتکاری داشته باشیم چون تابعی ندیدم

iKode
12-03-2013, 11:55
همچین تابعی نیست شما می تونید یه ترد و اجرا بزارید بعد از 4 ثانیه اون ترد و معلق و یکی دیگه رو بزارید تابعی اینچنینی براش وجود نداره حالا برای چی میخوایی اینطوری بشه؟

Life24
12-03-2013, 11:57
همچین تابعی نیست شما می تونید یه ترد و اجرا بزارید بعد از 4 ثانیه اون ترد و معلق و یکی دیگه رو بزارید تابعی اینچنینی براش وجود نداره حالا برای چی میخوایی اینطوری بشه؟


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

_H2_
16-03-2013, 00:45
سلام
همانطورکه دوستمان اشاره کردند میتوانید از متدهای Suspend و Resume جهت توقف موقتی و ادامه به کار مجدد ریسمان استفاده کنید.
از متدهایی مانند Abort هم میتوانید جهت توقف اجباری ریسمان استفاده کنید (چیزی شبیه EndTask)

دیگر نمیدانم به چه چیزی اضافه ای برای کارتان نیاز دارید...

Life24
16-03-2013, 12:09
سلام
همانطورکه دوستمان اشاره کردند میتوانید از متدهای Suspend و Resume جهت توقف موقتی و ادامه به کار مجدد ریسمان استفاده کنید.
از متدهایی مانند Abort هم میتوانید جهت توقف اجباری ریسمان استفاده کنید (چیزی شبیه EndTask)

دیگر نمیدانم به چه چیزی اضافه ای برای کارتان نیاز دارید...

سلام.
ممنون از شما
مشکل زمان است.
چطور بگم مثلا 4 ثانیه اجرا بشه بعد sus یا abort بشه. این زمانبندی کردنش اذیت میکنه.
میشه مثالی برای ما بزارید تا بفهمیم ؟ ممنونم

Msba
16-03-2013, 23:11
کافیست تا یکم ریزتر به سیستم عامل نگاه کنید.
یک cpu هشت بیتی مربوط به سال 1990 رو در نظر بگیرید. نه یک i7 هشت هسته ای!.
خوب اگر این cpu می خواست که یک OS داشته باشد چه می شد؟
خیلی ساده. یک تایمر داشت که زمان رو براش اندازه می گرفت و بعد از اینکه زمان تمام می شد می رفت تابع بعدیش رو اجرا می کرد. دوباره که زمان تمام می شد به همین ترتیب. یعنی در یک نگاه ریز تر:
1-زمان آغاز می گردد.
2- دستورات اول اجرا می شود.
3- زمان تمام می شود.
4-وضعیت دستورات اول می رود در stack
5-دستورات دوم اجرا می شود.
6-زمان تمام می شود.
.
.
.
.
n- وضعیت دستورات اول از stack برداشته می شود.
n+1- دستورات اول اجرا می شود.
n+2 - زمان تمام می شود.
.
.
.
.
خوب رسیدیم به قیامت!:n02:
پس برای برنامه نویسیش هم کافیه تا حداقل یک تایمر جهت اندازه گیری زمان داشته باشید. این تایمر ها در CPU ها با SysTickTimer شناخته می شوند. که رابطه مستقیمی با زمان دارند.( در برخی از CPU ها از RTC جهت Systick استفاده می شود.)

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

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگر مشکلی در نمایش داشته دوباره اجرا کنید.(احساس می کنم این عمل مربوط به بافر Console باشد.)

در مثال بالا من یک اولویت بالا برای Thread شماره 1 ایجاد کردم. با این کار این Thread دوبرابر Thread های دیگر اجرا می شود.(البته این بسته به تنظیمات const های شما داره اما با این تنظیمات 2برابر هست.)
در اینجا اصلا ما چیزی رو stack نکردیم. چرا؟
چون ما از thread ها خارج نشدیم. بلکه آن ها را متوقف کردیم. این در واقع کاری است که ما به کمک OS اصلی انجام دادیم.اگر می خواستیم از این ویژگی OS صرفه نظر کنیم می بایست یک کلاس stack تعریف و وضعیت شمارش گر thread که همان i باشد رو push کنیم(قرار دادن درstack). آنگاه می شد Thread ها را abort کرد و سپس با واکشی استک(POP) اون Thread رو به حالت قبل برگردوند.
استفاده از suspend و resume توصیه نمی شود. اما اینجا مثال را ساده تر می کرد.
اگر می خواستیم از این دو متد استفاده نکنیم یک semaphore می توانست شبیه ساز کاملا یک cpu تک هسته ای تا n هسته ای برا ما باشد. این کار کمی مثال را پیچیده تر می کرد.

کد بسیار ساده عمل می کند. با یک debug ساده می توان رفتار آن را فهمید اما برای نتیجه کلی نباید در حالت debug بود.(use: CTRL+F5)چرا؟ چون debug همزمانی thread ها را خراب می کند.

موفق باشید.

Life24
18-03-2013, 10:25
سلام
بسیار بسیار از زحماتت ممنون. فقط آیا در این کد امکان داره من شی بسازم که یک عدد به عنوان میلی ثانیه بهش بدم و بره اون قدر اجرا بشه؟
یا تابع داشته باشیم؟

امکان هست لطف کنید توضیح دهید از نحوه کار؟ واقعا ممنون و شرمنده میشیم

Msba
18-03-2013, 14:41
توضیح کد با توجه به مدت زمان اجرا:

شما priority های مختلف تعیین کنید و برای هر اولویت یک زمان اجرای مشخص. در کد بالا من فقط سطح 0 رو نوشتم که خودتون می تونید گسترشش بدید.
آلان همین وضعیت ها این طوری هست که هر یک ثانیه روند اجرا به یک Thread دیگه منتقل می شه به غیر از اونی که اولویت 0 رو داره که دوثانیه اجرا می شه.
توضیح:
هر تیک در 50 میلی ثانیه.
هر 20 تیک = تغییر روند به ریسمان دیگر.
اگر سطح اولویت های متفاوت تعریف شود می شود که هر کدام چند Tick با زمان 50 میلی ثانیه اجرا شوند.

شما زمان هر تیک رو بگذارید 10 میلی ثانیه. تغییر تیک رو هم از 20 به 5 تغییر دهید. آنگاه هر Thread هر 50 میلی ثانیه تغییر خواهد کرد. و اولویت صفر با این وضعیت 100 میلی ثانیه زمان اجرا دارد و مابقی همان 50 میلی ثانیه.




فقط آیا در این کد امکان داره من شی بسازم که یک عدد به عنوان میلی ثانیه بهش بدم و بره اون قدر اجرا بشه؟
یا تابع داشته باشیم؟
م

برای این کار داستان کاملا متفاوت هست. شما در کلاس جدیدی که می سازید یک Thread و یک StopWatch تعریف کنید. Thread را استارت کنید.کرنموتر رو نیز همین طور. یک متغیر Volatile از نوع bool بسازید که نمایانگر اتمام تابع Thread شما باشد. در همان Thread که instance کلاس اصلی شما باشد که یک حلفه مدت زمان سپری شده و اتمام کار Thread را بررسی کند. اگر زمان گذشت و Thread تمام نشد آن را Abort کنید.

موفق باشید.