150 likes | 228 Views
オペレーティングシステム ( プロセス管理とスケジューリング ). 2009 年 10 月 5 日 酒居敬一 ( sakai.keiichi@kochi-tech.ac.jp ) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/OS/2009/. ハードウェアのリセット処理によりプロセッサが働き始める。つまり、リセットベクタで指定されたプログラムを実行する. 初期化中. 稼動状態. 電源オン. POST. I/O のチェック メモリチェック 初期化. ブートストラップ. IPL. OS. IPL を読み込む.
E N D
オペレーティングシステム(プロセス管理とスケジューリング)オペレーティングシステム(プロセス管理とスケジューリング) 2009年10月5日 酒居敬一(sakai.keiichi@kochi-tech.ac.jp) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/OS/2009/
ハードウェアのリセット処理によりプロセッサが働き始める。つまり、リセットベクタで指定されたプログラムを実行するハードウェアのリセット処理によりプロセッサが働き始める。つまり、リセットベクタで指定されたプログラムを実行する 初期化中 稼動状態 電源オン POST I/Oのチェック メモリチェック 初期化 ブートストラップ IPL OS IPLを読み込む コマンドインタプリタ OSを読み込みシステムタスクとして稼動 ユーザ・タスク1 ユーザ・タスク2 OSの初期化終了後、コマンド・インタプリタを起動 ユーザーからのコマンドを処理する ユーザ・タスクn
プロセスの概念(23ページ) • プロセッサを抽象化したもの • プログラム、データ、レジスタの中身… を含む • 固有の記憶空間が与えられる • 記憶空間などを共有しているもの→スレッド • スレッドとプロセスを明確に区別しない→タスク • 実行のひとつの単位 • プロセスは(理想的には)複数が同時に走行 • (現実にはプロセッサはプログラムを処理するために使われる資源で、複数のプロセスで共有)→次回
並行処理と並列処理 • 並行処理(Concurrent Processing) • 複数のプロセスにより処理すること • 複数のジョブが互いに独立したプロセスになる • 並列処理(Parallel Processing) • 複数のプロセスにより処理すること • ひとつのジョブを複数のプロセスに分割
タスクとジョブ • タスクはコンピュータからみた仕事の単位 • シングルタスクOS • ひとつのタスクしか扱わないOS • マルチタスクOS • 複数のタスクを扱えるようにしたOS • ジョブは人間からみて目的のある一区切りの仕事 • 逐次的なジョブ処理 • シングルタスクOSでもマルチタスクOSでも処理できる • 並行的なジョブ処理 • マルチタスクOSでないと処理できない ※ タスクはプロセスとスレッドを区別しない言い方
ジョブ管理とタスク管理の関係 • ジョブ実行のスケジューリング • 並行的(マルチジョブ) • 資源の量と全体の処理時間をもとに、優先度をつけて処理 • 逐次的(シングルジョブ) • ただ順番に処理する。スケジューリングの必要がない。 • タスク実行のスケジューリング • 機械的に処理される。 • タスクはOSからみた仕事の単位であるから。 • OSが資源の利用状況を見ながら、スケジューリング
ハードウェアの管理 • Uni-Processor • 管理する主体(=プロセッサ)がひとつ • つまり、プロセスの実行管理だけを考えればよい • Multi-Processor • 管理する主体が複数ある • どのプロセッサが何を管理するか、という管理も必要! • 計算機の実装方式が複数ある • OS内部の管理表は唯一でなければならないが、 • 複数プロセッサ間で管理のための方法が単一ではない!
プロセスの構造(25ページ) • テキストセグメント • データセグメント • ヒープ領域 • スタックセグメント • 共有セグメント • レジスタコンテキスト
レジスタコンテキスト • プロセッサの持つレジスタの内容 • 汎用レジスタ • 浮動小数点数レジスタ • プログラムカウンタ、リンクレジスタ • スタックポインタ、フレームポインタ • ステータスレジスタ • マルチメディア拡張のためのレジスタ
プロセス管理 • プロセス制御ブロックPCB(Process Control Block) • プロセスの状態 • 実行可、待ち、消滅中、など • コンテキスト • レジスタ、資源管理表 • 優先順位 • タイムスライス、実行優先度、経過時間、など • PCBは線形リストを形成する • 線形リストによりキューを実現 • 線形リストはタスクの状態ごとに存在する
タスク構造体 • プロセスやスレッドの状態 • スケジューリングポリシー • 仮想記憶 • スレッドの情報 • /usr/src/linux/include/linux/sched.hstruct task_struct がLinux OSのタスク構造体 • current が参照するタスクが現在実行中のタスク • タスク構造体型のデータはカーネル空間に存在 • タスク構造体から参照される管理表は多い
プロセスの存在形態(27ページ) 実行中タスク 実行可能タスク 実行待ちタスク 入出力 仮想記憶処理 登録済タスク 条件待ちタスク 通信 タスク 異常停止タスク 同期 未登録タスク 実行不可能タスク 生成中タスク その他条件 消滅中タスク
[sakai@star linux]$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 1368 444 ? S Sep03 0:04 init [3] root 1300 0.0 0.1 1444 580 ? S Sep03 0:02 syslogd -m 0 root 1304 0.0 0.0 1364 420 ? S Sep03 0:00 klogd -x rpc 1314 0.0 0.1 1544 600 ? S Sep03 0:00 portmap root 1403 0.0 0.1 1484 536 ? S Sep03 0:00 /usr/sbin/automou named 1417 0.0 0.7 39980 3836 ? S Sep03 0:00 /usr/sbin/named - root 1456 0.0 0.1 2076 856 ? S Sep03 0:00 xinetd -stayalive ntp 1469 0.0 0.4 2392 2384 ? SL Sep03 0:08 ntpd -U ntp -g lp 1487 0.0 0.8 11800 4412 ? S Sep03 0:13 lpd Waiting root 1563 0.0 0.2 2520 1528 ? S Sep03 0:01 /usr/sbin/dhcpd e root 1630 0.0 0.1 1416 552 ? S Sep03 0:02 crond xfs 1688 0.0 0.9 9780 4944 ? S Sep03 0:21 xfs -droppriv -da root 1697 0.0 0.2 5800 1532 ? S Sep03 0:00 smbd -D root 1701 0.0 0.2 4636 1312 ? S Sep03 0:14 nmbd -D daemon 1719 0.0 0.0 1408 508 ? S Sep03 0:00 /usr/sbin/atd root 1857 0.0 0.1 2280 752 ? S Sep03 0:00 login -- sakai root 1858 0.0 0.0 1344 340 tty2 S Sep03 0:00 /sbin/mingetty tt sakai 1881 0.0 0.1 5352 980 tty1 S Sep03 0:00 -bash sakai 1910 0.0 0.0 2332 484 tty1 S Sep03 0:00 xinit root 1911 0.5 9.2 95476 47424 ? S Sep03 344:10 X -auth /home/sak sakai 1915 0.0 0.3 7076 1560 tty1 S Sep03 0:00 kterm -fn 8x16 -f sakai 1921 0.0 1.0 13416 5304 tty1 S Sep03 1:43 gkrellm -g -0+0 sakai 1931 0.0 1.6 25148 8668 tty1 S Sep03 0:14 twm sakai 1943 0.0 0.1 5348 972 pts/4 S Sep03 0:00 bash root 436 0.0 0.4 6220 2544 ? S Sep13 0:00 sendmail: accepti smmsp 444 0.0 0.4 6016 2308 ? S Sep13 0:00 sendmail: Queue r sakai 18193 0.0 0.5 8960 2628 tty1 S Oct09 0:01 aumix-X11 sakai 30076 0.1 8.8 121468 45784 tty1 R Oct19 1:54 /usr/lib/mozilla- sakai 32189 0.0 0.1 2724 776 pts/12 R 11:44 0:00 ps aux プロセスの状態
例: プロセスの待ち状態 入出力待ちの場合、デバイスのほうにキューを持たせる struct lp_struct { struct pardevice *dev; unsigned long flags; unsigned int chars; unsigned int time; unsigned int wait; char *lp_buffer; #ifdef LP_STATS unsigned int lastcall; unsigned int runchars; struct lp_stats stats; #endif wait_queue_head_t waitq; unsigned int last_error; struct semaphore port_mutex; wait_queue_head_t dataq; long timeout; unsigned int best_mode; unsigned int current_mode; unsigned long bits; }; struct __wait_queue { unsigned int flags; #define WQ_FLAG_EXCLUSIVE 0x01 struct task_struct * task; struct list_head task_list; #if WAITQUEUE_DEBUG long __magic; long __waker; #endif }; typedef struct __wait_queue wait_queue_t; struct __wait_queue_head { wq_lock_t lock; struct list_head task_list; #if WAITQUEUE_DEBUG long __magic; long __creator; #endif }; typedef struct __wait_queue_head wait_queue_head_t;
スケジューリング(28ページ) • 現実にはCPU数がプロセス数より少ない • プロセススケジューリングのアルゴリズム • プロセスにCPUを割付たり取り上げたりする • プロセスのディスパッチャー B-sh系 /usr/bin/time gogo -test 1000>a 2>&1 & nice -19 /usr/bin/time gogo -test 1000 >b 2>&1 & C-sh系 /usr/bin/time gogo -test 1000 > & a & nice +19 /usr/bin/time gogo -test 1000 > & b &