کافیست تا یکم ریزتر به سیستم عامل نگاه کنید.
یک cpu هشت بیتی مربوط به سال 1990 رو در نظر بگیرید. نه یک i7 هشت هسته ای!.
خوب اگر این cpu می خواست که یک OS داشته باشد چه می شد؟
خیلی ساده. یک تایمر داشت که زمان رو براش اندازه می گرفت و بعد از اینکه زمان تمام می شد می رفت تابع بعدیش رو اجرا می کرد. دوباره که زمان تمام می شد به همین ترتیب. یعنی در یک نگاه ریز تر:
1-زمان آغاز می گردد.
2- دستورات اول اجرا می شود.
3- زمان تمام می شود.
4-وضعیت دستورات اول می رود در stack
5-دستورات دوم اجرا می شود.
6-زمان تمام می شود.
.
.
.
.
n- وضعیت دستورات اول از stack برداشته می شود.
n+1- دستورات اول اجرا می شود.
n+2 - زمان تمام می شود.
.
.
.
.
خوب رسیدیم به قیامت!
پس برای برنامه نویسیش هم کافیه تا حداقل یک تایمر جهت اندازه گیری زمان داشته باشید. این تایمر ها در 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 ها را خراب می کند.
موفق باشید.