スレッドとプロセス 本題: スケジューリング

Slides:



Advertisements
Similar presentations
システムプログラミング 第11回 シグナル 情報工学科 篠埜 功. 今回の内容 前回の補足( exit システムコールについ て) プロセス間通信 – シグナルの送信 --- 今回の内容 – パイプによる通信 – ソケットによる通信.
Advertisements

ネットワーク・プログラミ ング カーネルの役割とプロセス生成. 1.1 OS の役割 仮想マシン OS はハードウェアの多様性 をカプセル化し、利用者を 複雑な処理から開放する。 プロセス管理 時間多重化により各プロセ スに CPU を割当てる。 メモリ管理 メモリ空間の多重化により、 各プロセスにメモリを割当.
プロセスの生成とコマンドの実行 プロセスの生成とコマンドの実行 プロセス生成のシステムコール プロセス生成のシステムコール プロセス生成のプログラム例 プロセス生成のプログラム例 プログラム実行のシステムコール プログラム実行のシステムコール 子プロセスの終了を待つシステムコール 子プロセスの終了を待つシステムコール.
システムプログラミング 第10回 情報工学科 篠埜 功. 今回の内容 プロセス(続き) – execve システムコール 現在のプロセスを、引数に与えられたファイル(実行 形式ファイルあるいはシェルスクリプト等の実行可能 なファイル)を受け取り、現在のプログラムをそれで 置き換える(変身)。 fork.
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
第2回 プロセス管理 ジョブ、プロセスとは? プロセスの状態遷移 プロセス制御ブロック スケジューリング.
オペレーティングシステム 第3回 プロセスの管理とスケジューリング
システムソフトウェア講義の概要 計算機システムの復習:中央演算処理装置(CPU),プログラムの実行,主記憶装置,補助記憶装置
計算機システム概論・3回目 本日のトピック:割込みと入出力制御について 割込み制御について 問題点の明確化 割込みとは
セキュリティ機構のオフロードを考慮した仮想マシンへの動的メモリ割当
榮樂 英樹 LilyVM と仮想化技術 榮樂 英樹
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
テープ(メモリ)と状態で何をするか決める
スレッドとプロセス 本題: スケジューリング
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
仮想マシンの並列処理性能に対するCPU割り当ての影響の評価
計算機システム概論・2回目 本日のトピック:プロセスについて プロセスとは プロセスのスケジューリングについて 多重プロセスの問題 排他制御
App. A アセンブラ、リンカ、 SPIMシミュレータ
プログラムはなぜ動くのか.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
担当:青木義満、篠埜 功 情報工学科 3年生対象 専門科目 システムプログラミング 第8回、第9回 シグナル処理 担当:青木義満、篠埜 功
第3回 CPUの管理と例外処理 OSによるハードウェアの管理 CPUの構成、動作 CPUの管理 例外処理、割り込み処理 コンテキストスイッチ
オペレーティングシステム (割り込み処理)
Linuxカーネルについて 2014/01.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
第5回 CPUの役割と仕組み3 割り込み、パイプライン、並列処理
割 込 み(1) オペレーティングシステム No.5.
オペレーティングシステム i386アーキテクチャ(2)
割り込み.
割り込み.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
シグナル通信 普通の割込みとソフトウェア割込み ソフトウェア割込みとシグナル キーボードからのシグナル 例外 (exception)
Ibaraki Univ. Dept of Electrical & Electronic Eng.
オペレーティングシステム2004 プロセス (1) 2004年10月8日 海谷 治彦.
アスペクト指向プログラミングを用いたIDSオフロード
型付きアセンブリ言語を用いた安全なカーネル拡張
C言語でスレッド (Pthread) 2007年1月11日 海谷 治彦.
システムプログラミング 第9回 、10回 ハードリンク、シンボリックリンク プロセスの生成
マルチスレッド処理 マルチプロセス処理について
コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第1週目 アセンブリ言語講座
実行時情報に基づく OSカーネルのコンフィグ最小化
オペレーティングシステム イントロダクション
Ibaraki Univ. Dept of Electrical & Electronic Eng.
オペレーティングシステム 第3回 プロセスの管理とスケジューリング
第7回 授業計画の修正 中間テストの解説・復習 前回の補足(クロックアルゴリズム・PFF) 仮想記憶方式のまとめ 特別課題について
Webプロキシ HTTP1.0 ヒント CS-B3 ネットワークプログラミング  &情報科学科実験I.
オペレーティングシステム 第2回 割り込みとOSの構成
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第6回 システムプログラミング概要 プロセスの生成 担当:青木義満
Ibaraki Univ. Dept of Electrical & Electronic Eng.
オペレーティングシステムJ/K 2004年11月15日2時限目
先週の復習: CPU が働く仕組み コンピュータの構造 pp 制御装置+演算装置+レジスタ 制御装置がなければ電卓と同様
オペレーティングシステム i386アーキテクチャ(1)
ウェブアプリケーションサーバの Degradation Schemeの 制御に向けて
組込みシステムとは コンピュータ制御システム?
アクセス集中時の Webサーバの性能に対する OSの影響
オペレーティングシステム (プロセススケジューリング)
実装について 前田俊行.
仮想マシンに対する 高いサービス可用性を実現する パケットフィルタリング
ユビキタスコンピューティングの ための ハンドオーバー機能付きRMIの実装
ネットワーク・プログラミング デバイスドライバと環境変数.
vc-1. Visual Studio C++ の基本操作 (Visual Studio C++ の実用知識を学ぶシリーズ)
オペレーティングシステム (プロセススケジューリング)
システムプログラミング 第9回 、10回 ハードリンク、シンボリックリンク プロセスの生成
Visual Studio 2013 の起動と プロジェクトの新規作成 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
ネットワーク・プログラミング 1対多のプロセス間通信.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
ネットワーク・プログラミング マルチタスク.
ネットワーク・プログラミング プロセスとファイルシステム管理.
Presentation transcript:

スレッドとプロセス 本題: スケジューリング 田浦健次朗

スレッド・プロセスの目的 CPUを仮想化 物理的なCPU数は固定, 少数 ラップトップ, スマホ: 1, 2, 4, 8くらい サーバ: 数十 ポイント: にもかかわらず数十, 数百のプログラムを立ち上げることができる 個々のプログラムを書く人が明示的な「譲り合い」をする必要はない

スレッドとは? 制御の流れ(thread of control) OSに「スレッドを作りたい」と要求 OSはスレッドにCPUを割り当て,実行 スレッドは「たくさんあってよい」 OSが交互に実行 CPUが複数あれば各CPU上で

プロセスとは?  プログラムの起動したときにできるもの プロセス=論理アドレス空間+(1つ以上の)スレッド 論理アドレス空間の生成 +mainスレッドの生成 プロセス=論理アドレス空間+(1つ以上の)スレッド

実践的知識 システム内のプロセス・スレッドの観察 自分のマシンには何個くらいプロセス, スレッドが走っているでしょう? Linux : ps, top, htop, システムモニタ Windows : タスクマネージャ, perfmon 自分のマシンには何個くらいプロセス, スレッドが走っているでしょう?

スレッド・プロセス関係API 共通な主要概念 代表的スレッドAPI名 代表的プロセスAPI 生成,終了 同期,実行の制御 Unix: POSIX Threads (pthread) Windows: Win32 thread 代表的プロセスAPI POSIX Win32

プロセス生成 Win : CreateProcess(file, cmd, …, &pid); Unix : pid = fork(); /* プロセス複製 */ if (pid == 0) { /* 子プロセス */ execv(file, cmdline); /* fileを実行 */ } else { /* 親プロセス */ }

プロセス終了 Win : ExitProcess(s); Unix : exit(s); またはプログラムのmain関数が終了したとき,自動的に終了

プロセス終了待ち プロセスpidが終了するのを待つ 実例 Win : WaitForSingleObject(pid, timeout) Unix : wait(&status), waitpid(pid, &status, …);

いわゆる「シェル」の動作 エラー処理などを除いた, コマンドシェル(bashなど)の議事コード while (…) { show_prompt(); char ** cmd = read_command(); int cid = fork(); if (cid == 0) { file = search_PATH(cmd[0]); execv(file, cmd); } else { waitpid(pid, &status); } }

高水準なAPI system(command_string) popen(command_string) command_stringを実行するプロセスを作り, 終了を待つ ( fork + exec + wait) popen(command_string) command_stringを実行するプロセスを作り, そのプロセスと通信するチャネル(パイプ)を返す(パイプ作成 + fork + exec) すべて最終的にはfork, exec, waitpid, etc.の組み合わせ(Unixの場合)

スレッド生成 基本: 実例 命令列が始まるアドレスを指定.そこから実行を開始するスレッドを生成 命令列のアドレス: Cの関数ポインタ Pthread : pthread_create(&id, .., f, x) Win : CreateThread(.., .., f, x, .., &id) f(x) を実行するスレッドを生成.スレッド名をidに格納

スレッド終了 スレッドの終了 実例 Pthread : pthread_exit(s) Win : ExitThread(s) または生成時に指定された関数fが終了すると自動的にスレッドが終了する s : status

スレッドの終了待ち スレッドidが終了するのを待つ(idはpthread_createなどによって得られたスレッド名) 実例 Pthread: pthread_join(id, &return_status) Win: WaitForSingleObject(id, timeout) その他の同期方法は後述 pthread_create pthread_join pthread_exit

そのほかの言語 ほとんどの言語(Java, C++, Python, etc.)でスレッド, プロセス関係のAPIが提供されている (名前は違うが)概念は似ている 多くの場合C用のライブラリ, それが最終的には fork, exec, etc.を呼び出している(Unixの場合)

プロセスとスレッド スレッドとプロセスは似ているようだが何が違う? 現時点では, 正確な違いは数週間後, メモリについて語るときにわかる スレッド: 一筋の実行の流れ プロセス: 「プログラムを起動したときにできるもの」 1個以上任意個のスレッドを含む「箱」 mainを実行するスレッドは自動的に含まれる

スケジューリング システム内には多数のスレッドが同時に存在する OSはそれらに「適切に」CPUを割り当てる(スケジューリング)必要がある 基本: 変わりばんこ

スレッドスケジューリングの目標 公平性 効率性 対話的プログラムの応答性 独占の禁止 公平なCPUの割り当て スレッド切り替えのオーバーヘッドを少なくする 対話的プログラムの応答性

スケジューラの挙動観察実験(1) いくつかのスレッド(プロセス)を立ち上げる スレッドがいつからいつまで「実行中だったか」を調べる 注目 「時刻を知るシステムコール」 注目 どのくらいの頻度でスレッドは入れ替わっているか? その状態でエディタやブラウザの応答性に影響は?

スケジューラの挙動観察実験(2) 各スレッド f (x) { t =現在時刻(); while (1) { t’ = 現在時刻(); if (t’ – t > 1ms) { どうやらしばらくCPUを奪われていたらしい; } t = t’; } 記録を出力; }

ヒント: 時刻を知るシステムコール UNIX : gettimeofday Win : QueryPerformanceCounter man gettimeofday Win : QueryPerformanceCounter MSDNライブラリで検索 授業のHPに例題掲載

特定のCPUへスレッドを固定する システムコール コマンド sched_setaffinity(pid, size, mask) mask : size bitのbit列 maskで1となっているCPUでのみ, pidを実行 子プロセスへ自動的に継承 コマンド taskset –c 0,1 command

スレッドスケジューラの実現

クイズ あなたが無限ループするプログラムを書いてもマウスが動き, ブラウザが動き, Ctrl-Cで消せる(事もある)のはなぜですか? (a) マウスはプログラムで動いているわけではないから (b) マシンにCPUコアが2個(以上)あるから(ブラウザと無限ループは別のコアで動いている) (c) 実は無限ループであってもC言語処理系が時々他のスレッドに譲るような機械語に変換しているから (d) その他

復習: OSのないCPU CPUの状態:レジスタ CPUの動作: 汎用 プログラムカウンタ(PC) モード(ユーザモード・特権モード) etc. CPUの動作: 以下を永遠に繰り返す { PCが指す場所の命令を取り出す 命令を実行(状態書き換え) } 外部割込みが発生していれば割り込み処理

もし割り込みがなかったら? 以下のようなプログラム(無限ループ)がCPUを独占するのを防ぐ方法はない C: for (;;) { } 機械語: L: jmp L

割り込み処理 割り込み: CPU外部からの信号 割り込み時にCPUが行うこと if (その割り込み許可中) { 割り込みを禁止にする; 一部の状態(割り込み発生時PCなど) を特定のレジスタに保存; 割り込みベクタを参照し,指定されてい る値をPCに設定(制御の移動); 特権モードへ移行; } IRQ Line

割り込みベクタ 割り込みハンドラ アドレス 割り込みベクタレジスタ (trap base register) メモリ TBR 割り込みベクタ 0x1234 0x1288 IRQ番号 0x1346 0x1390 割り込みベクタ 0x1432 … 0x2084

割り込みベクタ 通常OSの起動時に設定される IRQ通常の用途 各種入出力装置からの通知 キーボード,ネットワークコントローラ,etc. タイマ!! システムコール(トラップ命令)

タイマ割り込み CPUの独占を防ぐための鍵 通常定期的(1- 10ms 程度に一度程度)発生させる Linux (2.4) on x86, Windows on x86, BSDなどで10ms Linux on Alpha 1ms Linux 2.6.22以前 1ms, 4ms, または必要に応じて(tickless) タイマ割り込み間隔,クロック間隔,クロックチックなどと呼ぶ 必要な時にOSがCPUをアプリケーションから奪う「機会」を保障する

スケジューリングアルゴリズム

各スレッドの状態 生成  CPUの数 実行可 “reschedule” 実行中 (runnable, (running) active) yield, “reschedule” 中断 (suspend, block) 中断からの復帰 (resume, unblock) 中断中 (blocked, suspended)

中断状態 (たとえCPUがあいていても)直ちに実行をすることができない状態 OSは中断状態のスレッドを(当然)CPU割り当ての対象から外す

中断と復帰 スレッドが中断する理由(代表例) 復帰の理由(中断の逆) 入出力待ち(recv, read, etc.) 自主的休眠(sleep) スレッド間の同期(pthread_join, wait, etc.) ページフォルト(後述) 復帰の理由(中断の逆) 入出力完了 休眠時間経過 スレッド間の同期成立 ページフォルト処理完了

実行可能キュー 実行可能スレッドのリスト OSは「機会あるごとに」,実行可能キューから最も適切なスレッドを選んで実行(reschedule) 「スケジューリングキュー」,「ランキュー」 スレッドが実行可能キューにある  そのスレッドが実行可能 OSは「機会あるごとに」,実行可能キューから最も適切なスレッドを選んで実行(reschedule)

中断 例: ネットワークからのデータ待ちによる中断 recv() { … if (読むべきdataがない) { 現スレッドを実行可能キューからはずす; reschedule(); } … }

中断からの復帰 例: ネットワークからのデータ到着による復帰 /* 割り込み  OS内のネットワークからの入力を 処理する部分 */ if (あるスレッドが今到着したデータ待ち) { そのスレッドを実行可能キューに入れる;  reschedule(); }

Rescheduleの機会 OSカーネルが制御を得るあらゆる時点が,潜在的なrescheduleの機会 タイマ割り込み時 クロック間隔に一度 そのほかの割り込み(e.g, 入力)からの復帰時 実行中スレッドが中断したとき システムコールからの復帰時 etc.

Reschedule Rescheduleの機会をOSが得るたびに,「次に実行すべきスレッド」を選択して実行(CPUの割り当て) 次に実行すべきスレッドの選択の仕方が重要 公平 効率 対話的プログラムの応答

対話的なスレッドの応答性 エディタ,パワーポイント,ブラウザ,メーラに「キー入力」したらすぐに反応してほしい 対話的なスレッドの特徴 I/Oによる中断が非常に頻繁 キーボード,マウス,ネットワークなどの入力待ち 中断が多いため, CPU利用量は少ない

現在のLinuxスケジューラ カーネル2.6.23以降. Completely Fair Scheduler (CFS) 各スレッドが使用したCPU時間を管理 vruntime (virtual runtime) Reschedule時には毎回, vruntimeが最小のスレッドを選ぶ  つまり最もCPUを使っていないスレッドを選ぶ  公平性の保証

vruntime管理の実際 スレッドが生まれたとき スレッドがA  Bに切り替わるとき 子は親のvruntimeを引き継ぐ Aのvruntime += 今回消費した時間 Bのvruntime = 基本はそのまま. ただし, それだけだと問題がある

vruntime管理の実際 ABに切り替え時 Bのvruntime 何もしないが,  全スレッドのvruntimeの最小値 – 20 ms を保証 つまり長時間中断していてもその分をまるごと「貯金」はできない