Goならわかるシステムプログラミング
https://gyazo.com/8ec0d288a444faf305445100ef96d9ea
目次
code:目次
第1章 Go言語で覗くシステムプログラミングの世界
第2章 低レベルアクセスへの入口1:io.Writer
第3章 低レベルアクセスへの入口2:io.Reader
第4章 低レベルアクセスへの入口3:チャネル
第5章 システムコール
第6章 TCPソケットとHTTPの実装
第7章 UDPソケットを使ったマルチキャスト通信
第8章 高速なUnixドメインソケット
第9章 ファイルシステムの基礎とGo言語の標準パッケージ
第10章 ファイルシステムの最深部を扱うGo言語の関数
第11章 コマンドシェル
第12章 プロセスの役割とGo言語による操作
第13章 シグナルによるプロセス間の通信
第14章 Go言語と並列処理
第15章 並行・並列処理の手法と設計のパターン
第16章 Go言語のメモリ管理
第17章 実行ファイルが起動するまで
第18章 時間と時刻
第19章 Go言語とコンテナ
感想
用語集
第1章 Go言語で覗くシステムプログラミングの世界
第2章 低レベルアクセスへの入口1:io.Writer
2 - 4章:
Go言語における低レイヤーを扱いやすくするための抽象化レイヤー
第3章 低レベルアクセスへの入口2:io.Reader
第4章 低レベルアクセスへの入口3:チャネル
Go の Channel: キューに並列処理用の「並列でアク セスされても正しく処理される」ことを保証する機能を組み合わせたもの
使用パターン頻度:
1. <-演算子
2. for 文との連携
https://gyazo.com/b7915e0f7d6a9d8afdd8a26a7786f610
第5章 システムコール
5 - 8章:
5章は座学
6-8章は具体的なソケット通信について
とは
「特権モードで OS の機能を呼ぶ」こと
プロセスは自分のことだけに集中し、メモリ管理や時間管理などはプロセスの外のOSが全て行う方式が主流
主流以外のシステム呼び出し
io_uring
CPUの動作モード
特権モード
ユーザーモード
https://gyazo.com/090ea56ce748b1306038aceb8179a776
ex) Linux における os.Create()
os.file.go > os.file_unix.go > syscall_linux.go > zsyscall_linux_amd64.go > asm_linux_amd64.s(アセンブラ)
システムコールから呼ばれるカーネル側のコード(C言語)
システムコールのモニタリングコマンド
linux: strace
FreeBSD: truss
macOS: dtruss
windows: process moniter
第6章 TCPソケットとHTTPの実装
ソケット
アプリケーション層からトランスポート層のプロトコルを利用するときの API として利用する仕組み
TCP
UDP(7章)
Unixドメインソケット(8章)
プロセス間通信いろいろ
ソケット
シグナル
メッセージキュー
パイプ
共有メモリ
HTTP
HTTP
HTTP/2
バイナリプロトコルで高速化
HTTP/3
UDPベースのQUIC
https://gyazo.com/72cc238ef541dc7754f447918fad171a
第7章 UDPソケットを使ったマルチキャスト通信
TCPとUDPの比較
https://gyazo.com/122c354a7c06a98966232eee74841d23https://gyazo.com/c4ea3df174ff5a4adb25b0bb40c6d78d
第8章 高速なUnix ドメインソケット
code: ベンチマーク
go test -bench .
goos: darwin
goarch: arm64
pkg: systems-programming/08_UNIX_domain_socket/benchmark
BenchmarkTCPServer-8 4648 261866 ns/op
BenchmarkUDSStreamServer-8 37749 32334 ns/op
PASS
ok systems-programming/08_UNIX_domain_socket/benchmark 4.839s
第9章 ファイルシステムの基礎とGo言語の標準パッケージ
9 - 10章:
ファイルシステムについて
https://gyazo.com/5b2895f345f0fee01b4afc937a4e44b9
感想
この章から本書はGo言語を通してOSの仕組みを知るというよりかは、OSの仕組みを通してGo言語の機能を知る感じがしてきたので、写経も行っていない
特に知ってる部分が大半だったのもあり
第10章 ファイルシステムの最深部を扱うGo言語の関数
10.2 ファイルのロック
同期とブロッキングの違い
ブロッキング・・・ Aで待ちが発生したら、Aを処理してからBにいく
ノンブロッキング・・・ Aで待ちが発生したら、Aを待たずにBにいく。Aが完了しているかどうかは自分で確認しにいく。
同期・・・ Aで待ちが発生したら、Aを処理してからBにいく
非同期・・・ Aで待ちが発生したら、Aから完了通知がくるのを待ってる間にBにいく
go-cloud: 複数のクラウドに対応したGoogleのライブラリ
第11章 コマンドシェル101
Dockerのdistroless
Googleが提供している必要最小限の依存のみが含まれるDebian10(buster)を基に作成されたコンテナイメージ
aptやshellさえも含まれていない
SUS(Single Unix Specification)
Single UNIX Specification(SUS、唯一のUNIX仕様)は、"UNIX"を名乗ることができるコンピュータのオペレーティングシステム (OS) の標準規格全体を総称したものである。SUSは、IEEEと The Open Group の標準化作業の結果に基づくもので、Austin Group が開発および保守を行っている。
LinuxとFreeBSDはSUS認定を受けていない
https://gyazo.com/b7f0f6973697e2989ab94dc29e9311af
LSB(Linux Standard Base)
Linux Standard Base (LSB) は、複数のLinuxディストリビューションの共同プロジェクトであり、Linux Foundationを活動母体としてLinux系オペレーティングシステムの内部構造の標準化を行うものである。LSBはPOSIX仕様、Single UNIX Specification、その他いくつかのオープン標準に基づいて、特定の分野についてそれらを拡張している
BusyBox
LinuxやUNIX系OSで使われる多数の標準的なコマンドを、単一の実行ファイルに詰め込んだプログラム
よく利用されているUNIXツール群をまとめて1つの実行ファイルにしたソフトウェア。組み込みに多い
シェルの内部コマンド
code: シェルの内部コマンド
alias, bg, cd, command, false, fc, fg, getopts, hash, jobs, kill, newgrp, pwd, read, true, umask, unalias, wait
内部コマンド以外でSUS、LSB、BusyBox の最大公約数をとったコマンド
code: 内部コマンド以外
[, awk, basename, bc, cat, chgrp, chmod, chown, cksum, cmp, comm, cp, crontab, cut, date, dd, df, diff, dirname, du, echo, ed, env, expand, expr, find, fold, fuser, grep, head, id, ln, logger, ls, mkdir, mkfifo, more, mv, nice, nl, nohup, od, printf, ps, renice, rm, rmdir, sed, sh, sleep, sort, split, strings, stty, tail, tee, touch, unexpand, uniq, wc, xargs, zcat
変数展開 echo "hello ${USER}"・ワイルドカード cp *.txt dest・パイプ |・リダイレクト >, >> などが実装されているらしい
第12章 プロセスの役割とGo言語による操作
※12章も写経してない
プロセスに含まれるもの(Go 言語視点)
code: _
実行ファイルパス
プロセスID
プロセスグループID、セッショングループID
ユーザーID、グループID
実効ユーザーID、実効グループID
カレントフォルダ
ファイルディスクリプタ
psコマンド
-f オプションで以下を表示
ユーザID | プロセスID | 親プロセスID | 短期間のCPU使用率 | プロセス開始時刻 | 制御端末名 | CPU使用経過時間 | コマンド名
プロセスのすべての情報はtask_struct型のプロセスディスクリプタに保管されている
現代のプロセスは自分の仕事にだけ集中すればいい、他のプロセスが干渉しないから(5章)
だがそれは、OSが管理してくれているおかげ
スタック領域、ルートディレクトリ、静的なデータ領域、動的なデータ領域の確保
Goでは、os.Processとexec.Cmdでプロセスを扱うことができる
12.7 Go言語ではあまり触れることのない世界
fork/exec
フォークと並行処理
デーモン化
12.8 子プロセスの内部実装
第13章 シグナルによるプロセス間の通信
シグナルの用途2つ
1. プロセス間通信
2. ソフトウェア割り込み
https://gyazo.com/812d6da2f000a9d2885562bf4d3f3e8a
https://gyazo.com/bd78c9f45f615dbba81597728d0f4b89
p.254
Linux カーネル内ではスレッド・プロセスをまとめてタスクという言葉で扱ってい て、実際、スレッドとプロセスの実装上の差はほぼありません
シグナル
ハンドルできないシグナル
SIGKILL:プロセスを強制終了
SIGSTOP:プロセスを一時停止して、バックグラウンドジョブにする
サーバーアプリケーションでハンドルするシグナル
SIGTERM:kill()システムコールやkillコマンドがデフォルトで送信するシグナルで、 プロセスを終了させるもの
SIGHUP:通常は、後述するコンソールアプリケーション用のシグナルだが、「ターミナル を持たないデーモンでは絶対に受け取ることはない」ので、サーバーアプリケーションで は別の意味で使われる。具体的には、設定ファイルの再読み込みを外部から指示する用途 で使われることがデファクトスタンダードとなっている
コンソールアプリケーションでハンドルするシグナル
SIGINT:ユーザーがCtrl+Cでプログラムを終了
SIGQUIT:ユーザーがCtrl+\でコアダンプを生成し終了
SIGTSTP:ユーザーがCtrl+Zで停止させ、バックグラウンド動作をさせる
SIGCONT:バックグラウンド動作から戻させる指令
SIGWINCH:ウインドウサイズ変更
SIGHUP:バックグラウンド動作になったり、プロセスが終了したりして、擬似ターミナルから切断されるときに呼ばれるシグナル
グレイスフル・リスタート
まずはSIGTERMで送ろう。
dockerやk8sなどのコンテナ技術もアップデートにはSIGTERMを送ってからSIGKILLを送るパターンが多いから
第14章 Go言語と並列処理
goroutine: 実行
channel:コミュニケーション
select:調停
Goのファイルをコンパイルしてアセンブルに変換するコマンド
$ go tool compile -S main.go > main.s
「クロージャのローカル変数にキャプチャして渡す」の意味
code:sample.go
func sub1(c int) {
fmt.Println("share by arguments:", c*c)
}
func main() {
// 引数渡し
go sub1(10)
// クロージャのキャプチャ渡し
c := 20
go func() { // クロージャ。一般的には{}で囲まれた無名関数(関数リテラル)のこと
fmt.Println("share by capture", c*c) // キャプチャとはクロージャの中で使う変数をクロージャに取り込むこと。後で値が使える
}()
time.Sleep(time.Second)
}
スレッドとは
プログラムから見たスレッドは、「メモリにロードされたプログラムの現在の実行状態を持つ仮想 CPU」
OS や CPU から見たスレッドは、「時間が凍結されたプログラムの実行状態」
物理CPUコア、スケジューラー、プロセスの関係について補足
スケジューラーがCPU時間を割り当てることによって、複数のプロセスが物理CPUコア上で実行されることができる。また、複数の物理CPUコアを持つCPUでは、スケジューラーがそれぞれの物理CPUコアにプロセスを割り当てることによって、並列処理が可能になる
https://gyazo.com/481a92c6462828d4c306bca90899fbc3
第15章 並行・並列処理の手法と設計のパターン
主な実現手段
マルチプロセス
イベント駆動
マルチスレッド
ストリーミング・プロセッシング
第16章 Go言語のメモリ管理
ヒープとスタック
ヒープ: アプリケーションが実行時に動的に確保する領域。C言語においては一般的にmalloc関数で確保します
スタック: スタック領域は通常の変数の領域。auto変数などとも呼ばれますが、変数を定義するとスタック領域に確保されます。OSが自動的に必要な時に確保して、使用しなくなったら開放してくれる.
メモリ配置の慣例
1.システムコードやOS: メモリ空間の最初の領域は、システムコードやオペレーティングシステムが配置される領域です。これには、ブートストラップコードや起動時の初期化ルーチン、システムライブラリなどが含まれます。
2.プログラムのコードセグメント: プログラムの実行可能なコードは、通常、メモリの次の領域に配置されます。これは、実行可能ファイル内のプログラムコードのセグメントがメモリにロードされる場所です。
3.静的データとグローバル変数: グローバル変数や静的データ(初期化されたグローバル変数や静的変数)は、通常、コードの直後の領域に配置されます。これにより、グローバル変数へのアクセスが容易になります。
4.ヒープ: プログラムの実行中に動的に割り当てられるメモリ(ヒープ)は、通常、静的データやグローバル変数の後に位置します。ヒープは、実行時にメモリを動的に確保するために使用されるため、プログラムの実行中にメモリの割り当てと解放が頻繁に行われます。
5.スタック: プログラムの関数呼び出しやローカル変数などのスタックフレームが配置される領域は、通常、メモリの最後の領域です。スタックは、関数の呼び出しと制御のために使用されるデータ構造であり、関数呼び出しのたびにスタックフレームが追加されたり削除されたりします。
メモリの最適化
コピーオンライト: 複数のプロセスでシステムの同じ共有ライブラリをロードしている場合にメモリ消費を抑える仕組み
第17章 実行ファイルが起動するまで
アセンブリ
プロググラミング言語はブロックだが、アセンブリはラベル
起動時のラベル
_start
main
リンカーがラベルを読み取って実行ファイルを生成
M1 macでアセンブリを実行するコマンド
code: _
$ docker run -it --rm --platform linux/amd64 --name debian -v $(pwd):/path/to/mount gcc:11-bullseye
root@:/mnt# gcc -nostdlib hello.s
root@:/mnt# ./a.out
root@:/mnt# gcc hello.s
root@:/mnt# ./a.out
実行ファイルに格納されているもの
code: _
- この実行ファイルが対象としているCPUアーキテクチャの種類
- 実行ファイル中に含まれるセクションを、どのメモリアドレスに配置するか、そのときの
セクション名と実行権限
- プログラム起動時に最初に呼び出す命令が格納されているアドレス
- 実行ファイルの実行に必要な共有ライブラリの情報
- 実行コードのセクション(Mach-Oでは複数アーキテクチャ分を保持可能)
- 静的に初期化された変数のセクション
- サポートするOSの種類(Mach-Oのみ)
- 初期起動するスレッド情報(Mach-Oのみ)
- デバッガー用のシンボル情報
- 古いOS向けに「このバイナリは実行できません」というメッセージを出す16ビットコー
ド(PE のみ)
Goの埋め込みについて
インタプリタ言語のモジュールによる起動の確認
code: python
$ python -v ⏎
import _frozen_importlib # frozen
import _imp # builtin
import '_thread' # <class '_frozen_importlib.BuiltinImporter'>
(中略)
# installing zipimport hook
import 'time' # <class '_frozen_importlib.BuiltinImporter'>
import 'zipimport' # <class '_frozen_importlib.FrozenImporter'>
# installed zipimport hook
# /opt/local/lib/python3.9/encodings/__pycache__/__init__.cpython-39.pyc matches
→ /opt/local/lib/python3.9/encodings/__init__.py # code object from
→ '/opt/local/lib/python3.9/encodings/__pycache__/__init__.cpython-39.pyc' # /opt/local/lib/python3.9/__pycache__/codecs.cpython-39.pyc matches
→ /opt/local/lib/python3.9/codecs.py
# code object from '/opt/local/lib/python3.9/__pycache__/codecs.cpython-39.pyc' import '_codecs' # <class '_frozen_importlib.BuiltinImporter'>
import 'codecs' # <_frozen_importlib_external.SourceFileLoader object at
→ 0x100c10ca0>
(中略)
import 'site' # <_frozen_importlib_external.SourceFileLoader object at 0x100c40fd0> Python 3.9.5 (default, May 7 2021, 18:34:13)
Type "help", "copyright", "credits" or "license" for more information.
(中略)
# /opt/local/lib/python3.9/__pycache__/rlcompleter.cpython-39.pyc matches → /opt/local/lib/python3.9/rlcompleter.py
# code object from
→ '/opt/local/lib/python3.9/__pycache__/rlcompleter.cpython-39.pyc'
import 'rlcompleter' # <_frozen_importlib_external.SourceFileLoader object at → 0x100cb3ca0>
第18章 時間と時刻
第19章 Go言語とコンテナ
用語
完全仮想化(KVM)
準仮想化(PV)
ハイパーバイザ型の仮想化ソフトウェア(HVM)
Linux Containers(LXC)
物理 Linux マシンにインストールして仮想マシンを作成できるソフトウェア機能(Xen)
https://gyazo.com/00e6f22678f580396619e6d41b900a68
ホストOSのカーネル側からの提供
コントロールグループ(cgroups)で以下の使用量とアクセスを制限
CPU
メモリ
ブロックデバイス(mmap可能なストレージとほぼ同義)
ネットワーク
/dev 以下のデバイスファイル
名前空間(Namespaces)でホストから分離
プロセスID
ネットワーク(インタフェース、ルーティングテーブル、ソケットなど)
マウント(ファイルシステム)
UTS(ホスト名)
IPC(セマフォ、MQ、共有メモリなどのプロセス間通信)
ユーザー(UID、GID)
_____________________________________________________
感想
※ 個人の意見です
Cでは少し難しいがCに近い、Go言語がよしなにしてくれるの「よしな」の部分がどうなっているかが理解できる良い本だった
権限周りとユーザー空間/カーネル空間については解像度が上がった気がする
個人的にはシグナル周りとメモリ空間のところが発見が多くて面白かった
システムプログラミングという名の通り、アプリケーションを実行するまでにどのコンピューターのハードウェアの操作・制御をしているのかをイメージさせるために書かれていた。
ただ、本書の印象としてはGo言語でシステムが見えるようになるというよりも、システムからGo言語が見えるようになるの方が主軸だったように思うので、自分は後者を期待しすぎていたのだと思った。
そういう面では、基礎よりは実学に近い印象も同時にもった。
したがってもう少しサクサクと読み進めて問題なかったと後悔している。
本書によって
「APIの裏側でカーネルやOSがいかに縁の下の力持ちか分かる」とあったがそれを実感できたのは5・10・13章/19章だけだった気がする。
個人的にコンテナ周りの解像度も期待していたけどあまり深掘りされてる感じはなかった。意外と種類があって難しいらしい
_____________________________________________________
用語集
ファイルディスクリプタ
オペレーティングシステムがプログラムに対して提供する、開いているファイルや通信ソケットなどのリソースにアクセスするための識別子です。POSIX系OSにおいて、ファイルディスクリプタは整数(通常は非負整数)で表されます。
プログラムがファイルや通信ソケットを開くと、オペレーティングシステムはそのリソースへのアクセスを管理するために、ユニークなファイルディスクリプタを割り当てます。プログラムは、このファイルディスクリプタを使ってリソースに対する読み書きや状態の変更などの操作を行います。
POSIX系OSにおいて、通常、ファイルディスクリプタ0、1、2はそれぞれ標準入力(stdin)、標準出力(stdout)、標準エラー出力(stderr)に予約されています。これらはプログラムが起動する際に自動的に割り当てられるため、プログラムはこれらのファイルディスクリプタを利用して、ユーザーとの対話やエラーメッセージの表示などを行うことができます。
簡単に言うと、ファイルディスクリプタはオペレーティングシステムがプログラムに提供する、開いているファイルや通信ソケットなどのリソースにアクセスするための整数値であり、プログラムはこの識別子を使ってリソースへの操作を行います。
POSIX(ポジックス)
POSIX(Portable Oper- ating System Interface)は、OS 間で共通のシステムコールを決めることで、アプリ ケーションの移植性を高めるために作られた IEEE 規格です。
コンセプトは、「OS 間のポータビリティを維持する」
最終的に OS に仕事をお願いするのはシステムコールですが、POSIX で定められているのはシステムコールそ のものではなく、システムコールを呼び出すためのインタフェース(Go 言語の用語 とは違いますが、広い意味で)です 。具体的には C 言語の関数名と引数、返り値が 定義されています。
たとえばファイル入出力は、POSIX では 5 つの基本のシステムコールで構成されていて、そのための C 言語の関数は open()、read()、write()、close()、lseek() です。
レジスタ
CPU が持つ演算用のメモリ。CPUによって異なり、動作モードが 32 ビットか 64 ビットかでも多少変わってくる
プログラムカウンタ
次に実行すべき命令が入っているアドレス(メモリ上の番地)を記憶しておくためのレジスタ
スタックポインタ
マイクロプロセッサ内部MPU/CPU)でデータを保持するレジスタの一種で、スタックと呼ばれるメモリ領域の現在の操作位置を保持するためのもの
データレジスタ
演算結果を置いたり、データを一時的に記憶するレジスタ
OpenBSD
OpenBSD(オープンビーエスディー)とは、オープンソースのBSD系UNIXライクなオペレーティングシステムです。非常に高いセキュリティ性が特徴。
RAXレジスタ
x86アーキテクチャのCPUレジスタの一つ。一般的に、整数値の演算に使用されます。
シグナルハンドラ
シグナルハンドラ(signal handler)とは、プログラムがシグナル(割り込み)を受け取ったときに呼び出される関数のことです。シグナルは、OSがプログラムに通知する特別なイベントであり、例えばプログラムが異常終了する原因となるSIGSEGV(セグメンテーション違反)や、プログラムが割り込まれたことを通知するSIGINT(インタラプト)などがあります。
シグナルハンドラは、プログラムがシグナルを受け取ったときに自動的に呼び出され、プログラムがシグナルを処理するためのカスタムロジックを実行することができます。例えば、SIGINTを受け取ったときにプログラムを正常終了するための処理を実行することができます。
カーネル
カーネルは、コンピュータのオペレーティングシステムの中核で、ハードウェアとソフトウェアの両方の機能を提供するプログラムです。プログラムやアプリケーションが実行されるための基盤となり、システムリソースを管理して、必要な機能を提供します。
・プロセス管理: プロセスの作成、スケジューリング、終了などを行う。
・メモリ管理: プロセスのメモリ空間の割り当て、解放、ページング、スワッピングなどを行う。
・デバイスドライバ: デバイスへのアクセスを抽象化し、デバイスへのアクセスを提供するインタフェースを提供する。
・ファイルシステム: ファイルやディレクトリの管理を行い、ファイルアクセスを提供する。
ユーザーランド
実行中のオペレーティングシステム(OS)環境の中で、中核部であるカーネル以外の要素のこと。一般ユーザーの権限で操作できる領域であり、シェルやコマンド、アプリケーションなどが含まれる。
https://gyazo.com/798c67cb2b57580e695e63e544eaf03a
ネットワークカード
(英: network card)は、ネットワークへの物理的な接続を提供するためにコンピュータにインストールされるアダプタ回路基板である
https://gyazo.com/ff8d6105b5caa3e417a78cbd5ebaeebf
ソケット通信
ソケットインターネットとも呼ばれ、主にプログラムの世界とTCP/IP世界を結ぶ特別な出入り口のことを意味し、TCP/IPのトランスポート層を指します
https://gyazo.com/507dcfe21ec8f24541691ae734daa55c
輻輳
輻輳とは、さまざまな物が1箇所に集中する状態を指す
フォールバック
フォールバックとは、通常使用する方式や系統が正常に機能しなくなったときに、機能や性能を制限したり別の方式や系統に切り替えるなどして、限定的ながら使用可能な状態を維持すること
ペイロード
パケット通信においてパケットに含まれるヘッダやトレーラなどの付加的情報を除いた、データ本体のことである。
パケットにはデータの転送先や転送経路などを制御するための情報を含むヘッダや、データの破損などを検査するトレーラなどの情報が、データそのもののほかに付加されて送られる。ペイロードの語は、こうした情報を対象に含めず、ユーザーが送信したいデータそのものを指し示す際に用いられる。
データグラム型かストリーム型か
「ストリームソケット」は、TCP を使用したプロセスの通信を可能にします。ストリームソケットは、信頼性の高い、順序付けされた、重複のない双方向データフローをレコード境界なしで提供します。コネクションが確立されたあと、これらのソケットからのデータの読み取り、およびこれらのソケットに対するデータの書き込みがバイトストリームとして行えます。ソケットタイプは SOCK_STREAM です。
「データグラムソケット」は、UDP を使用したプロセスの通信を可能にします。データグラムソケットは、メッセージの双方向フローをサポートします。データグラムソケット側のプロセスは、送信シーケンスとは異なる順序でメッセージを受信することがあります。また、データグラムソケット側のプロセスは、重複したメッセージを受信することがあります。データグラムソケットで送信されるメッセージは、失われる場合があります。データ内のレコード境界は保持されます。ソケットタイプは SOCK_DGRAM です。
inode
iノードとは、ファイルの所有者やサイズ、アクセス権限、作成日時、データ領域へのポインタなどの各種情報を記録するための領域だ。 UNIX系のOSは、ファイルを実際のデータ領域とiノードに分けて管理している。
shebang(シバンまたはシェバン)
UnixおよびLinuxのスクリプトファイルの先頭行にある特殊な文字列。スクリプトファイルがどのプログラムで実行されるかを指定するために使用されます
ランタイム runtime
「実行時に必要になるあれこれの部品・環境」のこと
ランタイムが担うお仕事としては以下のようなものがあります。
・カーネルから割り当てられたメモリを分割し、必要なところに割り当てる
・ガベージコレクタを動かす
・ゴールーチンのスケジューリングを行う
コンテキストスイッチ
論理CPU上で動作するプロセスが切り替わること。
頻繁にContext Switchingを行われるとオーバーヘッドが発生し、効率(性能)が落ちる
フォーク
コンピュータ上で実行されているプログラム(プロセス)が、自身の複製を作成して新たなプロセスとして起動することをフォークという。 LinuxなどのUNIX系OSでよく利用される仕組みで、同名のシステムコール「fork」を利用して実行される。