パスワードを忘れた? アカウント作成
662365 journal

tarosukeの日記: 俺OS ii 7

日記 by tarosuke

調子に乗って続けてみる。設計メモも兼ねてるんだけど。
番号に意味が無いので番号振るのはやめ。

TCB定義
        なにはなくともとにかくキュー。キューに必要なメンバを記述する
        だけで半分は終ったようなもんだ。で、次は時間待ち用キュー。そ
        れと時間切れ時刻をtick値で格納する場所を作る。

        次はスケジューリングに必要なメンバ。優先度だ。今回は前回と違
        って天井付き優先度継承をするつもりなので優先度の初期値も必要
        になる。

        「とにかくキュー」なんて言う理由は、タスクの状態=タスクが繋
        がっている場所だからだ。たとえばレディキューに繋がっていれば
        それは実行可能だし、セマフォに繋がっていればセマフォ待ちとい
        うことになる。

        実際「タスクの状態」という情報は冗長だ。今回使うキューにはそ
        れ自身の所属を示すハンドルも付いてるし。

レディキュー
        実行可能なタスクをぶら下げておく優先度別のキューにすることが
        多い。少なくともRTOSでは。その辺にあるPC用OSでは優先度が
        256だとか65536だとかある場合があるけど、そんなものは8段で
        十分だ。スケジューラがレディキューを走査するので優先度は無闇
        に増やさない方がいいし。

        それに最低優先度以外のタスクはさっさと待ちに入る義務があるの
        で、タスクがちゃんと作られてれば実際には優先度は4段くらいで
        も大丈夫。「さっさと」の度合は優先度と同じ。つまり優先度が高
        い程CPUをとっとと手放さなければならない。具体的には最低限の
        処理をした後で下位優先度のタスクを起こして後の処理を任せて自
        分は寝てしまう(次のイベントを待つ)。

        これが守られてないとシステムの動作がギクシャクしたりイベント
        を逃したりするのでこれは結構重要。ちなみに同一優先度での優先
        順位は早い者勝ち。

        最低優先度のタスクはある意味特別で定期的に強制的に回してラウ
        ンドロビンでスケジュールされる。この優先度のタスクは待ちに入
        る義務がないのでこれは必要な操作だ。ちなみにキューをリング構
        成で作っておくとキューを回すのが非常に軽くなる。

        ここでチケットスケジューリングしてもいいかも知らんけど、重い
        割に効果がなさそうなのでパス。

タスクディスパッチャ
        これがアーキテクチャに依存してて難しい所。たとえばix86なら
        CPUのコンテキスト切り替えはサポートがある。でも他のCPUでは
        サポートがなかったり形式が全然違ったりする。

        私は割り込みハンドラをディスパッチャにする方法が好みなのだが
        こうなるとix86のコンテキスト切り替えサポートが邪魔に思えて
        きたりする。TCBの形式を決められてしまうのも嫌だ。

        というわけでこれに関しては悩み中。何も使わないできないかな。

仮想メモリ&メモリ管理
        ページ管理構造体を定義してみた。またもやとりあえずキュー。そ
        れから実メモリのページ番号。ディスクキャッシュは仮想メモリ側
        に置いた方がやりやすそうだ。

        最初に全ページング対象実メモリをプールにしておいて、仮想メモ
        リ側には最初は何も割り当てないでページフォルトの度に実メモリ
        を割り当てていく。という寸法でいこうと思ってる。

        適当なアドレスをアクセスすればそこにリアルタイムでページがあ
        てがわれていくような感じになる。足を置いた所に床が出来るよう
        なもんだ。

        プールの管理はページ数に対してO(1)なアルゴリズムを使うので
        時間的にもあまり問題はないと思う。ここでもまたキューを使うわ
        けだが。

        ページを取り出す時にメモリプール、読み込みディスクキャッシュ
        ダーティバッファの順に取り出すようにすれば無駄が少なくていい
        かも。キャッシュのページは使ったらキューの頭(尻尾)に付け直せ
        ば尻尾(頭)は確実に古いし。

        明示的に開放されたりプロセスが終了したらそのページをプールに
        戻す。ページスワップはそのうちに。まだやんない。

        と、ここまで設計。

今日は出社して仕事してきたのでここまで。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

物事のやり方は一つではない -- Perlな人

読み込み中...