Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 18843] ファイルの概要

このコミットは、Go 1.3 リリースノートのドキュメントファイル doc/go1.3.txt に追加の変更点を追記するものです。具体的には、スタックのコピーに関するサポート、Windows 2000 のサポート終了、およびガベージコレクタにおけるライブネス解析について言及しています。

コミット

commit b11aeef912f24bfb881bb0b7df2c72235991202b
Author: Russ Cox <rsc@golang.org>
Date:   Wed Mar 12 16:32:35 2014 -0400

    doc/go1.3.txt: add notes about copying stacks, win2k support
    
    LGTM=bradfitz
    R=golang-codereviews, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/74800043

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/b11aeef912f24bfb881bb0b7df2c72235991202b

元コミット内容

--- a/doc/go1.3.txt
+++ b/doc/go1.3.txt
@@ -27,3 +27,8 @@ syscall: add support for FreeBSD 10 (CL 56770044, 56980043)
 testing: add b.RunParallel function (CL 57270043)
 testing: diagnose buggy tests that panic(nil) (CL 55780043)
 unicode: upgrade from Unicode 6.2.0 to 6.3.0 (CL 65400044)
+
+Additional notes:
+- support for Windows 2000 removed (CL 74790043)
+- copying stack support; initial stack size 4kB again.
+- liveness analysis in garbage collector

変更の背景

このコミットは、Go 1.3 のリリースノートドキュメント doc/go1.3.txt に、以前のコミットで導入された重要な変更点に関する追加の注記を追記するために作成されました。Go 1.3 は、Go 言語のランタイムとコンパイラに多くの重要な改善をもたらしたバージョンであり、特にガベージコレクションとスタック管理の分野で大きな進歩がありました。

具体的には、以下の3つの主要な変更点がリリースノートに明記される必要がありました。

  1. Windows 2000 のサポート終了: Go 1.3 では、古いオペレーティングシステムである Windows 2000 のサポートが正式に終了しました。これは、開発リソースの最適化と、より新しいOSバージョンに焦点を当てるための決定でした。
  2. スタックのコピーサポートと初期スタックサイズ: Go 1.3 では、スタックのコピーメカニズムが導入され、それに伴いゴルーチンの初期スタックサイズが 4KB に戻されました。これは、Go のスタック管理戦略における重要な変更であり、パフォーマンスとメモリ使用量のバランスを取るためのものです。
  3. ガベージコレクタにおけるライブネス解析: Go 1.3 のガベージコレクタは、ライブネス解析(liveness analysis)の改善を特徴としています。これにより、ガベージコレクタがより正確に「生きている」オブジェクトを識別し、不要なメモリを効率的に解放できるようになりました。

これらの変更は、Go 1.3 の重要な機能改善であるため、ユーザーがリリースノートを通じてこれらの情報を容易に把握できるように、ドキュメントへの追記が必要とされました。

前提知識の解説

このコミットの変更内容を理解するためには、以下のGo言語のランタイムとガベージコレクションに関する基本的な知識が必要です。

1. Goのゴルーチンとスタック

Go言語のゴルーチン(goroutine)は、軽量な並行処理の単位です。各ゴルーチンは独自のスタックを持っています。Goのランタイムは、必要に応じてゴルーチンのスタックを動的に拡張・縮小します。

  • スタックの成長と縮小: Goの初期バージョンでは、スタックは固定サイズで、オーバーフローすると新しいより大きなスタックにコピーされていました。Go 1.2では、連続したスタック(contiguous stack)が導入され、スタックの成長がより効率的になりました。しかし、Go 1.3では、スタックのコピーメカニズムが再び導入され、特定のシナリオでのパフォーマンスが改善されました。
  • 初期スタックサイズ: ゴルーチンが開始される際に割り当てられる初期スタックのサイズです。このサイズは、メモリ使用量とスタックの成長・縮小の頻度に影響を与えます。Go 1.3で初期スタックサイズが4KBに戻されたのは、スタックのコピーサポートと関連しています。

2. ガベージコレクション (GC)

ガベージコレクションは、プログラムが不要になったメモリを自動的に解放するプロセスです。Goのガベージコレクタは、並行かつ低遅延で動作するように設計されています。

  • ライブネス解析 (Liveness Analysis): ガベージコレクタが「生きている」(プログラムによってまだ参照されている)オブジェクトを識別するためのプロセスです。ライブネス解析が正確であればあるほど、ガベージコレクタはより多くの不要なメモリを解放できます。Go 1.3では、このライブネス解析が改善され、GCの効率と精度が向上しました。
  • マーク&スイープ (Mark and Sweep): Goのガベージコレクタの基本的なアルゴリズムの一つです。ライブネス解析によって「生きている」とマークされたオブジェクト以外のメモリを解放します。

3. Windows 2000

Windows 2000 は、2000年にリリースされたMicrosoftのオペレーティングシステムです。Go 1.3がリリースされた2014年時点では、すでにサポートが終了しており、セキュリティや互換性の問題から使用が推奨されない古いOSでした。Goのようなモダンな言語が古いOSのサポートを終了するのは、開発コストの削減と、より新しい環境での最適化に注力するためによくあることです。

技術的詳細

このコミット自体はドキュメントの変更ですが、その背景にある技術的変更はGoランタイムの重要な進化を示しています。

1. Windows 2000 サポートの削除 (CL 74790043)

Go 1.3では、Windows 2000 のサポートが正式に削除されました。これは、Goのビルドシステムとランタイムが、より新しいWindows APIと機能に依存するようになったためです。古いOSのサポートを維持することは、テスト、デバッグ、および特定の機能の実装において追加の複雑さをもたらします。サポートの削除により、開発チームはより新しいWindowsバージョン(Windows XP以降)に焦点を当て、それらの環境でのパフォーマンスと安定性を向上させることができました。

2. スタックのコピーサポートと初期スタックサイズ 4KB への回帰

Go 1.2では、スタックの成長をより効率的にするために「連続したスタック」(contiguous stack)が導入されました。これは、スタックがヒープ上に連続したメモリブロックとして割り当てられ、必要に応じてそのブロックが拡張されるというものでした。しかし、このアプローチにはいくつかの課題がありました。特に、スタックの拡張時にメモリの再割り当てとコピーが発生する可能性があり、これがパフォーマンスのボトルネックになることがありました。

Go 1.3では、このアプローチが見直され、スタックのコピーサポートが再び導入されました。これは、ゴルーチンのスタックが小さくなりすぎたり、大きくなりすぎたりした場合に、新しいサイズのスタックを割り当てて、古いスタックの内容を新しいスタックにコピーするというメカニズムです。この変更に伴い、ゴルーチンの初期スタックサイズが 4KB に戻されました

この変更の主な理由は、スタックのコピーが特定の条件下で連続したスタックよりも効率的であると判断されたためです。特に、スタックの成長と縮小が頻繁に発生するようなワークロードにおいて、コピーベースのスタック管理がより予測可能で、かつオーバーヘッドが少ない場合があります。また、スタックのコピーは、ガベージコレクタがスタックをスキャンする際の複雑さを軽減する効果もあります。

3. ガベージコレクタにおけるライブネス解析の改善

Go 1.3のガベージコレクタは、ライブネス解析の精度と効率が大幅に向上しました。ライブネス解析は、ガベージコレクタがメモリを解放する際に、どのオブジェクトがまだプログラムによって使用されているか(「生きている」か)を判断するために不可欠なステップです。

Go 1.3以前のGCは、スタック上のポインタを保守的にスキャンしていました。これは、ポインタのように見える値が実際にはポインタではない場合でも、それがポインタであると仮定して、その参照先のオブジェクトを「生きている」とマークする可能性がありました。この保守的なアプローチは安全ですが、実際には到達不可能なオブジェクトを誤って保持してしまう(メモリリークではないが、メモリ使用量が増える)可能性があります。

Go 1.3では、コンパイラとランタイムが連携して、スタック上のポインタに関するより正確な情報を提供するようになりました。これにより、ガベージコレクタはより正確なライブネス解析を実行できるようになり、不要なオブジェクトをより積極的に解放できるようになりました。結果として、メモリ使用量の削減とGCの一時停止時間の短縮が実現されました。これは、Goのガベージコレクタが「正確なGC」(precise GC)に近づくための重要な一歩でした。

コアとなるコードの変更箇所

このコミット自体は、doc/go1.3.txt というドキュメントファイルへの変更のみです。Go言語のソースコード自体には変更を加えていません。

--- a/doc/go1.3.txt
+++ b/doc/go1.3.txt
@@ -27,3 +27,8 @@ syscall: add support for FreeBSD 10 (CL 56770044, 56980043)
 testing: add b.RunParallel function (CL 57270043)
 testing: diagnose buggy tests that panic(nil) (CL 55780043)
 unicode: upgrade from Unicode 6.2.0 to 6.3.0 (CL 65400044)
+
+Additional notes:
+- support for Windows 2000 removed (CL 74790043)
+- copying stack support; initial stack size 4kB again.
+- liveness analysis in garbage collector

具体的には、doc/go1.3.txt ファイルの末尾に以下の5行が追加されています。

  • Additional notes:
  • - support for Windows 2000 removed (CL 74790043)
  • - copying stack support; initial stack size 4kB again.
  • - liveness analysis in garbage collector

これらの行は、Go 1.3のリリースにおける重要な変更点を簡潔にまとめたものです。

コアとなるコードの解説

前述の通り、このコミットはドキュメントの変更であり、Goランタイムのコアとなるコード自体には直接的な変更はありません。しかし、追加された各行は、Go 1.3で実装された重要なランタイム機能やポリシー変更を指し示しています。

  • support for Windows 2000 removed (CL 74790043): これは、GoランタイムのビルドターゲットからWindows 2000が除外されたことを意味します。関連する変更は、Goのビルドシステムや、Windows固有のシステムコールを扱うsyscallパッケージなどに分散して行われたと考えられます。CL 74790043 は、この変更を具体的に行った変更リスト(Change List)のIDです。

  • copying stack support; initial stack size 4kB again.: これは、Goランタイムのスタック管理メカニズムの変更を指します。Go 1.2で導入された連続スタックの概念から、Go 1.3ではスタックのコピーを伴う方式に回帰しました。これには、ランタイムのスケジューラ(runtimeパッケージ内のmgp構造体や関連する関数)およびスタックの割り当て・解放ロジック(runtime/stack.goなど)に大きな変更があったことを示唆しています。初期スタックサイズが4KBに戻されたのも、この新しいスタック管理戦略の一部です。

  • liveness analysis in garbage collector: これは、Goのガベージコレクタ(GC)の内部動作の改善を指します。特に、GCが「生きている」オブジェクトを識別する際の精度が向上したことを意味します。これには、コンパイラが生成するコード(特にスタックフレームに関する情報)と、ランタイムのGC部分(runtime/mgc.goruntime/stack.goruntime/mbitmap.goなど)にわたる複雑な変更が含まれています。より正確なライブネス解析は、GCの一時停止時間の短縮とメモリ使用量の削減に貢献します。

これらの変更は、Go 1.3のリリースにおける主要な改善点であり、Goプログラムのパフォーマンス、メモリ効率、およびサポートされるプラットフォームに大きな影響を与えました。

関連リンク

  • Go 1.3 Release Notes: このコミットが変更を加えているドキュメントの最終版は、Goの公式ウェブサイトで公開されているGo 1.3のリリースノートとして参照できます。
  • Go 1.3におけるスタックの変更に関する議論:
  • Go 1.3におけるGCの変更に関する議論:
  • Goのガベージコレクションに関する詳細:

参考にした情報源リンク