[インデックス 18725] ファイルの概要
このコミットは、Go言語のリリースノート doc/go1.3.txt
にFreeBSD関連の項目を追加するものです。具体的には、FreeBSD 10におけるソケット作成の高速化(SOCK_CLOEXEC
とAccept4
の使用)、syscall
パッケージへのAccept4
の追加、およびFreeBSD 10のサポートに関する変更が記載されています。
コミット
commit df8b63780b9331ea1860eae6432b047a7c8ea08e
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date: Tue Mar 4 10:53:24 2014 +0900
doc: add freebsd items
LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/71000043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/df8b63780b9331ea1860eae6432b047a7c8ea08e
元コミット内容
doc: add freebsd items
LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/71000043
変更の背景
このコミットは、Go 1.3のリリースに向けたドキュメントの更新の一環として行われました。Go言語はクロスプラットフォーム対応を重視しており、様々なオペレーティングシステム上での動作をサポートしています。FreeBSDもその重要なターゲットの一つです。
FreeBSD 10では、ソケット操作に関するいくつかの重要な改善が導入されました。特に、SOCK_CLOEXEC
フラグとAccept4
システムコールは、ソケットの作成と受け入れのプロセスをより効率的かつ安全にするためのものです。Goランタイムがこれらの新しい機能を利用できるようにすることで、FreeBSD上でのネットワークアプリケーションのパフォーマンス向上とリソース管理の改善が期待されます。
このドキュメント更新は、これらのFreeBSD 10固有の最適化がGo 1.3で利用可能になったことをユーザーに知らせるためのものです。これにより、Go開発者はFreeBSD 10の新しい機能を活用し、より高性能なネットワークサービスを構築できるようになります。
前提知識の解説
1. SOCK_CLOEXEC
フラグ
SOCK_CLOEXEC
は、ソケットを作成する際に指定できるフラグです。このフラグが設定されたソケットは、exec
ファミリーのシステムコール(例: execve
, execl
など)によって新しいプログラムが実行される際に、自動的にクローズされます。
なぜ重要か?
- セキュリティの向上: 子プロセスが意図せず親プロセスのソケットディスクリプタを継承し、それを通じて機密情報にアクセスしたり、予期せぬネットワーク通信を行ったりするリスクを防ぎます。
- リソースリークの防止: プロセスが
exec
によって別のプログラムに置き換わる際に、不要なソケットディスクリプタがオープンなまま残ることを防ぎ、リソースリークを抑制します。 - 競合状態の回避:
fork()
とexec()
の間に、子プロセスがソケットディスクリプタを操作する競合状態(race condition)を回避できます。従来の方式では、socket()
でソケットを作成した後、fcntl(fd, F_SETFD, FD_CLOEXEC)
を呼び出してCLOEXEC
フラグを設定する必要がありましたが、この間に子プロセスがソケットを継承してしまう可能性がありました。SOCK_CLOEXEC
はソケット作成と同時にフラグを設定するため、この競合状態を根本的に解決します。
2. Accept4
システムコール
Accept4
は、既存のaccept
システムコールを拡張したものです。accept
と同様に、リスニングソケット上で保留中の接続を受け入れ、新しいソケットディスクリプタを返しますが、Accept4
は追加のフラグ引数を受け取ることができます。
なぜ重要か?
SOCK_NONBLOCK
とSOCK_CLOEXEC
の同時設定:Accept4
の最も重要な機能は、新しいソケットディスクリプタに対してSOCK_NONBLOCK
(非ブロッキングモード)とSOCK_CLOEXEC
フラグをアトミックに設定できる点です。- 従来の
accept
では、接続を受け入れた後にfcntl
を呼び出してこれらのフラグを設定する必要がありました。この間に、新しいソケットディスクリプタがブロッキングモードで動作したり、CLOEXEC
フラグが設定される前にexec
が呼び出されたりする可能性がありました。 Accept4
を使用することで、これらの操作が単一のシステムコール内で完結し、競合状態を回避し、効率を向上させます。
- 従来の
- パフォーマンスの向上: システムコール呼び出しの回数を減らすことで、オーバーヘッドが削減され、特に高負荷なネットワークアプリケーションにおいてパフォーマンスが向上します。
3. FreeBSD 10
FreeBSDは、UNIX系のオペレーティングシステムの一つで、高性能、安定性、セキュリティに定評があります。FreeBSD 10は、2014年1月にリリースされた主要なバージョンアップであり、このバージョンでSOCK_CLOEXEC
フラグとAccept4
システムコールが導入されました。Goランタイムがこれらの新しいAPIを利用することで、FreeBSD 10上での動作が最適化され、より効率的なネットワーク処理が可能になります。
技術的詳細
このコミット自体はGoのソースコードの変更ではなく、Go 1.3のリリースノート (doc/go1.3.txt
) に、FreeBSD 10におけるGoランタイムの改善点に関する記述を追加するものです。追加された項目は以下の3つです。
-
net: enable fast socket creation using SOCK_CLOEXEC and Accept4 on FreeBSD 10 (69100043)
- これは、Goの
net
パッケージがFreeBSD 10で利用可能なSOCK_CLOEXEC
フラグとAccept4
システムコールを活用し、ソケットの作成と接続受け入れのプロセスを高速化したことを示しています。これにより、特に多数の同時接続を処理するサーバーアプリケーションにおいて、パフォーマンスの向上が期待されます。内部的には、Goランタイムがこれらの新しいAPIを条件付きで利用するように実装が変更されたことを意味します。
- これは、Goの
-
syscall: add Accept4 for freebsd (CL 68880043)
- これは、Goの
syscall
パッケージにFreeBSD向けのAccept4
システムコールが追加されたことを示しています。syscall
パッケージは、GoプログラムからOSの低レベルなシステムコールを直接呼び出すためのインターフェースを提供します。この追加により、Go開発者は必要に応じてAccept4
を直接利用できるようになり、より細かな制御や最適化が可能になります。
- これは、Goの
-
syscall: add support for FreeBSD 10 (CL 56770044, 56980043)
- これは、Goの
syscall
パッケージがFreeBSD 10の新しい機能や変更に対応するように更新されたことを示しています。これには、新しいシステムコールの追加だけでなく、既存のシステムコールの動作変更への対応や、FreeBSD 10固有の定数や構造体の定義などが含まれる可能性があります。これにより、GoプログラムがFreeBSD 10環境で安定して動作し、その機能を最大限に活用できるようになります。
- これは、Goの
これらの変更は、Goランタイムが特定のOSの最新機能を積極的に取り込み、そのプラットフォーム上でのパフォーマンスと互換性を向上させるというGo開発チームのコミットメントを示しています。
コアとなるコードの変更箇所
このコミットは、Goのソースコード自体を変更するものではなく、Go 1.3のリリースノートファイル doc/go1.3.txt
に以下の3行を追加しています。
--- a/doc/go1.3.txt
+++ b/doc/go1.3.txt
@@ -15,11 +15,14 @@ net/http: add optional Server.ConnState callback (CL 69260044)
net/http: use TCP Keep-Alives on DefaultTransport's connections (CL 68330046)
net/http: use TCP keep-alives for ListenAndServe and ListenAndServeTLS (CL 48300043)
net: add Dialer.KeepAlive option (CL 68380043)
+net: enable fast socket creation using SOCK_CLOEXEC and Accept4 on FreeBSD 10 (69100043)
os/exec: fix Command with relative paths (CL 59580044)
runtime/debug: add SetPanicOnFault (CL 66590044)
runtime: output how long goroutines are blocked (CL 50420043)
sync: add Pool (CL 41860043, 46010043)
+syscall: add Accept4 for freebsd (CL 68880043)
syscall: add NewCallbackCDecl to use for windows callbacks (CL 36180044)
+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)
コアとなるコードの解説
追加された各行は、Go 1.3で導入された特定の変更点とその変更を追跡するためのGo CL (Change List) 番号を示しています。
-
net: enable fast socket creation using SOCK_CLOEXEC and Accept4 on FreeBSD 10 (69100043)
- この行は、Goのネットワーク (
net
) パッケージが、FreeBSD 10で利用可能なSOCK_CLOEXEC
フラグとAccept4
システムコールを利用して、ソケットの作成を高速化したことを示しています。CL 69100043でこの機能が実装されました。
- この行は、Goのネットワーク (
-
syscall: add Accept4 for freebsd (CL 68880043)
- この行は、Goのシステムコール (
syscall
) パッケージに、FreeBSD固有のAccept4
システムコールが追加されたことを示しています。CL 68880043でこのシステムコールがGoから呼び出せるようになりました。
- この行は、Goのシステムコール (
-
syscall: add support for FreeBSD 10 (CL 56770044, 56980043)
- この行は、Goの
syscall
パッケージがFreeBSD 10の全体的なサポートを強化したことを示しています。これには、FreeBSD 10で導入された新しいAPIや変更への対応が含まれます。CL 56770044とCL 56980043でこれらの変更が行われました。
- この行は、Goの
これらの記述は、Go 1.3がFreeBSD 10環境において、より効率的で堅牢なネットワーク操作を提供するための重要な改善を含んでいることをユーザーに伝えます。
関連リンク
- Go 1.3 Release Notes (公式ドキュメント): https://golang.org/doc/go1.3 (このコミットが反映されるドキュメントの最終版)
- Go CL 71000043 (このコミットの元のChange List): https://golang.org/cl/71000043
- Go CL 69100043 (net: enable fast socket creation using SOCK_CLOEXEC and Accept4 on FreeBSD 10): https://golang.org/cl/69100043
- Go CL 68880043 (syscall: add Accept4 for freebsd): https://golang.org/cl/68880043
- Go CL 56770044 (syscall: add support for FreeBSD 10): https://golang.org/cl/56770044
- Go CL 56980043 (syscall: add support for FreeBSD 10): https://golang.org/cl/56980043
参考にした情報源リンク
- FreeBSD 10.0-RELEASE Announcement: https://www.freebsd.org/releases/10.0R/announce/ (FreeBSD 10のリリース情報)
accept4(2)
man page (FreeBSD): https://www.freebsd.org/cgi/man.cgi?query=accept4&sektion=2 (FreeBSDにおけるaccept4
システムコールの詳細)socket(2)
man page (FreeBSD): https://www.freebsd.org/cgi/man.cgi?query=socket&sektion=2 (FreeBSDにおけるsocket
システムコールとSOCK_CLOEXEC
フラグの詳細)- The Linux
accept4()
system call: https://lwn.net/Articles/326521/ (Linuxにおけるaccept4
に関するLWN.netの記事。概念はFreeBSDにも共通) CLOEXEC
andO_NONBLOCK
onaccept()
: https://stackoverflow.com/questions/10058226/cloexec-and-o-nonblock-on-accept (CLOEXEC
とO_NONBLOCK
に関するStack Overflowの議論)- Go
syscall
package documentation: https://pkg.go.dev/syscall (Goのsyscall
パッケージの公式ドキュメント) - Go
net
package documentation: https://pkg.go.dev/net (Goのnet
パッケージの公式ドキュメント) - Go Change List (CL) system: https://go.dev/doc/contribute#change_lists (GoのChange Listシステムに関する説明)