Slide 1

Slide 1 text

Linux環境のCPU上で 10ミリ秒間に起こること Mar. 20th, 2024 Satoru Takeuchi X: satoru_takeuchi 1

Slide 2

Slide 2 text

はなすこと ● Linux環境(Linuxをインストールしたマシン)で10ミリ秒程度の短い期間にCPU上で 何が起きるかを説明 ● 📝多くの仮定を置いて話を簡略化している ○ Linuxをインストールしているのは物理マシン ○ 1CPU1コア環境 ○ tickless kernelではない ○ あらゆる処理の所要時間は 1ms単位 ○ その他いっぱい 2

Slide 3

Slide 3 text

前提知識: プロセススケジューリング ● CPUリソースを使うプロセスが複数存在すると、CPU上で動作するプロセスをカー ネル内のスケジューラが定期的に切り替えている ● プロセスが一度に動ける期間をタイムスライスと呼ぶ ○ タイムスライスの残量はタイマーというハードウェアを使って確認 (後述) ● 例: プロセスp0,p1が動作中でタイムスライスは両方2ms p0 p1 p0 p1 時間 CPU 3 *1マスが1msに対応

Slide 4

Slide 4 text

前提知識: システムコール ● プロセスがシステムコールを発行すると、カーネルに制御が移って処理を開始す る。完了すると再度プロセスが動き出す p0 カーネル p0 syscall発行 syscall完了 時間 CPU 4

Slide 5

Slide 5 text

前提知識: システムコール ● プロセスがシステムコールを発行すると、カーネルに制御が移って処理を開始す る。完了すると再度プロセスが動き出す p0 カーネル p0 syscall発行 syscall完了 時間 CPU 5 1. syscall判別 2. 個々のsyscallの処理 3. スケジューラ: 次に動くプロセスの決定 p0のsyscall処理

Slide 6

Slide 6 text

前提知識: デバイス操作 ● システムコールの延長でデバイスにアクセスすると、デバイスにI/O発行した後にプ ロセスは待ち状態になり、その後は他のプロセスが動作する ● 例: p0がread()を発行し、待ちの間はp1が動作し、I/O完了後は再度p0が動く p0 I/O処理 CPU SSD p1 カーネル カーネル read発行 I/O依頼 p0 6 I/O完了 read完了 時間

Slide 7

Slide 7 text

前提知識: デバイス操作 ● システムコールの延長でデバイスにアクセスすると、デバイスにI/O発行した後にプ ロセスは待ち状態になり、その後は他のプロセスが動作する ● 例: p0がread()を発行し、待ちの間はp1が動作し、I/O完了後は再度p0が動く p0 I/O処理 CPU SSD p1 カーネル カーネル read発行 I/O依頼 p0 7 I/O完了 read完了 時間 1. Virtual File System(VFS)層: 全fs共通の read処理 2. 個々のfs: read処理 p0のsyscall処理 1. ブロック層: 全ブロックデバイス共通処理 2. デバイスドライバ: I/O発行処理 3. スケジューラ: 次に動くプロセスの決定 I/O発行処理

Slide 8

Slide 8 text

前提知識: デバイス操作 ● システムコールの延長でデバイスにアクセスすると、デバイスにI/O発行した後にプ ロセスは待ち状態になり、その後は他のプロセスが動作する ● 例: p0がread()を発行し、待ちの間はp1が動作し、I/O完了後は再度p0が動く p0 I/O処理 CPU SSD p1 カーネル カーネル read発行 I/O依頼 p0 8 I/O完了 read完了 時間 1. I/O完了処理 2. スケジューラ: 次に動かすプロセスの決定 SSDの割り込み処理 1. fs: 完了処理 2. VFS層: 完了処理 p0のsyscall処理

Slide 9

Slide 9 text

前提知識: タイマー ● プロセスのタイムスライスはタイマーというデバイスで確認 ○ 定期的にCPUに通知して、割り込みハンドラを実行 ● 例: p0,p1が存在し、4msに一回タイマーがCPUに通知 p0 時間計測(実際はカーネルが設定したタイマーが切れたときにちょっと動くだけ CPU タイマー カーネル 通知 9 p0 割り込み p1 カーネル 時間 残り3ms… 時間切れ!

Slide 10

Slide 10 text

前提知識: タイマー ● プロセスのタイムスライスはタイマーというデバイスで確認 ○ 定期的にCPUに通知して、割り込みハンドラを実行 ● 例: p0,p1が存在し、4msに一回タイマーがCPUに通知 p0 時間計測(実際はカーネルが設定したタイマーが切れたときにちょっと動くだけ CPU タイマー カーネル 通知 10 p0 残り3ms… p1 カーネル 時間切れ! 時間 1. スケジューラ: 次に動かすプロセスを決定 割り込み タイマー割り込み処理

Slide 11

Slide 11 text

状況 ● 2つのプロセスp0,p1が存在する ● 10ミリ秒の間にやること ○ p0: 計算->read発行->計算 ○ p1: 計算し続ける ● 途中で一回タイマー割り込み発生 11

Slide 12

Slide 12 text

10msのうちわけはこんなかんじになる 12 p0 I/O処理 CPU SSD カーネル 依頼 通知 タイマー 時間計測 p1 完了 時間 カーネル p0 p0 カーネル 時間切れ! p1 p1 p1 read発行 通知 read完了 1. Virtual File System(VFS)層: 全fs 共通のread処理 2. 個々のfs: read処理 p0のsyscall処理 1. ブロック層: 全ブロックデバイス共通処理 2. デバイスドライバ: I/O発行処理 3. スケジューラ: 次に動くプロセスの決定 I/O発行処理 1. I/O完了処理 2. スケジューラ: 次に動かすプロセスの決定 SSDの割り込み処理 1. fs: 完了処理 2. VFS層: 完了処理 p0のsyscall処理 1. スケジューラ: 次に動かすプロ セスを決定 タイマー割り込み処理

Slide 13

Slide 13 text

まとめ ● Linux環境では10ミリ秒程度の間にCPU上では様々なことが起きている ● これでもかなり簡略化していて、実際はさらに複雑 ● そのうち別のどこかで紹介するかも 13