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

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

このコミットは、Go言語のネットワークパッケージ(net)におけるFreeBSD/ARMアーキテクチャ向けの変更です。具体的には、Goランタイムに統合されたネットワークポーラーをFreeBSD/ARM環境で有効にすることを目的としています。これにより、ネットワークI/Oの効率とパフォーマンスが向上します。

コミット

commit 9b65dac494903780ef2134eb4fd6a8ee97cd7f4e
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Tue Aug 20 17:02:42 2013 +0900

    net: enable runtime-integrated network pollster on freebsd/arm
    
    Fixes #6146.
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/12927048

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

https://github.com/golang/go/commit/9b65dac494903780ef2134eb4fd6a8ee97cd7f4e

元コミット内容

net: enable runtime-integrated network pollster on freebsd/arm

Fixes #6146.

変更の背景

Go言語のネットワーク操作は、内部的にOSの提供するI/O多重化メカニズム(Linuxのepoll、macOS/BSDのkqueueなど)を利用して効率的に非同期I/Oを実現しています。Goランタイムは、これらのメカニズムと密接に連携し、ゴルーチン(goroutine)のスケジューリングとI/Oイベントの処理を統合することで、高い並行性とパフォーマンスを提供します。これを「ランタイム統合型ネットワークポーラー(runtime-integrated network pollster)」と呼びます。

このコミット以前のGoのバージョンでは、FreeBSDのARMアーキテクチャ(freebsd/arm)において、このランタイム統合型ネットワークポーラーが適切に有効化されていませんでした。その結果、freebsd/arm環境でのネットワークI/Oは、他のサポートされているプラットフォームと比較して効率が劣る可能性がありました。

コミットメッセージにある Fixes #6146 は、この問題がGoのIssueトラッカーで報告されていたことを示しています。Issue #6146は、「net: freebsd/arm needs runtime network poller」というタイトルで、FreeBSD/ARM環境でネットワークポーラーが有効になっていないことによるパフォーマンスの問題や、場合によってはデッドロックの可能性が指摘されていました。このコミットは、その問題を解決するために導入されました。

前提知識の解説

1. Goのビルドタグ(Build Tags)

Go言語では、ソースコードファイルの先頭に// +build tag1 tag2のようなコメントを記述することで、条件付きコンパイルを行うことができます。これは「ビルドタグ」と呼ばれ、特定のOS、アーキテクチャ、またはカスタムタグに基づいて、そのファイルをビルドに含めるか除外するかを制御します。

  • // +build freebsd,arm: このタグを持つファイルは、OSがFreeBSDで、かつCPUアーキテクチャがARMの場合にのみビルドに含まれます。
  • // +build ignore: このタグを持つファイルは、常にビルドから除外されます。これは、特定のファイルが特定のビルド構成でのみ使用されるべきではない場合や、テスト目的で一時的に無効化する場合などに使用されます。

2. ネットワークポーラー(Network Pollster)とI/O多重化

ネットワークポーラーは、複数のI/O操作(ソケットの読み書きなど)を効率的に監視し、準備ができたI/Oイベントをアプリケーションに通知するメカニズムです。これにより、アプリケーションはI/O操作が完了するのを待つ間、他の処理を行うことができ、高い並行性を実現します。

主要なI/O多重化メカニズムには以下のようなものがあります。

  • epoll (Linux): 大量のファイルディスクリプタ(FD)を効率的に監視できる、スケーラブルなメカニズム。
  • kqueue/kevent (FreeBSD, macOS, NetBSD): BSD系のOSで利用されるイベント通知インターフェース。epollと同様に効率的です。
  • select/poll (POSIX): 多くのUNIX系システムで利用可能な汎用的なメカニズムですが、監視できるFDの数に制限があったり、FDの数が増えるとパフォーマンスが低下する傾向があります。

3. GoランタイムとネットワークI/Oの統合

Goランタイムは、ゴルーチンとI/O多重化メカニズムを統合しています。Goのnetパッケージでネットワーク操作(例: conn.Read(), conn.Write())が呼び出されると、Goランタイムは対応するファイルディスクリプタをネットワークポーラーに登録します。I/O操作がブロックされる場合、ランタイムはそのゴルーチンを一時停止し、他の実行可能なゴルーチンにCPUを譲ります。ネットワークポーラーからI/Oイベント(例: データが読み取り可能になった)が通知されると、ランタイムは一時停止していたゴルーチンを再開し、I/O操作を完了させます。この仕組みにより、GoプログラムはノンブロッキングI/Oを意識することなく、同期的なコードスタイルで高い並行性を実現できます。

技術的詳細

このコミットの核心は、Goのビルドタグの変更を通じて、FreeBSD/ARM環境でfd_poll_runtime.goがビルドされるようにすることです。

  • src/pkg/net/fd_poll_runtime.go: このファイルは、Goランタイムに統合されたネットワークポーラーの実装を含んでいます。このポーラーは、OS固有の効率的なI/O多重化メカニズム(FreeBSDの場合はkqueue)を利用して、ネットワークI/Oイベントを処理します。

    • 変更前: // +build darwin freebsd,amd64 freebsd,386 linux netbsd openbsd windows
    • 変更後: // +build darwin freebsd linux netbsd openbsd windows
    • この変更により、freebsd,amd64freebsd,386という特定のアーキテクチャ指定が削除され、単にfreebsdとなりました。これは、FreeBSD上のすべてのアーキテクチャ(ARMを含む)でfd_poll_runtime.goがビルドされることを意味します。これにより、FreeBSD/ARM環境でもランタイム統合型ネットワークポーラーが有効になります。
  • src/pkg/net/fd_bsd.go: このファイルは、BSD系のOSにおけるファイルディスクリプタ(FD)の待機メカニズム(おそらくkqueue/keventのより汎用的な、あるいは特定のケースでの実装)に関連している可能性があります。

    • 変更前: // +build freebsd,arm
    • 変更後: // +build ignore
    • この変更により、freebsd/arm環境でfd_bsd.goがビルドされなくなります。これは、fd_poll_runtime.goがFreeBSD/ARMで有効になるため、このファイルが不要になるか、あるいは競合を避けるために無効化されたと考えられます。
  • src/pkg/net/fd_poll_unix.go: このファイルも、Unix系のシステムにおけるファイルディスクリプタのポーリングに関連する実装を含んでいる可能性があります。

    • 変更前: // +build freebsd,arm
    • 変更後: // +build ignore
    • fd_bsd.goと同様に、freebsd/arm環境でfd_poll_unix.goがビルドされなくなります。これも、fd_poll_runtime.goの有効化に伴い、特定のアーキテクチャ向けの代替ポーリングメカニズムが不要になったためと考えられます。

これらの変更は、FreeBSD/ARM環境におけるGoのネットワークスタックの動作を根本的に変更します。以前は、おそらくより単純な、あるいはランタイムと統合されていないポーリングメカニズムが使用されていたか、あるいは特定の最適化が欠けていた可能性があります。このコミットにより、FreeBSD/ARMも他の主要なプラットフォームと同様に、Goランタイムの高度なI/O多重化機能を活用できるようになり、ネットワークアプリケーションのパフォーマンスと安定性が向上します。

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

--- a/src/pkg/net/fd_bsd.go
+++ b/src/pkg/net/fd_bsd.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build freebsd,arm
+// +build ignore
 
 // Waiting for FDs via kqueue/kevent.
 
--- a/src/pkg/net/fd_poll_runtime.go
+++ b/src/pkg/net/fd_poll_runtime.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin freebsd,amd64 freebsd,386 linux netbsd openbsd windows
+// +build darwin freebsd linux netbsd openbsd windows
 
 package net
 
--- a/src/pkg/net/fd_poll_unix.go
+++ b/src/pkg/net/fd_poll_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build freebsd,arm
+// +build ignore
 
 package net

コアとなるコードの解説

このコミットの変更は、Goのビルドシステムがどのファイルを特定のプラットフォーム向けにコンパイルするかを制御するビルドタグに集約されています。

  1. src/pkg/net/fd_bsd.go の変更:

    • // +build freebsd,arm から // +build ignore へ変更。
    • これは、FreeBSD/ARM環境でfd_bsd.goがビルドされなくなることを意味します。このファイルは、おそらくFreeBSDのkqueue/keventを利用したFD待機メカニズムの特定の、あるいは以前の実装を含んでいましたが、新しいランタイム統合型ポーラーがFreeBSD/ARMで有効になるため、このファイルは不要になったか、あるいは競合を避けるために明示的に除外されました。
  2. src/pkg/net/fd_poll_runtime.go の変更:

    • // +build darwin freebsd,amd64 freebsd,386 linux netbsd openbsd windows から // +build darwin freebsd linux netbsd openbsd windows へ変更。
    • この変更が最も重要です。freebsd,amd64freebsd,386という具体的なアーキテクチャ指定が削除され、単にfreebsdとなりました。これにより、fd_poll_runtime.goはFreeBSD上のすべてのアーキテクチャ(amd64, 386だけでなく、armも含む)でビルドされるようになります。
    • fd_poll_runtime.goは、Goランタイムと密接に連携する高性能なネットワークポーラーの実装を含んでいます。この変更により、FreeBSD/ARM環境でもGoのネットワークI/Oがランタイムのスケジューラと統合され、効率的な非同期I/O処理が可能になります。
  3. src/pkg/net/fd_poll_unix.go の変更:

    • // +build freebsd,arm から // +build ignore へ変更。
    • fd_bsd.goと同様に、FreeBSD/ARM環境でfd_poll_unix.goがビルドされなくなります。このファイルも、おそらくFreeBSD/ARM向けの代替または以前のポーリングメカニズムを含んでいましたが、fd_poll_runtime.goが有効になることでその役割を終えました。

これらの変更は、Goのビルドプロセスにおいて、FreeBSD/ARM向けのネットワークポーリングの実装を、より汎用的でランタイムに統合されたfd_poll_runtime.goに切り替えることを目的としています。これにより、FreeBSD/ARM上でのGoアプリケーションのネットワークパフォーマンスと安定性が向上し、他のサポートされているプラットフォームと同等のI/O効率が実現されます。

関連リンク

参考にした情報源リンク

  • Go言語のソースコード (特に src/pkg/net ディレクトリ内のファイル)
  • Go言語のIssueトラッカー (Issue #6146)
  • Go言語のGerritコードレビューシステム (Change 12927048)
  • Go言語のビルドタグに関する公式ドキュメントや解説記事
  • I/O多重化メカニズム(epoll, kqueue, select/poll)に関する一般的な情報# [インデックス 17339] ファイルの概要

このコミットは、Go言語のネットワークパッケージ(net)におけるFreeBSD/ARMアーキテクチャ向けの変更です。具体的には、Goランタイムに統合されたネットワークポーラーをFreeBSD/ARM環境で有効にすることを目的としています。これにより、ネットワークI/Oの効率とパフォーマンスが向上します。

コミット

commit 9b65dac494903780ef2134eb4fd6a8ee97cd7f4e
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Tue Aug 20 17:02:42 2013 +0900

    net: enable runtime-integrated network pollster on freebsd/arm
    
    Fixes #6146.
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/12927048

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

https://github.com/golang/go/commit/9b65dac494903780ef2134eb4fd6a8ee97cd7f4e

元コミット内容

net: enable runtime-integrated network pollster on freebsd/arm

Fixes #6146.

変更の背景

Go言語のネットワーク操作は、内部的にOSの提供するI/O多重化メカニズム(Linuxのepoll、macOS/BSDのkqueueなど)を利用して効率的に非同期I/Oを実現しています。Goランタイムは、これらのメカニズムと密接に連携し、ゴルーチン(goroutine)のスケジューリングとI/Oイベントの処理を統合することで、高い並行性とパフォーマンスを提供します。これを「ランタイム統合型ネットワークポーラー(runtime-integrated network pollster)」と呼びます。

このコミット以前のGoのバージョンでは、FreeBSDのARMアーキテクチャ(freebsd/arm)において、このランタイム統合型ネットワークポーラーが適切に有効化されていませんでした。その結果、freebsd/arm環境でのネットワークI/Oは、他のサポートされているプラットフォームと比較して効率が劣る可能性がありました。

コミットメッセージにある Fixes #6146 は、この問題がGoのIssueトラッカーで報告されていたことを示しています。Issue #6146は、「net: freebsd/arm needs runtime network poller」というタイトルで、FreeBSD/ARM環境でネットワークポーラーが有効になっていないことによるパフォーマンスの問題や、場合によってはデッドロックの可能性が指摘されていました。このコミットは、その問題を解決するために導入されました。

前提知識の解説

1. Goのビルドタグ(Build Tags)

Go言語では、ソースコードファイルの先頭に// +build tag1 tag2のようなコメントを記述することで、条件付きコンパイルを行うことができます。これは「ビルドタグ」と呼ばれ、特定のOS、アーキテクチャ、またはカスタムタグに基づいて、そのファイルをビルドに含めるか除外するかを制御します。

  • // +build freebsd,arm: このタグを持つファイルは、OSがFreeBSDで、かつCPUアーキテクチャがARMの場合にのみビルドに含まれます。
  • // +build ignore: このタグを持つファイルは、常にビルドから除外されます。これは、特定のファイルが特定のビルド構成でのみ使用されるべきではない場合や、テスト目的で一時的に無効化する場合などに使用されます。

2. ネットワークポーラー(Network Pollster)とI/O多重化

ネットワークポーラーは、複数のI/O操作(ソケットの読み書きなど)を効率的に監視し、準備ができたI/Oイベントをアプリケーションに通知するメカニズムです。これにより、アプリケーションはI/O操作が完了するのを待つ間、他の処理を行うことができ、高い並行性を実現します。

主要なI/O多重化メカニズムには以下のようなものがあります。

  • epoll (Linux): 大量のファイルディスクリプタ(FD)を効率的に監視できる、スケーラブルなメカニズム。
  • kqueue/kevent (FreeBSD, macOS, NetBSD): BSD系のOSで利用されるイベント通知インターフェース。epollと同様に効率的です。
  • select/poll (POSIX): 多くのUNIX系システムで利用可能な汎用的なメカニズムですが、監視できるFDの数に制限があったり、FDの数が増えるとパフォーマンスが低下する傾向があります。

3. GoランタイムとネットワークI/Oの統合

Goランタイムは、ゴルーチンとI/O多重化メカニズムを統合しています。Goのnetパッケージでネットワーク操作(例: conn.Read(), conn.Write())が呼び出されると、Goランタイムは対応するファイルディスクリプタをネットワークポーラーに登録します。I/O操作がブロックされる場合、ランタイムはそのゴルーチンを一時停止し、他の実行可能なゴルーチンにCPUを譲ります。ネットワークポーラーからI/Oイベント(例: データが読み取り可能になった)が通知されると、ランタイムは一時停止していたゴルーチンを再開し、I/O操作を完了させます。この仕組みにより、GoプログラムはノンブロッキングI/Oを意識することなく、同期的なコードスタイルで高い並行性を実現できます。

技術的詳細

このコミットの核心は、Goのビルドタグの変更を通じて、FreeBSD/ARM環境でfd_poll_runtime.goがビルドされるようにすることです。

  • src/pkg/net/fd_poll_runtime.go: このファイルは、Goランタイムに統合されたネットワークポーラーの実装を含んでいます。このポーラーは、OS固有の効率的なI/O多重化メカニズム(FreeBSDの場合はkqueue)を利用して、ネットワークI/Oイベントを処理します。

    • 変更前: // +build darwin freebsd,amd64 freebsd,386 linux netbsd openbsd windows
    • 変更後: // +build darwin freebsd linux netbsd openbsd windows
    • この変更により、freebsd,amd64freebsd,386という特定のアーキテクチャ指定が削除され、単にfreebsdとなりました。これは、FreeBSD上のすべてのアーキテクチャ(ARMを含む)でfd_poll_runtime.goがビルドされることを意味します。これにより、FreeBSD/ARM環境でもランタイム統合型ネットワークポーラーが有効になります。
  • src/pkg/net/fd_bsd.go: このファイルは、BSD系のOSにおけるファイルディスクリプタ(FD)の待機メカニズム(おそらくkqueue/keventのより汎用的な、あるいは特定のケースでの実装)に関連している可能性があります。

    • 変更前: // +build freebsd,arm
    • 変更後: // +build ignore
    • この変更により、freebsd/arm環境でfd_bsd.goがビルドされなくなります。これは、fd_poll_runtime.goがFreeBSD/ARMで有効になるため、このファイルが不要になるか、あるいは競合を避けるために無効化されたと考えられます。
  • src/pkg/net/fd_poll_unix.go: このファイルも、Unix系のシステムにおけるファイルディスクリプタのポーリングに関連する実装を含んでいる可能性があります。

    • 変更前: // +build freebsd,arm
    • 変更後: // +build ignore
    • fd_bsd.goと同様に、freebsd/arm環境でfd_poll_unix.goがビルドされなくなります。これも、fd_poll_runtime.goの有効化に伴い、特定のアーキテクチャ向けの代替ポーリングメカニズムが不要になったためと考えられます。

これらの変更は、FreeBSD/ARM環境におけるGoのネットワークスタックの動作を根本的に変更します。以前は、おそらくより単純な、あるいはランタイムと統合されていないポーリングメカニズムが使用されていたか、あるいは特定の最適化が欠けていた可能性があります。このコミットにより、FreeBSD/ARMも他の主要なプラットフォームと同様に、Goランタイムの高度なI/O多重化機能を活用できるようになり、ネットワークアプリケーションのパフォーマンスと安定性が向上します。

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

--- a/src/pkg/net/fd_bsd.go
+++ b/src/pkg/net/fd_bsd.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build freebsd,arm
+// +build ignore
 
 // Waiting for FDs via kqueue/kevent.
 
--- a/src/pkg/net/fd_poll_runtime.go
+++ b/src/pkg/net/fd_poll_runtime.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin freebsd,amd64 freebsd,386 linux netbsd openbsd windows
+// +build darwin freebsd linux netbsd openbsd windows
 
 package net
 
--- a/src/pkg/net/fd_poll_unix.go
+++ b/src/pkg/net/fd_poll_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build freebsd,arm
+// +build ignore
 
 package net

コアとなるコードの解説

このコミットの変更は、Goのビルドシステムがどのファイルを特定のプラットフォーム向けにコンパイルするかを制御するビルドタグに集約されています。

  1. src/pkg/net/fd_bsd.go の変更:

    • // +build freebsd,arm から // +build ignore へ変更。
    • これは、FreeBSD/ARM環境でfd_bsd.goがビルドされなくなることを意味します。このファイルは、おそらくFreeBSDのkqueue/keventを利用したFD待機メカニズムの特定の、あるいは以前の実装を含んでいましたが、新しいランタイム統合型ポーラーがFreeBSD/ARMで有効になるため、このファイルは不要になったか、あるいは競合を避けるために明示的に除外されました。
  2. src/pkg/net/fd_poll_runtime.go の変更:

    • // +build darwin freebsd,amd64 freebsd,386 linux netbsd openbsd windows から // +build darwin freebsd linux netbsd openbsd windows へ変更。
    • この変更が最も重要です。freebsd,amd64freebsd,386という具体的なアーキテクチャ指定が削除され、単にfreebsdとなりました。これにより、fd_poll_runtime.goはFreeBSD上のすべてのアーキテクチャ(amd64, 386だけでなく、armも含む)でビルドされるようになります。
    • fd_poll_runtime.goは、Goランタイムと密接に連携する高性能なネットワークポーラーの実装を含んでいます。この変更により、FreeBSD/ARM環境でもGoのネットワークI/Oがランタイムのスケジューラと統合され、効率的な非同期I/O処理が可能になります。
  3. src/pkg/net/fd_poll_unix.go の変更:

    • // +build freebsd,arm から // +build ignore へ変更。
    • fd_bsd.goと同様に、FreeBSD/ARM環境でfd_poll_unix.goがビルドされなくなります。このファイルも、おそらくFreeBSD/ARM向けの代替または以前のポーリングメカニズムを含んでいましたが、fd_poll_runtime.goが有効になることでその役割を終えました。

これらの変更は、Goのビルドプロセスにおいて、FreeBSD/ARM向けのネットワークポーリングの実装を、より汎用的でランタイムに統合されたfd_poll_runtime.goに切り替えることを目的としています。これにより、FreeBSD/ARM上でのGoアプリケーションのネットワークパフォーマンスと安定性が向上し、他のサポートされているプラットフォームと同等のI/O効率が実現されます。

関連リンク

参考にした情報源リンク

  • Go言語のソースコード (特に src/pkg/net ディレクトリ内のファイル)
  • Go言語のIssueトラッカー (Issue #6146)
  • Go言語のGerritコードレビューシステム (Change 12927048)
  • Go言語のビルドタグに関する公式ドキュメントや解説記事
  • I/O多重化メカニズム(epoll, kqueue, select/poll)に関する一般的な情報