XINU
|
プロセスを再スケジューリングする。 More...
#include <xinu.h>
Go to the source code of this file.
Functions | |
void | resched (void) |
最優先の適切なプロセスにCPU実行権を渡す。 More... | |
status | resched_cntl (int32 defer) |
再スケジューリングを延期させるか、もしくは許可させるかを制御する。 More... | |
Variables | |
struct defer | Defer |
遅延リスケジューリングに関連する項目を集約した構造体 More... | |
プロセスを再スケジューリングする。
Definition in file resched.c.
void resched | ( | void | ) |
最優先の適切なプロセスにCPU実行権を渡す。
resched()は、割り込みが禁止された区間で使用される事を想定している。
Step1. 再スケジューリングを遅延させられている場合、再スケジュールを試みた事を記録して終了する。
Step2. カレント(古い)プロセスのプロセステーブルを取得する
Step3. 「カレントプロセスが現在動作中」かつ「READYリスト先頭プロセスより高優先度」の場合は終了する。
Step4. カレントプロセスの状態を実行中からREADY状態に遷移させ、READYリストに挿入する。
Step5. カレントPIDをREADYリストの先頭プロセスとし、そのプロセスをREADY状態から実行状態に遷移させる。
Step6. プリエンプション(実行中のタスクを一時的に中断する動作)のためのタイムスライスを設定する。
Step7. 古いプロセスから新しいプロセスへコンテキストスイッチを行う。
Step8. 古いプロセスはresume()後に、resched()を即座にリターンする。
Definition at line 22 of file resched.c.
References defer::attempt, ctxsw(), currpid, Defer, dequeue(), firstkey, insert(), defer::ndefers, PR_CURR, PR_READY, preempt, proctab, procent::prprio, procent::prstate, procent::prstkptr, QUANTUM, readylist, and TRUE.
Referenced by clkhandler(), kill(), ready(), receive(), recvtime(), resched_cntl(), sleepms(), suspend(), wait(), and yield().
再スケジューリングを延期させるか、もしくは許可させるかを制御する。
[in] | defer | DEFER_START(延期開始)か、DEFER_STOP(延期終了)を指定する。 |
resched_cntl()は、割り込みが禁止された区間で使用される事を想定している。
引数がDEFER_STARTの場合、以下を実行後にOKを返して終了する。
・延期されたプロセス数が0の場合は、その数を1に変更
・延期されたプロセス数が0の場合は、延期中の再スケジューリングは未実施に変更
引数がDEFER_STOPの場合、以下を実行する。
・延期されたプロセス数が負の値の場合は、SYSERRを返す。
・「延期されたプロセスが1の場合」かつ「延期中に再スケジューリング実施済み」の場合は再スケジューリングを実施し、OKを返す。 引数が不正な値の場合は、SYSERRを返す。
Definition at line 81 of file resched.c.
References defer::attempt, Defer, DEFER_START, DEFER_STOP, FALSE, defer::ndefers, OK, resched(), and SYSERR.
Referenced by ethhandler(), icmp_release(), irq_dispatch(), semdelete(), semreset(), signaln(), ttyhandler(), udp_release(), and wakeup().