アプリケーションプログラム②:ホスト環境とフリースタンディング環境の役割
本記事はコンピュータサイエンス学習サービスRecursionの学習記録です。
プログラムのコンパイルは、ホスト環境 または フリースタンディング環境 のいずれかで行われる。
環境に応じてプログラムの実行方法や利用できる機能が異なる。
ホスト環境
ホスト環境では、OSやライブラリなどの実行環境のサポートを受けながらプログラムが動作する。
ホスト環境でコンパイルされたプログラムは、システムコールやAPIを通じてOSの機能をフル活用できる。
OSは、ハードウェア資源の管理やプロセス管理、メモリの確保、入出力制御などアプリケーションに共通のサービスを提供する役割を果たす。
フリースタンディング環境
フリースタンディング環境では、OSやその他の実行環境のサポートなしでプログラムが動作する。
プログラムは、言語の基本的な動作(データ型、制御構造、メモリ割り当て関数など)のみを利用し、どのようなコンピュータシステムでも実行できるようにコンパイルされる。
OSの役割
OSは、ファイル操作やプロセス管理、入出力制御などをアプリケーションに提供する。
例えば、アプリケーションがファイルを保存する場合、OSが異なるストレージデバイスの違いを吸収するため、アプリケーションは単にファイルパスを指定するだけで処理が可能になる。
高レベルのライブラリ
実際にはプログラムがシステムコールを直接呼び出すことは少ない。
多くの場合、高レベルに抽象化されたライブラリを使用する。
例えば、print("hello")
を実行するとメモリ管理やファイル操作のシステムコールが何十回も呼び出される。
このように、ライブラリは低レベルの操作を隠ぺいして開発者が特定のタスクに集中できるようにする。
メモ
例えば、
print("hello")
を実行するとメモリ管理やファイル操作のシステムコールが何十回も呼び出される。
この部分が具体的にわからなかったので調べてみた。
Linuxのstraceツールを使用することで実際のシステムコールを確認できるとのこと。
手元にLinuxマシンが無いので、Google Colabで実行した。
ちなみに、Google Colabはホスト環境。
実行コマンド
!apt-get install strace # colabにはstraceコマンドがデフォルトで備わっていないため導入する。
!strace python3 -c 'print("hello")'
出力(抜粋)
execve("/usr/bin/python3", ["python3", "-c", "print(\"hello\")"], 0x7ffddac5b390 /* 98 vars */) = 0
brk(NULL) = 0x5cf4976eb000
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffe5c2e0890) = -1 EINVAL (Invalid argument)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7af43baf4000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/local/nvidia/lib/glibc-hwcaps/x86-64-v3/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
newfstatat(AT_FDCWD, "/usr/local/nvidia/lib/glibc-hwcaps/x86-64-v3", 0x7ffe5c2dfab0, 0) = -1 ENOENT (No such file or directory)
・・・(以下略)・・・
主要なシステムコールをまとめると以下の結果となった。
システムコール | 役割 | 出力内に現れた数 |
---|---|---|
brk() | プログラムのメモリを拡張する。 | 11 |
mmap() | プログラムによるメモリのマッピングに利用する。 | 28 |
write() |
"hello\n" を標準出力に書き込む。 |
1 |
close() | 使用されたファイルディスクリプタを閉じる。 | 60 |
たしかに何十回も呼び出されている。
「print("hello")
を実行するとメモリ管理やファイル操作のシステムコールが何十回も呼び出される」ことが腹落ちした。
Discussion