XINU
Functions | Variables
resched.c File Reference

プロセスを再スケジューリングする。 More...

#include <xinu.h>
Include dependency graph for resched.c:

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...
 

Detailed Description

プロセスを再スケジューリングする。

Definition in file resched.c.

Function Documentation

◆ resched()

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().

23 {
24  struct procent *ptold; /* Ptr to table entry for old process */
25  struct procent *ptnew; /* Ptr to table entry for new process */
26 
27  /* If rescheduling is deferred, record attempt and return */
28 
29  if (Defer.ndefers > 0)
30  {
31  Defer.attempt = TRUE;
32  return;
33  }
34 
35  /* Point to process table entry for the current (old) process */
36 
37  ptold = &proctab[currpid];
38 
39  if (ptold->prstate == PR_CURR)
40  { /* Process remains eligible */
41  if (ptold->prprio > firstkey(readylist))
42  {
43  return;
44  }
45 
46  /* Old process will no longer remain current */
47 
48  ptold->prstate = PR_READY;
49  insert(currpid, readylist, ptold->prprio);
50  }
51 
52  /* Force context switch to highest priority ready process */
53 
55  ptnew = &proctab[currpid];
56  ptnew->prstate = PR_CURR;
57  preempt = QUANTUM; /* Reset time slice for process */
58  ctxsw(&ptold->prstkptr, &ptnew->prstkptr);
59 
60  /* Old process returns here when resumed */
61 
62  return;
63 }
pid32 currpid
現在実行中のプロセス。
Definition: initialize.c:32
#define PR_READY
プロセスが準備完了(READY)状態。
Definition: process.h:39
void ctxsw(void *, void *)
コンテキストスイッチを行う(ctxsw.S に定義がある)
bool8 attempt
延期中に再スケジューリングが実行されたかどうか
Definition: resched.h:21
#define firstkey(q)
リスト中の最初のプロセスのキーを返す。
pid32 dequeue(qid16)
プロセスキューテーブルからキューを削除し、リスト先頭のプロセスIDを返す。
Definition: queue.c:78
qid16 readylist
READY状態のプロセスリストに対するグローバルID.
Definition: ready.c:9
pri16 prprio
プロセスのスケジューリング優先度。
Definition: process.h:90
#define PR_CURR
プロセスが現在動作中。
Definition: process.h:37
#define TRUE
Boolean True(1)
Definition: kernel.h:65
#define QUANTUM
ミリ秒単位のタイムスライス
Definition: kernel.h:93
uint16 prstate
プロセス状態(PR_CURR, ..., etc)。
Definition: process.h:88
struct procent proctab[]
プロセステーブル。
Definition: initialize.c:23
struct defer Defer
遅延リスケジューリングに関連する項目を集約した構造体
Definition: resched.c:8
int32 ndefers
未処理の延期プロセスの数
Definition: resched.h:19
uint32 preempt
プリエンプションカウンタ
Definition: clkinit.c:9
status insert(pid32, qid16, int32)
優先度に基づいて、キューにプロセスを挿入する。
Definition: insert.c:20
プロセステーブル(32bitsの倍数)。
Definition: process.h:85
char * prstkptr
保存されたスタックポインタ。
Definition: process.h:92
Here is the call graph for this function:
Here is the caller graph for this function:

◆ resched_cntl()

status resched_cntl ( int32  defer)

再スケジューリングを延期させるか、もしくは許可させるかを制御する。

Parameters
[in]deferDEFER_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().

82 {
83  switch (defer)
84  {
85 
86  case DEFER_START: /* Handle a deferral request */
87 
88  if (Defer.ndefers++ == 0)
89  {
91  }
92  return OK;
93 
94  case DEFER_STOP: /* Handle end of deferral */
95  if (Defer.ndefers <= 0)
96  {
97  return SYSERR;
98  }
99  if ((--Defer.ndefers == 0) && Defer.attempt)
100  {
101  resched();
102  }
103  return OK;
104 
105  default:
106  return SYSERR;
107  }
108 }
bool8 attempt
延期中に再スケジューリングが実行されたかどうか
Definition: resched.h:21
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
#define OK
処理が成功した場合
Definition: kernel.h:77
#define FALSE
Boolean False(0)
Definition: kernel.h:63
#define DEFER_STOP
遅延リスケジューリングの停止
Definition: resched.h:10
#define DEFER_START
遅延リスケジューリングの開始
Definition: resched.h:8
遅延リスケジューリングに関連する項目を集約した構造体
Definition: resched.h:16
struct defer Defer
遅延リスケジューリングに関連する項目を集約した構造体
Definition: resched.c:8
int32 ndefers
未処理の延期プロセスの数
Definition: resched.h:19
void resched(void)
最優先の適切なプロセスにCPU実行権を渡す。
Definition: resched.c:22
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ Defer

struct defer Defer

遅延リスケジューリングに関連する項目を集約した構造体

defer構造体のextern宣言

Definition at line 8 of file resched.c.

Referenced by resched(), resched_cntl(), and sysinit().