1月版 GCC 4.0向け最適化開始で2.95はオシマイ
上川純一
日本ヒューレット・パッカード株式会社
コンサルティング・インテグレーション統括本部
2006/1/31
linux-kernelメーリングリスト(以下LKML)かいわいで起きるイベントを毎月お伝えする、Linux Kernel Watch。学生が冬休みに入った影響か、2005年12月は心なしか簡単な内容の質問メールが多かったようです。さて、どのようなことが起きたのか、見てみましょう。
HAVE_ARCH_XXXは悪だ
Linusは、アーキテクチャ独自の実装を利用するための
#ifdef HAVE_ARCH_XXX |
注:HAVE_ARCH_XXXは、汎用の関数を定義する一方、各アーキテクチャ用に最適化されたルーチンがある場合はそれを使うようにする仕組み。例えば、__HAVE_ARCH_MEMCPYなどで利用されている。 |
という構文には「意味がなく、追跡が難しいため、カーネルソースから追放するべきだ」と主張しました。具体的には、USE_ELF_CORE_DUMP、HAVE_PCI_MMAP、ARCH_HAS_PREFETCH、HAVE_CSUM_COPY_USERなどを例として挙げ、
- この方式を利用するとコードが見にくくなる
- 実際に一貫性のない名称が利用されており、特に方式として確立されていないのに慣習として使われている
といった点を問題として指摘しました。
ではどうするべきでしょうか? Linusは、実装するのなら、Makefileで
obj-$(CONFIG_GENERIC_FOO) += generic-foo.c |
のように汎用のコードを読み込むようにし、
#include <asm-generic/div64.h> |
のようにして汎用のヘッダを定義するのがよいだろう。その方がgrepなどがしやすいから、と説明しました。
メモリバリアの実装ってどうなっているの?
ほとんどのCPUアーキテクチャは、読み込んだ順番に命令を実行しているわけではなく、実行可能になった順番で命令を実行しています。「メモリバリア」は、そうしたアーキテクチャにおいて、メモリへの書き込みとメモリからの読み込みの前後関係を保証したいときに使います。例えば、複数のCPUがSMPで動作している場合や外部デバイスとメモリバスを共有している場合に、ほかのCPUに対してメモリに確実に書き込まれていることを確認する際に重要な意味を持ちます。
メモリバリアの命令を発行すると、その直前まで実行していたメモリに対するアクセス命令が実質的に完了していることが保証されます。ただ、この操作はCPU間の同期などが必要になるため一般的には遅い操作であり、必要最小限に限るのが好ましいとされています。
カーネル内部には、それぞれの用途に最適化されたメモリバリア命令が多数あります。そのため、「各メモリバリア命令の用途が分からない」という質問をLKMLに投げた人がいました。Paul McKennyはそれに対して、それぞれの命令について簡単に解説しました。
- wmb
この命令を発効するまでの、そのCPUにおいて実行した書き込み命令がインターコネクト(具体的には、ほかのCPUから見えるメモリあるいはほかのCPUのキャッシュ)に対して完了していることを保証する
- rmb
インターコネクトがその時点で検知している変更は、rmb命令の発行以降、rmbを発行したCPUでは読み込める
- mb
wmbとrmbを併せたもの
- smp_wmb、smp_rmb、smp_mb
SMPの場合だけwmb/rmb/mbの効果を発生させ、単一プロセッサシステムの場合は何もしない命令
- read_barrier_depends()
Alphaのみではrmb、そのほかでは何もしない命令。Alphaのみメモリ読み込みの順番特性に特殊な部分があるため、そこで利用されている
ここで、「mmiowbという似た命令が存在するのだが、これはどういう関係にあるのか」という議論が発生しました。Roland DreierとJeremy Higdonの解説によると、デバイスのI/Oの際に、スピンロックを保持しながら正しい順番で書き込みをする必要がある場合に、mmiowbを利用する必要が生じることがあるそうです。ただ、スピンロックを取得する動作自体にメモリバリアの操作が含まれているため、スピンロックを取得している場合にもメモリI/Oの順番が保証されないアーキテクチャはAltixくらいだ、と付け加えていました。
mountコマンドの拡張
以前、プライベートネームスペース(編注)についてお伝えしました。それに関連して、sharedsubtreeがカーネル2.6.15にすでにマージされているようです。これにより、デバイスを複数のネームスペースにわたって同じマウントポイントにマウントする機能などが実現できます。各ユーザー用のディレクトリに名前空間を用意するため、サブツリーを利用して実装するという手法が可能性を帯びてきました。
編注:プライベートネームスペースについては、Linux Kernel Watchの 「11月版 ドライバに変数を渡すのにうってつけの方法」 も参照。 |
カーネル側のサポートは準備ができているようです。ただし、対応するmountコマンドがリリースされ、一般的に利用されるようになるにはまだしばらく時間がかかりそうです。ドキュメントには、例としてsmountコマンドの実装例があり、添付のsmountコマンドを利用すればshared subtree機能を活用できるようです。
参考: | ||
カーネルソース内のドキュメント | Documentation/sharedsubtree.txt | |
LWNでの記事 | http://lwn.net/Articles/159077/ |
1/2
|
|
||||
|
連載 Linux Kernel Watch |
Linux Squareフォーラム Linuxカーネル関連記事 |
連載:Linux Kernel Watch(連載中) Linuxカーネル開発の現場ではさまざまな提案や議論が交わされています。その中からいくつかのトピックをピックアップしてお伝えします |
|
連載:Linuxファイルシステム技術解説 ファイルシステムにはそれぞれ特性がある。本連載では、基礎技術から各ファイルシステムの特徴、パフォーマンスを検証する |
|
特集:全貌を現したLinuxカーネル2.6[第1章] エンタープライズ向けに刷新されたカーネル・コア ついに全貌が明らかになったカーネル2.6。6月に正式リリースされる予定の次期安定版カーネルの改良点や新機能を詳しく解説する |
|
特集:/procによるLinuxチューニング[前編] /procで理解するOSの状態 Linuxの状態確認や挙動の変更で重要なのが/procファイルシステムである。/procの概念や/procを利用したOSの状態確認方法を解説する |
|
特集:仮想OS「User
Mode Linux」活用法 Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説 |
|
Linuxのカーネルメンテナは柔軟なシステム カーネルメンテナが語るコミュニティとIA-64 Linux IA-64 LinuxのカーネルメンテナであるBjorn Helgaas氏。同氏にLinuxカーネルの開発体制などについて伺った |
|
|
- 【 pidof 】コマンド――コマンド名からプロセスIDを探す (2017/7/27)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、コマンド名からプロセスIDを探す「pidof」コマンドです。 - Linuxの「ジョブコントロール」をマスターしよう (2017/7/21)
今回は、コマンドライン環境でのジョブコントロールを試してみましょう。X環境を持たないサーバ管理やリモート接続時に役立つ操作です - 【 pidstat 】コマンド――プロセスのリソース使用量を表示する (2017/7/21)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、プロセスごとのCPUの使用率やI/Oデバイスの使用状況を表示する「pidstat」コマンドです。 - 【 iostat 】コマンド――I/Oデバイスの使用状況を表示する (2017/7/20)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、I/Oデバイスの使用状況を表示する「iostat」コマンドです。
|
|