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

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

このコミットは、Go言語のリリースノート doc/go1.3.txt にFreeBSD関連の項目を追加するものです。具体的には、FreeBSD 10におけるソケット作成の高速化(SOCK_CLOEXECAccept4の使用)、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_NONBLOCKSOCK_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つです。

  1. net: enable fast socket creation using SOCK_CLOEXEC and Accept4 on FreeBSD 10 (69100043)

    • これは、GoのnetパッケージがFreeBSD 10で利用可能なSOCK_CLOEXECフラグとAccept4システムコールを活用し、ソケットの作成と接続受け入れのプロセスを高速化したことを示しています。これにより、特に多数の同時接続を処理するサーバーアプリケーションにおいて、パフォーマンスの向上が期待されます。内部的には、Goランタイムがこれらの新しいAPIを条件付きで利用するように実装が変更されたことを意味します。
  2. syscall: add Accept4 for freebsd (CL 68880043)

    • これは、GoのsyscallパッケージにFreeBSD向けのAccept4システムコールが追加されたことを示しています。syscallパッケージは、GoプログラムからOSの低レベルなシステムコールを直接呼び出すためのインターフェースを提供します。この追加により、Go開発者は必要に応じてAccept4を直接利用できるようになり、より細かな制御や最適化が可能になります。
  3. syscall: add support for FreeBSD 10 (CL 56770044, 56980043)

    • これは、GoのsyscallパッケージがFreeBSD 10の新しい機能や変更に対応するように更新されたことを示しています。これには、新しいシステムコールの追加だけでなく、既存のシステムコールの動作変更への対応や、FreeBSD 10固有の定数や構造体の定義などが含まれる可能性があります。これにより、GoプログラムがFreeBSD 10環境で安定して動作し、その機能を最大限に活用できるようになります。

これらの変更は、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でこの機能が実装されました。
  • syscall: add Accept4 for freebsd (CL 68880043)

    • この行は、Goのシステムコール (syscall) パッケージに、FreeBSD固有のAccept4システムコールが追加されたことを示しています。CL 68880043でこのシステムコールがGoから呼び出せるようになりました。
  • syscall: add support for FreeBSD 10 (CL 56770044, 56980043)

    • この行は、GoのsyscallパッケージがFreeBSD 10の全体的なサポートを強化したことを示しています。これには、FreeBSD 10で導入された新しいAPIや変更への対応が含まれます。CL 56770044とCL 56980043でこれらの変更が行われました。

これらの記述は、Go 1.3がFreeBSD 10環境において、より効率的で堅牢なネットワーク操作を提供するための重要な改善を含んでいることをユーザーに伝えます。

関連リンク

参考にした情報源リンク