1.5K Views
March 10, 25
スライド概要
- ハードウェアとソフトウェア
- ハードウェアの構成
- プログラムの実行
- ソフトウェアの構成
- 仮想化技術
機械学習や音声認識に関する書籍を執筆しています。
プログラミング〈新〉作法 ~これからプログラムを書く人のために ~ 3. プログラムが動く仕組み ハードウェアとソフトウェア ハードウェアの構成 プログラムの実行 ソフトウェアの構成 仮想化技術 1
3.1 ハードウェアとソフトウェア ユーザがC言語などのプログラミング言語で記述したソフトウェアはアプリケーシ ョンとよばれる アプリケーションが実行される手順のイメージ #include <stdio.h> int main(void) { int amount; int price = 150; ... } アプリケーション オペレーティング システム ハードウェア 2
3.1 ハードウェアとソフトウェア オペレーティングシステムやハードウェアを学ぶ重要性 高水準言語においては,実行速度や安全性向上のためにさまざまな工夫が取 り入れられている 実行速度や安全性が重要となる場面では,コードが機械語として実行される までのイメージを理解しておくことが必要 3
3.2 ハードウェアの構成 ハードウェアの構成要素 データバス アドレスバス 制御信号 CPU メモリ I/O コントローラ 4
3.2 ハードウェアの構成 構成要素間の制御 データバス : CPU とメモリ・I/O コントローラ間のデータ転送 アドレスバス : CPU からのメモリアクセス時のアドレス指定や I/O コントロ ーラのポート指定 制御信号 : データの読み/書きの切り替えや,外部からの割り込みの検知 すべてのコンポーネントは周期的に High/Low を切り替えるクロック信号を受 け取り,同期して動作する 5
3.2 ハードウェアの構成 CPU ハードウェアの中心的な装置で,コンピュータへの命令を解釈して実行する 制御装置・演算装置・レジスタから構成される 演算装置 レジスタ 汎⽤レジスタ 汎⽤レジスタ プログラムカウンタ データバス アドレスバス 制御 アドレスバス システム 制御 制御信号 制御装置 スタックポインタ フラグレジスタ データバス 制御 内部バス 内部制御信号 CPU 6
3.2 ハードウェアの構成 制御装置 メモリ上の機械語命令やデータをレジスタに読み出し,命令の内容に応じた 全体の制御,指定されたアドレスに対するデータの書き込み,I/O コントロー ラの制御を行う 演算装置 レジスタに読み出されたデータに対して加減算や論理演算を行う レジスタ 機械語命令・データ・演算結果を格納する場所.役割ごとに複数のレジスタ が用意されている 7
3.2 ハードウェアの構成 レジスタの種類と役割 種類 汎用レジスタ プログラムカウン タ スタックポインタ フラグレジスタ 役割 どのようなデータでも格納できる 次に実行する命令のアドレス スタック領域における現在の操作位置のアドレス 演算結果がゼロかマイナスかなど,処理の流れを変える判断に用いるフラ グ 8
3.2 ハードウェアの構成 メモリ 通常は主記憶(メインメモリ)のことを指し,命令とデータを2進表記で格納 している CPU には最近アクセスされたデータや,その近くのデータを一時的に保持す るキャッシュメモリがある 外部記憶装置(ハードディスク,SSD など)上にある命令やデータがメモリ にロードされて処理が実行される 9
3.2 ハードウェアの構成 メモリアドレス 8ビット(=1バイト)を基本単位として,アドレスが割り当てられている アドレス メモリの内容 … 0x 0000 0002 0x 0000 0001 0x 0000 0000 8 ビット 10
3.2 ハードウェアの構成 I/O コントローラ I/O コントローラはキーボードやディスプレイなどの外部装置との間でデータ のやりとりを制御する CPUから見た外部装置はポート番号で管理され,ポート番号と外部装置との 対応はI/O コントローラが管理する 高速なCPUと低速な外部装置の間でデータを一時保持する場合もある 割り込みを発生させることで,CPUに効率的な処理を行わせる 外部装置の低レベル制御はI/Oコントローラ,高レベル制御はOSが担当する 11
3.3 プログラムの実行 アセンブリ言語とは 機械語(CPU が理解できる唯一の言語)にほぼ1対1対応する言語 アセンブラと呼ばれるプログラムで機械語に変換される アセンブリ言語の基本構成 : 「ラベル: 命令 オペランド」 ラベル: プログラムの中で一意の名前.命令やデータのアドレスを識別する 命令: CPU が実行する操作 オペランド: 命令の対象となるもの.レジスタ名,メモリアドレス,リテラル のいずれか 12
3.3 プログラムの実行 アセンブリ言語の基本命令 データ転送 「 mov ソース, 宛先 」 : 例 movl $2, -4(%rbp) * ソースの値を宛先にコピーする 演算 「 演算命令 ソース, 宛先 」 : 例 addl $3, %eax ソースと宛先の間で,加減乗除・論理演算などを行う 比較 「 cmp ソース, 宛先 」 : 例 cmpl $10, -4(%rbp) ソースと宛先の値を比較し,結果をフラグレジスタに格納する 条件分岐 「 分岐命令 ラベル 」など : 例 jle .L2 フラグレジスタの値に応じて,ラベルにジャンプする 関数呼び出し 「 call 関数名 」 : 例 call puts@PLT ライブラリ関数の呼び出しは PLT を経由する 13
3.3 プログラムの実行 プログラムとアセンブリ言語の対応 : 加算 Cプログラム C int a = 2; printf("%d\n", a+3); return 0; アセンブリ言語 movl $2, -4(%rbp) movl -4(%rbp), %eax addl $3, %eax 14
3.3
プログラムの実行
プログラムとアセンブリ言語の対応 : 条件分岐
Cプログラム
C
int i = 20;
if (i > 10)
printf("large\n");
アセンブリ言語
movl $20, -4(%rbp)
cmpl $10, -4(%rbp)
jle
.L2
leaq .LC0(%rip), %rdi
call puts@PLT
.L2:
15
3.3 プログラムの実行 プログラムとアセンブリ言語の対応 : 繰り返し Cプログラム C int s = 0; for(int i=0; i<=5; i++) s += i; 16
3.3 プログラムの実行 プログラムとアセンブリ言語の対応 : 繰り返し アセンブリ言語 C movl $0, -8(%rbp) movl $0, -4(%rbp) jmp .L2 .L3: movl -4(%rbp), %eax addl %eax, -8(%rbp) addl $1, -4(%rbp) .L2: cmpl $5, -4(%rbp) jle .L3 17
3.3 プログラムの実行 数の表現 コンピュータ内部では数値は2進数で表現されるので,10進数との変換が必要 基数変換 10進数 2進数の変換を,整数・小数それぞれの場合で理解しておく 内部表現 符号付き整数の表現方法 : 2の補数表現 浮動小数点数の表現方法 : IEEE754規格 18
3.3 プログラムの実行 整数の基数変換 : 2進数 10進数 1が立っている位の数を足し合わせる 例: 19
3.3 プログラムの実行 整数の基数変換 : 10進数 2進数 商が 0 になるまで 2 で割り続け,余りを計算順の逆に並べる 10 進数 余り 2 157 2 78 1 2 39 0 2 19 1 2 9 1 2 4 1 2 2 0 2 1 0 2 0 1 2 進数 1001 1101 20
3.3 プログラムの実行 小数の基数変換 : 2進数 10進数 整数と同じ考え方.小数点以下の位については,小数第1位から順に を表すと考える 例: 21
3.3 プログラムの実行 小数の基数変換 : 10進数 2進数 整数部と小数部に分けて行う 整数部は前述の手順どおり 小数部は,小数点以下の数のみに2を掛け続けることを計算結果が0になるま で繰り返し,そのかけ算の結果として出てきた整数の部分を計算順に並べる 以前の計算で出現した小数部が再度現れた場合は,その時点で循環小数 となる 22
3.3 プログラムの実行 0.1 x 2 0.2 x 2 0.1 = 0.0001100110011... 10 進数 2 進数 循環 0.4 x 2 0.8 x 2 1.6 x 2 循環 1.2 x 2 0.4 23
3.3 プログラムの実行 整数の内部表現 型は通常の2進表記でメモリに格納される int 型のような符号付き整数では負の数の表現方法が必要となる 基本的には最上位ビットを符号ビットとして用いる 1の補数表現はビットを反転させて負を表す 0が2通りに表現される問題がある 2の補数表現はビット反転後に1を加える 例: unsigned int 24
3.3 プログラムの実行 小数の内部表現 仮数 指数 」で表現する 2進の浮動小数点数は「符号 符号は正を0,負を1とし,仮数は小数点以下の数のみ保持する 指数はイクセス表現(バイアス)を用いて表現する 正: 0 負: 1 の場合 8byteの場合 4byte イクセス 表現 そのまま 符号 指数 仮数 1bit 8bit 23bit 1bit 11bit 52bit 25
3.3 プログラムの実行 メモリ領域の概要 プログラムをコンパイルしてできた実行ファイルは,OSがプロセスとして起 動し,個々のプロセスに割り当てたメモリ領域上で実行される メモリ領域は,テキスト・定数・静的・スタック・ヒープに分かれる 上位アドレス メモリ スタック領域 ヒープ領域 下位アドレス 静的領域 定数領域 テキスト領域 26
3.3 プログラムの実行 テキスト領域 コンパイルされた機械語が格納される CPU のプログラムカウンタが,この領域の特定の場所を指し,そこから機械 語命令がCPU に読み出されて実行される 定数領域 値を変更することができない文字列リテラルなどが格納される 静的領域 グローバル変数や static 変数などのための領域が,プログラムの実行前に確 保される 27
3.3 プログラムの実行 スタック領域 関数が呼び出されるごとに記憶場所が設定される 関数内部から新たな関数が呼ばれると,現在の領域の下位アドレス側に新た な記憶場所が設定される 上位アドレス スタック領域 %rbp %rbp main() main() %rsp の 呼び出し func1() main() %rbp func1() %rsp の 実⾏終了 func1() %rsp 下位アドレス 28
3.3 プログラムの実行 ヒープ領域 動的に確保された変数の値が置かれる場所 明示的にメモリの確保・解放を行う関数( malloc , free など)を用いる メモリ 上位アドレス アドレス スタック領域 ヒープ領域 malloc() 下位アドレス 関数によって確保された領域 静的領域 定数領域 テキスト領域 29
3.4 ソフトウェアの構成 コンピュータシステムの構成 アプリケーションからは,OS が提供するライブラリを介してハードウェアを 制御する アプリケーション 外部ライブラリ OSライブラリ カーネル ハードウェア 30
3.4 ソフトウェアの構成 オペレーティングシステム アプリケーションに対して,ハードウェアに依存しない統一されたインタフ ェースを提供 仮想メモリを管理し,実メモリ上の配置を決定するとともに,複数のプログ ラムをプロセスとして並行実行させる 入出力は OS のシステムコールを介して行われ,プログラムは直接ハードウ ェアを操作しない OS はカーネルを中心に,シェル・GUI・ネットワーク機能・セキュリティ機 能などを統合して提供される 31
3.4 ソフトウェアの構成 カーネルの主要な機能 (1/2) タスク管理 プログラムに対して個別の ID が割り当てられたプロセス(独立したメモ リ空間)またはスレッド(メモリ空間を共有)を起動 メモリ管理 各プロセスは仮想アドレス空間で稼働し,カーネルが仮想アドレスをメ モリの実アドレスに変換 デバイス管理 Linux ではほぼすべてのデバイスをファイルとして管理 Linux OS 32
3.4 ソフトウェアの構成 カーネルの主要な機能 (2/2) ファイルシステム ルートディレクトリを根とした木構造でファイルを管理 それぞれのディレクトリやファイルに対して読み・書き・実行の可否を ユーザ権限に基づいて設定 ネットワーク機能 ネットワーク入出力は通信プロトコルを守って接続しなければならない ため,それらの機能を実装したソケットを用いる Linux OS 33
3.4 ソフトウェアの構成 カーネルの割り込み処理 : イベントによって特定の処理を実行する 割り込み ハードウェア割り込み : 周辺機器や内部タイマが発生させる ソフトウェア割り込み : プロセス状態の変更通知など 例外 機械語のプログラム実行中のゼロ除算やメモリアクセス違反など システムコール ユーザプログラムから OS の機能を利用するためのインタフェース CPU をユーザモードからカーネルモードに一時的に遷移させる Linux 34
3.4 ソフトウェアの構成 シェル ユーザとカーネルとの間のインタフェース 主要な機能 環境変数の管理 OS やアプリケーションが動作する際に参照する変数 ファイルシステムの操作 ファイルやディレクトリの作成・削除・移動・コピーなど ワイルドカード( * や ? など)の解釈 コマンドの合成 リダイレクト( > や < )やパイプ( | )など 35
3.4
ソフトウェアの構成
言語処理系
ソースコードを機械語に変換するソフトウェア
libc.a
stdio.h
#include <stdio.h>
int main(void) {
...
}
ソースコード
main:
.LFB0:
.cfi_startproc
pushq %rbp
...
movl $0, %eax
call printf@PLT
movl $0, %eax
ret
extern FILE *stdin;
extern FILE *stdout;
extern int printf
(const char ...);
int main(void) {
...
}
プリプロセッサ
ソースコード
コンパイラ
アセンブリ⾔語
オブジェクト 実⾏可能
ファイル ファイル
アセンブラ
リンカ
36
3.4 ソフトウェアの構成 LLVM (Low Level Virtual Machine) 多言語・複数環境のコンパイラ基盤 ソースコードを中間言語に変換し,最適化を行った後に機械語に変換する フロントエンド バックトエンド C/C++ Rust Swift X86 LLVM IR ARM WASM 37
3.4 ソフトウェアの構成 WASM (WebAssembly) ブラウザ上で高速な実行を可能にするバイナリフォーマット LLVM で生成された中間言語をブラウザ上で実行するための仕組み ブラウザ上で動作するプログラムは,ほかのプログラムやユーザのデータか ら隔離された安全な仕組みで実行される Web 38
3.5 仮想化技術 仮想化技術とは 階層化されたソフトウェアにおいて,ある階層から下の実行環境を,あたか も手元にあるかのように提供する技術 さまざまな仮想化技術 クラウドコンピューティング 仮想マシン コンテナ 39
3.5 仮想化技術 クラウドコンピューティング インターネットを通じてリモートのサーバにあるリソースを使う IaaS(Infrastructure as a Service) ユーザがサーバやストレージなどのインフラをリモートで利用する PaaS(Platform as a Service) ユーザがアプリケーション開発に用いるプラットフォーム(言語処理 系・ライブラリ・開発ツールなど)をリモートで利用する SaaS(Software as a Service) ユーザが web ブラウザ経由または API を用いてソフトウェアをリモート で利用する 40
3.5 仮想化技術 仮想マシン 使用しているコンピュータの OS 上でハードウェアの動作をシミュレートす る仮想ハードウェアを動かす その上に OS・ミドルウェア・ライブラリおよびアプリケーションを載せる 仮想マシン 仮想マシン アプリ ライブラリ ミドルウェア ゲストOS 仮想ハードウェア アプリ ライブラリ ミドルウェア ゲストOS 仮想ハードウェア ホストOS ハードウェア 41
3.5 仮想化技術 コンテナ OS のカーネルは共有しつつ,コンテナ間で独立したファイルシステム・ネッ トワーク・プロセス空間を持つ 複数の異なる OS を同時に実行するハイパーバイザによって軽量・高速に動 作 Windows Windows アプリ アプリ コンテナ アプリ ライブラリ ミドルウェア コンテナ アプリ ライブラリ ミドルウェア コンテナエンジン Windows WSL2 (Linux) ハイパーバイザ ハードウェア 42
3.6 まとめ コンピュータはCPU・メモリ・I/O コントローラからなるハードウェアと,OS や アプリケーションからなるソフトウェアで構成される ハードウェア上でプログラムが実行される様子を理解するには,アセンブリ言語 およびメモリ領域の理解が重要 アプリケーションは OS が提供するライブラリを介してハードウェアを制御する 言語処理系は,ソースコードを前処理・コンパイル・アセンブル・リンクの過程 を経て実行可能なバイナリに変換する ある階層から下の実行環境を仮想的に提供する技術を仮想化とよぶ.仮想化の実 現方法には,クラウドコンピューティング・仮想マシン・コンテナなどがある 43