12.07.2015 Views

RedHawk Linux User's Guide version 6.3 日本語版

RedHawk Linux User's Guide version 6.3 日本語版

RedHawk Linux User's Guide version 6.3 日本語版

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Linux</strong>® User’s <strong>Guide</strong>0898004-670February 2013


Copyright 2013 by Concurrent Computer Corporation. All rights reserved.本 書 は 当 社 製 品 を 利 用 する 社 員 、 顧 客 、エンドユーザーを 対 象 とします。本 書 に 含 まれる 情 報 は、 本 書 発 行 時 点 での 正 確 な 情 報 ですが、 予 告 なく 変 更 されることがあります。当 社 は、 明 示 的 、 暗 示 的 に 関 わらず 本 書 に 含 まれる 情 報 に 対 して 保 障 できかねます。誤 字 ・ 誤 記 の 報 告 または 本 書 の 特 定 部邪 分 への 意 見 は、 当 該 ページをコピーし、コピーに 修 正 またはコメントを 記 述 してコンカレント 日 本 株 式 会 社 まで 郵邱 送 またはメールしてください。http://www.ccur.co.jp/concurrent_computer_contact_us.aspx本 書 はいかなる 理 由 があろうとも 当 社 の 許 可 なく 複 製 ・ 変 更 することはできません。Concurrent Computer CorporationおよびそのロゴはConcurrent Computer Corporationの 登 録 商 標 です。当 社 のその 他 すべての 製 品 名 はConcurrentの 商 標 です。また、その 他 全 ての 製 品 名 が 各 々の 所 有 者 の 商 標 または 登 録 商 標 です。<strong>Linux</strong>®は、<strong>Linux</strong> Mark Institute(LMI)のサブライセンスに 従 い 使 用 しています。改 定 履 歴 :Date Level Effective WithAugust 2002 000 <strong>RedHawk</strong> <strong>Linux</strong> Release 1.1September 2002 100 <strong>RedHawk</strong> <strong>Linux</strong> Release 1.1December 2002 200 <strong>RedHawk</strong> <strong>Linux</strong> Release 1.2April 2003 300 <strong>RedHawk</strong> <strong>Linux</strong> Release 1.3, 1.4December 2003 400 <strong>RedHawk</strong> <strong>Linux</strong> Release 2.0March 2004 410 <strong>RedHawk</strong> <strong>Linux</strong> Release 2.1July 2004 420 <strong>RedHawk</strong> <strong>Linux</strong> Release 2.2May 2005 430 <strong>RedHawk</strong> <strong>Linux</strong> Release 2.3March 2006 500 <strong>RedHawk</strong> <strong>Linux</strong> Release 4.1May 2006 510 <strong>RedHawk</strong> <strong>Linux</strong> Release 4.1May 2007 520 <strong>RedHawk</strong> <strong>Linux</strong> Release 4.2April 2008 600 <strong>RedHawk</strong> <strong>Linux</strong> Release 5.1June 2008 610 <strong>RedHawk</strong> <strong>Linux</strong> Release 5.1October 2008 620 <strong>RedHawk</strong> <strong>Linux</strong> Release 5.2December 2009 630 <strong>RedHawk</strong> <strong>Linux</strong> Release 5.4May 2011 640 <strong>RedHawk</strong> <strong>Linux</strong> Release 6.0March 2012 650 <strong>RedHawk</strong> <strong>Linux</strong> Release 6.0September 2012 660 <strong>RedHawk</strong> <strong>Linux</strong> Release <strong>6.3</strong>February 2013 670 <strong>RedHawk</strong> <strong>Linux</strong> Release <strong>6.3</strong>注 意 事 項 :本 書 は、Concurrent Computer Corporationより 発 行 された「<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>」を 日 本 語 に 翻 訳 した 資料 です。 英 文 と 表 現 が 異 なる 文 章 については 英 文 の 内 容 が 優 先 されます。


前 書 きマニュアルの 範 囲本 書 は3つのパートにより 構 成 されます。本 書 のPart 1はリアルタイム・ユーザー 向 け、Part 2はシステム 管 理 者 向 け、Part 3は 附 録 、 用 語 解説 、 索 引 となります。以 下 は、 本 書 の 内 容 の 概 略 です。マニュアルの 構 成本 書 は 以 下 のセクションで 構 成 されます:Part 1 – リアルタイムユーザー• 1 章 :「 序 文 」は、<strong>RedHawk</strong> <strong>Linux</strong> OSの 手 引 きおよびリアルタイム 機 能 の 概 要 。• 2 章 :「リアルタイム 性 能 」は、 割 り 込 み 応 答 、プロセス・ディスパッチ・レイテンシー(PDL :Process Dispatch Latency)およびデターミニスティック( 応 答 時 間 が 予 測 可 能 )なプログラムの実 行 を 含 むリアルタイム 性 能 の 実 現 に 関 する 問 題 の 検 討 。シールドCPUモデルの 説 明 。• 3 章 :「リアルタイム・プロセス 間 通 信 」は、POSIX®とSystem Vのメッセージ 送 受 信 、 共 有 メモリ 機 能 の 使 い 方 。• 4 章 :「プロセス・スケジューリング」は、プロセスのスケジューリングの 概 要 とPOSIXスケジューリングのポリシーと 優 先 度 の 説 明 。• 5 章 :「プロセス 間 同 期 」は、 共 有 リソースへ 同 期 アクセスする 協 同 プロセス 用 に<strong>RedHawk</strong> <strong>Linux</strong>より 提 供 されるインターフェースの 説 明 。(POSIXカウンティング・セマフォ、System Vセマフォ、 再 スケジューリング 制 御 ツール、 条 件 同 期 ツール)• 6 章 :「プログラム 可 能 なクロックおよびタイマー」は、<strong>RedHawk</strong> <strong>Linux</strong>で 利 用 可 能 なRCIMおよびPOSIXのタイミング 機 能 の 概 要 。• 7 章 :「システム・クロックおよびタイマー」は、システム 時 間 計 測 とCPU 単 位 のローカルタイマーの 説 明 。• 8 章 :「ファイル・システムとディスクI/O」は、<strong>RedHawk</strong> <strong>Linux</strong> 上 でのXFSジャーナリング・ファイルシステムおよびダイレクト・ディスクIO 実 行 手 順 の 説 明 。• 9 章 :「メモリ・マッピング」は、プロセスが 他 のプロセスのアドレス 空 間 へアクセスするために<strong>RedHawk</strong> <strong>Linux</strong>が 提 供 する 方 法 を 説 明 。• 10 章 :「Non-Uniform Memory Access (NUMA)」は、 特 定 のシステム 上 で 利 用 可 能 なNUMAサポートの 説 明 。Part 2 – 管 理 者• 11 章 :「カーネルの 構 成 および 構 築 」は、<strong>RedHawk</strong> <strong>Linux</strong>カーネルの 構 成 および 再 構 築 方 法 について 説 明 。iii


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>構 文 記 法• 12 章 :「カーネル・デバッギング」は、kdump、crashを 使 ったカーネル・メモリ・イメージの 保 存 、 復 元 、 解 析 のガイドラインおよびkdbカーネル・デバッガの 基 本 的 な 使 い 方 。• 13 章 :「Pluggable Authentication Modules (PAM)」は、<strong>RedHawk</strong> <strong>Linux</strong>のPAM 認 証 機 能 の 説 明 。• 14 章 :「デバイス・ドライバ」は、<strong>RedHawk</strong>の 機 能 とデバイスドライバの 記 述 に 関 連連 したリアルタイムの 問 題 の 説 明 。• 15 章 :「PCI-to-VMEサポート」は、<strong>RedHawk</strong>がサポートするPCI-VME 間 ブリッジの 説 明Part 3 - 共 通 事 項• 付 録 A:「メッセージ・キュー・プログラム 例 」は、POSIXおよびSystem Vのメッセージキューの 機 能 を 解 説 するサンプルプログラム。• 付 録 B:「リアルタイム 機 能 のためのカーネル・チューニング」は、<strong>RedHawk</strong> <strong>Linux</strong>のユニークな 機 能 を 制 御 するチューニング・パラメータおよびプレビルド・カーネルのデフォルト 値の 一 覧 。• 付 録 C:「ケーパビリティ」は、<strong>RedHawk</strong> <strong>Linux</strong>に 含 まれるケーパビリティと 各 々より 提 供 されるパーミッション(アクセス 権 限 )の 一 覧 。• 付 録 D:「カーネル・トレース・イベント」は、 所 定 のカーネル・トレース・ポイントおよびカーネル・モジュール 内 のカスタムイベントの 定 義 とロギング 方 法 の 一 覧 。• 付 録 E:「32bitコードから64bitコードへの 移 植 」は、x86_64プロセッサ 上 で32bitコードを64bit処 理 へ 移 植 するための 情 報 。• 付 録 F:「シールドCPU 上 のカーネル・レベル・デーモン」は、シールドCPU 上 でカーネルレベルのデーモンを 実 行 する 方 法 およびパフォーマンスを 向 上 する 方 法 を 説 明 。• 付 録 G:「シールドCPU 上 のプロセッサ 間 割 り 込 み」は、シールドCPU 上 でプロセッサ 間 割 り込 みを 実 行 する 方 法 およびパフォーマンスを 向 上 する 方 法 の 説 明 。• 付 録 H:「シリアル・コンソールの 設 定 」は、シリアルコンソールを 設 定 するための 手 順 。• 付 録 I:「ブート・コマンド・ライン・パラメータ」は、<strong>RedHawk</strong> 対 応 のユニークなブートパラメータを 説 明 。• 「 用 語 解 説 」は、 本 書 全 体 で 使 われる 用 語 を 記 述 。本 書 を 通 して 使 用 される 表 記 法 は 以 下 のとおりとなります。斜 体ユーザーが 特 定 する 書 類 、 参 照 カード、 参 照 項 目 は、 斜 体 にて 表 記 します。特 殊 用 語 も 斜 体 にて 表 記 します。iv


前 書 き太 字表ユーザー 入 力 または 図 は 太 字 にて 表 記 します。ディレクトリ 名 、ファイル 名 、コマンド、オプション、manページの 引 用 も 太 字 にて 表 記 します。オペレーティング・システムおよびプログラムが 出 力 したプロンプト、メッセージ、ファイルやプログラムのリストは 表 にて 表 記 します。[] ブラケット( 大 括 弧 )はコマンドオプションやオプションの 引 数 を囲 みます。もし、これらのオプションまたは 引 数 を 入 力 する 場 合 は、ブラケットをタイプする 必 要 はありません。青 字赤 字インターネットのURLを 青 字 で 表 記 します。マニュアルの 名 称 を 赤 字 で 表 記 します。関 連連 図 書以 下 の 表 に<strong>RedHawk</strong> <strong>Linux</strong>のドキュメントを 記 載 します。これらのドキュメントは、Concurrent Computer CorporationのWEBサイトにて 参 照 または 入 手 することが 可 能 です。http://www.ccur.com.http://redhawk.ccur.com/docs/document.cgi?document=1redhawk<strong>RedHawk</strong> <strong>Linux</strong> Operating System DocumentationPub. Number<strong>RedHawk</strong> <strong>Linux</strong> Release Notes 0898003<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong> 0898004Real-Time Clock & Interrupt Module (RCIM) User’s <strong>Guide</strong> 0898007<strong>RedHawk</strong> <strong>Linux</strong> FAQN/AOptional <strong>RedHawk</strong> Product Documentation<strong>RedHawk</strong> <strong>Linux</strong> Frequency-Based Scheduler (FBS) User’s <strong>Guide</strong> 0898005v


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>vi


目 次前 書 き . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .iii1 章 序 文概 要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-1<strong>RedHawk</strong> <strong>Linux</strong>カーネル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-3システム・アップデート. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-4リアルタイム 機 能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-4プロセッサ・シールディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-4プロセッサ・アフィニティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-4ユーザー・レベル・プリエンプション 制 御 . . . . . . . . . . . . . . . . . . . . . . . . 1-5高 速 ブロック/ウェイク・サービス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-5RCIMドライバ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-5Frequency-Based Scheduler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-5/procの 変 更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-6カーネル・トレース 機 能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-6ptrace 拡 張 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-6カーネル・プリエンプション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-6リアルタイム・スケジューラ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-7低 レイテンシー 拡 張 . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-7優 先 度 継 承 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-7高 分 解 能 プロセス・アカウンティング . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-7ケーパビリティのサポート . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-7カーネル・デバッガ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-8カーネルのコア・ダンプ/クラッシュ 解 析 . . . . . . . . . . . . . . . . . . . . . . . . . . 1-8ユーザー・レベル・スピン・ロック . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-8usermapおよび/proc mmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-8ハイパースレッディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-8XFSジャーナリング・ファイル・システム . . . . . . . . . . . . . . . . . . . . . . . . . 1-9POSIXリアルタイム 拡 張 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-9ユーザー 優 先 度 スケジューリング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-9メモリ 常 駐 プロセス . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-9メモリ・マッピングおよびデータ 共 有 . . . . . . . . . . . . . . . . . . . . . . . . . 1-10プロセス 同 期 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-10非 同 期 入 出 力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-10同 期 入 出 力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-10リアルタイム・シグナルの 挙 動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-11クロックおよびタイマー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-11メッセージ・キュー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-112 章 リアルタイム 性 能シールドCPUモデルの 概 要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-1デターミニズムの 概 要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-2プロセス・ディスパッチ・レイテンシー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-2割 り 込 み 禁 止 の 効 果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-4割 り 込 みの 影 響 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-5プリエンプション 禁 止 の 効 果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-8vii


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>3 章 リアルタイム・プロセス 間 通 信オープン・ソース・デバイス・ドライバの 影 響 . . . . . . . . . . . . . . . . . . . . 2-9シールディングでリアルタイム 性 能 を 向 上 する 方 法 . . . . . . . . . . . . . . . . . . . . 2-9バックグラウンド・プロセスからのシールディング . . . . . . . . . . . . . . . . 2-9割 り 込 みからのシールディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-10ローカル 割 り 込 みからのシールディング . . . . . . . . . . . . . . . . . . . . . . . . . . 2-11CPUシールディングのインターフェース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-12shieldコマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-12shieldコマンド 例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-13終 了 ステータス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-13shieldコマンド 拡 張 機 能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-14CPUシールディングの/procインターフェース . . . . . . . . . . . . . . . . . . . . . . 2-14CPUへのプロセス 割 り 当 て . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-14mpadviseを 使 ったマルチプロセッサ 制 御 . . . . . . . . . . . . . . . . . . . . . . . 2-15initへのCPUアフィニティ 割 り 当 て . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-17シールドCPUの 設 定 例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-17デターミニズムを 高 める 手 順 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-20メモリのページをロック . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-20プログラム 優 先 度 の 設 定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-21遅逼 延 割 り 込 み 処 理 の 優 先 度 設 定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-21別 プロセスの 起 床 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-21キャッシュ・スラッシングの 回 避遪 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-22物 理 メモリの 予 約 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-23NUMAノードへのバインディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-27クアッドOpteronシステムのI/Oスループット . . . . . . . . . . . . . . . . . . . . . . . 2-27ハイパースレッディングの 理 解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-28システム 構 成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-30推 奨 されるCPU 構 成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-30メモリ 不 足 状 態 の 回 避遪 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-34<strong>Linux</strong>のデターミニズムに 関 する 既 知 の 問 題 . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-34概 要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-1POSIXメッセージ・キュー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-2System Vメッセージ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-3メッセージの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-4msggetシステムコール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-7msgctlシステムコール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-9msgsndおよびmsgrcvシステムコール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-10メッセージの 送 信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-10メッセージの 受 信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-11POSIX 共 有 メモリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-12shm_openルーチンの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-13shm_unlinkルーチンの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-15System V 共 有 メモリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-15共 有 メモリの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-16shmgetシステムコール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-19shmctlシステムコール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-21共 有 メモリ 領 域 をI/O 空 間 へバインド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-22shmgetの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-22shmbindの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-23shmatおよびshmdtシステムコール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-23共 有 メモリ 領 域 の 結 合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-24共 有 メモリ 領 域 の 分 離 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-24viii


目 次4 章 プロセス・スケジューリング5 章 プロセス 間 同 期共 有 メモリ・ユーティリティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-25shmdefineユーティリティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-25shmconfigコマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-25概 要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-1プロセス・スケジューラの 管 理 方 法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-2スケジューリング・ポリシー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-3ファーストイン・ファーストアウト・スケジューリング(SCHED_FIFO) . . . . . . 4-3ラウンドロビン・スケジューリング(SCHED_RR) . . . . . . . . . . . . . . . 4-4タイムシェアリング・スケジューリング(SCHED_OTHER) . . . . . . . 4-4性 能 向 上 のための 手 続 き . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-4優 先 度 設 定 方 法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-4割 り 込 みルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-5SCHED_FIFO vs SCHED_RR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-5CPUをロックする 固 定 優 先 度 プロセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-5メモリのロック . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-6CPUアフィニティとシールド・プロセッサ . . . . . . . . . . . . . . . . . . . . . . . . . 4-6プロセス・スケジューリング・インターフェース . . . . . . . . . . . . . . . . . . . . . . . 4-6POSIXスケジューリング・ルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-6sched_setschedulerルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-7sched_getschedulerルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-8sched_setparamルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-9sched_getparamルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-10sched_yieldルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-10sched_get_priority_minルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-11sched_get_priority_maxルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-11sched_rr_get_intervalルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-12runコマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-13プロセス 間 同 期 の 理 解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-1再 スケジューリング 制 御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-3再 スケジューリング 変 数 の 理 解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-3resched_cntlシステムコールの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-4再 スケジューリング 制 御 マクロの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-5resched_lock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-5resched_unlock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-6resched_nlocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-6再 スケジューリング 制 御 ツールの 適遚 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-7ビジーウェイト 相 互 排 他 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-7spin_mutex 変 数 の 理 解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-7spin_mutexインターフェースの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-8spin_mutexツールの 適遚 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-9nopreempt_spin_mutex 変 数 の 理 解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-10nopreempt_spin_mutexインターフェースの 利 用 . . . . . . . . . . . . . . . . . . . . . . 5-10POSIXカウンティング・セマフォ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-12概 要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-12インターフェース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-13The sem_initルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-14The sem_destroyルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-15The sem_openルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-16The sem_closeルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-17ix


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>6 章 プログラム 可 能 なクロックおよびタイマーThe sem_unlinkルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-18The sem_waitルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-19The sem_timedwaitルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-19The sem_trywaitルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-20The sem_postルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-20The sem_getvalueルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-21POSIXミューテックスへの 機 能 拡 張 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-21ロウバスト・ミューテックス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-22優 先 度 継 承 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-23ユーザー・インターフェース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-23pthread_mutex_consistent_np . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-24pthread_mutex_getunlock_np . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-24pthread_mutex_setconsistency_np . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-24pthread_mutex_setunlock_np. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-25pthread_mutexattr_getfast_np . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-25pthread_mutexattr_getprotocol. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-25pthread_mutexattr_getrobust_np . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-26pthread_mutexattr_getunlock_np . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-26pthread_mutexattr_setfast_np. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-26pthread_mutexattr_setprotocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-27pthread_mutexattr_setrobust_np . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-27pthread_mutexattr_setunlock_np . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-27POSIXミューテックス・プログラムのコンパイル . . . . . . . . . . . . . . . . . . . 5-27System Vセマフォ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-28概 要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-28System Vセマフォの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-29semgetシステムコール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-31semctlシステムコール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-34semopシステムコール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-36条 件 同 期 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-37postwaitシステムコール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-37serverシステムコール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-39server_block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-39server_wake1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-40server_wakevec. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-41条 件 同 期 ツールの 適遚 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-42クロックおよびタイマーの 理 解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-1RCIMクロックおよびタイマー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-1POSIXクロックおよびタイマー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-2POSIX 時 間 構 造造 体 の 理 解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-3POSIX clockルーチンの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-4clock_settimeルーチンの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-4clock_gettimeルーチンの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-5clock_getresルーチンの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-5POSIX timerルーチンの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-6timer_createルーチンの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-6timer_deleteルーチンの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-8timer_settimeルーチンの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-8timer_gettimeルーチンの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-9timer_getoverrunルーチンの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-10POSIX sleepルーチンの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-11x


目 次7 章 システム・クロックおよびタイマー8 章 ファイル・システムとディスクI/O9 章 メモリ・マッピング10 章 Non-Uniform Memory Access (NUMA)nanosleepルーチンの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-11clock_nanosleepルーチンの 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-12システム 時 間 計 測 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-1ローカル・タイマー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-1機 能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-2CPUアカウンティング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-2プロセス 実 行 時 間 および 制 限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-3インターバル・タイマーのデクリメント . . . . . . . . . . . . . . . . . . . . . . . 7-3システム・プロファイリング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-3CPU 負 荷 バランシング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-3CPU 再 スケジューリング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-4POSIXタイマー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-4RCU 処 理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-4その 他 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-4ローカル・タイマーの 禁 止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-4ジャーナリング・ファイル・システム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-1XFSファイル・システムの 作 成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-2XFSファイル・システムのマウント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-2データ 管 理 API(DMAPI) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-2ダイレクト・ディスクI/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-3ターゲット・プロセスのアドレス 空 間 へのマッピングの 確 立 . . . . . . . . . . . . 9-1mmap(2)の 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9-1usermap(3)の 利 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9-3検 討 事 項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9-4カーネル 構 成 パラメータ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9-4概 要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-1メモリ・ポリシー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-2NUMAユーザー・インターフェース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-3メモリ・シールドされたノード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-3メモリ・シールドとプリアロケート・グラフィック・ページ . . . . . . . . 10-5run(1)を 利 用 したNUMAサポート(プロセス 用 ) . . . . . . . . . . . . . . . . . . . . . . 10-7shmconfig(1)を 利 用 したNUMAサポート( 共 有 メモリ 領 域 用 ) . . . . . . . . . . 10-9システムコール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-11ライブラリ 機 能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-11情 報 提 供 ファイルおよびユーティリティ . . . . . . . . . . . . . . . . . . . . . . . . . . 10-11ノード 統 計 値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-11マッピングされたページのノードID . . . . . . . . . . . . . . . . . . . . . . . . . . 10-12numastatを 利 用 したNUMA 成 功 / 失 敗 統 計 値 . . . . . . . . . . . . . . . . . . . . . . . . 10-13kdbサポート . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-13カーネル・テキスト・ページの 複 製 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-14カーネル・モジュール・ページの 割 り 当 て . . . . . . . . . . . . . . . . . . . . . . . . 10-15性 能 ガイドライン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-16xi


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>11 章 カーネルの 設 定 および 構 成12 章 カーネル・デバッギングタスク 全 体 のNUMA mempolicy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-16共 有 メモリ 領 域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-17構 成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-17序 文 . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-1ccur-configを 利 用 したカーネルの 構 成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-2カーネルの 構 築 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-4ドライバ・モジュールの 構 築 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-5プレビルト<strong>RedHawk</strong>カーネルで 動 的 にロード 可 能 なモジュールの 構 築 例 11-6追 加 情 報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-7概 要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12-1システム・クラッシュの 取 得 および 解 析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12-1kdumpの 起 動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12-1クラッシュ・ダンプの 作 成 方 法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12-2インストール/ 構 成 の 詳 細 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12-3構 成 ファイルで 定 義 されるkdumpオプション . . . . . . . . . . . . . . . . . . . . . . . 12-3kdumpコマンド・ライン・インターフェース . . . . . . . . . . . . . . . . . . . . . . . 12-4crashを 利 用 したダンプの 解 析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12-5ダンプ・ファイルの 解 析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12-5実 行 中 システムの 解 析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12-7ヘルプの 入 手 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12-7カーネル・デバッガ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12-8kdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12-8NMI 割 り 込 み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12-8NMIボタン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12-913 章 Pluggable Authentication Modules (PAM)14 章 デバイス・ドライバ序 文 . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-1PAMモジュール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-1サービス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-2ロール・ベース・アクセス 制 御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-2例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-3ケーパビリティの 定 義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-3例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-4実 装 詳 細 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-5デバイス・ドライバの 種 類 の 理 解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-1ユーザー・レベル・デバイス・ドライバの 開 発 . . . . . . . . . . . . . . . . . . . . . . . . . . 14-1PCIリソースへのアクセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-1PCI BARインターフェース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-2カーネル・スケルトン・ドライバ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-6サンプル・ドライバの 機 能 の 理 解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-6ドライバのテスト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-9カーネル・レベル・ドライバの 開 発 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-11ドライバ・モジュールの 構 築 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-11xii


目 次15 章 PCI-to-VMEサポート付 録 A メッセージ・キュー・プログラム 例カーネルの 仮 想 アドレス 空 間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-11リアルタイム 性 能 の 問 題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-11割 り 込 みルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-11割 り 込 み 機 能 の 遅逼 延 (ボトム・ハーフ) . . . . . . . . . . . . . . . . . . . . . . . . . . 14-12マルチスレッディングの 問 題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-14ビッグ・カーネル・ロック(BKL)とioctl . . . . . . . . . . . . . . . . . . . . . . . . . 14-14ユーザー 空 間 I/Oドライバ(UIO) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-15性 能 の 解 析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-16概 要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-1文 書 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-2ハードウェアのインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-2開 梱 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-2アダプター・カードの 設 定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-3PCIアダプター・カードのインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-4VMEバス・アダプター・カードのインストール . . . . . . . . . . . . . . . . . . . . . 15-4アダプター・ケーブルの 接 続 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-4ソフトウェアのインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-5構 成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-6btpモジュール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-6デバイス・ファイルおよびモジュール・パラメータ 仕 様 . . . . . . . . . . . . . 15-6VMEバス・マッピング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-7ユーザー・インターフェース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-7API 機 能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-8バインド・バッファの 実 装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-9bt_get_info BT_INFO_KMALLOC_BUF. . . . . . . . . . . . . . . . . . . . . . . . . . 15-9bt_set_info BT_INFO_KMALLOC_SIZ. . . . . . . . . . . . . . . . . . . . . . . . . . . 15-10bt_set_info BT_INFO_KFREE_BUF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-10バインド・バッファの 追 加 情 報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-11VMEバス 空 間 へのマッピングおよびバインド . . . . . . . . . . . . . . . . . . . . . . . 15-13bt_hw_map_vme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-13bt_hw_unmap_vme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-14/procファイル・システム・インターフェース . . . . . . . . . . . . . . . . . . . 15-15アプリケーション 例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-17bt_bind_mult . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-18bt_bind_multsz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-19bt_hwmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-19bt_hwunmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-19readdma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-20shmat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-20shmbind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-20shmconfig-script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-21vme-mappings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-21writemem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-21writedma. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-21POSIXメッセージ・キュー 例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-1System Vメッセージ・キュー 例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-4xiii


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>付 録 B リアルタイム 機 能 のためのカーネル・チューニング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B-1付 録 C ケーパビリティ付 録 D カーネル・トレース・イベント付 録 E 32bitコードからコードから64bitコードへの コードへの 移 植概 要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C-1ケーパビリティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C-1定 義 済 みカーネル・トレース・イベント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D-1ユーザー 定 義 カーネル・トレース・イベント . . . . . . . . . . . . . . . . . . . . . . . . . . . D-4定 義 済 みCUSTOMトレース・イベント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D-4動 的 カーネル・トレース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D-4序 文 . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-1手 順 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-2コーディング 要 件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-3データ 型 のサイズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-3long 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-3ポインタ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-3配郤 列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-4宣 言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-4明 示 的 なデータ・サイズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-4定 数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-5API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-5呼 び 出 し 規 約 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-5条 件 付 コンパイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-6その 他 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-6コンパイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-6テスト/デバッグ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-6性 能 問 題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-7メモリのアライメントおよび 構 造造 体 のパディング . . . . . . . . . . . . . . . . . . . . E-7付 録 F シールドCPU 上 のカーネル・レベル・デーモン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . F-1付 録 G シールドCPU 上 のプロセッサ 間 割 り 込 み概 要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . G-1メモリ・タイプ・レンジ・レジスタ (MTRR) 割 り 込 み . . . . . . . . . . . . . . . . . . . . G-1グラフィクス 割 り 込 み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . G-3NVIDIA CUDA 割 り 込 み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . G-4ユーザー 空 間 でのTLBフラッシュ 割 り 込 み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . G-5xiv


目 次付 録 H シリアル・コンソールの 設 定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . H-1付 録 I ブート・コマンド・ライン・パラメータ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I-1用 語 解 説 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Glossary-1Index-1画 面画 面 11-1 カーネル 構 成 GUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-3画 面 11-2 カーネル 構 成 GUIでシリアル・カード・サポートの 追 加 . . . . . . . . . . . . . . . . . . . . 11-6図図 2-1 標 準 的 なプロセス・ディスパッチ・レイテンシー . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-3図 2-2 割 り 込 み 無 効 によるプロセス・ディスパッチ・レイテンシーへの 影 響 . . . . . . . . . . . 2-4図 2-3 高 優 先 度 割 り 込 みによるプロセス・ディスパッチ・レイテンシーへの 影 響 . . . . . . . 2-5図 2-4 低 優 先 度 割 り 込 みによるプロセス・ディスパッチ・レイテンシーへの 影 響 . . . . . . . 2-6図 2-5 複 数 割 り 込 みによるプロセス・ディスパッチ・レイテンシーへの 影 響 . . . . . . . . . . 2-7図 2-6 プリエンプション 無 効 によるプロセス・ディスパッチ・レイテンシーへの 影 響 . . . 2-8図 2-7 クアッドOpteronのI/Oスループット・レイアウト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-28図 2-8 標 準 的 なシールドCPUモデル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-31図 2-9 割 り 込 みを 分 離 したシールディング. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-32図 2-10 ハイパースレッドのシールディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-33図 3-1 msqid_ds 構 造造 体 の 定 義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-5図 3-2 ipc_perm 構 造造 体 の 定 義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-5図 3-3 shmid_ds 構 造造 体 の 定 義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-17図 4-1 スケジューラ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-2図 5-1 sembuf 構 造造 体 の 定 義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-29図 5-2 semid_ds 構 造造 体 の 定 義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-30図 10-1 NUMAシステム 上 のCPU/Busの 関 係 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-1図 11-1 カーネルの 構 成 および 構 築 セッションの 実 例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-5表表 1-1 プレビルト・カーネル. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-3表 2-1 shield(1) コマンドのオプション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-12表 3-1 メッセージ・キューの 操 作 パーミッション・コード . . . . . . . . . . . . . . . . . . . . . . . . . . 3-8表 3-2 共 有 メモリ 操 作 パーミッション・コード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-20表 3-3 shmconfig(1) コマンドのオプション. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-26表 5-1 セマフォ 操 作 パーミッション・コード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-33表 14-1 ボトム・ハーフのタイプ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-13表 15-1 PCI-to-VMEライブラリ 関 数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-8表 15-2 PCI-to-VMEプログラム 例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15-17表 B-1 リアルタイム 機 能 用 カーネル・チューニング・パラメータ . . . . . . . . . . . . . . . . . . . . . B-2表 D-1 定 義 済 みカーネル・トレース・イベント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D-1表 E-1 データ 型 のサイズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-3表 E-2 可 変 サイズのデータ 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-4表 E-3 固 定 精 度 のデータ 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-4表 E-4 呼 び 出 し 規 約 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-5表 E-5 条 件 付 コンパイルのマクロ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-6表 I-1 ブート・コマンド・ライン・パラメータ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I-2xv


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>xvi


11Chapter 1 序 文本 章 は、<strong>RedHawk</strong> <strong>Linux</strong>の 紹 介 およびオペレーティング・システムに 含 まれているリアルタイム機 能 の 概 要 を 提 供 します。1概 要 1Concurrent Computer Corporationの<strong>RedHawk</strong> <strong>Linux</strong>® は、オープン・ソース<strong>Linux</strong>オペレーティング・システムのリアルタイム・バージョンです。 互 換 性 およびパフォーマンスを 必 要 とする 複 雑なタイムクリティカル・アプリケーションをサポートするため、 標 準 <strong>Linux</strong> Ver.2.6カーネルを 基に 改 良 が 行 われました。<strong>RedHawk</strong>は、すべてのシステム・オペレーションを 直 接 制 御 するシングル・プログラミング 環 境 をサポートするため、シングル・カーネル 設 計 を 利 用 します。この 設 計は、デターミニスティック(レスポンス 時 間 が 予 測 可 能 )なプログラムの 実 行 および 割 り 込 みに 対するレスポンスを 可 能 とし、 更 に 高 I/Oスループットとデターミニスティックなファイル、ネットワーキング、グラフィックI/O 操 作 を 同 時 に 提 供 します。<strong>RedHawk</strong>はシミュレーション、データ 収集 、 工 業 制 御 機 器 、 医 療 画 像 システムが 求 めるデターミニスティック・アプリケーションのための 理 想 的 な<strong>Linux</strong> 環 境 です。<strong>RedHawk</strong>に 含 まれているのは、 良 く 知 られているRHELディストリビューションです。<strong>RedHawk</strong>のインストール・ディスクは、リアルタイム・カーネルと 特 定 のカーネル 機 能 にアクセスするためのライブラリを 提 供 します。カーネルを 除 いて 全 てのRHELのコンポーネントは 標 準 的 な 方 法で 動 作 します。それにはRHELで 変 更 されていない<strong>Linux</strong>ユーティリティ、ライブラリ、コンパイラー、ツール、インストーラが 含 まれています。オプションであるNightStar RT 開 発 ツールは、タイムクリティカルなアプリケーションの 開 発 や 周 期 実 行 、パフォーマンスをモニタリングするプロセスのスケジュールに 使 用 出 来 る Frequency-Based Scheduler(FBS)およびパフォーマンス・モニタに 利 用 することが 可 能 です。<strong>RedHawk</strong>カーネルは、オープン・ソースのパッチと 最 高 水 準 のリアルタイム・カーネルを 提 供 するためにConcurrentが 開 発 した 機 能 の 両 方 を 統 合 します。これらの 多 くの 機 能 は、40 年 以 上 のリアルタイム・オペレーティングシステムの 開 発 の 経 験 に 裏 づけられたConcurrentが 実 現 したリアルタイムUNIX®より 派 生 しています。これらの 特 徴 は、 本 章 の 「Real-Time Features」セクションの中 でもう 少 し 詳 細 な 情 報 を 記 載 しています。<strong>RedHawk</strong>はConcurrentのiHawkシステムに 含 まれています。iHawkシステムは 多 様 なアーキテクチャや 構 成 が 利 用 可 能 な 対 象 型 マルチプロセッサ(SMP)のシステムです。オペレーティング・システムとそれがサポートするソフトウェア 製 品 の32bitまたは64bitバージョンのどちらかが、iHawkアーキテクチャおよび <strong>RedHawk</strong>に 含 まれるサポートに 応 じてインストールされます。SMPシステムへの 対 応 は 高 度 に 最 適遚 化 されています。シールドCPUとして 知 られるユニークなコンセプトは、プロセッサーの 一 部邪 を 最 もデターミニスティックなパフォーマンスを 必 要 とするタスク 専 用 とすることができます。 個 々のCPUは、 割 り 込 み 処 理 、カーネルデーモン、 割 り 込 みルーチン、その 他 の<strong>Linux</strong>タスクよりシールドすることが 可 能 です。プロセッサ・シールディングは、15μ 秒 未 満 の 割 り 込 み 応 答 を 保 証 する 高 度 なデターミニスティックな 実 行 環 境 を 提 供 します。1-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong><strong>RedHawk</strong> <strong>Linux</strong>は、 少 なくともカーネル2.6をベースとする 他 の<strong>Linux</strong>ディストリビューションのようにPOSIX 準 拠 のレベルは 同 等 です。Concurrentは 標 準 <strong>Linux</strong>には 存 在 しないPOSIXリアルタイム拡 張 を 加 えることで 更 なるPOSIXの 互 換 性 を 付 加 しました。それぞれの<strong>Linux</strong>/Intel x86プラットフォーム 上 で 動 作 するように 設 計 されたパッケージアプリケーションの 標 準 バイナリが 定 義 されたIntel x86アーキテクチャ 上 の<strong>Linux</strong>は、ConcurrentのiHawkプラットフォームで 動 作 します。NightStar RTは、マルチプロセッサ 向 けタイムクリティカル・アプリケーションの 制 御 、 監 視 、 解析 、デバッグを 行 うためのConcurrentの 強 力 なツールセットです。<strong>RedHawk</strong>のカーネルには、アプリケーション 実 行 への 干 渉 を 最 小 限 に 抑 えて 効 果 的 に 機 能 するツールの 強 化 機 能 が 含 まれています。すべてのツールは、 同 一 システム 上 でもリモートでもアプリケーション 制 御 を 邪邇 魔 することなく 同 じように 実 行 されます。NightStar RTツールには、 以 下 のものが 含 まれています。 詳 細 な 情 報 は 個 々のUser’s <strong>Guide</strong>を 参 照してください。• NightView ソースレベル・デバッガー:マルチ 言 語 、マルチプロセッサ、マルチプログラム、マルチスレッドの 監 視 、デバッグをシングルGUIで 行 います。NightViewは、アプリケーションの 実 行 速 度 で 実 行 中 のプログラムに 修 正 を 加 えるためのホットパッチ、データ 変 更 ・修 正 、 条 件 付 きブレークポイント/モニタポイント/ウォッチポイントの 各 機 能 を 持 っています。• NightTrace 実 行 時 間 アナライザー: 動 作 中 のアプリケーションの 挙 動 を 解 析 するために 使用 します。ユーザーおよびシステムの 動 きを 高 分 解 能 タイムスタンプにて 記 録 およびマークします。アプリケーション 実 行 中 に 発 生 したこれらのイベントの 詳 細 な 挙 動 をグラフィック表 示 します。NightTraceは 複 数 のプロセス、 複 数 のプロセッサ 上 の 挙 動 、 分 散 システム 上 で実 行 されたアプリケーション、ユーザー/カーネルの 相 互 関 係 を 表 示 する 理 想 的 なツールです。その 強 力 な 機 能 は 特 定 のイベントやカーネル/ユーザーのステータスを 調 査 することが 可 能です。• NightSim 周 期 スケジューラ: 周 期 実 行 を 必 要 とするアプリケーションを 簡 単 にスケジューリングすることが 可 能 です。 開 発 者 は 連連 携 する 複 数 のプロセス、それらのプライオリティやCPUの 割 り 当 てを 動 的 に 制 御 することが 可 能 です。NightSim は 詳 細 かつ 正 確 なパフォーマンスの 統 計 値 とオーバーラン 発 生 時 の 様 々な 処 理 の 定 義 を 提 供 します。• NightProbe データモニター: 実 行 中 の 複 数 のプログラムのデータのサンプリング、 記 録 、修 正 に 利 用 します。プログラムデータはシンボルテーブルを 参 照 して 探 し 出 します。アプリケーションページはアプリケーション 実 行 への 影 響 を 最 小 限 にするために 物 理 レベルのページで 共 有 されます。NightProbeは 入 出 力 用 のGUIコントロールパネルを 作 成 することでデバッグ、 解 析 、エラー 挿 入 (Fault Injection)を 代 用 することが 可 能 です。• NightTune パフォーマンスチューナー: CPU 使 用 状 況 、コンテキストスイッチ、 割 り 込 み、仮 想 メモリ 使 用 状 況 、ネットワーク 使 用 状 況 、プロセス 属 性 、CPUシールディング 等 のシステムやアプリケーション 性 能 解 析 のためのGUIツールです。NightTuneはポップアップダイアログまたはドラッグ&ドロップ 操 作 で 個 々のプロセスまたはグループの 優 先 度 、スケジューリング・ポリシー、CPUアフィニティを 変 更 することができます。 同 時 にCPUのシールディングやハイパースレッドの 属 性 変 更 、 個 々の 割 り 込 みの 割 り 当 てを 変 更 することも 可 能 です。1-2


序 文<strong>RedHawk</strong> <strong>Linux</strong>カーネル1<strong>RedHawk</strong> <strong>Linux</strong>カーネルは3 種 類 存 在 します。システム 管 理 者 はブート・ローダーを 介 してロードするカーネルのバージョンを 遥 択 することが 可 能 です。Table 1-1はプレビルト・カーネルのそれぞれの 概 要 になります。表 1-1 プレビルト・カーネルカーネルの 種 類 Generic Trace Debugカーネル 名 称 * vmlinuz-kernel<strong>version</strong>-<strong>RedHawk</strong>-x.xvmlinuz-kernel<strong>version</strong>-<strong>RedHawk</strong>-x.x-tracevmlinuz-kernel<strong>version</strong>-<strong>RedHawk</strong>-x.x-debug推 奨 使 用 方 法タイムクリティカル・アプリケーションの 実 行NightStar RTツールを 利 用 してパフォーマンス 評 価アプリケーションまたはドライバの 新 規 開 発概 要Genericカーネルは 最 も 最 適遚化 されており、 最 高 のパフォーマンスを 提 供 しますが、NightStar RTツールの 利点 すべてが 必 要 だとしても一 部邪 の 機 能 が 使 えません。TraceカーネルはGenericカーネルの 全 ての 機 能 がサポートされ、NightTraceツールのカーネル・トレース 機 能 を 提 供 しており、 多 くのユーザーに 推奨 します。このカーネルはシステム 起 動DebugカーネルはTraceカーネルの 全 ての 機 能 がサポートされ、カーネル・レベル・デバッグもサポートします。このカーネルはドライバの 開発 やシステムの 問 題 をデバッグする 際 に 推 奨 します。時 にデフォルトでロードされます。Featuresカーネル・デバッグ 無 効 無 効 有 効システム・ダンプ 有 効 有 効 有 効カーネル・トレース 無 効 有 効 有 効(NightTraceを 利 用 )高 分 解 能 プロセス・ 有 効 有 効 有 効アカウンティングNMI Watchdog 無 効 無 効 有 効Frequency BasedScheduler (FBS)モジュールがロードされたときに 有 効モジュールがロードされたときに 有 効モジュールがロードされたときに 有 効パフォーマンス・モニタ 無 効 有 効 有 効(PM)* kernel<strong>version</strong> はそのカーネルをベースとする<strong>Linux</strong>カーネル・ソースコードの 公 式 バージョンですx.x は<strong>RedHawk</strong>のバージョン 番 号 を 示 しますExample: vmlinuz-2.6.26.6-<strong>RedHawk</strong>-5.2.1-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>システム・アップデート 1リアルタイム 機 能 1「<strong>RedHawk</strong> <strong>Linux</strong> updates」はConcurrentのWebサイト「<strong>RedHawk</strong> Updates」からダウンロードすることが 可 能 です。 詳 細 は<strong>RedHawk</strong> <strong>Linux</strong> Release Notes を 参 照 してください。NOTEConcurrentは「RHEL updates」のダウンロードは 推 奨 しません。<strong>RedHawk</strong><strong>Linux</strong>カーネルは 標 準 RHELカーネルを 差 し 替 えており、RHELディストリビューションのどのようなバージョンであっても 動 作 する 可 能 性 は 高 いです。しかし、Concurrentから 提 供 された 以 外 の「updates」をインストールするとシステムが 不 安 定 となりますのでそれは 推 奨 しません( 特 にgccとglibc)。 外 部邪 からのセキュリティに 関 するUpdatesは 必 要 であればインストールしても 構 いません。本 セクションはオペレーティング・システムのリアルタイム 処 理 やパフォーマンスを 含 む 機 能 の簡 単 な 説 明 を 提 供 します。 以 下 に 記 載 された 機 能 に 関 する 更 に 詳 細 な 情 報 は、 本 章 に 後 にて 提 供します。プロセッサ・シールディング 1プロセッサ・アフィニティ 1Concurrentは 割 り 込 みやシステムデーモンに 関 連連 した 予 測 できない 処 理 から 遥 択 したCPUを 保 護(シールド)する 方 法 を 開 発 しました。クリティカルなプライオリティの 高 いタスクを 特 定 のCPUにバインドし、 多 くの 割 り 込 みやシステムデーモンを 他 のCPUへバインドすることにより、マルチプロセッサーシステムの 特 定 CPU 上 において 最 高 のプロセス・ディスパッチ・レイテンシー(PDL)を 得 ることができます。2 章 ではシールディングCPUの 手 本 を 紹 介 し、またレスポンス 時 間向 上 およびデターミニズム 強 化 のテクニックを 説 明 します。複 数 のCPU 上 で 複 数 のプロセスを 実 行 するリアルタイム・アプリケーションでは、システムの 全てのプロセスのCPU 割 り 当 てを 明 示 的 に 制 御 することが 望 ましい。この 機 能 はConcurrentよりmpadvise(3)ライブラリルーチンや run(1)コマンドを 通 して 提 供 されます。 追 加 情 報 については2 章 およびmanページを 参 照 してください。1-4


序 文ユーザー・レベル・プリエンプション 制 御 1複 数 のCPU 上 で 動 作 する 複 数 のプロセスを 所 有 するアプリケーションがプロセス 間 でデータを 共有 する 動 作 をする 時 、2つ 以 上 のプロセスの 同 時 アクセスによる 破 壊 を 防 ぐために 共 有 データへのアクセスは 保 護 する 必 要 があります。 共 有 データの 保 護 のための 最 も 効 果 的 なメカニズムはスピンロックですが、スピンロックを 保 持 している 間 にプリエンプトする 可 能 性 のあるアプリケーションが 存 在 すると 効 果 的 に 使 用 することができません。 効 果 を 維 持 するために<strong>RedHawk</strong>はアプリケーションがプリエンプションを 瞬 時 に 無 効 にするためのメカニズムを 提 供 します。ユーザー・レベルのプリエンプション 制 御 に 関 するより 詳 細 な 情 報 は5 章 とresched_cntl(2)のmanページを参 照 してください。高 速 ブロック/ウェイク・サービス1RCIMドライバ1多 くのリアルタイムアプリケーションは 複 数 の 協 同 プロセスで 構 成 されています。これらのアプリケーションはプロセス 間 同 期 をするための 効 果 的 な 方 法 を 必 要 としています。Concurrentが 開 発した 高 速 ブロック/ウェイク・サービスは、 他 の 協 同 プロセスからのウェイク・アップ 通 知 を 待 っているプロセスが 瞬 時 に 自 分 自 身 をサスペンドすることを 可 能 とします。 詳 細 な 情 報 については、2 章 、5 章 およびpostwait(2)とserver_block(2)のmanページを 参 照 してください。Real-Time Clock and Interrupt Module(RCIM)をサポートするためのドライバーがインストールされています。この 多 目 的 PCIカードは 以 下 の 機 能 を 備 えています。• 最 大 12 個 の 外 部邪 デバイス 割 り 込 み• 最 大 8 個 のシステムへの 割 り 込 み 可 能 なリアルタイムクロック• アプリケーションからの 割 り 込 み 作 成 が 可 能 な 最 大 12 個 のプログラマブル 割 り 込 みジェネレータこれらの 機 能 はRCIMがインストールされているシステム 上 でローカル 割 り 込 みをすべて 作 成 することが 可 能 です。 複 数 の<strong>RedHawk</strong> <strong>Linux</strong>システムは 相 互 にチェーン 接 続 することが 可 能 で、 他のRCIMがインストールされたシステムに 対 してローカル 割 り 込 みの 配郤 信 が 最 大 12 個 まで 可 能 です。これは1つのタイマー、1つの 外 部邪 割 込 み、もしくは1つのアプリケーション・プログラムが 複数 の<strong>RedHawk</strong> <strong>Linux</strong>システムを 同 期 させるために 同 時 に 割 り 込 むことを 許 可 しています。 更 にRCIMには 複 数 のシステムを 共 通 時 間 で 共 有 させることが 出 来 る 同 期 高 分 解 能 クロックが 含 まれています。 更 なる 情 報 については、 本 書 の6 章 とReal-Time Clock & Interrupt Module (RCIM) User’s<strong>Guide</strong> を 参 照 してください。Frequency-Based Scheduler 1Frequency-Based Scheduler (FBS)は、 所 定 周 期 の 実 行 パターンにより 動 作 するアプリケーションをスケジューリングするためのメカニズムです。FBSはプログラムが 実 行 する 時 間 になったときにプロセスを 起 こすための 非 常 にしっかりしたメカニズムも 同 時 に 提 供 します。 更 に 周 期 アプリケーションのパフォーマンスがデッドラインを 超 える 場 合 にプログラムマーが 利 用 可 能 な 様 々なオプションにより 追 跡 することが 可 能 です。FBSは 周 期 実 行 アプリケーションをスケジュールするためのNightSimツールの 基 となるカーネル・メカニズムです。 更 なる 情 報 については、Frequency-Based Scheduler (FBS) User’s <strong>Guide</strong> とNightSim RT User’s <strong>Guide</strong> を 参 照 してください。1-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>/procの の 修 正 1カーネル・トレース 機 能 1ptrace 拡 張 1特 権 を 持 ったプロセスが 他 のプロセスのアドレス 空 間 の 値 を 読 み 書 きを 可 能 にするため、 修 正 はプロセスのアドレス 空 間 をサポートする/procで 行 われます。これはNightProbeデータ・モニタリング・ツールやNightViewデバッガのサポートに 利 用 されます。カーネルの 動 きをトレースする 機 能 が 追 加 されました。これにはカーネル・トレース・ポイントの 挿 入 、カーネルのトレース・メモリ・バッファの 読 み 取 り、トレース・バッファの 管 理 を 行 うためのメカニズムが 含 まれています。カーネル・トレース 機 能 はNigthTraceにより 利 用 できます。カーネル・トレースに 関 する 情 報 は 付 録 Dを 参 照 してください。<strong>Linux</strong>のptraceデバッギング・インターフェースは、NightViewデバッガーの 機 能 をサポートするために 拡 張 されました。 追 加 された 機 能 :カーネル・プリエンプション 1• デバッガ・プロセスが 停 止 状 態 のプロセス 内 のメモリを 読 み 書 きするための 機 能• デバッガがデバッグ 中 のプロセスのシグナル 群 だけをトレースするための 機 能• デバッガがデバッグ 中 のプロセスを 新 しいアドレスで 再 実 行 するための 機 能• デバッガ・プロセスがデバッグ 中 の 全 ての 子 プロセスに 自 動 的 にアタッチするための 機 能カーネル 内 で 実 行 中 の 低 優 先 度 プロセスを 高 優 先 度 プロセスがプリエンプトするための 機 能 が 提供 されます。 標 準 的 な<strong>Linux</strong> 下 の 低 優 先 度 プロセスは、カーネルから 抜 けるまで 実 行 し 続 け、ワーストケースのプロセス・ディスパッチ・レイテンシーとなります。データ 構 造造 体 を 保 護 するメカニズムは、 対 称 型 マルチプロセッサをサポートするためにカーネルに 組 み 込 まれています。1-6


序 文リアルタイム・スケジューラ1低 レイテンシー 拡 張 1優 先 度 継 承 1リアルタイム・スケジューラは、システム 内 で 動 作 中 のプロセスがいくつであっても 固 定 長 のコンテキスト・スイッチ 時 間 を 提 供 します。また、 対 称 型 マルチプロセッサ 上 で 動 作 する 真 のリアルタイム・スケジューリングも 提 供 します。カーネルが 使 用 する 共 有 データ 構 造造 体 を 保 護 するため、カーネルはスピン・ロックとセマフォによりその 共 有 データ 構 造造 体 へアクセスするコード・パスを 保 護 します。スピン・ロックのロック処 理 は、スピン・ロックが 保 持 している 間 はプリエンプションや 割 り 込 みが 無 効 となることを 命じます。 低 レイテンシー 拡 張 は、より 良 い 割 り 込 み 応 答 時 間 を 提 供 するために 最 悪 の 状 況 となるプリエンプションが 特 定 されたアルゴリズムに 手 を 加 えています。スリーピーウェイト 相 互 排 他 メカニズムとして 使 用 されるセマフォは 優 先 度 反 転 の 問 題 を 引 き 起こす 可 能 性 があります。クリティカル・セクション 内 で 実 行 される1つ 以 上 の 低 優 先 度 プロセスが1つ 以 上 の 高 優 先 度 プロセスの 動 作 を 妨 げるときに 優 先 度 反 転 を 引 き 起 こします。 優 先 度 継 承 はクリティカル・セクション 内 で 実 行 中 の 低 優 先 度 プロセスの 優 先 度 を 待 機 中 の 最 高 優 先 度 プロセスへ 一 時 的 に 引 き 上 げることを 生 じます。これは、クリティカル・セクション 内 で 実 行 中 のプロセスがクリティカル・セクションから 離 れるまで 実 行 し 続 けるために 十 分 な 優 先 度 を 持 つことを 確実 にします。 詳 細 な 情 報 については5 章 を 参 照 してください。高 分 解 能 プロセス・アカウンティング 1ケーパビリティのサポート1標 準 <strong>Linux</strong>カーネル 内 では、システムはとても 大 雑 把 なメカニズムを 使 ってプロセスのCPU 実 行 時間 を 計 算 しています。これは 特 定 のプロセスが 使 用 するCPU 時 間 の 量 がとても 不 正 確 になる 可 能性 があることを 意 味 します。 高 分 解 能 プロセス・アカウンティング 機 能 はとても 正 確 なCPU 実 行時 間 計 算 のためのアルゴリズムを 提 供 し、 優 れたアプリケーションの 性 能 モニタリングを 可 能 にします。この 機 能 はConcurrentが 提 供 する”Debug”および”Trace”カーネルの 中 に 盛 り 込 まれ、 標 準<strong>Linux</strong>のCPUアカウンティング・サービスとそれらのカーネルのパフォーマンス・モニタに 利 用 されます。CPUアカウンティング 方 式 に 関 する 情 報 は7 章 を 参 照 してください。Pluggable Authentication Module (PAM)は、ユーザーに 特 権 を 割 り 当 てるメカニズムを 提 供 し、 認証 プログラムを 再 コンパイルすることなく 認 証 ポリシーを 設 定 できます。この 仕 組 みの 下 では、ルートだけが 許 可 された 特 権 を 必 要 とするアプリケーションを 非 ルートユーザーが 実 行 できるように 設 定 することが 可 能 です。 例 えば、メモリ 内 のページをロックする 機 能 は 個 々のユーザーやグループに 割 り 当 て 可 能 な 所 定 の 特 権 により 提 供 されます。特 権 は、 設 定 ファイルを 通 して 許 可 されます。ロールは 有 効 な<strong>Linux</strong>ケーパビリティのセットです。定 義 されたロールは、 予 め 定 義 されたロールのケーパビリティを 継 承 する 新 しいロールと 一 体 となって 後 に 続 くロールの 基 礎 的 要 素 として 使 用 されます。ロールはシステム 上 でケーパビリティを 定 義 してユーザーおよびグループに 割 り 当 てます。PAMの 機 能 に 関 する 情 報 は13 章 を 参 照 してください。1-7


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>カーネル・デバッガ 1オープンソース・カーネル・デバッガー kdbは<strong>RedHawk</strong> <strong>Linux</strong>のデバッグ・カーネルでサポートされます。追 加 の 情 報 は12 章 を 参 照 してください。カーネルのコア・ダンプ/クラッシュ 解 析 1kexecおよびkdumpのオープンソース・パッチは 他 のカーネルのクラッシュ・ダンプの 取 り 込 みを 可 能 とし、crashユーティリティは 取 り 込 んだダンプを 解 析 するために 提 供 されます。クラッシュ・ダンプ 解 析 に 関 する 詳 細 な 情 報 については12 章 を 参 照 してください。ユーザー・レベル・スピン・ロック 1usermapおよびおよび/proc mmap 1ハイパースレッディング 1<strong>RedHawk</strong> <strong>Linux</strong>のビジーウェイト 相 互 排 他 ツールには 低 オーバーヘッドのビジーウェイト 相 互 排他 変 数 (スピンロック)と 初 期 化 、ロック、アンロック、クエリー・スピンロックが 可 能 なマクロのセットが 含 まれます。 効 果 を 上 げるためにユーザー・レベル・スピンロックはユーザー・レベル・プリエンプション・コントロールと 一 緒 に 利 用 する 必 要 があります。 詳 細 は5 章 を 参 照 してください。libccur_rtライブラリに 属 する usermap(3)ライブラリルーチンは、 簡 単 なCPUの 読 み 書 きを 利 用して 現 在 実 行 中 のプログラムのロケーションを 効 果 的 に 監 視 および 変 更 するためのアプリケーションを 提 供 します。/procファイルシステムのmmap(2)は、 自 分 自 身 のアドレス 空 間 の 中 に 他 のプロセスのアドレス空 間 の 一 部邪 を 割 り 当 てることを 許 可 するusermap(3)のための 基 本 となるカーネルサポートです。従 って、 他 の 実 行 中 のプログラムの 監 視 および 変 更 はread(2)およびwrite(2)システムコールによる/procファイルシステムのオーバーヘッドを 発 生 させる 事 なくアプリケーション 自 身 のアドレス 空 間 の 中 で 簡 単 なCPUの 読 み 書 きとなります。 詳 細 な 情 報 については9 章 を 参 照 してください。ハイパースレッディングはIntel Pentium Xeonプロセッサーの 機 能 です。これは1つの 物 理 プロセッサーをオペレーティングシステムに2つの 論 理 プロセッサーのように 見 せる 効 果 があります。2つのプログラムカウンターは 各 々のCPUチップの 中 で 同 時 に 実 行 されるため、 事 実 上 、 各 々のチップはデュアルCPUとなります。 物 理 CPUのハイパースレッディングは、キャッシュミスや 特 殊 命令 のようなものを2つのレジスターセット 間 で 高 速 ハードウェアベースのコンテキスト・スイッチを 利 用 することにより“ 並 行 ”して 複 数 のタスクを 実 行 することが 可 能 です。<strong>RedHawk</strong> <strong>Linux</strong>にはハイパースレッディングのサポートが 含 まれています。リアルタイム 環 境 においてこの 機 能 を効 果 的 に 使 用 する 詳 細 な 情 報 については2 章 を 参 照 してください。1-8


序 文XFSジャーナリング・ファイル・システム1POSIXリアルタイム 拡 張 1SGIが 提 供 するXFSジャーナリング・ファイル・システムは<strong>RedHawk</strong> <strong>Linux</strong>に 実 装 されています。ジャーナリング・ファイル・システムは 処 理 を 記 録 するためにジャーナル(ログ)を 使 用 します。システムクラッシュの 事 象 が 発 生 した 場 合 、バックグラウンド・プロセスは 再 起 動 を 実 行 し、ジャーナルからジャーナリング・ファイル・システムへのアップデートを 終 了 します。このようにファイルシステムのチェックの 複 雑 さを 徹 底 的 に 省 くことで 復 旧 時 間 を 削 減 します。SGIは、 性能 と 拡 張 性 を 補 助 するためにBツリーを 広 範 囲 にわたり 利 用 したものをベースとしたマルチスレッド、 大 容 量 ファイルおよび 大 容 量 ファイルシステムが 利 用 可 能 な64bitファイルシステム、 拡 張属 性 、 可 変 長 ブロックサイズを 実 装 しています。 詳 細 については8 章 を 参 照 してください。<strong>RedHawk</strong> <strong>Linux</strong>は、ISO/IEC 9945-1に 記 述 されているPOSIXリアルタイム 拡 張 により 定 義 された 殆どのインターフェースをサポートしています。 以 下 がサポートされている 機 能 です。• ユーザー 優 先 度 スケジューリング• プロセス・メモリ・ロック• メモリ・マップド・ファイル• 共 有 メモリ• メッセージ・キュー• カウンティング・セマフォ• リアルタイム・シグナル• 非 同 期 I/O• 同 期 I/O• タイマー( 高 分 解 能 バージョン)ユーザー 優 先 度 スケジューリング 1メモリ 常 駐 プロセス 1<strong>RedHawk</strong> <strong>Linux</strong>はユーザー 優 先 度 スケジューリングに 適遚 応 しています- 固 定 優 先 度 POSIXスケジューリングでスケジュールされたプロセスは、 実 行 時 の 状 態 に 応 じてオペレーティングシステムにより 優 先 度 が 変 更 されることはありません。 結 果 として 生 じるメリットはカーネルのオーバーヘッドの 削 減 とユーザーコントロールの 増 加 です。プロセス・スケジューリング 機 能 は4 章 に 記 載されています。ページングとスワッピングはアプリケーションプログラムに 予 測 できないシステム・オーバーヘッド 時 間 を 付 加 します。パフォーマンス 低 下 の 原 因 となるページングとスワッピングを 排 除 するため、<strong>RedHawk</strong> <strong>Linux</strong>は 確 実 なプロセスの 仮 想 アドレス 空 間 常 駐 の 割 り 当 てをユーザーに 許 可 しています。mlockall(2), munlockall(2), mlock(2), munlock(2)のPOSIXシステムコールは 物 理 メモリ 内 のプロセス 仮 想 アドレス 空 間 の 全 てまたは 一 部邪 をロックすることが 可 能 です。 詳 細 はmanページを 参 照 してください。1-9


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>メモリ・マッピングおよびデータ 共 有 1プロセス 同 期 1非 同 期 入 出 力 1同 期 入 出 力 1<strong>RedHawk</strong> <strong>Linux</strong>はIEEE 規 格 1003.1b-1993およびSystem V IPCメカニズムに 準 拠 する 共 有 メモリおよびメモリ・マッピング 機 能 をサポートします。POSIX 機 能 はメモリ・オブジェクトの 利 用 を 通してプロセスがデータを 共 有 することを 許 可 し、1つまたはそれ 以 上 のプロセスのアドレス 空 間 にマップ 可 能 な 指 定 された 記 憶 領 域 を 関 連連 したメモリと 共 有 することを 許 可 します。メモリ・オブジェクトにはPOSIX 共 有 メモリオブジェクト、レギュラーファイル、いくつかのデバイス、ファイル・システム・オブジェクト(ターミナル、ネットワーク 等 )が 含 まれます。プロセスはオブジェクト 上 のアドレス 空 間 の 一 部邪 をにマッピングすることにより 直 接 メモリ・オブジェクト 内 のデータにアクセスすることが 可 能 です。これはカーネルとアプリケーション 間 のデータコピーを 排除 するため、read(2)およびwrite(2)システムコールを 使 うよりも 更 に 効 果 的 です。<strong>RedHawk</strong> <strong>Linux</strong>は 協 同 プロセスが 共 有 リソースへのアクセスを 同 期 するために 利 用 可 能 な 多 様 なツールを 提 供 します。IEEE 規 格 1003.1b-1993に 準 拠 するカウンティング・セマフォは、マルチスレッド 化 されたプロセス 内 の 複 数 のスレッドが 同 一 リソースへのアクセスを 同 期 することが 可 能 です。カウンティング・セマフォはリソースの 使 用 および 割 り 当 てが 可 能 なタイミングを 判 定 する 値 を 持 っています。プロセス 間 セマフォをサポートするSystem V IPC セマフォも 利 用 可 能 です。セマフォに 加 えてConcurrentが 開 発 した 一 連連 のリアルタイム・プロセス 同 期 ツールは、 再 スケジューリングの 影 響 を 受 けるプロセスの 制 御 、 連連 続 したプロセスのビジーウェイト 相 互 排 他 メカニズムによるクリティカル・セクションへのアクセス、プロセス 間 のクライアント-サーバ 相 互 関 係の 調 整 の 各 機 能 を 提 供 します。これらのツールにより、 優 先 度 反 転 を 抑 制 するスリーピーウェイト 相 互 排 他 を 提 供 するためのメカニズムを 構 成 することが 可 能 になります。同 期 ツールの 説 明 および 利 用 手 順 は5 章 で 提 供 されます。非 同 期 でI/O 操 作 を 実 行 できるということはI/O 操 作 の 開 始 とブロックせずにI/O 完 了 からの 復 帰 が可 能 であることを 意 味 します。<strong>RedHawk</strong> <strong>Linux</strong>はIEEE 規 格 1003.1b-1993に 準 拠 したライブラリ・ルーチンのグループによる 非 同 期 I/Oに 対 応 しています。これらのインターフェースはプロセスが 非同 期 での 読 み 書 き 処 理 の 実 行 、シングルコールによる 複 数 の 非 同 期 I/O 操 作 の 開 始 、 非 同 期 I/O 操作 の 完 了 待 機 、 待 機 している 非 同 期 I/O 操 作 のキャンセル、 非 同 期 ファイルの 同 期 実 行 が 可 能 です。この”aio” 機 能 はシステム 上 のinfoページ(”info libc”)に 記 載 されています。<strong>RedHawk</strong> <strong>Linux</strong>はIEEE 規 格 1003.1b-1993に 準 拠 した 同 期 I/O 機 能 もサポートしています。POSIX 同期 I/Oはアプリケーションのデータとファイルの 整 合 性 を 確 実 にする 手 段 を 提 供 します。 同 期 出 力操 作 は 出 力 デバイスに 書 き 込 まれたデータの 記 録 を 確 実 にします。 同 期 入 力 操 作 はデバイスから読 み 取 ったデータと 現 在 ディスク 上 に 存 在 するデータのミラーであることを 確 実 にします。 詳 細な 情 報 についてはmanページを 参 照 してください。1-10


序 文リアルタイム・シグナルの 挙 動 1クロックおよびタイマー 1メッセージ・キュー 1リアルタイム・シグナルの 挙 動 はIEEE 規 格 1003.1b-1993に 含 まれている、リアルタイム・シグナル 番 号 、 複 数 の 特 定 シグナル 発 生 のキューイングのサポート、 複 数 の 同 種 類 のシグナル 発 生 を 区別 するためにシグナルが 作 成 されたときのアプリケーション 定 義 された 値 の 規 格 のサポート 等 によって 仕 様 が 定 められています。POSIXシグナル 管 理 機 能 には、シグナル 受 信 待 ち、シグナルおよびアプリケーション 定 義 の 値 のキューイングが 可 能 な sigtimedwait(2), sigwaitinfo(2),sigqueue(2)システムコールが 含 まれています。 詳 細 な 情 報 についてはmanページを 参 照 してください。高 分 解 能 POSIXクロックおよびタイマーのサポートが<strong>RedHawk</strong> に 含 まれています。POSIXクロック 全 体 はタイムスタンプやコードセグメント 長 の 計 測 のような 目 的 で 使 用 されます。POSIXタイマーはアプリケーションが 高 分 解 能 クロック 上 の 相 対 または 絶 対 時 間 を 使 用 することで 単 発 または 定 期 的 なイベントをスケジュールすることが 可 能 です。アプリケーションは 個 々のプロセスで複 数 のタイマーを 作 成 することが 可 能 です。 更 には 非 常 に 短 い 時 間 プロセスをスリープ 状 態 にするために 利 用 でき、また、スリープ 時 間 の 計 測 に 使 用 されるクロックを 指 定 できる 高 分 解 能 スリープのメカニズムを 提 供 します。 追 加 の 情 報 は6 章 を 参 照 してください。IEEE 規 格 1003.1b-1993 上 のPOSIXメッセージ 送 信 機 能 は<strong>RedHawk</strong> <strong>Linux</strong> に 含 まれており、ファイルシステムとして 実 行 されます。POSIXメッセージキュー・ライブラリ・ルーチンはメッセージキューの 作 成 、オープン、 問 合 せ、 破 棄 、メッセージの 送 受 信 、 送 信 メッセージの 優 先 度 設 定 、メッセージ 到 遉 時 の 非 同 期 通 知 リクエストが 可 能 です。POSIXメッセージキューはSystem V IPCメッセージとは 関 係 なく 動 作 し、System V IPCメッセージも 利 用 できます。 詳 細 は3 章 を 参 照 してください。1-11


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>1-12


2122Chapter 2リアルタイム 性 能本 章 では<strong>RedHawk</strong> <strong>Linux</strong>でのリアルタイム 性 能 を 実 現 することに 関 連連 したいくつかの 問 題 を 明 確にします。 本 章 の 主 な 焦 点 は、 最 高 のリアルタイム 性 能 を 得 るためにプロセスおよび 割 り 込 みをシステム 内 のCPUの 一 部邪 に 割 り 当 てるシールドCPUモデル となります。リアルタイム 性 能 で 重 要 なことは 割 り 込 み 応 答 、プロセス・ディスパッチ・レイテンシー、デターミニスティック( 予 測 可 能 な)プログラムの 実 行 を 明 確 にすることです。これらの 指 標 上 で 様 々なシステム 動 作 の 影 響 を 明 確 にし、 最 適遚 なリアルタイム 性 能 のための 手 法 を 提 供 します。シールドCPUモデルの 概 要 2シールドCPUモデルは 対 称 型 マルチ・プロセッサー・システムにおいて 最 高 のリアルタイム 性 能を 得 るためのアプローチです。シールドCPUモデルはリアルタイム・アプリケーションのデターミニスティック( 予 測 可 能 )な 実 行 、 同 じく 割 り 込 みに 対 してデターミニスティック( 予 測 可 能 )な 応答 を 可 能 にします。コード・セグメントの 実 行 に 必 要 な 時 間 が 予 測 可 能 かつ 一 定 である 時 、タスクはデターミニスティックな 実 行 状 態 となります。 同 様 に 割 り 込 みの 応 答 に 必 要 な 時 間 が 予 測 可 能 かつ 一 定 である 時 、割 り 込 み 応 答 もデターミニスティックとなります。コード・セグメントの 実 行 または 割 り 込 み 応答 を 測 定 した 時 間 が 標 準 的 なケースとは 明 らかに 異 なり 最 悪 であった 時 、そのアプリケーション性 能 はジッター が 発 生 している 状 態 と 言 う。リソースを 共 有 するためのメモリ・キャッシュやメモリ・コンテンションのようなコンピュータ・アーキテクチャ 機 能 が 原 因 で、 計 測 した 実 行 時 間の 中 に 常 にジッターが 含 まれます。それぞれのリアルタイム・アプリケーションは 容 認 できるジッターの 量 を 明 確 にする 必 要 があります。シールドCPUモデルでは、 特 定 の 重 要 なリアルタイム 機 能 に 対 してハイグレードなサービスを 保証 する 方 法 としてタスクと 割 り 込 みをあるCPUに 割 り 当 てます。 特 に 高 優 先 度 タスクは、1つまたはそれ 以 上 のシールドCPUに 制 限 し、 殆 どの 割 り 込 みや 低 優 先 度 タスクはそれ 以 外 のCPUに 制 限します。 高 優 先 度 タスクを 動 作 させる 役 割 を 持 つCPUが、 割 り 込 みに 関 連連 した 予 測 できない 処 理やシステムコールを 経 由 してカーネル 空 間 にいる 他 の 低 優 先 度 プロセスの 動 きから 遮遝 断 されているこのCPUの 状 態 をシールドCPU と 呼 びます。シールドCPU 上 で 実 行 されるべきタスクの 種 類 の 例 :• 割 り 込 み 応 答 時 間 の 保 証 を 要 求 するタスク• 最 速 の 割 り 込 み 応 答 時 間 を 要 求 するタスク• 高 周 期 で 実 行 しなければならないタスク• デッドラインを 満 足 するためにデターミニスティックな 実 行 を 要 求 するタスク• オペレーティング・システムからの 割 り 込 みを 容 認 できないタスク2-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>デターミニズムの 概 要 2様 々なレベルのCPUシールディングは、 高 優 先 度 割 り 込 み 応 答 しなければならない、またはデターミニスティックな 実 行 を 要 求 するタスクのために 異 なる 度 合 いのデターミニズムを 提 供 します。シールドCPUで 可 能 となるシールディングのレベルを 明 確 にする 前 にシステムが 外 部邪 イベントにどのように 応 答 するのか、コンピュータ・システムのいくつかの 通 常 オペレーションが 応 答 時 間およびデターミニズムにどのような 影 響 を 与 えているのかを 理 解 する 必 要 があります。デターミニズム は 一 定 時 間 内 で 特 定 のコード・パス( 順 に 実 行 される 命 令 セット)を 実 行 するためのコンピュータシステムの 能 力 に 言 及 します。ある 状 態 から 他 へ 変 化 したコード・パスの 実 行 時間 の 範 囲 はシステムでのデターミニズムの 度 合 いを 示 します。デターミニズムは、ユーザー・アプリケーションのタイム・クリティカルな 部邪 分 を 要 求 時 間 で 実行 するだけでなく、カーネル 内 のシステム・コードを 要 求 時 間 で 実 行 することも 当 てはまります。プロセス・ディスパッチ・レイテンシーのデターミニズムは、 例 えば、 割 り 込 みのハンドリング、ターゲット・プロセスの 起 床 、コンテキスト・スイッチの 実 行 、ターゲット・プロセスがカーネルから 抜 け 出 すのを 許 可 、のような 実 行 されなければならないコード・パスに 依 存 します。( 「Process Dispatch Latency」セクションにて 用 語 プロセス・ディスパッチ・レイテンシー を 明記 し、マルチプロセッサーシステム 内 の 特 定 CPUで 最 高 のプロセス・ディスパッチ・レイテンシーを 得 るためのモデルを 紹 介 します。)プログラム 実 行 のデターミニズムにおいて 最 大 のインパクトは 割 り 込 みの 受 信 です。これは 割 り込 みがシステム 内 では 常 に 最 高 優 先 度 の 機 能 であり、 割 り 込 みの 受 信 が 予 測 不 可 能 -プログラム実 行 中 は 遅逼 れることなく 如 何 なるポイントでも 発 生 する 可 能 性 がある-であるためです。 重 要 ではない 割 り 込 みからのシールディングは、 高 優 先 度 タスク 実 行 中 にデターミニズムの 向 上 に 最 大のインパクトを 得 ることになります。プログラム 実 行 でのデターミニズム 向 上 のそのほかのテクニックについては「デターミニズムを高 める 手 順 」セクションに 明 記 されています。プロセス・ディスパッチ・レイテンシー 2リアルタイム・アプリケーションは 実 在 イベントに 応 答 すること、 実 在 イベントのハンドリングに 必 要 な 処 理 を 与 えられた 期 限 (デッドライン) 内 に 終 了 することが 出 来 なければなりません。 実在 イベントに 応 答 するために 必 要 な 計 算 はデッドラインの 前 に 終 了 していなければならず、さもなければその 結 果 は 不 正 確 であるとみなされます。 割 り 込 みへの 応 答 が 異 常 に 長 い1つの 事 例 は、デッドラインを 超 えたことが 原 因 である 可 能 性 があります。用 語 プロセス・ディスパッチ・レイテンシー は、 割 り 込 みによって 通 知 される 外 部邪 イベント 発 生から 外 部邪 イベント 待 ちプロセスがユーザー・モードでの 最 初 の 命 令 を 実 行 するまでの 時 間 経 過遃 を意 味 します。リアルタイム・アプリケーションにとって 予 想 される 最 悪 のプロセス・ディスパッチ・レイテンシーは 基 準 の 鍵 になります。それは、デッドラインを 満 足 することを 保 証 するリアルタイム・アプリケーション 性 能 を 左 右 する 最 悪 の 応 答 時 間 であるためです。2-2


リアルタイム 性 能プロセス・ディスパッチ・レイテンシーは 以 下 のイベント 発 生 のシーケンスに 掛 かる 時 間 で 構 成されます。1. 割 り 込 みコントローラは 割 り 込 みを 通 知 し、CPUへの 例 外 割 り 込 みを 作 成 します。2. 割 り 込 みルーチンが 実 行 され、 割 り 込 みを 待 っている(ターゲット)プロセスが 起 こされます。3. 現 在 実 行 中 のプロセスは 停 止 され、コンテキスト・スイッチが 機 能 するためターゲット・プロセスが 実 行 可 能 となります。4. ターゲット・プロセスは 割 り 込 み 待 ちでブロックされていたカーネルポイントから 抜 けます。5. ターゲット・プロセスはユーザー・モードで 実 行 します。この 一 連連 のイベントはプロセス・ディスパッチ・レイテンシーの 理 想 のケースを 表 しており、 図2-1に 図 示 されています。 上 記 1~5の 番 号 が 図 2-1の 中 に 記 述 されています。図 2-1 標 準 的 なプロセス・ディスパッチ・レイテンシープロセス・ディスパッチ・レイテンシーは、アプリケーションが 外 部邪 イベントに 対 して 応 答 可 能なスピードを 表 しているので、イベント 駆 動 型 リアルタイム・アプリケーションにとってとても重 要 な 基 準 となります。 殆 どのリアルタイムアプリケーションの 開 発 者 が、 彼 らのアプリケーションが 特 定 のタイミング 制 約 を 満 たす 必 要 があるため、 予 想 される 最 悪 のプロセス・ディスパッチ・レイテンシーに 興 味 を 持 っています。プロセス・ディスパッチ・レイテンシーはいくつかのオペレーティング・システムの 通 常 操 作 、デバイスドライバー、ハードウェアに 影 響 します。 以 下 のセクションではプロセス・ディスパッチ・レイテンシーでのいくつかのジッターの 原 因 を 観 察 します。2-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>割 り 込 み 禁 止 の 効 果 2オペレーティング・システムは 共 有 データ 構 造造 体 を 破 壊 されるのを 避遪 けるために 共 有 データ 構 造造体 へのアクセスを 保 護 しなければなりません。 割 り 込 みレベルでデータ 構 造造 体 がアクセスされることが 可 能 な 時 、いつそのデータ 構 造造 体 がアクセスされようとも 割 り 込 みを 無 効 にする 必 要 があります。これは、 同 じ 共 有 データ 構 造造 体 の 更 新 最 中 にプログラム・レベル・コードに 割 り 込 んで共 有 データ 構 造造 体 が 破 壊 されることから 割 り 込 みコードを 保 護 します。これはカーネルが 短 時 間割 り 込 みを 無 効 にする 主 要 な 理 由 です。割 り 込 みが 無 効 であるとき、 応 答 しようとしている 割 り 込 みは 再 び 割 り 込 みが 有 効 となるまでアクティブになることが 出 来 ないため、プロセス・ディスパッチ・レイテンシーは 影 響 を 受 けます。このケースでは、 割 り 込 み 待 機 中 タスクのプロセス・ディスパッチ・レイテンシーは 割 り 込 みが無 効 である 状 態 が 続 く 時 間 だけ 延 長 されます。これは 図 2-2に 図 示 されています。この 図 表 内 では、低 優 先 度 プロセスが 割 り 込 みを 無 効 にするシステムコールを 実 行 しました。 割 り 込 みが 現 在 無 効であるため、 高 優 先 度 割 り 込 みが 発 生 した 時 にアクティブになることは 出 来 ません。 低 優 先 度 プロセスがクリティカル・セクションを 終 了 した 時 、 割 り 込 みが 有 効 となり、アクティブな 状 態 となって 割 り 込 みサービスルーチンがコールされます。 通 常 の 割 り 込 み 応 答 のステップから 完 了 までは 普 通 の 方 法 となります。 図 2-2に 記 述 された1~5の 番 号 は2-3ページで 説 明 した 通 常 のプロセス・ディスパッチ・レイテンシーのステップを 表 します。明 らかに 割 り 込 みが 無 効 となっているオペレーティング・システム 内 のクリティカル・セクションは、 良 好 なプロセス・ディスパッチ・レイテンシーを 得 るために 最 小 限 に 抑 えれなければなりません。図 2-2 割 り 込 み 無 効 によるプロセス・ディスパッチ・レイテンシーへの 影 響2-4


リアルタイム 性 能割 り 込 みの 影 響 2割 り 込 みの 受 信 は 割 り 込 みを 無 効 にしたことと 同 じようにプロセス・ディスパッチ・レイテンシー 影 響 を 及 ぼします。ハードウェア 割 り 込 みを 受 信 したとき、システムは 現 在 の 割 り 込 みよりも優 先 度 が 同 等 かそれ 以 下 の 割 り 込 みをブロックします。 単 純 なケースを 図 2-3に 図 示 します。ターゲットの 割 り 込 みの 前 に 高 優 先 度 割 り 込 みが 発 生 した 場 合 、 高 優 先 度 割 り 込 みが 発 生 するまでターゲットの 割 り 込 みの 遅逼 延 を 招 くことになります。 図 2-3に 記 述 された1~5の 番 号 は2-3ページで説 明 した 通 常 のプロセス・ディスパッチ・レイテンシーのステップを 表 します。図 2-3 高 優 先 度 割 り 込 みによるみによるプロセス・ディスパッチ・レイテンシーへの 影 響2-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>割 り 込 みの 相 対 的 な 優 先 度 はプロセス・ディスパッチ・レイテンシーに 影 響 しません。 低 優 先 度割 り 込 みがアクティブになる 時 でも、 高 優 先 度 割 り 込 みに 対 するプロセス・ディスパッチ・レイテンシーへの 割 り 込 みの 影 響 は 同 等 です。これは 割 り 込 みが 常 にユーザー・レベル・コードよりも 高 い 優 先 度 で 実 行 されているためです。 従 って、 我 々は 高 優 先 度 割 り 込 みのための 割 り 込 みルーチンを 提 供 するかもしれませんが、その 割 り 込 みルーチンは 実 行 中 のユーザー・レベル・コンテキストを 全 ての 割 り 込 みの 実 行 が 完 了 するまで 取 得 することが 出 来 ません。プロセス・ディスパッチ・レイテンシーにおけるこの 低 優 先 度 割 り 込 みの 影 響 は 図 2-4に 図 示 されています。これらの 処 理 方 法 の 順 序 は 図 2-3での 高 優 先 度 割 り 込 みのケースとは 異 なりますが、プロセス・ディスパッチ・レイテンシーにおける 影 響 は 同 等 です。 図 2-4に 記 述 された1~5の 番 号 は2-3ページで 説 明した 通 常 のプロセス・ディスパッチ・レイテンシーのステップを 表 します。図 2-4 低 優 先 度 割 り 込 みによるみによるプロセス・ディスパッチ・レイテンシーへの 影 響2-6


リアルタイム 性 能プロセス・ディスパッチ・レイテンシーに 対 する 明 確 な 影 響 で 割 り 込 みの 無 効 化 と 割 り 込 み 受 信とで 最 大 の 遊 いの1つは、 割 り 込 みが 実 行 しているアプリケーションに 対 して 非 同 期 かつ 予 測 不 可能 な 時 に 発 生 することです。これは 利 用 可 能 なシールディングの 様 々なレベルを 理 解 することが重 要 です。複 数 の 割 り 込 みが 特 定 のCPU 上 で 受 信 が 可 能 な 時 、プロセス・ディスパッチ・レイテンシーへの影 響 は 深 刻 となる 可 能 性 があります。これは 複 数 の 割 り 込 み 処 理 ルーチンが 高 優 先 度 割 り 込 みのプロセス・ディスパッチ・レイテンシーが 完 了 する 前 に 処 理 されなければならない 割 り 込 みが 積み 重 なることが 可 能 であるためです。 図 2-5は 高 優 先 度 割 り 込 みに 応 答 しようとしている 間 に2つの 割 り 込 みがアクティブになるケースを 示 します。 図 2-5に 記 述 された1~5の 番 号 は2-3ページで説 明 した 通 常 のプロセス・ディスパッチ・レイテンシーのステップを 表 します。CPUが 割 り 込 みを 受 信 した 時 、CPUは 割 り 込 みが 可 能 なCPUからの 低 優 先 度 の 割 り 込 みを 無 効 にします。もしこの 期 間 に 低 優 先 度 の2 番 目 の 割 り 込 みがアクティブになったとしても、 最 初 の 割 り 込 みがアクティブである 限 りブロックされます。 最 初 の 割 り 込 みサービスが 完 了 した 時 、2 番 目 の 割 り 込 みはアクティブになりサービスが 提 供 されます。もし2 番 目 の 割 り 込 みが 最 初 の 割 り 込 みよりも 高 優 先 度 であった 場 合 、その 割 り 込 みは 即 座 にアクティブになります。2 番 目 の 割 り 込 み 処 理 が 完 了 した 時 、最 初 の 割 り 込 みは 再 びアクティブになります。どちらのケースもユーザープロセスは、すべての保 留 中 の 割 り 込 みのサービスが 完 了 するまでは 実 行 が 抑 制 されます。恐 らく、それは 割 り 込 みがアクティブであり 続 け、システムが 高 優 先 度 割 り 込 みに 応 答 することを 決 して 許 可 しない 異 常 なケースとなる 可 能 性 があります。 複 数 の 割 り 込 みが 特 定 のCPUに 割 り付 けられる 時 、 割 り 込 みが 積 み 重 ねられることが 原 因 でそのCPUのプロセス・ディスパッチ・レイテンシーは 予 測 しにくくなります。図 2-5 複 数 割 り 込 みによるみによるプロセス・ディスパッチ・レイテンシーへの 影 響2-7


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>プリエンプション 禁 止 の 効 果 2<strong>RedHawk</strong> <strong>Linux</strong>には 割 り 込 みレベルでロックされない 共 有 リソースを 保 護 するクリティカル・セクションが 存 在 します。このケースでは、このクリティカル・セクション 間 で 割 り 込 みをブロックする 理 由 がありません。しかし、このクリティカル・セクション 間 で 発 生 したプリエンプションは、もし 新 しいプロセスが 同 じクリティカル・セクションに 入 ってきた 場 合 に 共 有 リソースを 破壊 する 原 因 となる 可 能 性 があります。 従 って、このようなクリティカル・セクションのタイプでプロセスが 実 行 している 間 は、プリエンプションは 無 効 となります。プリエンプションのブロックは 割 り 込 みの 受 信 が 遅逼 延 しません。しかし、もしその 割 り 込 みが 高 優 先 度 プロセスを 起 こす 場合 は、プリエンプションが 再 び 有 効 となるまでそのプロセスに 切 り 替 わる 可 能 性 はありません。同 一 CPUが 要 求 されているとするならば、プロセス・ディスパッチ・レイテンシーの 実 際 の 影 響はまるで 割 り 込 みが 無 効 にされたのと 同 じになります。プロセス・ディスパッチ・レイテンシーにおけるプリエンプション 無 効 の 効 果 は 図 2-6に 図 示 されています。 図 2-6に 記 述 された1~5の 番号 は2-3ページで 説 明 した 通 常 のプロセス・ディスパッチ・レイテンシーのステップを 表 します。図 2-6 プリエンプション 無 効 によるプロセス・ディスパッチ・レイテンシーへの 影 響2-8


リアルタイム 性 能オープン・ソース・デバイス・ドライバの 影 響 2デバイス・ドライバーはスーパーバイザー・モードで 実 行 するので、<strong>Linux</strong>カーネルの 一 部邪 となります。これは、デバイス・ドライバーは 割 り 込 みが 無 効 またはプリエンプションが 無 効 の<strong>Linux</strong>の 機 能 をコールすることが 自 由 であることを 意 味 します。デバイス・ドライバーも 割 り 込 みを 処理 しますので、 割 り 込 みレベルで 過遃 ごす 時 間 を 制 御 します。 本 章 の 前 セクションで 示 したようにデバイス・ドライバーの 動 きは 割 り 込 み 応 答 やプロセス・ディスパッチ・レイテンシーに 影 響 する可 能 性 があります。<strong>RedHawk</strong> <strong>Linux</strong>で 有 効 なデバイス・ドライバーは、リアルタイム 性 能 に 不 利 な 影 響 を 与 えないことが 確 かであることをテストしています。オープンソース・デバイス・ドライバーの 著 者 は 割 り 込みレベルで 過遃 ごす 時 間 の 最 小 化 や 割 り 込 み 時 間 の 無 効 化 を 働 きかける 一 方 、 実 際 には、 様 々な 気遣違 いレベルでオープンソース・デバイス・ドライバーは 記 述 されています。もし 付 け 加 えたオープンソース・デバイス・ドライバーを 有 効 にした 場 合 、<strong>RedHawk</strong> <strong>Linux</strong>が 提 供 するプロセス・ディスパッチ・レイテンシーの 保 証 に 悪 影 響 を 与 えるかもしれません。デバイス・ドライバーに 関 連連 するリアルタイムの 問 題 の 詳 細 な 情 報 については「デバイス・ドライバ」 章 を 参 照 してください。シールディングでリアルタイム 性 能 を 向 上 する 方 法 2本 セクションは、CPUシールディングの 特 性 の 遊 いがユーザープロセスの 割 り 込 み 応 答 能 力 (プロセス・ディスパッチ・レイテンシー)とユーザー・プロセス 実 行 のデターミニズムをどのように向 上 するかを 検 証 します。シールディングを 有 効 にする 場 合 、すべてのシールディングの 特 性 は 規 定 値 で 有 効 になります。これはシールドCPU 上 における 最 高 のデターミニスティックな 実 行 環 境 を 提 供 します。 各 々のシールディング 特 性 のさらに 詳 細 な 情 報 は 後 述 されています。ユーザーは 各 シールディング 特 性 が与 える 影 響 、 特 性 の 一 部邪 は 通 常 のシステム 機 能 への 副 作 用 を 持 っているということを 十 分 に 理 解すべきです。 現 在 サポートされているシールディング 特 性 の3つのカテゴリーは、• バックグラウンド・プロセスからのシールディングs• 割 り 込 みからのシールディング• ローカル 割 り 込 みからのシールディング各 々の 特 性 はCPU 単 位 で 個 別 に 遥 択 可 能 です。 各 々のシールディング 特 性 は 後 述 されています。バックグラウンド・プロセスからのシールディング 2このシールディング 特 性 はCPUをシステム 内 の 一 部邪 のプロセスのために 予 約 することを 可 能 にします。この 特 性 はCPUの 割 り 込 み 応 答 を 最 速 、 予 測 可 能 であることを 望 むときにそのCPU 上 で 有効 にすべきです。プロセス・ディスパッチ・レイテンシー 上 の 最 高 の 保 障 は、 割 り 込 みに 応 答 するタスクだけが 割 り 込 みを 割 り 付 けられたCPU 上 で 実 行 する 時 に 実 現 されます。2-9


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>CPUがバックグラウンド・プロセスを 実 行 可 能 である 時 、 割 り 込 みを 割 り 付 けたそのCPU 上 の 極めてデターミニスティックな 応 答 を 要 求 される 高 優 先 度 タスクのプロセス・ディスパッチ・レイテンシーに 影 響 を 与 える 可 能 性 があります。これはバックグラウンド・プロセスが 割 り 込 みまたはプリエンプションを 無 効 にできるシステムコールを 呼 ぶ 可 能 性 を 秘 めているためです。これらの 処 理 は、 本 セクションの「 割 り 込 み 禁 止 の 効 果 」および「プリエンプション 禁 止 の 効 果 」で 説明 されているようにプロセス・ディスパッチ・レイテンシーに 影 響 を 与 えます。CPUがバックグラウンド・プロセスを 実 行 可 能 である 時 、 高 優 先 度 プロセスの 実 行 中 にデターミニズムへの 影 響 はありません。これはバックグラウンド・プロセスの 優 先 度 が 高 優 先 度 プロセスよりも 低 いことが 想 定 されます。 注 意 すべきことは、バックグラウンド・プロセスはシグナルやserver_wake1(3)インターフェースのような 他 のカーネルのメカニズムを 介 してプロセスを 起 床するために 必 要 な 時 間 に 影 響 を 及 ぼす 可 能 性 があることです。システム 内 の 各 プロセスまたはスレッドは、CPUアフィニティ・マスクを 持 っています。そのCPUアフィニティ・マスクは、プロセスまたはスレッドをどのCPU 上 で 実 行 するかを 決 定 します。CPUアフィニティ・マスクは 親 プロセスから 継 承 され、mpadvise(3)ライブラリ・ルーチンまたはsched_setaffinity(2)システムコールを 経 由 して 設 定 することが 可 能 です。CPUがプロセスからシールドされている 時 、CPUはシールドCPUを 含 むCPUセットに 明 示 的 に 設 定 されたCPUアフィニティを 持 つプロセスとスレッドのみを 実 行 します。つまり、プロセスのCPUアフィニティ・マスクがシールドされていないCPUの 場 合 、そのプロセスはシールドされていないCPU 上 でのみ 実 行されます。バックグラウンドプロセスからシールドされたCPU 上 でプロセスまたはスレッドを 実行 するためには、シールドCPUだけを 指 定 したCPUアフィニティ・マスクを 持 っていなければなりません。<strong>Linux</strong>によって 作 成 された 特 定 のカーネル・デーモンは、システム 内 の 各 CPU 上 に 複 製 されます。プロセスからシールドされているCPUは、これらの「CPU 毎 」のデーモンをシールドCPUから 移動 することはありません。これらのデーモンの 影 響 は、カーネル 構 成 や 注 意 深 いアプリケーション 挙 動 の 制 御 を 通 じて 避遪 けることが 可 能 です。CPU 毎 カーネルデーモンからジッターを 避遪 けるための 機 能 や 方 法 は 付 録 Fで 説 明 しています。割 り 込 みからのシールディング 2このシールディング 特 性 はシステムが 受 信 した 割 り 込 みの 一 部邪 だけを 処 理 するために 予 約 することを 可 能 にします。 最 も 高 速 、 最 も 予 測 可 能 なプロセス・ディスパッチ・レイテンシーであることが 望 ましい 時 、またはアプリケーションの 実 行 時 間 にデターミニズムがあることが 望 ましい 時 、このシールディング 特 性 を 有 効 にするべきです。何 故 なら 割 り 込 みはCPU 上 で 常 に 最 高 優 先 度 の 機 能 であり、 割 り 込 みのハンドリングはプロセス・ディスパッチ・レイテンシーと 高 優 先 度 タスクのコードパスの 実 行 に 必 要 な 時 間 の 両 方 に 影響 を 与 える 可 能 性 があります。これは「 割 り 込 みの 影 響 」セクションで 説 明 されています。各 デバイスの 割 り 込 みはIRQと 結 合 されます。これらIRQはどのCPUで 割 り 込 みを 受 信 するかを 決定 するCPUアフィニティを 持 っています。 割 り 込 みが 特 定 CPUへ 送 られない 時 、 割 り 込 みコントローラはその 時 に 発 生 した 割 り 込 みをハンドリングするためにIRQアフィニティ・マスクのCPUセットからCPUを 遥 びます。IRQアフィニティはshield(1)コマンドまたは/proc/irq/N/smp_affinityを 通 して 修 正 されます。i386アーキテクチャ 上 では、kirqdデーモンはCPU 間 の 割 り 込 み 負 荷 のバランスをとるため 周 期 的にIRQアフィニティを 調 整 します。このデーモンは 割 り 込 みシールドと 相 容 れず、IRQBALANCEカーネル 構 成 オプションにより 全 ての<strong>RedHawk</strong> <strong>Linux</strong>カーネル 構 成 ではデフォルトで 無 効 となっています。これはSHIELDをオフにしたときに 利 用 可 能 となるIRQBALANCEカーネル・パラメータで 有 効 にすることが 可 能 です。2-10


リアルタイム 性 能もしすべてのCPU 上 ですべての 割 り 込 みを 無 効 にすることが 好 ましい 場 合 、 推 奨 する 手 順 は、1つのCPUを 除 いてそれ 以 外 のすべてのCPUを 割 り 込 みからシールドし、シールドされていないCPU 上 でlocal_irq_disable(2)をコールすることに 留 意 してください。 詳 細 はmanページを 参 照 してください。一 部邪 の 機 能 は 割 り 込 みがシールドCPUへ 送 信 される 原 因 となる 可 能 性 があります。プロセッサ 間割 り 込 みは、 他 のCPUにCPU 毎 の 特 定 タスクをハンドルすることを 強 制 する 方 法 として 利 用 されます。プロセッサ 間 割 り 込 みはシールドCPUに 目 立 つジッターを 引 き 起 こす 可 能 性 があります。完 全 な 議 論 は 付 録 Gを 参 照 してください。ローカル 割 り 込 みからのシールディング 2ローカル 割 り 込 みは 各 CPUと 一 体 となった 専 用 タイマーのための 特 別 な 割 り 込 みです。<strong>RedHawk</strong><strong>Linux</strong>では、このタイマーはカーネル 内 やユーザー・レベルにおいて 様 々なタイムアウトのメカニズムで 利 用 されています。この 機 能 は7 章 の 中 で 説 明 されいます。 初 期 設 定 ではこの 割 り 込 みはシステム 内 のすべてのCPU 上 で 有 効 となっています。この 割 り 込 みは10ミリ 秒 毎 に 発 せられ、このローカル 割 り 込 みはシステム 内 で 最 も 頻 繁 に 実 行 される 割 り 込 みルーチンの1つとなります。 従 って、このローカル 割 り 込 みはリアルタイム・アプリケーションにとってジッターの 大 きな 原 因 となります。CPUがローカル・タイマーからシールドされたとき、ローカル 割 り 込 みは 事 実 上 無 効 となり、そのCPUのローカル・タイマーによって 提 供 される 機 能 はもはや 実 行 されません。しかしながら、ローカル・タイマーはローカル・タイマーがシールドされていない 他 のCPU 上 で 実 行 され 続 けます。これらの 機 能 のいくつかは、 他 の 手 段 によって 提 供 されている 間 は 失 われることになります。特 定 CPU 上 でローカル 割 り 込 みが 無 効 である 時 に 失 われる 機 能 の1つは、CPU 実 行 時 間 計 算 のための 低 分 解 能 メカニズムです。これはCPU 上 で 実 行 される 各 プロセスに 使 われるCPU 時 間 がどの 程度 なのかを 測 定 するメカニズムです。いつローカル 割 り 込 みが 発 生 しようとも、 最 後 のクロック・ティック 分 の 時 間 は 割 り 込 まれたプロセスに 加 算 されます。もし 高 分 解 能 プロセス・アカウンティングが 構 成 されていた 場 合 、CPU 時 間 はローカル 割 り 込 みが 有 効 であるか 否 かは 関 係 なく 性 格に 計 算 されます。 高 分 解 能 プロセス・アカウンティングは7 章 の「システム・クロックおよびタイマー」に 明 記 されています。CPUがローカル・タイマーからシールドされた 時 、ローカル 割 り 込 みはシールドCPUに 割 り 付 けられたプロセスによってPOSIXタイマーとnanosleepの 機 能 のために 使 われ 続 けます。 従 って、もしローカル・タイマー 割 り 込 みを 完 全 に 取 り 除 くことが 重 要 である 場 合 、POSIXタイマーまたはnanosleepの 機 能 を 利 用 しているアプリケーションをそのようなCPUに 割 り 付 けるべきではありません。もしプロセスがシールドCPU 上 で 実 行 することが 許 されない 場 合 、そのタイマーはプロセスの 実 行 が 許 されたCPUへ 移 動 されます。一 部邪 の 機 能 のためにローカル・タイマーや 利 用 可 能 な 手 段 を 無 効 にする 影 響 についての 全 ての 解説 は7 章 の「システム・クロックおよびタイマー」を 参 照 してください。2-11


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>CPUシールディングのインターフェース2shieldコマンド本 セクションは、シールドCPUを 構 成 するために 利 用 可 能 なコマンドレベルおよびプログラミング・インターフェースの 両 方 について 記 述 します。シールドCPUを 構 成 するためによくある 事 例も 記 述 しています。shield(1)コマンドは 遥 択 したCPUに 対 して 指 定 したシールド 特 性 を 設 定 します。shieldコマンドはシールドCPUとしてCPUを 特 徴 付 けるために 使 用 されます。シールドCPUは、アプリケーション・コードの 実 行 にかかる 時 間 のデターミニズムを 向 上 させるために 一 部邪 のシステム 機 能 から 保 護 します。shieldコマンドの 実 行 によって 作 用 する 論 理 CPUのリストは、CPU 番 号 または 範 囲 のリストをコンマ 区 切 りで 渡 します。shieldコマンドを 実 行 するための 書 式 :shield [OPTIONS]オプションについては 表 2-1で 説 明 します。以 下 に 記 載 されたオプションの 中 で、CPULISTは 論 理 CPUをコンマ 区 切 りの 値 または 値 の 範 囲 を表 しています。 例 えば、CPUのリスト“0-4,7” は、CPU 番 号 0,1,2,3,4,7 を 指 定 しています。表 2-1 shield(1)コマンドのオプションオプション--irq=CPULIST, -i CPULIST--loc=CPULIST, -l CPULIST概 要割 り 込 みからCPULIST のすべてのCPUをシールドします。 指 定 されたCPU 上 で 実 行 される 唯 一 の 割 り込 みは、 他 のCPU 上 で 実 行 されることを 防 ぐためにCPUアフィニティを 指 定 された 割 り 込 みとなります。指 定 されたCPUのリストはローカル・タイマーからシールドされます。ローカル・タイマーは 時 間 ベースのサービスをCPUに 提 供 します。ローカル・タイマーを 無 効 にすることは、ユーザー/システムの 時 間計 算 やラウンドロビンのような 一 部邪 のシステムの 機能 が 無 効 となる 可 能 性 があります。 全 ての 解 説 は7 章を 参 照 してください。2-12


リアルタイム 性 能表 2-1 shield(1)コマンドのオプション( 続 き) きオプション--proc=CPULIST, -p CPULIST--all=CPULIST, -a CPULIST--help, -h--<strong>version</strong>, -V--reset, -r--current, -c概 要指 定 されたCPUのリストは 無 関 係 なプロセスからシールドされます。 非 シールドCPU 上 で 実 効 することを 許 可 されたアフィニティ・マスクを 所 有 するプロセスは、 非 シールドCPU 上 で 実 行 されるだけとなります。シールドCPU 以 外 のいずれかのCPU 上 での 実行 が 不 可 能 となるプロセスは、シールドCPU 上 での実 行 が 許 可 されます。指 定 されたCPUのリストは 利 用 可 能 な 全 てのシールド 特 性 を 所 有 することになります。 各 々のシールド特 性 の 意 味 を 理 解 するために 上 記 の 個 々のシールドオプションの 説 明 を 参 照 してください。利 用 可 能 なオプションと 使 用 方 法 の 解 説 します。コマンドの 現 在 のバージョンを 印 字 します。全 CPUに 対 してシールド 特 性 をリセットします。シールドされたCPUはない 状 態 となります。アクティブな 全 てのCPUの 現 在 の 設 定 を 表 示 します。shieldコマンド 例 2終 了 ステータス 2NUMAノードのメモリ・シールドを 制 御 するshield(1)のオプションは、10 章 の「Non-UniformMemory Access (NUMA)」を 参 照 してください。以 下 のコマンドは、 最 初 に 全 てのシールド 特 性 をリセットし、 次 にCPUの0, 1, 2を 割 り 込 みからシールド、そしてCPUの1をローカルタイマーからシールド、CPUの2を 無 関 係 なプロセスからシールド、 最 後 に 変 更 後 の 新 しい 全 ての 設 定 を 表 示 します。shield -r -i 0-2 -l 1 -p 2 -c以 下 のコマンドは、CPUの1, 2, 3を 割 り 込 み、ローカルタイマー、 無 関 係 なプロセスからシールドします。CPUの0は 全 ての 割 り 込 みやシールドCPUのターゲットではないプロセスをサービスする「 多 目 的 」CPUとして 残 します。 全 てのシールド 特 性 がCPUのリストに 設 定 されます。shield --all=1-3通 常 は、 終 了 ステータスは0です。しかし、シールドCPU 属 性 を 変 更 しようとしている 間 にエラーが 発 生 した 場 合 、 診 断 メッセージが 出 力 され 終 了 ステータスが1で 返 されます。2-13


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>shieldコマンド 拡 張 機 能 2以 下 に 記 載 された 拡 張 機 能 は、 経 験 のあるユーザーが 使 用 されることを 推 奨 します。CPULIST 内 で 指 定 されるCPUは ‘+’ または ‘-’ の 記 号 を 前 に 置 く 事 が 可 能 で、そのケースのリストのCPUは 既 にシールドされたCPUのリストに 追 加 (‘+’) または 除 外 (‘-’) します。オプションは 複 数 回 使 用 することが 可 能 です。 例 えば、“shield -i 0 -c -i +1 -c” は、 現 在 の 設 定 にCPU0を 割 り 込 みからシールドし、 現 在 の 設 定 を 表 示 した 後 に 再 度 CPU1を 割 り 込 みからシールドするCPUのリストを 追 加 することを 表 します。CPUシールディングのシールディングの/procインターフェース2CPUシールドのカーネル・インターフェースは 以 下 のファイルを 使 用 する /procファイルシステムを 経 由 します。/proc/shield/procs/proc/shield/irqs/proc/shield/ltmrsプロセスのシールドIRQをシールドローカルタイマーをシールド全 てのユーザーはこれらのファイルを 読 むことが 可 能 ですが、ルートまたはCAP_SYS_NICEケーパビリティを 持 つユーザーだけが 書 き 換 えることが 可 能 です。ファイルを 読 んだ 時 、8 桁 の16 進逭 数 ASCII 値 が 返 されます。この 値 はシールドされたCPUのビットマスクです。 設 定 されたビットはシールドされたCPUと 一 致 します。 設 定 された 各 々のビットのポジションはシールドされている 論 理 CPUの 番 号 です。例 :CPUへのプロセス 割 り 当 て 200000001 – 0ビット 目 が 設 定 されている 場 合 はCPU0がシールド00000002 - 1ビット 目 が 設 定 されている 場 合 はCPU1がシールド00000004 - 2ビット 目 が 設 定 されている 場 合 はCPU2がシールド00000006 - 1ビット 目 と2ビット 目 が 設 定 されている 場 合 はCPU1と2がシールドファイルへ 書 き 込 む 時 、8 桁 の16 進逭 数 ASCII 値 が 期 待 されています。この 値 は 上 記 と 同 一 フォームのシールドCPUのビットマスクです。その 値 は 間 もなく 新 しいシールドCPUセットとなります。追 加 の 情 報 はshield(5)のmanページを 参 照 してください。本 セクションは 利 用 可 能 なCPUセットへのプロセスまたはスレッドの 割 り 付 け 方 法 を 記 述 します。プロセスが 実 行 を 許 可 されたCPUセットはCPUアフィニティとして 知 られています。規 定 値 では、プロセスまたはスレッドはシステム 内 のどのCPU 上 でも 実 行 が 可 能 です。プロセスまたはスレッド 毎 にビットマスクまたはCPUアフィニティを 持 っており、スケジュール 可 能 なCPUを 決 定 します。プロセスまたはスレッドは、fork(2)またはclone(2)からCPUアフィニティを継 承 しますが、その 後 アフィニティが 変 わる 可 能 性 はあります。2-14


リアルタイム 性 能mpadvise(3)の 呼 び 出 しでMPA_PRC_SETBIASコマンドを 指 定 、または run(1)コマンドの -bbias オプションを 指 定 するすることで、1つまたは 複 数 のプロセスまたはスレッドのCPUアフィニティを 設 定 することが 可 能 です。sched_setaffinity(2)もCPUアフィニティを 設 定 するために 使用 することが 可 能 です。CPUアフィニティを 設 定 するために 以 下 の 条 件 を 満 足 する 必 要 があります。• 有 効 な 呼 び 出 し 元 プロセスのユーザーIDは、CPUアフィニティを 設 定 しようとしている 登 録されているプロセスのユーザーIDと 一 致 していなければならない、もしくは、• 呼 び 出 し 元 プロセスはCAP_SYS_NICEケーパビリティを 持 っている、またはルートでなければなりませんCPUにプロセスまたはスレッドのCPUアフィニティを 追 加 するため、 呼 び 出 し 元 プロセスはCAP_SYS_NICEケーパビリティを 持 っている、またはルートでなければなりません。CPUアフィニティは init(8)プロセスに 割 り 当 てることが 可 能 です。すべての 一 般 的 なプロセスはinitの 子 プロセスです。 結 果 、 一 般 的 なプロセスのほとんどは init のCPUアフィニティ、もしくは initのCPUアフィニティの 一 部邪 のCPUと 同 じCPUアフィニティになるはずです。( 前 述 の) 特 権を 持 ったプロセスだけはCPUをそれらのCPUアフィニティに 加 えることができます。initへの 制 限されたCPUアフィニティの 割 り 当 ては、すべての 一 般 的 なプロセスを initと 同 じCPUサブセットへ 制 限 します。その 例 外 は、 適遚 切 なケーパビリティを 明 示 的 に 修 正 したCPUアフィニティを 持 つプロセスです。もしinitのCPUアフィニティを 変 更 したいと 考 えるのであれば、「initへのCPUアフィニティ 割 り 当 て」セクション 以 下 の 説 明 を 参 照 してください。mpadviseライブラリ・ルーチンは「mpadviseを 使 ったマルチプロセッサ 制 御 」セクション 以 下 およびmpadvise(3)のmanページに 記 述 されています。runコマンドは4 章 内 の「runコマンド」セクションおよびrun(1)のmanページに 記 述 されています。sched_setaffinity(2)とsched_getaffinity(2)に 関 する 情 報 については、sched_affinity(2)のmanページを 参 照 してください。mpadviseを を 使 ったマルチプロセッサ 制 御 2mpadvise(3)は、 様 々なマルチプロセッサーの 機 能 を 実 行 します。CPUは 1つまたはそれ 以 上 のCPUの 組 み 合 わせを 定 義 したcpuset_t オブジェクトのポインターを 指 定 することにより 識 別されます。CPUの 設 定 に 関 する 詳 細 な 情 報 についてはcpuset(3)のmanページを 参 照 してください。概 要情 報 コマンド#include int mpadvise (int cmd, int which, int who, cpuset_t *setp)gcc [options] file -lccur_rt ...以 下 のコマンドはシステム 内 のCPUに 関 する 情 報 を 取 得 または 設 定 します。whichとwhoのパラメータは 無 視 されます。MPA_CPU_PRESENT システム 内 に 物 理 的 に 存 在 するCPUを 示 すマスクを 返 します。cpu(1)コマンドによってダウンしたCPUは 含 まれたままとなります。MPA_CPU_ACTIVEバックプレーンの 中 にいくつ 存 在 するかは 関 係 なく、 初 期 化 され 動 作可 能 なCPUを 示 すマスクを 返 します。cpu(1)コマンドによってダウンしたCPUは 含 まれません。2-15


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>MPA_CPU_BOOTMPA_CPU_LMEMシステムをブートしたCPUを 示 すマスクを 返 します。ブートCPUは他 のCPUと 共 有 しないいくつかの 責 務 を 持 っています。NUMA 対 応 システムにおいてローカル・メモリを 持 つCPUを 示 すマスクを 返 します。cpu(1)コマンドによってダウンしたCPUは 含 まれたままとなります。制 御 コマンド以 下 のコマンドは、プロセス、スレッド、プロセス・グループもしくはユーザーによるCPU 利 用の 制 御 を 提 供 します。MPA_PRC_GETBIASMPA_PRC_SETBIASMPA_PRC_GETRUN指 定 されたプロセス 内 の 全 スレッドのCPUアフィニティ(MPA_PID)、もしくは 指 定 されたスレッドに 対 する 正 確 な 独 自 バイアス(MPA_TID)に 対 応 するCPUセットを 返 します。指 定 されたプロセス 内 の 全 スレッドのCPUアフィニティ(MPA_PID)、もしくは 指 定 されたスレッドの 独 自 CPUアフィニティ(MPA_TID)を指 定 されたcpusetへ 設 定 します。プロセスのCPUアフィニティを 変 更するため、 現 在 のユーザーが CAP_SYS_NICEケーパビリティを 持 っていない 限 り、 有 効 なユーザーIDは( exec(2)から) 登 録 されたプロセスのユーザーIDと 一 致 しなければなりません。指 定 されたスレッドが 現 在 実 行 中 (または 実 行 待 機 中 )のCPUと 一 致 する 正 確 なCPUを 含 むCPUセットを 返 します(MPA_TID)。MPA_PIDが指 定 されるとき、 非 スレッドプ・ログラムのCPU1つおよびマルチスレッド・プログラムの 全 スレッドが 使 用 するCPU 一 式 を 返 します。この 値 が 返 される 頃 には、CPU 割 り 当 てが 既 に 変 わっている 可 能 性 があることに 注 意 してください。whichとwho の 使 用 方 法which 遥 択 基 準 を 指 定 するために 使 用 します。 以 下 の1つを 指 定 可 能 。MPA_PID特 定 のプロセスおよびその 全 スレッドMPA_TID特 定 のスレッドMPA_PGID プロセス・グループMPA_UID ユーザーMPA_LWPID MPA_TIDと 同 様 (PowerMAXと 互 換 )who which に 関 連連 する 説 明 :プロセスIDスレッドIDプロセス・グループIDユーザーIDwhoの 値 が0である 場 合 、 呼 び 出 し 元 のプロセスID、プロセス・グループID、ユーザーID が 使 用 されます。2-16


リアルタイム 性 能単 独 の 従 属 ( 非 原 始 )スレッドで のMPA_PIDの 使 用 は、 原 始 スレッドが 提 供 されたときの 処 理 を 含 んでいるプロセスを 適遚 用 します。MPA_TIDを 使 用 する 時 、whoは(gettid が 返 す)スレッドIDの 数 値 でなければならず、POSIXスレッド・ライブラリに 関 連連 するpthreadのIDではありません。initへのへのCPUアフィニテ 割 り 当 て 2一 般 的 な 全 てのプロセスは init(8)の 子 プロセスです。 既 定 値 で initはシステム 内 の 全 てのCPUを含 むマスクを 所 有 し、それらのCPUアフィニティの 修 正 が 可 能 な 特 殊 なケーパビリティを 持 つ 唯一 の 遥 ばれたプロセスです。もしそれがCPUのサブセットに 制 限 された 既 定 の 全 プロセスによって 要 求 された 場 合 、CPUアフィニティは 特 権 を 持 つユーザーによって initプロセスへ 割 り 付 けることが 可 能 です。この 目 的 を 遉 成 するため、run(1)コマンドはシステム 初 期 化 プロセスの 中 で 初期 段 階 で 呼 び 出 すことが 可 能 です。例 えば、initとその 全 ての 子 プロセスをCPU1,2,3へ 割 り 付 けるために 以 下 のコマンドをシステム 初期 化 (inittab(5)を 参 照 )の 初 期 段 階 で 呼 ばれる /etc/rc.sysinitスクリプトの 最 後 に 追 加 することが 可 能 です。initプロセスはこのコマンドの 中 では 常 に1であるプロセスIDを 用 いて 指 定 しています。/usr/bin/run -b 1-3 -p 1同 じ 効 果 がshield(1)コマンドを 利 用 することにより 得 ることが 可 能 です。このコマンドを 利 用 する 利 点 は、どのランレベルであってもコマンドラインから 実 行 できることです。shieldコマンドはシールドされたCPU 上 で 既 に 動 作 しているプロセスの 移 動 を 処 理 します。 更 にshieldコマンドを 使 い 異 なるシールドのレベルを 指 定 することも 可 能 です。 本 コマンドの 詳 細 な 情 報 については、「shieldコマンド」セクションまたはshield(1)のmanページを 参 照 してください。例 えば、 動 作 中 のプロセスからCPU0をシールドするためには、 以 下 のコマンドを 実 行 します。$ shield -p 0シールドCPUの 設 定 例 2CPUをシールドした 後 、 常 にシールドCPUで 指 定 したプロセスを 動 作 させるためにrunコマンドを 利 用 します。例 えば、 予 めプロセスからシールドしたCPU0 上 で mycommandを 実 行 するためには、 以 下 のコマンドを 実 行 します。$ run -b 0 ./mycommand以 下 の 例 は、RCIMのエッジトリガー 割 り 込 みに 対 する 最 高 の 割 り 込 み 応 答 を 保 証 するためのシールドCPUの 使 い 方 を 示 します。つまり、この 目 的 はRCIM 上 で 発 生 したエッジトリガー 割 り 込み 時 にユーザー・レベルプロセスが 起 き 上 がるために 必 要 な 時 間 の 最 適遚 化 、およびプロセスが 起き 上 がるときのためにデターミニスティックな 実 行 環 境 を 提 供 することです。この 場 合 、シールドCPUはRCIMの 割 り 込 み 処 理 とその 割 り 込 みに 応 答 するプログラムだけを 設 定 しなければなりません。最 初 のステップは、shield(1)コマンドを 通 してシールド・プロセッサから 割 り 込 みを 切 り 離 す 指示 をします。 最 高 の 割 り 込 み 応 答 を 得 るためにローカル・タイマー 割 り 込 みは 無 効 にし、バックグラウンド・プロセスは 除 外 します。2-17


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>CPU1がそれらの 結 果 を 遉 成 するためのshieldコマンドは、$ shield -a 1現 段 階 でシールドされたCPU1 上 の 割 り 込 みは 無 し、 実 行 を 許 可 されたプロセスもありません。CPUのシールド 状 況 は 以 下 の 方 法 を 利 用 することで 確 認 することが 可 能 です。shield(1)コマンド:$ shield -cCPUID irqs ltmrs procs---------------------------------------0 no no no1 yes yes yes2 no no no3 no no nocpu(1)コマンド:$ cpucpu chip core ht ht-siblings state shielding--- ---- ---- -- ----------- ----- ---------0 0 - 0 2 up none1 3 - 0 3 up proc irq ltmr2 0 - 1 0 up none3 3 - 1 1 up noneまたは /procファイル・システム:$ cat /proc/shield/irqs00000002これは 全 ての 割 り 込 みがCPU1 上 での 実 行 が 不 可 能 であることを 表 します。この 例 の 中 で、 目 的 はシールドされたCPU 上 で 特 定 の 割 り 込 みに 応 答 することであり、CPU1にRCIMの 割 り 込 みの 割 り付 けとCPU1 上 で 割 り 込 みに 応 答 するプログラムの 実 行 を 許 可 する 必 要 があります。最 初 のステップはRCIMの 割 り 込 みが 割 り 付 けられたIRQを 判 断 することです。この 割 り 込 みとIRQ 間 の 割 り 当 てはマザーボード 上 のデバイスおよび 特 定 のPCIスロットのPCIデバイスによって変 わることはありません。もしPCIボードが 新 しいスロットへ 移 動 した 場 合 はそのIRQの 割 り 付 けは 変 わるかもしれません。 所 有 するデバイスのIRQを 見 つけるために 以 下 のコマンドを 実 行 します。$ cat /proc/interruptsCPU0 CPU1 CPU2 CPU30: 665386907 0 0 0 IO-APIC-edge timer4: 2720 0 0 0 IO-APIC-edge serial8: 1 0 0 0 IO-APIC-edge rtc9: 0 0 0 0 IO-APIC-level acpi14: 9649783 1 2 3 IO-APIC-edge ide015: 31 0 0 0 IO-APIC-edge ide116: 384130515 0 0 0 IO-APIC-level eth017: 0 0 0 0 IO-APIC-level rcim,Intel18: 11152391 0 0 0 IO-APIC-level aic7xxx19: 0 0 0 0 IO-APIC-level uhci_hcd23: 0 0 0 0 IO-APIC-level uhci_hcd2-18


リアルタイム 性 能NMI: 102723410 116948412 0 0 Non-maskable interruptsLOC: 665262103 665259524 665264914 665262848 Local interruptsRES: 36855410 86489991 94417799 80848546 Rescheduling interruptsCAL: 2072 2074 2186 2119 function call interruptsTLB: 32804 28195 21833 37493 TLB shootdownsTRM: 0 0 0 0 Thermal event interruptsSPU: 0 0 0 0 Spurious interruptsERR: 0 0 0 0 Error interruptsMIS: 0 0 0 0 APIC errata fixups上 記 リストの 中 では、RCIMはIRQ17に 割 り 当 てられています。IRQ 番 号 が 分 かったら、RCIMの割 り 込 みをIRQ17のアフィニティ・マスクを 表 す /procファイルを 通 してシールド・プロセッサへ 割 り 付 けることが 可 能 です。IRQのアフィニティ・マスクは8 桁 の16 進逭 数 ASCII 値 です。その 値はCPUのビット・マスクになっています。マスク 内 に 配郤 置 された 各 ビットは、この 割 り 込 みのための 割 り 込 みルーチンが 処 理 されるかもしれないCPUを 表 します。 各 々 設 定 されたビットの 位 置は 割 り 込 み 処 理 が 可 能 な 論 理 CPUの 番 号 です。 以 下 のコマンドはCPU1にIRQ17のCPUアフィニティ・マスクを 設 定 します。$ echo 2 > /proc/irq/17/smp_affinityIRQのための “smp_affinity” ファイルは、ルート・ユーザーだけがIRQの 割 り 込 みの 割 り 付 けが変 更 可 能 なパーミッションでデフォルトでインストールされていることに 注 意 してください。IRQアフィニティのための /procファイルは 変 更 が 実 施 されたことを 確 認 するために 読 み 取 ることも 可 能 です。$ cat /proc/irq/17/smp_affinity00000002 user 00000002 actual“user” で 返 された 値 は、IRQのCPUアフィニティのためにユーザーより 指 定 されたビット・マスクであることに 注 意 してください。“actual” で 返 された 値 は、 存 在 しないCPUやシールドされたCPUがマスクから 取 り 除 かれた 後 に 生 じたアフィニティとなります。もしユーザーがシールドCPU/ 非 シールドCPUの 両 方 を 含 むアフィニティ・マスクを 設 定 した 場 合 、シールドCPUはIRQのアフィニティ・マスクから 取 り 除 かれただけとなることに 注 意 してください。これは、もし 割 り込 みを 処 理 できるIRQのアフィニティ・マスクの 中 に 非 シールドCPUが 存 在 しなければ、 割 り 込みからシールドされたCPUは 割 り 込 みを 処 理 するだけだからです。この 例 では、CPU1は 割 り 込 みからシールドされますが、このアフィニティ・マスクはCPU1だけが 割 り 込 みの 処 理 を 許 可 されたことを 示 すため、CPU1はIRQ17を 処 理 します。次 のステップは、RCIMのエッジトリガー 割 り 込 みに 応 答 するプログラムがシールドされたプロセッサー 上 での 実 行 を 確 認 することです。システム 内 の 各 プロセスはCPUアフィニティ・マスクが 割 り 付 けられています。バックグラウンド・プロセスからCPUをシールドするため、シールドされたCPUだけを 指 定 したCPUアフィニティ・マスクを 持 つプロセスだけがシールドされたプロセッサー 上 で 実 行 することを 許 可 します。もしプロセスのアフィニティ・マスクの 中 にいくつかの 非 シールドCPUが 存 在 する 場 合 、そのプロセスは 非 シールドCPU 上 でのみ 実 行 されることに 注意 してください。以 下 のコマンドは、ユーザープログラム “edge-handler” をCPU1 上 でリアルタイム 優 先 度 で 実 行することを 強 制 します。$ run -s fifo -P 50 -b 1 edge-handlerプログラムは「mpadviseを 使 ったマルチプロセッサ 制 御 」セクションで 説 明 されているmpadvise(3)ライブラリ・ルーチンの 呼 び 出 しによって 自 身 のCPUアフィニティを 設 定 できることに 注 意 してください。run(1)コマンドはプログラムのアフィニティをチェックするために 利 用できます。$ run -i -n edge-handlerPid Tid Bias Actual Policy Pri Nice Name9326 9326 0x2 0x2 fifo 50 0 edge-handler2-19


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>“Bias” が 返 す 値 は、ユーザーによって 指 定 されたプロセスのCPUアフィニティのビット・マスクであることに 注 意 してください。“actual” が 返 す 値 は、 存 在 しないCPUやシールドされたCPUがマスクから 取 り 除 かれた 後 に 生 じたアフィニティとなります。もしユーザーがシールドCPU/ 非 シールドCPUの 両 方 を 含 むアフィニティ・マスクを 設 定 した 場 合 、シールドCPUはプロセスのアフィニティ・マスクから 取 り 除 かれただけとなることに 注 意 してください。これは、もしプログラムを 実 行 できるプロセスのアフィニティ・マスクの 中 に 非 シールドCPUが 存 在 しなければ、バックグラウンド・プロセスからシールドされたCPUはプロセスを 実 行 するだけだからです。この 例では、CPU1はバックグラウンド・プロセスからシールドされますが、このアフィニティ・マスクはCPU1だけがプログラムの 実 行 を 許 可 されたことを 示 すため、CPU1は “edge-handler” プログラムを 実 行 します。デターミニズムを 高 める 手 順 2以 下 のセクションでは、 以 下 のテクニックを 使 ってパフォーマンスの 向 上 が 可 能 な 様 々な 方 法 を説 明 します。• メモリ 内 のプロセスのページをロック• 適遚 切 な 静 的 優 先 度 割 り 付 けの 利 用• 割 り 込 みレベルから 非 クリティカルな 処 理 を 排 除• 迅 速 なプロセスの 起 床• キャッシュ・アクセスの 制 御• 物 理 メモリの 予 約• NUMAシステムにおいてプログラムからローカル・メモリへのバインド• ハイパースレッドの 慎 重 利 用• 低 メモリ 状 態 の 回 避遪メモリのページをロック 2オーバーヘッドに 結 びつくページングやスワッピングは mlockall(2), mlockall_pid(2),munlockall(2), munlockall_pid(2), mlock(2), munlock(2)を 使 うことにより 回 避遪 することが 可 能です。これらのシステムコールは 物 理 メモリ 内 のプロセスの 仮 想 アドレスの 全 てまたは 一 部邪 をロックおよびアンロックすることを 許 可 します。これらのインターフェースはIEEE 規 格1003.1b-1993に 準 拠 しています。これらの 各 コールにより、コール 時 点 で 常 駐 していないページはメモリに 断 層 が 生 じてロックされます。mlockall(2), mlockall_pid(2), munlockall(2), munlockall_pid(2), mlock(2), munlock(2)システムコールを 使 うにはCAP_IPC_LOCKケーパビリティを 所 有 していなければなりません。mlockall_pid(2)については、 呼 び 出 し 元 プロセスのユーザーIDがターゲットプロセスのユーザーIDと 一 致 しない 場 合 、CAP_SYS_NICEケーパビリティも 必 要 となる 可 能 性 があります。ケーパビリティに 関 する 追 加 の 情 報 は13 章 と pam_capability(8)のmanページを 参 照 してください。メモリをロックするシステム・サービス・コールはプロセスが 自 分 自 身 のアドレス 空 間 をロックまたはアンロックする 方 法 として 提 供 するのに 対 し、runコマンドは 更 に--lockオプションにより他 のプロセスのアドレス 空 間 をロックまたはアンロックする 機 能 を 提 供 します。 様 々なページをロックするシステムコールを 利 用 するための 手 順 は、 対 応 するmanページの 中 で 全 て 説 明 されています。--lockオプションは run(1)のmanページの 中 で 説 明 されています。2-20


リアルタイム 性 能プログラム 優 先 度 の 設 定 2<strong>RedHawk</strong> <strong>Linux</strong>カーネルは 静 的 優 先 度 スケジューリングを 提 供 します — つまり、 特 定 のPOSIXスケジューリング・ポリシーでスケジュールされたプロセスは、 実 行 時 の 動 作 に 応 じてオペレーティング・システムにより 優 先 度 が 変 更 されることはありません。POSIXリアルタイム・スケジューリング・ポリシーの1つによりスケジューリングされたプロセスは 常 に 静 的 優 先 度 の 状 態 です(リアルタイム・スケジューリング・ポリシーとはSCHED_RRおよびSCHED_FIFO:これらは4 章 で 説 明 されています)。プロセスのスケジューリング・ポリシーを変 更 するには、sched_setscheduler(2)とsched_setparam(2)のシステムコールを 利 用 することが 可 能 です。プロセスの 優 先 度 をより 高 い(より 有 利 な) 値 に 変 更 するためにこれらのシステムコールを 利 用 するには、CAP_SYS_NICEケーパビリティを 持 っていなければならないことに 注 意 してください(これらのルーチンを 利 用 するためのケーパビリティ 条 件 に 関 する 全 ての 情 報 は、 対応 するmanページを 参 照 してください)。特 定 CPU 上 で 実 行 中 の 最 高 優 先 度 のプロセスは、 最 高 のプロセス・ディスパッチ・レイテンシーとなります。もし、あるプロセスがCPU 上 で 実 行 している 他 のプロセスよりも 低 い 優 先 度 が 割 り付 けられている 場 合 、このプロセス・ディスパッチ・レイテンシーは 高 い 優 先 度 のプロセスが 実行 に 費 やす 時 間 に 影 響 されます。よって、 優 れたプロセス・ディスパッチ・レイテンシーを 必 要とする1つ 以 上 のもプロセスが 存 在 する 場 合 、いくつかのCPUにそれらのプロセスを 分 散 することを 推 奨 します。 特 定 CPUへのプロセスの 割 り 付 け 方 法 については、「CPUへのプロセス 割 り 当 て」セクションを 参 照 してください。プロセスのスケジューリングは4 章 ですべて 説 明 されています。プロセスの 優 先 度 を 変 更 するためのsched_setschedulerおよびsched_setparamシステムコールの 利 用 手 順 についても 説 明 されています。遅逼 延 割 り 込 み 処 理 の 優 先 度 設 定 2別 プロセスの 起 床 2<strong>Linux</strong>は 割 り 込 みレベルで 別 に 行 われた 処 理 を 遅逼 延 するために 割 り 込 みルーチンで 使 用 されるいくつかのメカニズムをサポートしています。デバイス 割 り 込 みを 処 理 するためのその 処 理 は2つの役 割 に 分 けます。 最 初 の 役 割 は 割 り 込 みレベルで 実 行 し、 割 り 込 み 完 了 処 理 の 最 もクリティカルな 側 面 のみ 処 理 します。2つ 目 の 役 割 はプログラムレベルで 実 行 するために 遅逼 延 します。 割 り 込 みレベルからの 非 クリティカル 処 理 を 排 除 することにより、 本 セクション「 割 り 込 みの 影 響 」の 最初 に 説 明 されているようにシステムはより 良 い 割 り 込 み 応 答 時 間 を 得 ることが 可 能 となります。割 り 込 みルーチンの2 番 目 の 役 割 はカーネル・デーモンに 処 理 され、デバイス・ドライバーで 使 用される 割 り 込 みを 遅逼 延 する 技 法 次 第 となります。システム 管 理 者 に 許 可 された 遅逼 延 した 割 り 込 み処 理 を 扱 うカーネル・デーモンの 優 先 度 を 設 定 するためのカーネル・チューニング・パラメータが 存 在 します。リアルタイム・タスクが 遅逼 延 した 割 り 込 みを 処 理 しているCPU 上 で 実 行 する 時 、遅逼 延 した 割 り 込 みカーネル・デーモンの 優 先 度 を 設 定 することが 可 能 となり、 高 優 先 度 のユーザープロセスは 遅逼 延 した 割 り 込 みカーネル・デーモンよりも 更 に 有 利 な 優 先 度 を 所 有 します。これはこのリアルタイム・プロセスのために 追 加 のデターミニスティックな 応 答 時 間 を 可 能 にします。割 り 込 み 処 理 の 遅逼 延 、カーネル・デーモン、カーネル・チューニング・パラメータに 関 する 詳 細な 情 報 については、「デバイス・ドライバ」 章 を 参 照 してください。マルチプロセス・アプリケーションでは、 多 くの 場 合 に 特 定 のタスクを 実 行 するためにプロセスを 起 こす 必 要 があります。システムの 応 答 性 の1つの 基 準 は、1つのプロセスが 別 のプロセスを 起こすことができる 速 度 です。 他 のタスクへの 切 り 替 えを 実 行 するために 使 用 できる 最 速 の 方 法 は、postwait(2)システムコールを 使 用 することです。レガシー・コードとの 互 換 性 のためにserver_block(2)とserver_wake1(2)の 機 能 が<strong>RedHawk</strong> <strong>Linux</strong>にて 提 供 されます。2-21


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>これらの 機 能 を 使 用 する 方 法 は5 章 の 中 で 説 明 されています。キャッシュ・スラッシングの 回 避遪 2アプリケーションが 異 なるCPU 上 で 複 数 の 実 行 スレッド 間 で 共 有 されるアドレス 空 間 の 一 部邪 を所 有 する 場 合 、あるスレッドに 頻 繁 に 使 用 される 変 数 ( 例 えば i)と、それとは 別 のスレッドに 頻繁 に 使 用 される 変 数 ( 例 えば j)が、 同 じキャッシュ・ラインに 配郤 置 されているメモリ 内 に 互 いに接 近 して 配郤 置 されないことを 確 保 することが 重 要 です。もし i と j が 同 じキャッシュ・ラインに 配郤 置 されている 場 合 、それぞれのスレッドにより i と j への 参 照 が 行 われる 時 にそのキャッシュ・ラインは2つのCPU 間 であわただしく 動 くことになり、キャッシュ 性 能 が 低 下 します。逆 に1つのスレッドが 頻 繁 に 複 数 の 変 数 ( 例 えば i, j, k )を 使 う 場 合 、 同 じキャッシュ・ラインに i,j, k を 配郤 置 しようとすることがむしろ 望 ましいのです。 同 じキャッシュ・ラインに i, j, k が 配郤 置されている 場 合 、i, j, k のいづれかを 参 照 する 時 に3つの 変 数 全 てが 余 計 な 性 能 低 下 なしに 利 用 可能 となります。配郤 列 を 使 用 するアプリケーションは 更 なる 制 約 があり、 配郤 列 のサイズをシステムのキャッシュ・サイズと 比 較 する 方 法 を 理 解 することが 重 要 となります。 例 えば、 配郤 列 が1.2Mbyteのメモリを 必要 とするのにシステムがたった1Mbyteのキャッシュを 提 供 する 場 合 、キャッシュ 内 で 完 全 に 実 行される 配郤 列 を 持 つことの 利 点 を 得 ること 無 く、 配郤 列 操 作 は 他 のどの 変 数 もキャッシュの 利 用 から完 全 に 除 外 します。この 場 合 の 唯 一 の 解 決 策 は、より 大 きなキャッシュを 持 つシステムを 購 入 するか、より 小 さな 配郤 列 を 使 用 できるように 配郤 列 を 使 用 するアルゴリズムを 再 設 計 することです。今 日 の 殆 どのシステムはNUMAシステムであることに 注 意 して 下 さい。NUMAシステム 上 のCPUはグループに 編 成 され、 各 グループはいくつかの( 通 常 、 非 キャッシュ)ローカル・メモリが 利 用可 能 となります。データがキャッシュ 内 に 無 くメモリから 読 む 必 要 がある 時 、メモリ 操 作 が 高 速かつ 最 もデターミニスティックな 状 態 となるように 同 一 NUMAノード・グループのCPU 上 で 大 量のデータを 共 有 するどの 実 行 スレッドも 実 行 されることを 確 保 することが 重 要 となります。もう 一 つのNUMAシステムの 重 要 な 特 徴 は、 各 NUMAノードは 通 常 ローカルIOバスを 持 っているということです。 一 般 的 にシステム・デバイス( 例 えば、ディスク、CD/DVDドライブ、ネットワーク・カード 他 )は 特 定 のNUMAノードに 対 してはローカルとなり、 他 のNUMAノードのCPU 上 で実 行 しているスレッドに 対 してはリモートとなります。 任 意 のシステムにとっては、どのNUMAノードをどのIOデバイスと 連連 動 させるかを 決 定 するために 役 に 立 ちます。ディスクを 集 中 的 に 使用 するスレッドは、ディスク・コントローラに 属 するNUMAノード 内 のCPU 上 において 最 高 パフォーマンスで 実 行 されることとなります。ネットワークを 集 中 的 に 使 用 するスレッドは、ネットワーク・コントローラに 属 するNUMAノード 内 のCPU 上 において 最 高 パフォーマンスで 実 行 されることとなります。システムを 購 入 または 構 成 する 時 、どのNUMAノードがハードウェア 上 のどのデバイスに 属 しているかを 理 解 することは 重 要 となります。お 手 持 ちのアプリケーションのリソースの 使 用 形 態 を理 解 することもまた 重 要 となります。 例 えば、ディスクとネットワークを 集 中 的 に 使 用 するアプリケーションを 所 有 している 場 合 、パフォーマンスを 最 適遚 化 するためにネットワーク・コントローラとディスク・コントローラの 両 方 に 属 するNUMAノードを 持 つハードウェアを 遥 択 します。2-22


リアルタイム 性 能物 理 メモリの 予 約 2物 理 メモリは /etc/grub.confファイル 内 のコマンドライン 引 数 の 利 用 することにより 予 約 することが 可 能 です。このタイプの 割 り 当 ては、ローカル・デバイスで 必 要 となるDMAバッファまたは PCI-to-VMEアダプタのようなものを 介 してiHawkのメモリにマッピングされた 外 部邪 ホストのデバイスに 利 用 することが 可 能 です。それは 動 的 な 仮 想 メモリ・アロケーションが 提 供 するページ・アロケーションのランダム 性 を 持 たないデータ 空 間 を 提 供 するために 使 用 することが 可 能 です。これは 大 きなデータ 配郤 列 のキャッシュ 衝 突 を 一 定 以 上 にすることでアプリケーションの 性 能 を 向 上 させ、 連連 続したプロセスの 実 行 による 実 行 時 間 の 不 一 致 を 減 らします。ファイル 内 でのメモリのカスタム・マッピングによって、RAMの 予 約 された 区 域 を 獲 得 することが 可 能 です。System Vのshmop(2)の 機 能 は 物 理 メモリのこの 区 域 へのアクセスに 使 用 することが可 能 です。shmconfig(1), shmbind(2), shmop(2)の 各 機 能 はこのメモリ 区 域 の 作 成 およびアタッチに 利 用 することが 可 能 です。利 用 可 能 な 物 理 RAMの 量 は、i386 上 では 以 下 に 示 すように /proc/iomemの 内 容 を 調 べることにより 見 ることが 可 能 です。$ cat /proc/iomem00000000-0009ffff : System RAM00000000-00000000 : Crash kernel000a0000-000bffff : Video RAM area000c0000-000cefff : Video ROM000d0800-000d3fff : Adapter ROM000f0000-000fffff : System ROM00100000-7fe8abff : System RAM00100000-004f58a5 : Kernel code004f58a6-00698577 : Kernel data7fe8ac00-7fe8cbff : ACPI Non-volatile Storage7fe8cc00-7fe8ebff : ACPI Tables7fe8ec00-7fffffff : reserved:(このサンプルからI/O 情 報 は 削 除 しています)“System RAM” と 記 述 された 箇 所 は、 割 り 付 け 可 能 な 物 理 メモリを 表 しています。物 理 RAMを 予 約 する 方 法 を 説 明 する /etc/grub.confの 例 を16 進逭 数 で 以 下 に 示 します (10 進逭 数 での 例 は 後 に 続 きます) 。grub.confに 設 定 されたコマンドは、メモリ・マッピングを 作 成 するために 起 動 時 に 処 理 されます。“memmap=exactmap” エントリは 正 確 なBIOSマップが 使 用 されることを 指 定 します。残 りのエントリは 領 域 を 定 義 するために 指 定 します。そのコマンドの 書 式 は、memmap=sizeaddressの 場 所 にシステムRAMは ‘@’、 予 約 は ‘$’、ACPIは ‘#’ を 指 定 します。以 下 の 例 では、 丁 度 1Gのアドレスより 下 に32MBを 予 約 します。default=0timeout=10splashimage=(hd0,0)/grub/ccur.xpm.gz2-23


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>title <strong>RedHawk</strong> <strong>Linux</strong> <strong>6.3</strong>.3 (Trace=Yes, Debug=No)root (hd0,0)kernel /vmlinuz-3.5.7-<strong>RedHawk</strong>-<strong>6.3</strong>.3-trace ro root=/dev/sda2vmalloc=256M ¥memmap=exactmap ¥memmap=0xa0000@0x0 ¥memmap=0x3df00000@0x100000 ¥memmap=0x2000000$0x3e000000 ¥memmap=0x3fe8ac00@0x40000000 ¥memmap=0x2000#0x7fe8cc00上 記 のエントリはmemexact(1)ユーティリティを 使 って 取 得 し、その 後 /etc/grub.confコマンド・ラインへコピーされます。memexactはコマンド・オプションを 処 理 し、/proc/iomemの 内容 もしくはコマンド・ラインで 指 定 されたファイルに 準 じて 適遚 切 なメモリ 予 約 コマンドを 実 行 します。2-24# /usr/bin/memexact -x -MS=32M,U=1Gmemmap=exactmap memmap=0xa0000@0 memmap=0x3df00000@0x100000memmap=0xa0000@0memmap=0x3df00000@0x100000 memmap=0x2000000$0x3e000000memmap=0x3fe8ac00@0x40000000 memmap=0x2000#0x7fe8cc00オプション:-x 16 進逭 数 での 出 力 を 指 定 します-M 複 数 のエントリを 陳 列 します-S 予 約 サイズを 指 定 します-U 予 約 の 上 限 を 指 定 しますこの 領 域 の 予 約 は、/proc/iomem 内 の “System RAM” で 確 認 できるメモリの 領 域 、かつカーネルのアドレスを 含 んでいない 限 り 任 意 に 遥 ぶことが 可 能 です。“Adapter ROM”、 “System ROM”、“ACP”、 “reserved” の 各 領 域 は、これらのコマンドを 使 って 再 マップしてはいけません。memexact(1)は/proc/iomemおよびコマンド・ライン・オプションで 与 えられた 内 容 に 準 じて 予約 するために 適遚 切 な 領 域 を 遥 びます。CAUTIONこれらのエントリの 中 で 発 生 した 既 に 予 約 された 領 域 ( 例 . System RAM等 )の 重 複 のようなエラーは、カーネルの 起 動 に 致 命 的 なエラーの 原 因 となる 可 能 性 があります。以 下 の 例 は10 進逭 数 のアドレスを 使 用 します。これは 上 述 の16 進逭 数 の 例 と 同 一 の 機 能 で 同 一 の 結 果を 生 じます。# memexact -MS=32M,U=1Gmemmap=exactmap memmap=640K@0 memmap=991M@1M memmap=32M$992Mmemmap=1047083K@1G memmap=8K#2095667K以 下 は、 記 10 進逭 数 のエントリが 追 加 された grub.confファイルに 相 当 します。default=0timeout=10splashimage=(hd0,0)/grub/ccur.xpm.gztitle <strong>RedHawk</strong> <strong>Linux</strong> <strong>6.3</strong>.3 (Trace=Yes, Debug=No)root (hd0,0)kernel /vmlinuz-3.5.7-<strong>RedHawk</strong>-<strong>6.3</strong>.3-trace ro root=/dev/sda2vmalloc=256M ¥memmap=exactmap ¥memmap=640K@0 ¥memmap=991M@1M ¥


リアルタイム 性 能memmap=32M$992M ¥memmap=1047083K@1G ¥memmap=8K#2095667K以 下 は 上 述 の 例 が 予 約 を 実 行 する 前 後 のメモリの 比 較 です。「 予 約 後 」の “reserved” と 記 述 された 0x3e000000の 領 域 は 新 たに 予 約 された32MBの 領 域 です。予 約 前 の /proc/iomem予 約 後 の /proc/iomem00000000-0009ffff : System RAM00000000-0009ffff : System RAM00000000-00000000 : Crash kernel00000000-00000000 : Crash kernel000a0000-000bffff : Video RAM area000a0000-000bffff : Video RAM area000c0000-000cefff : Video ROM000c0000-000cefff : Video ROM000d0800-000d3fff : Adapter ROM000d0800-000d3fff : Adapter ROM000f0000-000fffff : System ROM000f0000-000fffff : System ROM00100000-7fe8abff : System RAM00100000-3dffffff : System RAM00100000-004f58a5 : Kernel code00100000-004f58a5 : Kernel code004f58a6-00698577 : Kernel data004f58a6-00698577 : Kernel data7fe8ac00-7fe8cbff : ACPI Non-volatile Storage 3e000000-3fffffff : reserved7fe8cc00-7fe8ebff : ACPI Tables40000000-7fe8abff : System RAM7fe8ec00-7fffffff : reserved7fe8cc00-7fe8ebff : ACPI Tables..(このサンプルからI/O 情 報 は 削 除 しています)次 の 例 は、x86_64システム 上 の4GBを 超 える2つのシステムメモリ 領 域 の 間 でメモリ 領 域 を 予 約 するためにgrub.confの 中 に 設 定 するコマンドを 説 明 します。 予 約 前 の/proc/iomemの 出 力 を 以 下に 示 します。“mm” は “memmap” の 別 名 で “ex” は “exactmap” の 別 名 であることに 注 意 してください。これらの 短 い 別 名 は、grubコマンド・ライン 毎 におよそ1500 文 字 の 制 限 があるため、 予 約 エリアを設 定 するのに 必 要 な 文 字 数 を 減 らすために 使 用 する 必 要 があります。mm=ex ¥mm=0x9fc00@0x0 ¥mm=0x400@0x9fc00 ¥mm=0x20000$0xe0000 ¥mm=0xcfef0000@0x100000 ¥mm=0x10000#0xcfff0000 ¥mm=0x840000$0xff7c0000 ¥mm=512M@0x100000000 ¥mm=512M$4608M ¥mm=1G@5G以 下 は 上 述 の 例 が 予 約 を 実 行 する 前 後 のメモリの 比 較 です。「 予 約 後 」の “reserved” と 記 述 された 0x0000000120000000 の 領 域 は 新 たに 予 約 された 領 域 です。2-25


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>予 約 前 の/proc/iomem予 約 後 の/proc/iomem0000000000000000-000000000009fbff : System RAM 0000000000000000-000000000009fbff : System RAM000000000009fc00-000000000009ffff : reserved000000000009fc00-000000000009ffff : System RAM00000000000a0000-00000000000bffff : Video RAM area 00000000000a0000-00000000000bffff : Video RAM area00000000000c0000-00000000000c7fff : Video ROM 00000000000c0000-00000000000c7fff : Video ROM00000000000c8000-00000000000cbfff : Adapter ROM 00000000000c8000-00000000000cbfff : Adapter ROM00000000000f0000-00000000000fffff : System ROM 00000000000f0000-00000000000fffff : System ROM0000000000100000-00000000d7feffff : System RAM 0000000000100000-00000000cffeffff : System RAM0000000000100000-00000000005c9521 : Kernel code 0000000000100000-00000000005c9521 : Kernel code00000000005c9522-0000000000954137 : Kernel data 00000000005c9522-0000000000954137 : Kernel data00000000d7ff0000-00000000d7ffefff : ACPI Tables 00000000cfff0000-00000000cfffffff : ACPI Tables00000000d7fff000-00000000d7ffffff : ACPI Non-volatile 00000000ff7c0000-00000000ffffffff : reservedStorage0000000100000000-000000011fffffff : System RAM00000000ff7c0000-00000000ffffffff : reserved0000000120000000-000000013fffffff : reserved0000000100000000-000000017fffffff : System RAM 0000000140000000-000000017fffffff : System RAM..(このサンプルからI/O 情 報 は 削 除 しています)shmconfig(1)またはshmbind(2)は 予 約 済 み 物 理 メモリにパーティションを 作 成 するために 使 用されます。System Vの 共 有 メモリ 操 作 shmop(2)はアクセス 領 域 を 増 やすアプリケーションで 使用 することが 可 能 です。以 下 の 例 は、 本 セクション 内 で 提 示 したi386システム 上 の 最 初 の 例 に 基 づき、 物 理 アドレス0x3e000000にアクセス 制 限 なしおよび6602のキーによる32MBのSystem Vメモリ・パーティションを 作 成 します。# usr/bin/shmconfig -s 0x2000000 -p 0x3e000000 -m 0777 6602このコマンドは 共 有 メモリパーティションの 作 成 を 自 動 化 するために /etc/rc.localへ 設 定 しても 構 いません。この 例 では 符 号 化 された6602のキーを 使 うと 同 時 に、キーとして/dev/MyDeviceのようなパスを 使 用 して、ftok(3)の 機 能 を 使 ってアタッチするために 使 うキーを 得 ることをアプリケーションに 許 可 します。以 下 のコードの 断 片 は 動 的 に 共 有 メモリ・パーティションを 作 成 するために 使 用 することも 可 能です。..paddr = 0x3e000000 ;shmkey = ftok( pathname ) ;shmid = shmget ( shmkey, sizeof ( ) ,SHM_R | SHM_W | IPC_CREAT) ;shmstat = shmbind ( shmid , paddr ) ;pstart = shmat ( shmid , NULL , SHM_RND ) ;..システム 上 の 共 有 メモリ・セグメントは ipcs(8) (-m オプション) を 使 って、もしくは/proc/sysvipc/shmファイルを 通 して 見 ることが 出 来 ます。# cat /proc/sysvipc/shmkey shmid perms size cpid lpid nattch uid gid cuid cgidatime dtimectime physaddr6602 0 777 33554432 4349 0 0 0 0 0 00 0 1153750799 3e0000002-26


リアルタイム 性 能# ipcs -m------ Shared Memory Segments --------key shmid owner perms bytes nattch status0x000019ca 0 root 777 33554432 0これらの 機 能 やユーティリティの 利 用 に 関 する 詳 細 な 情 報 については、manページまたは3 章 を 参照 してください。NUMAノードへのバインディング2iHawk OpteronシステムのようなNon-Uniform Memory Access (NUMA)のシステム 上 では、ほかのシステムよりも 一 部邪 のメモリ 領 域 へのアクセスに 時 間 が 掛 かります。NUMAシステム 上 のメモリはノードに 分 けられ、ノードはメモリ 領 域 とNUMAノードのメモリ 領 域 と 同 じ 物 理 バス 上 に 存 在 する 全 てのCPUで 定 義 されます。もしこのタイプのシステム 上 で 実 行 中 のプログラムがNUMA 対 応でない 場 合 、 十 分 に 実 行 することが 出 来 ません。デフォルトで、ページは(プログラムが 実 行 された)ローカルCPUに 存 在 するノードから 割 り 付 けられますが、タスクまたはタスク 内 の 仮 想 領 域 は 最 良 のデターミニズムと 制 御 のために 特 定 のノードからのページ 割 り 付 けを 指 定 することが 可 能 です。NUMAに 関 する 情 報 は10 章 を 参 照 してください。クアッドOpteronシスシステムのテムのI/Oスループット2クアッドOpteron 対 称 型 マルチプロセッサ・システムにおいて、 各 プロセッサはプロセッサに 直 結するユニークなメモリ・バンクを 持 っています。システム 内 の 全 てのメモリはHyperTransport を介 してどのCPUからもアクセスすることが 可 能 ですが、プロセッサに 直 結 したメモリはそのプロセッサ 上 で 動 作 している 実 行 スレッドに 最 速 のアクセス 時 間 を 提 供 します。このレイアウトを 図2-7に 図 示 します。2-27


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>図 2-7 クアッドOpteronのI/Oスループット・レイアウトOpteronシステムでのI/Oデバイスへのアクセスも 同 様 に 完 全 な 対 象 型 ではありません。I/O HubとPCI Tunnelは、システム 内 の 特 定 ノードに 直 結 しています。 図 2-7の 中 でI/O Hub はNode 0に 接 続し、PCI Tunnel はNode 1 に 接 続 しています。 試 験 においてプログラム 化 されたI/Oの 時 間 は、プログラム 化 したI/Oを 実 行 しているプログラムがデバイスが 存 在 するI/Oバスへ 接 続 したノード 上で 実 行 している 時 、 最 速 かつよりデターミニスティックであることを 示 しました。I/O 性 能 に 対 するこの 影 響 は、ほかのプログラムがI/Oまたは 非 ローカルメモリ 操 作 を 実 行 中 であるため、HyperTransport 相 互 接 続 により 競 合 するときに 特 に 目 立 ちます。これは、アプリケーションがデータミニスティックな 高 速 プログラム 化 I/Oを 要 求 する 場 合 、そのようなI/Oを 実 行 しているそのプログラムは、デバイスが 存 在 するI/Oバスに 最 も 近 いプロセッサ上 で 実 行 せざるを 得 ないことを 意 味 します。I/Oブリッジに 結 合 するノードはシステム 構 成 図 を 見 ることにより、もしくは 試 験 することにより明 らかにすることが 可 能 です。ハイパースレッディングの 理 解 2ハイパースレッディングは、iHawk 860システムのIntel Pentium Xeonプロセッサの 機 能 です。これは1つの 物 理 プロセッサでアプリケーション・ソフトウェアの 複 数 スレッドの 同 時 実 行 を 可 能 にします。これはプロセッサの 実 行 リソース 一 式 を 共 有 すると 同 時 に 各 プロセッサ 上 に2つの 構 造造 形 態を 持 つことによって 実 現 します。この 構 造造 形 態 はプログラムまたはスレッドの 流 れを 追 跡 し、 実行 リソースは(Add, Multiply, Load 等 の) 作 業 をするプロセッサ 上 のユニットになります。ハイパースレッド 付 き 物 理 CPUの2つの 各 々の 構 造造 形 態 は、“ 論 理 ”CPUとして 考 えることが 可 能 です。“Sibling CPU” という 言 葉 は、 同 一 物 理 CPU 上 に 存 在 する1 対 の 論 理 CPUとは 別 のCPUを 指 します。2-28


リアルタイム 性 能スレッドがスケジューリングされた 時 、オペレーティング・システムは1つの 物 理 CPU 上 の2つの論 理 CPUをあたかも 別 個 のプロセッサのように 扱 います。ps(1)もしくはshield(1)のようなコマンドは 各 論 理 CPUを 識 別 します。これはマルチプロセッサ 対 応 ソフトウェアが 倍 の 数 の 論 理 CPU 上で 修 正 せずに 実 行 することを 可 能 にします。ハイパースレッド 技 術 は2 個 目 の 物 理 プロセッサを 追加 することにより 得 られる 性 能 レベルの 度 合 いを 供 与 しない 一 方 、いくつかのベンチマーク・テストは 並 列 アプリケーションが30%ほどの 性 能 増 加 を 体 験 できることを 示 しています。リアルタイム・アプリケーションにとってハイパースレッディングを 利 用 する 最 善 の 操 作 方 法 案 は「 推 奨されるCPU 構 成 」セクションを 参 照 してください。2つの 論 理 CPUを 持 つ1つの 物 理 CPUは 実 行 リソースを 効 果 的 に 利 用 できるため、ハイパースレッディングによる 性 能 増 加 が 発 生 します。 非 ハイパースレッドCPU 上 の 標 準 的 なプログラムの 実 行中 において、チップ 上 の 実 行 リソースは 多 くの 場 合 入 力 待 ちで 遊 んでいます。2つの 論 理 CPUが 実行 リソース 一 式 を 共 有 しているため、2 番 目 の 論 理 CPU 上 で 実 行 しているスレッドは1つのスレッドだけが 実 行 中 で 遊 んでいる 他 のリソースを 使 うことが 出 来 ます。 例 えば、1つの 論 理 CPUが 終 了するためにメモリからフェッチを 待 って 停 止 している 間 、そのシブリングは 命 令 ストリームを 処理 し 続 けることが 可 能 です。プロセッサとメモリの 速 度 が 全 く 等 しくないため、プロセッサはメモリからのデータ 転 送 を 待 つことに 大 部邪 分 の 時 間 を 費 やす 可 能 性 があります。 従 って、 特 定 の 並列 アプリケーションのためのハイパースレッディングは 著 しい 性 能 向 上 を 提 供 します。 他 の 並 列処 理 の 例 は、 他 の 加 算 とロード 処 理 を 実 行 中 の 浮 動 小 数 点 演 算 を 実 行 する1つの 論 理 プロセッサです。チップ 上 の 異 なるプロセッサ 実 行 ユニットを 利 用 するため、これらの 演 算 は 並 列 に 実 行 されます。ハイパースレッディングはマルチスレッドの 作 業 負 荷 に 対 して 通 常 高 速 実 行 を 提 供 する 一 方 、リアルタイム・アプリケーションにとって 問 題 となる 可 能 性 があります。これはスレッド 実 行 のデターミニズムに 対 する 影 響 によるものです。ハイパースレッドCPUは 別 スレッドと 一 体 となっているプロセッサの 実 行 ユニットを 共 有 するため、ハイパースレッドCPU 上 でスレッドを 実 行 したときに 実 行 ユニット 自 身 が 他 のリソースレベルで 競 合 します。ハイパースレッド 上 の 高 優 先 度 のプロセスが 命 令 の 実 行 を 使 用 としたときに 実 行 ユニットは 常 に 利 用 可 能 ではないため、ハイパースレッド 上 のコード・セグメントの 実 行 に 必 要 な 時 間 は 非 ハイパースレッドCPU 上 と 同 様 に 予 測できません。並 列 リアルタイム・アプリケーションの 設 計 者 は、アプリケーションにとってハイパースレッディングが 意 味 があるのかどうかを 判 定 しなければなりません。タスクをハイパースレッドCPU 上で 並 列 実 行 することが、 連連 続 的 に 実 行 することと 比 較 してアプリケーションの 利 益 となるでしょうか?もしそうなのであれば、 開 発 者 はハイパースレッド 上 で 実 行 することにより 重 要 な 高 優 先度 スレッドの 実 行 速 度 にどれくらいのジッターをもたらすのかを 判 断 するために 測 定 することが可 能 です。容 認 できるジッターのレベルはアプリケーションに 大 いに 依 存 します。もしハイパースレッディングが 原 因 で 容 認 できないジッター 量 をリアルタイム・アプリケーションにもたらす 場 合 、 影 響したタスクはcpu(1)コマンドによりシブリングCPUをダウン 状 態 (アイドル 状 態 )にしたシールドCPU 上 で 実 行 されなければなりません。CPUをダウン 状 態 にしたシステムの 例 は 本 章 で 後 述 します。 特 定 のプロセッサ 間 割 り 込 みは、ダウン 状 態 ( 詳 細 はcpu(1)のmanページを 参 照 してください)のCPU 上 で 処 理 され 続 けることに 注 意 しなければなりません。もし 必 要 であれば、ハイパースレッディングはシステム 全 体 で 無 効 にすることが 可 能 です。 詳 細 は「システム 構 成 」セクションを参 照 してください。2-29


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>システム 構 成 2推 奨 されるCPU 構 成 2ハイパースレッディング 技 術 はシステムの 各 プロセッサ 内 で 並 列 処 理 を 提 供 することによりマルチプロセッシングを 補 いますが、デュアルもしくはマルチプロセッサに 置 き 換 わるものではありません。システムに 利 用 可 能 な2つの 論 理 CPUがあっても、 同 じ 量 の 実 行 リソースを 共 有 したままです。 従 って、 専 用 の 実 行 リソース 一 式 を 所 有 するもう1つの 物 理 プロセッサの 性 能 の 利 点 は、より 大 きな 性 能 レベルを 提 供 することです。これはデターミニスティックな 実 行 環 境 を 獲 得 するためにシールドCPUを 利 用 するアプリケーションにとっては 特 に 有 効 となります。上 述 したように 各 論 理 CPUは 完 全 な 構 造造 状 態 一 式 を 維 持 します。この(シブリングCPUによって 共有 されていない) 構 造造 状 態 は 汎 用 レジスタ、 制 御 レジスタ、 高 度 プログラマブル 割 り 込 みコントローラ(APIC)レジスタ、いくつかのマシン・ステータス・レジスタ(MSR)で 構 成 されます。 論 理 プロセッサはキャッシュ、 実 行 ユニット、 分 岐 予 測 、 制 御 ロジック、バスのような 物 理 プロセッサ上 の 殆 どのリソースを 共 有 します。 各 論 理 プロセッサはそれぞれの 割 り 込 みコントローラもしくはAPICを 持 っています。ハイパースレッディングが 有 効 であるか 無 効 であるかは 関 係 なく、 特 定の 論 理 CPUに 送 信 する 割 り 込 みはその 論 理 CPUだけで 処 理 されます。以 下 の 項 目 はハイパースレッドの 可 用 性 がシステム 全 体 に 影 響 を 及 ぼします。• システムは Intel Pentium Xeonプロセッサが 構 成 されている 必 要 があります。• カーネル 構 成 GUI 上 の「Processor Type and Features」にあるカーネル・チューニング・パラメータ X86_HTを 通 してハイパースレッディングを 有 効 にする 設 定 でなければなりません。ハイパースレッディングはすべての<strong>RedHawk</strong> i386プレデファイン・カーネルでは 規 定 値 で 有 効 となっています。• ハイパースレッディングを 利 用 するためにBIOSで 有 効 にする 必 要 があります。 必 要 に 応 じてBIOSの 設 定 に 関 するハードウェアの 資 料 を 参 照 してください。ハイパースレッディングは、シブリングCPUをダウン 状 態 にするためのcpu(1)コマンドを 使 ってCPU 毎 に 無 効 にすることが 可 能 です。 詳 細 はcpu(1)のmanページを 参 照 してください。ハイパースレッディングを 有 効 にすることで、ハイパースレッディングをサポートしていなかった<strong>RedHawk</strong> <strong>Linux</strong> 1.3より 前 にリリースされたバージョンが 動 作 中 の 以 前 のシステムでは、top(1)やrun(1)のようなコマンドはCPU 数 の2 倍 レポートすることに 注 意 してください。システム 全 体 でハイパースレッディングが 無 効 になっているとき、 論 理 CPUの 数 は 物 理 CPUの 数 と 等 しくなります。ハイパースレッディング 技 術 は 並 列 アプリケーションに 性 能 向 上 の 可 能 性 を 提 供 します。しかし、CPUリソースが1つの 物 理 CPUを 論 理 CPU 間 で 共 有 されている 様 式 であるため、 様 々なアプリケーションの 混 合 はパフォーマンスの 結 果 が 異 なることとなります。これはアプリケーションにデターミニスティックな 実 行 時 間 を 必 要 とするリアルタイム 要 件 がある 時 に 特 に 当 てはまります。 従って、 最 適遚 な 性 能 を 判 断 するために 様 々なCPU 構 成 でアプリケーションの 性 能 テストをすることがとても 重 要 になります。 例 えば、もし1 組 のシブリングCPU 上 で 並 列 に 実 行 可 能 な2つのタスクが 存 在 する 場 合 、 両 方 のシブリングCPUを 使 って 並 列 にそれらのタスクを 実 行 するために 必 要 な時 間 に 対 してシブリングCPUの1つをダウン 状 態 にしてそれらのタスクを 連連 続 で 実 行 するために必 要 な 時 間 を 必 ず 比 較 してください。ハイパースレッディングによって 提 供 されるユニークな 並列 処 理 の 優 位 性 をそれら2つのタスクが 得 られるかどうかを 判 断 できるでしょう。2-30


リアルタイム 性 能標 準 的 なシールドCPUモデル2以 下 は、リアルタイム・アプリケーションのためにハイパースレッドCPUを 含 むSMPシステムを構 成 する 方 法 を 提 案 します。これらのサンプルには、 様 々な 性 能 特 性 を 持 つアプリケーションにとって 最 高 に 作 用 するかもしれない 構 成 に 関 するヒントが 含 まれています。このモデルは、プログラム 実 行 においてデータミニズムを 非 常 に 厳 しく 要 求 するアプリケーションに 利 用 できるでしょう。シールドCPUは、これらの 種 類 のタスクに 最 もデターミニスティックな 環 境 を 提 供 します(シールドCPUに 関 する 詳 細 な 情 報 については「シールディングでリアルタイム 性 能 を 向 上 する 方 法 」セクションを 参 照 してください)。シールドCPUのデターミニズムを 最大 限 にするために 物 理 CPU 上 のハイパースレッディングは 無 効 にします。これはcpu(1)コマンドを 使 ってシールドCPUのシブリング 論 理 CPUをダウン 状 態 にすることで 完 了 します。標 準 的 なシールドCPUモデルでは、 非 シールドCPUはハイパースレッディングは 有 効 の 状 態 です。一 般 的 にハイパースレッディングはより 多 くのCPUリソースを 利 用 されることを 許 可 するため、これらのCPUは 非 クリティカルな 作 業 負 荷 に 使 用 されます。2つの 物 理 CPU(4つの 論 理 CPU(を 持 つシステム 上 の 標 準 的 なシールドCPUモデルを 図 2-8に 図 示します。この 例 の 中 では、CPU3はダウン 状 態 となりCPU2は 割 り 込 み、プロセス、ハイパースレッディングからシールドされています。 高 優 先 度 割 り 込 みとその 割 り 込 みに 応 答 するプログラムは、 割 り 込 みに 対 して 最 高 のデターミニスティックな 応 答 をするためCPU2に 割 り 付 けます。図 2-8 標 準 的 なシールドなシールドCPUモデルこの 構 成 を 設 定 するコマンドは、$ shield -a 2$ cpu -d 3割 り 込 みを 分 離 したシールディング 2このモデルは 標 準 的 なシールドCPUモデルに 非 常 に 似 ています。しかし、このケースではすべての 論 理 CPUは 使 用 されており、1つもダウン 状 態 ではありません。 標 準 的 なシールドCPUモデルのように 論 理 CPUの1つの 集 合 はシールドされています。しかし、シールドCPUのシブリングをダウン 状 態 にすることよりむしろ、それらのCPUをシールドしてデターミニスティックな 割 り 込 み 応答 を 要 求 する 高 優 先 度 割 り 込 みを 処 理 するために 専 念 させます。これはプロセスと 割 り 込 みからシブリングCPUをシールドし、 更 にそのシブリングCPUへ 特 定 の 割 り 込 みのCPUアフィニティを設 定 することにより 完 了 します。2-31


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>割 り 込 みを 分 離 したシールディングを 図 2-9に 図 示 します。Figure 2-9 割 り 込 みを 分 離 したシールディングハイパースレッドのシールディング 2このアプローチの 利 点 は、(CPU3 上 で 動 作 する) 割 り 込 みルーチンとシブリングCPU 上 の 高 優 先 度タスク(CPU2 上 で 動 作 する 割 り 込 み 待 ちプログラム)の 実 行 との 間 で 僅 かながらの 並 列 処 理 を 提供 することです。 割 り 込 みルーチンがCPU3 上 で 実 行 している 唯 一 のコードあるため、この 割 り 込みルーチンは 通 常 L1キャッシュに 完 全 に 保 持 され、そのコードはキャッシュの 中 に 留 まって、 割り 込 みルーチンに 対 し 最 適遚 な 実 行 時 間 を 提 供 します。その 割 り 込 みルーチンはシブリングCPU 上の 割 り 込 み 待 ちタスクを 起 こすためにプロセッサ 間 割 り 込 みを 送 信 する 必 要 があるため、 小 さな代 償 を 払 うことにはなります。この 余 分 なオーバーヘッドは2μ 秒 未 満 です。割 り 込 み 分 離 によるシールディングの 利 用 によるもう 一 つの 潜 在 的 効 果 は、デバイスのI/Oスループットを 向 上 させることです。デバイスの 割 り 込 み 処 理 にCPUが 専 念 しているため、この 割 り 込みはI/O 操 作 が 完 了 したときに 常 に 可 能 な 限 り 迅 速 に 完 了 します。これは 割 り 込 みルーチンが 即 座に 次 のI/O 操 作 の 開 始 を 可 能 にし、より 良 いI/Oスループットを 提 供 します。この 構 成 は 標 準 的 なシールドCPUモデルとは 別 のバリエーションです。このケースでは、 一 つのシブリングCPUがもう 一 方 のシブリングCPUが 通 常 のタスクの 実 行 を 許 可 されている 状 態 でシールドされています。シールドCPUはもう 一 方 のシブリングCPU 上 の 動 作 状 況 によってデターミニズムに 影 響 を 与 えます。また 一 方 で、この 優 位 性 はアプリケーションがより 多 くの 物 理 CPUのCPUパワーを 利 用 することが 可 能 であることです。ハイパースレッドのシールディング 構 成 を 図 2-10に 図 示 します。2-32


リアルタイム 性 能図 2-10 ハイパースレッドのシールディング浮 動 小 数 点 演 算 / 整 数 演 算 の 共 有 2共 有 データ・キャッシュ2このサンプルでは、CPU3はシールドされ、 高 優 先 度 の 割 り 込 みとその 割 り 込 みに 応 答 するプログラムだけの 実 行 を 許 可 しています。CPU2はシールドされていないために 通 常 の 利 用 が 可 能 、つまり 特 定 のタスク 一 式 を 実 行 するために 構 成 されています。プリエンプションや 割 り 込 みブロックが 無 効 の 時 、CPU3 上 で 実 行 中 の 高 優 先 度 割 り 込 みやタスクには 影 響 がないため、CPU2 上 で 動 作するタスクは 直 接 割 り 込 み 応 答 時 間 へ 影 響 を 与 えることはありません。しかし、チップのリソースレベルではCPU3 上 での 実 行 のデターミニズムには 影 響 を 与 える 競 合 が 存 在 します。その 影 響 の度 合 いはアプリケーションにとても 依 存 します。この 構 成 はアプリケーションが 主 に 浮 動 小 数 点 演 算 を 実 行 するいくつかのプログラムおよび 整 数算 術 演 算 を 実 行 するいくつかのプログラムを 持 っているときに 利 用 することが 可 能 です。ハイパースレッドCPUの 両 方 のシブリングは 特 定 のタスクを 実 行 するために 使 用 されます。 浮 動 小 数 点を 集 約 したプログラムを1つのシブリングCPUに 割 り 付 け、 主 に 整 数 計 算 を 実 行 するプログラムをもう 一 方 のシブリングCPUに 割 り 付 けます。この 構 成 の 優 位 点 は 浮 動 少 数 点 演 算 と 整 数 演 算 は 異なるチップのリソースを 利 用 することです。これはチップレベルでの 利 用 が 可 能 な 並 列 処 理 であるため、ハイパースレッド 型 並 列 処 理 を 十 分 に 活 用 することが 可 能 となります。コンテキスト・スイッチ 間 で 浮 動 小 数 点 レジスタの Save/Restore がないため、 整 数 演 算 だけを 実 行 するCPU 上 のアプリケーションはコンテキスト・スイッチ 時 間 が 高 速 に 見 えることに 注 意 すべきです。この 構 成 はアプリケーションが 生 産 者 / 消 費 者 型 プリケーションの 時 に 利 用 することが 可 能 です。言 い 換 えると、1つのプロセス( 消 費 者 )はもう 一 方 のプロセス( 生 産 者 )から 渡 されたデータで 動 作しています。このケースでは、 生 産 者 と 消 費 者 の 各 スレッドはハイパースレッドCPUのしうリングに 割 り 付 ける 必 要 があります。2つのシブリングCPUがデータ・キャッシュを 共 有 するため、 生産 者 プロセスによって 生 産 されるデータは 消 費 者 プロセスが 生 産 者 タスクから 渡 されたデータをアクセスしたときにデータ・キャッシュ 内 に 留 まっている 可 能 性 があります。このように2つのシブリングCPUを 利 用 することは 生 産 者 と 消 費 者 の 各 タスクが 並 列 に 実 行 することを 可 能 にし、またそれらの 間 で 渡 されるデータは 基 本 的 に 高 速 キャッシュ・メモリを 介 して 渡 されます。これはハイパースレッド 型 並 列 処 理 を 利 用 するために 重 要 な 機 会 を 提 供 します。もう1つのこのモデルの 潜 在 的 な 利 用 法 は、ハイパースレッドCPU 上 の1つのシブリングCPU 上 のプロセスのためにもう 一 つのシブリングCPUで 実 行 中 のプロセスで 使 われるデータ・キャッシュの 中 にデータをプリフェッチすることです。2-33


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>シールド・ユニプロセッサ 2メモリ 不 足 状 態 の 回 避遪 2この 構 成 はハイパースレッド・シールディング 構 成 の1つのバリエーションです。 唯 一 の 遊 いは、SMPシステム 内 の 一 つの 物 理 プロセッサよりもむしろ、ユニプロセッサにこの 技 術 を 適遚 用 していることです。 物 理 メモリには 現 在 2つの 論 理 CPUが 含 まれているため、ユニプロセッサは 現 在 シールドCPUを 作 るために 使 用 することが 可 能 です。このケースでは、CPUの1つをシールドの 設 定 して、 一 方 他 のCPUはバックグラウンド 処 理 を 実 行 するために 使 用 します。このタイプのシールドCPUのデターミニズムは、 異 なる 物 理 CPUでのCPUシールディングの 利 用 ほど 確 実 ではありませんが、シールドされていないよりは 明 らかに 良 くなります。所 有 するシステムが 適遚 切 な 物 理 メモリを 搭 載 していることを 確 認 してください。Concurrentのリアルタイム 保 証 は、リアルタイム・アプリケーションが 利 用 するために 十 分 なRAMが 搭 載 されているシステムが 正 しく 構 成 されていることを 前 提 とします。メモリが 少 ない 状 況 では、システムの完 全 性 をより 確 実 にし、 適遚 切 なシステムの 挙 動 を 維 持 するためにリアルタイムのデッドラインを犠 牲 にするかもしれません。<strong>Linux</strong> はメモリが 不 足 する 時 、 無 作 為 にメモリを 開 放 するために 終了 するプロセスを 遥 ぶことで、 他 のプロセスを 起 動 することが 可 能 になります。メモリの 使 用 状 況 は /proc/meminfo, free(1), vmstat(8)に 含 まれるいくつかのツールの 利 用 で 監視 することが 可 能 です。<strong>Linux</strong>のデターミニズムに 関 する 既 知 の 問 題 2以 下 は、リアルタイム 性 能 にネガティブな 影 響 を 与 えることが 知 られている 標 準 的 な<strong>Linux</strong> の 問題 です。システムがリアルタイム・アプリケーションを 実 行 中 は、これらの 行 為 は 本 質 的 に 一 般的 な 管 理 用 であり 実 行 してはいけません。• hdparm(1)ユーティリティは、IDEまたはSCSIディスク 用 の 特 別 なパラメータを 有 効 にするためのコマンド・ライン・インターフェースです。 本 ユーティリティは 非 常 に 長 い 時 間 割 り込 みを 無 効 にすることで 知 られています。• blkdev_close(2)インターフェースは、RAWブロック・デバイスへ 書 き 込 むためにブート・ローダーに 使 用 されます。これは 非 常 に 長 い 時 間 割 り 込 みを 無 効 にすることで 知 られています。• フレームバッファ(fb)コンソールがスクロールすることを 避遪 けてください。これは 非 常 に 長 い時 間 割 り 込 みを 無 効 にすることで 知 られています。• 仮 想 コンソールを 使 用 する 時 、コンソールは 切 り 替 えないでください。これは 非 常 に 長 い 時間 割 り 込 みを 無 効 にすることで 知 られています。• CDのマウント/アンマウントおよびファイルシステムのアンマウントは 避遪 けてください。これらのアクションは 長 い 待 ち 時 間 を 引 き 起 こします。• CDの 自 動 マウントは 止 めてください。これはポーリングのインターフェースで 周 期 的 なポーリングが 長 い 待 ち 時 間 を 引 き 起 こします。• haldaemonサービスはリアルタイム 性 能 を 妨 げることが 明 らかで、デフォルトで 止 めています。しかし、ファイルのコンテキスト・メニューからCDまたはDVDにファイルを 焼 く( 例 えばISO)ためには 実 行 する 必 要 があります。2-34


リアルタイム 性 能ディスク 上 にファイルを 焼 くために 最 初 にhaldaemonサービスを 開 始 します。$ service haldaemon startコピー 処 理 が 終 了 した 後 、サービスを 停 止 します。$ service haldaemon stop• デバイスドライバのioctl()ルーチンにコールされる 前 にデフォルトで<strong>Linux</strong>カーネルはBigKernel Lock (BKL)をロックします。これはioctl()ルーチンがリアルタイム・プロセスからコールまたはシールドCPU 上 からコールされた 時 に 遅逼 延 を 引 き 起 こす 可 能 性 があります。この問 題 を 解 決 する 方 法 の 詳 細 な 情 報 については「デバイス・ドライバ」 章 を 参 照 してください。• カーネル・モジュールをアンロードすることは 避遪 けてください。この 行 為 はCPUに 不 必 要 なジッターが 増 す 可 能 性 のあるkmoduleデーモンをCPU 毎 に 作 成 し 破 棄 します。• ksoftirqdカーネル・デーモンにより 定 期 的 にフラッシュされるIPルート・キャッシュ・テーブルは、 利 用 可 能 なメモリの 量 に 基 づいて 動 的 に 大 きさを 設 定 します ( 例 :メモリ4GBのシステムに 対 して128Kエントリ)。もしネットワークのデターミニズムに 問 題 がある 場 合 、 特にシングルCPUシステムにおいてはフラッシュに 必 要 な 時 間 が 問 題 となる 可 能 性 があります。過遃 剰 なksoftirqd の 実 行 を 減 らすため、IPルート・キャッシュ・テーブルはGRUBコマンドrhash_entries=n (n はテーブル・エントリの 数 )を 利 用 して 固 定 サイズに 設 定 することが 可能 です。 例 :rhash_entries=4096 (エントリ 数 を4Kに 設 定 )• シールドCPU 上 でタイムクリティカル・アプリケーションの 実 行 中 、Xサーバの 開 始 および停 止 する 時 にリアルタイムに 問 題 が 発 生 する 可 能 性 があります。システムで 使 われているグラフィックカードの 種 類 によっては、 多 くのプロセッサ 間 割 り 込 みの 性 能 低 下 という 結 果 になるかもしれません。もしこのような 経 験 があるのであれば、これらの 割 り 込 みを 減 らすために 付 録 Gを 参 照 してください。• カーネル 内 にDETECT_SOFTLOCKUPが 存 在 しないことを 確 認 してください。このオプションは 全 てのCPU 上 の 過遃 度 なCPU 毎 デーモンを 終 了 することによりCPUシールディングに 干 渉し、また 最 スケジューリング 中 の 変 数 がソフト・ロックアップとしてのsoftlockup 機 構 により誤 って 実 行 される 時 に 最 スケジューリング 変 数 に 干 渉 します。• カーネル 内 にSCHED_SMT_IDLEが 設 定 されていないことを 確 認 してください。 他 のスレッドがSCHED_RRまたはSCHED_FIFOタスクとして 実 行 中 にもしSCHED_OTHERタスクを 実行 するためにスケジュールされた 場 合 、このパラメータは 一 組 のSMT CPUのスレッドが 強 制的 にアイドルになることを 回 避遪 します。• mount(1)オプションのnoatimeは、ファイルシステムにアクセスする 毎 にiノードのアクセス時 間 の 不 必 要 なアップデートを 排 除 するために/etc/fstab 内 で 定 義 することを 推 奨 します。2-35


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>2-36


333Chapter 3リアルタイム・プロセス 間 通 信本 章 では<strong>RedHawk</strong> <strong>Linux</strong>がサポートするPOSIXのリアルタイム・プロセス 間 通 信 、およびSystem Vのメッセージ 送 受 信 と 共 有 メモリ 機 能 について 説 明 します。付 録 AにはPOSIXとSystem Vのメッセージ・キュー 機 能 の 使 用 方 法 を 説 明 したプログラム 例 が 含まれています。概 要 3<strong>RedHawk</strong> <strong>Linux</strong>はプロセスがデータをやり 取 りすることを 許 可 するいくつかのメカニズムを 提 供します。それらのメカニズムにはIEEE 規 格 1003.1b-1993に 準 拠 するメッセージ・キュー、 共 有 メモリ、セマフォの 他 にSystem Vの Interprocess Communication (IPC) パッケージに 含 まれるそれらの 機 能 も 含 まれています。メッセージ・キューと 共 有 メモリは 本 章 の 中 で 解 説 し、セマフォは5章 の「プロセス 間 同 期 」で 解 説 しています。メッセージ・キュー は1つ 以 上 の 読 み 取 りプロセスにより 読 まれるメッセージを1つ 以 上 のプロセスが 書 き 込 むことが 可 能 です。この 機 能 はメッセージ・キューの 作 成 、オープン、 問 い 合 わせ、破 棄 、 送 信 、メッセージ・キューからのメッセージ 受 信 、 送 信 メッセージの 優 先 度 指 定 、メッセージ 到 遉 時 の 非 同 期 通 知 リクエストを 提 供 します。POSIXとSystem Vのメッセージング 機 能 はお 互 い 独 立 して 動 作 します。 推 奨 するメッセージ 送 受信 メカニズムは、 効 率 性 と 可 搬 性 の 理 由 によりPOSIXメッセージ・キュー 機 能 です。 本 章 の「POSIXメッセージ・キュー」と「System Vメッセージ」のセクションでこれらの 機 能 を 説 明 しています。共 有 メモリ は 協 同 するプロセスがメモリの 共 通 エリアを 通 してデータを 共 有 することが 可 能 です。1つ 以 上 のプロセスがメモリの 一 部邪 に 接 続 することが 可 能 で、 故 にそこに 置 かれたどんなデータでも 共 有 することが 可 能 です。メッセージング 同 様 、POSIXとSystem Vの 共 有 メモリ 機 能 はお 互 いに 独 立 して 動 作 します。アプリケーション 内 で 共 有 メモリに 置 いたデータは 一 時 的 なものでシステム 再 起 動 後 に 存 在 する 必 要がないSystem V 共 有 メモリエリアの 使 用 を 推 奨 します。System V 共 有 メモリ 内 のデータはメモリにのみ 保 持 されます。ディスク・ファイルはそのメモリと 関 連連 しておらず、 結 果 、sync(2) システムコールによるディスク・トラフィックが 生 じることもありません。また、System V 共 有 メモリは 共 有 メモリセグメントを 物 理 メモリ 領 域 にバインドさせることが 可 能 です。この 機 能 についての 情 報 は「System V 共 有 メモリ」セクションを 参 照 してください。System V 共 有 メモリの 使 用 の 代 替 えとして、/dev/memファイルの 一 部邪 をマッピングするmmap(2)システムコールを 使 用 します。mmapシステムコールに 関 する 情 報 は、9 章 の「メモリ・マッピング」を 参 照 してください。/dev/memファイルに 関 する 情 報 は、mem(4)のmanページを参 照 してください。POSIX 共 有 メモリのインターフェースは/var/tmpディレクトリ 内 のディスク・ファイルにマッピングされます。もしこのディレクトリがmemfsファイルシステム 上 にマウントされている 場 合 、syncシステムコール 中 の 共 有 データのフラッシュによる 余 計 なディスク・トラフィックは 発 生 しません。もしこのディレクトリが 通 常 のディスク・パーティション 上 にマウントされている 場 合 、マッピングされたディスク・ファイル 内 の 共 有 データを 更 新 し 続 けるためにsyncシステムコール中 はディスク・トラフィックが 発 生 します。3-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>POSIX 共 有 メモリのデータがファイルに 保 存 されたかどうかに 関 係 なく、それらのデータはシステム 再 起 動 後 は 保 持 されません。POSIX 共 有 メモリ 機 能 は、 本 章 の「POSIX 共 有 メモリ」セクションで 説 明 しています。POSIXメッセージ・キュー3アプリケーションは 複 数 の 協 同 プロセスから 構 成 され、おそらく 別 個 のプロセッサ 上 で 動 作 することになります。これらのプロセスは 効 果 的 に 通 信 しそれらの 動 作 を 調 整 するためにシステム 全体 でPOSIXメッセージ・キューを 使 用 します。POSIXメッセージ・キューの 主 な 用 途 は、プロセス 間 でデータ 送 受 信 するためです。 対 照 的 に 同一 プロセス 内 スレッドは 既 にアドレス 空 間 全 体 を 共 有 しているため、 同 一 プロセス 内 の 協 同 スレッド 間 のデータ 送 受 信 機 能 としてはほとんど 必 要 ありません。しかし、1つ 以 上 のプロセス 内 のスレッド 間 でデータ 送 受 信 するためにアプリケーションがメッセージ・キューを 利 用 することは 避遪けられません。メッセージ・キューはmq_open(3)を 使 って 作 成 およびオープンされます。この 機 能 はコールした 後 にオープン・メッセージ・キューを 参 照 するために 使 用 するメッセージ・キュー 記 述 子(mqd_t)を 返 します。 各 メッセージ・キューは/somename の 形 式 の 名 称 によって 識 別 されます。2つのプロセスがmq_openに 同 じ 名 前 を 渡 すことによって 同 じキューを 操 作 することが 可 能 となります。メッセージは、mq_send(3)とmq_receive(3)を 使 ってキューとの 受 け 渡 しを 行 います。プロセスがキューの 使 用 を 終 了 した 時 、mq_close(3)を 使 ってキューを 閉 じ、キューが 既 に 必 要 ではなない 時 、mq_unlink(3)を 使 って 削 除 することが 可 能 です。キューの 属 性 は、mq_getattr(3)とmq_setattr(3)を 使 って 取 得 および( 場 合 によっては) 修 正 することが 可 能 です。プロセスはmq_notify(3)を 使 って 空 のキューへのメッセージ 到 遉 の 非 同 期 通 知 をリクエストすることが 可 能です。メッセージ・キュー 記 述 子 は、オープン・メッセージ・キュー 記 述 の 参 照 先 です(open(2)を 参 照 )。fork(2) 実 行 後 、 子 プロセスは 親 のメッセージ・キュー 記 述 子 のコピーを 継 承 し、それらの 記 述 子は 親 プロセスと 一 致 する 記 述 子 と 同 じオープン・メッセージ・キュー 記 述 を 参 照 します。 一 致 する 記 述 子 は2つのプロセスは、オープン・メッセージ・キュー 記 述 に 関 連連 するフラグ (mq_flags)を 共 有 します。各 メッセージは 優 先 度 を 持 っており、メッセージは 常 に 最 高 優 先 度 の 受 信 プロセスが 先 に 配郤 信 されます。メッセージ・キューは 仮 想 ファイル・システム 内 に 作 成 されます。このファイル・システムは 以下 のコマンドを 使 ってマウントすることが 可 能 です。$ mkdir /dev/mqueue$ mount -t mqueue none /dev/mqueueファイル・システムがマウントされた 後 、システム 上 のメッセージ・キューは 通 常 ファイルのために 使 用 されるコマンド( 例 :ls(1), rm(1))を 使 って 見 ることおよび 操 作 することが 可 能 となります。POSIXメッセージ・キューのサポートはカーネル 構 成 パラメータPOSIX_MQUEUEを 介 して 構 成可 能 です。このオプションはデフォルトで 有 効 となっています。サンプルプログラムは 付 録 Aで提 供 されます。3-2


リアルタイム・プロセス 間 通 信System Vメッセージ3メッセージ・キュー・ライブラリ・ルーチンをコールするすべてのアプリケーションはリアルタイム・ライブラリに 静 的 または 動 的 のどちらでもリンクしなければなりません。 以 下 の 例 は 典 型的 なコマンドラインの 書 式 を 示 します。gcc [options...] file -lrt ...System Vのプロセス 間 通 信 (IPC: Iinterprocess Communication) 型 メッセージは、プロセス( 実 行 中 のプログラム)がバッファに 格 納 されたデータの 交 換 を 通 して 通 信 することを 可 能 にします。このデータはメッセージと 呼 ばれる 別 々の 部邪 分 の 中 でプロセス 間 に 送 信 されます。このIPC 型 を 利 用 するプロセスはメッセージの 送 信 および 受 信 が 可 能 です。プロセスがメッセージを 送 受 信 する 前 にオペレーティング・システムはこれらの 操 作 を 処 理 するためにソフトウェアのメカニズムを 作 成 する 必 要 があります。プロセスはmsgget(2)システムコールを 利 用 して 処 理 します。こうすることでプロセスはメッセージの 所 有 者 / 作 成 者 になり、それ自 体 を 含 む 全 てのプロセスに 対 して 初 期 操 作 の 権 限 を 指 定 します。その 後 、 所 有 者 / 作 成 者 は 所 有権 の 放 棄 またはmsgctl(2)システムコールを 使 って 操 作 権 限 を 変 更 することが 可 能 となります。しかし、 作 成 者 は 機 能 が 存 在 する 限 り 依 然 として 作 成 者 のままです。 権 限 を 持 つほかのプロセスは様 々な 他 の 制 御 機 能 を 実 行 するためにmsgctlを 使 うことが 可 能 です。もし 操 作 の 実 行 に 失 敗 した 場 合 、 権 限 を 持 っておりメッセージの 送 受 信 を 行 おうとしているプロセスは 実 行 を 停 止 することが 可 能 です。これは、メッセージの 送 信 をしようとしているプロセスは 指 定 されたメッセージ・キューに 対 してメッセージを 送 信 することが 可 能 になるまで 待 つことが 出 来 ます。この 受 信 プロセスは 影 響 を 及 ぼすことはなく( 間 接 的 を 除 く: 例 えば、もし 消 費 者が 消 滅 していなければ、そのキューのスペースは 最 終 的 には 空 になります)、 逆 も 同 じとなります。実 行 の 停 止 を 指 示 するプロセスはブロッキング・メッセージ 操 作 を 実 行 します。 実 行 の 停 止 を 許可 されないプロセスはノンブロッキング・メッセージ 操 作 を 実 行 します。3-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>メッセージの 利 用 3ブロッキング・メッセージ 操 作 を 実 行 するプロセスは、3つの 条 件 の1つが 発 生 するまで 停 止 することが 可 能 です。• 操 作 が 成 功• プロセスがシグナルを 受 信• システムからメッセージ・キューが 削 除システムコールはプロセスに 利 用 可 能 なこれらのメッセージ・ケーパビリティを 作 ります。 呼 び出 し 元 プロセスはシステムコールに 引 数 を 渡 し、システムコールはその 機 能 が 成 功 または 失 敗 のどちらかとなります。もしそのシステムコールが 成 功 した 場 合 、その 機 能 は 実 行 され 適遚 切 な 情 報を 返 します。そうではない 場 合 、プロセスに-1が 返 され、それに 応 じたerrnoが 設 定 されます。メッセージが 送 信 または 受 信 する 前 にユニークな 識 別 されたメッセージ・キューとデータ 構 造造 体を 作 成 する 必 要 があります。そのユニークな 識 別 子 はメッセージ・キュー 識 別 子 (msqid)と 呼 ばれます(これは 関 連連 するメッセージ・キューやデータ 構 造造 体 を 確 認 もしくは 参 照 するために 使 用 されます)。この 識 別 子 は 通 常 のアクセス 制 限 下 にあるシステムのあらゆるプロセスよりアクセス 可 能です。メッセージ・キューの 対 応 するカーネルデータ 構 造造 体 は 送 信 されるもしくは 受 信 される 各 メッセージに 関 する 情 報 を 保 持 するために 使 用 されます。システム 内 部邪 で 使 用 されるこの 情 報 は、 以 下の 各 メッセージが 含 まれます。• メッセージの 種 類• テキスト・メッセージのサイズ• テキスト・メッセージのアドレスユニークな 識 別 されたメッセージ・キューmsqid_dsのために1つの 関 連連 するデータ 構 造造 体 が 存 在します。このデータ 構 造造 体 はメッセージ・キューに 関 連連 する 以 下 の 情 報 を 含 んでいます。• データの 権 限 操 作 ( 構 造造 の 権 限 操 作 )• キュー 上 の 現 在 のバイト 数• キュー 上 のメッセージの 数• キュー 上 の 最 大 バイト 数• 最 後 にメッセージを 送 信 したプロセス 識 別 番 号 (PID)• 最 後 にメッセージを 受 信 したPID• 最 後 にメッセージを 送 信 した 時 間• 最 後 にメッセージを 受 信 した 時 間• 最 後 に 変 更 した 時 間NOTE本 章 で 説 明 するすべてのC 言 語 のヘッダーファイルは、/usr/includeサブディレクトリにあります。3-4


リアルタイム・プロセス 間 通 信関 連連 するメッセージ・キュー・データ 構 造造 体 msqid_dsの 定 義 は 図 3-1に 示 すメンバーに 含 まれています。図 3-1 msqid_ds 構 造造 体 の 定 義struct ipc_perm msg_perm;/* structure describing operation permission*/__time_t msg_stime; /* time of last msgsnd command */__time_t msg_rtime; /* time of last msgrcv command */__time_t msg_ctime; /* time of last change */unsigned long int __msg_cbytes; /* current number of bytes on queue */msgqnum_t msg_qnum; /* number of messages currently on queue */msglen_t msg_qbytes;/* max number of bytes allowed on queue */__pid_t msg_lspid; /* pid of last msgsnd() */__pid_t msg_lrpid; /* pid of last msgrcv() */C 言 語 のデータ 構 造造 体 msqid_dsの 定 義 は、 実 際 にはこの 構 造造 体 は に 定 義 されていますが、ヘッダーファイルをインクルードすることにより 取 得 する 必 要 があります。プロセス 間 通 信 許 可 データ 構 造造 体 ipc_perm の 定 義 は、 図 3-2に 示 すメンバーに 含 まれています。図 3-2 ipc_perm 構 造造 体 の 定 義__key_t __key; /* Key. */__uid_t uid; /* Owner's user ID. */__gid_t gid; /* Owner's group ID. */__uid_t cuid; /* Creator's user ID. */__gid_t cgid; /* Creator's group ID. */unsigned short int mode; /* Read/write permission. */unsigned short int __seq; /* Sequence number. */C 言 語 のデータ 構 造造 体 ipc_permの 定 義 は、 実 際 にはこの 構 造造 体 はに 定 義 されていますが、ヘッダーファイルをインクルードすることにより 取 得 する 必 要 があります。は 一 般 的 に 全 てのIPC 機 能 に 使 用 されることに 注 意 してください。msgget(2)システムコールは2つのタスクの1つを 実 行 します。• 新 しいメッセージ・キュー 識 別 子 を 作 成 し、それに 対 応 するメッセージ・キューとデータ 構造造 体 を 作 成 します• 既 にメッセージ・キューとデータ 構 造造 体 に 対 応 した 既 存 のメッセージ・キュー 識 別 子 を 確 認します両 方 のタスクはmsggetシステムコールに 渡 す 引 数 key が 必 要 です。もしkey が 既 存 のメッセージ・キューに 使 用 されていない 場 合 、システム・チューニング・パラメータを 超 えない 条 件 で 新しい 識 別 子 はkey に 対 応 するメッセージ・キューとデータ 構 造造 体 を 作 成 して 返 します。3-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>key の 値 がゼロ(IPC_PRIVATE)を 指 定 するための 条 件 もあります。IPC_PRIVATEが 指 定 されたとき、 新 しい 識 別 子 はメッセージ・キュー 最 大 数 (MSGMNI)のシステム 制 限 を 超 えない 限 り、 常 に対 応 するメッセージ・キューとデータ 構 造造 体 を 作 成 して 返 します。ipcs(8)コマンドは 全 てゼロでmsqid のためのkey フィールドを 表 示 します。もしメッセージ・キュー 識 別 子 が 指 定 されたkey が 存 在 する 場 合 、 既 存 の 識 別 子 の 値 が 返 されます。もし 既 存 のメッセージ・キュー 識 別 子 を 返 して 欲 しくない 場 合 、 制 御 コマンド(IPC_EXCL)をシステムコールに 渡 すmsgflg 引 数 に 設 定 することが 可 能 です( 本 システムコールの 詳 細 は、「msggetシステムコール」を 参 照 してください)。メッセージ・キューが 作 成 される 時 、msggetをコールしたプロセスは 所 有 者 / 作 成 者 になり、 対応 するデータ 構 造造 体 はそれに 応 じて 初 期 化 されます。 所 有 権 を 変 更 することは 可 能 ですが、 作 成されるプロセスは 常 に 作 成 者 のままであることを 覚 えておいてください。メッセージ・キュー 作成 者 もまたそれのために 初 期 操 作 権 限 を 決 定 します。一 旦 ユニークなメッセージ・キュー 識 別 子 が 作 成 された、もしくは 既 存 の 識 別 子 が 見 つかたら、msgop(2)(メッセージ 操 作 )とmsgctl(2)(メッセージ 制 御 )を 使 用 することが 可 能 です。前 述 のようにメッセージ 操 作 はメッセージの 送 信 と 受 信 で 構 成 されます。msgsndとmsgrcvのシステムコールは 各 々の 操 作 のために 提 供 されます(これらのシステムコールの 詳 細 は「msgsndおよびmsgrcvシステムコール」を 参 照 してください)。msgctlシステムコールは 以 下 の 方 法 によりメッセージ 機 能 を 制 御 することを 許 可 します。• メッセージ・キュー 識 別 子 に 対 応 するデータ 構 造造 体 の 取 得 (IPC_STAT)• メッセージ・キュー 権 限 の 変 更 操 作 (IPC_SET)• 特 定 メッセージ・キューのメッセージ・キューサイズ(msg_qbytes)の 変 更 (IPC_SET)• 対 応 するメッセージ・キューとデータ 構 造造 体 と 共 にオペレーティング・システムから 特 定 メッセージ・キュー 識 別 子 の 削 除 (IPC_RMID)msgctlシステムコールの 詳 細 は「msgctlシステムコール」セクションを 参 照 してください。System Vメッセージ・キューを 利 用 したサンプルプログラムに 関 しては、 付 録 Aを 参 照 してください。 更 なるサンプルプログラムは、 各 System Vシステムコールを 深 く 掘 り 下 げた 使 い 方 の 説 明をインターネットで 見 つけることが 可 能 です。これらはシステムコールを 説 明 する 本 章 のセクションの 中 で 記 載 されています。3-6


リアルタイム・プロセス 間 通 信msggetシステムコールシステムコール3msgget(2)は 新 しいメッセージ・キューを 作 成 または 既 存 のメッセージ・キューを 取 得 します。本 セクションではmsggetシステムコールを 説 明 します。より 詳 細 な 情 報 はmsgget(2)のmanページを 参 照 してください。この 呼 び 出 しの 使 用 を 説 明 しているプログラムは、README.msgget.txt内 に 提 供 された 多 数 のコメントと 共 に/usr/share/doc/ccur/examples/msgget.cで 見 つけることが 可 能 です。概 要#include #include #include int msgget (key_t key, int msgflg);上 記 の 全 てのインクルードファイルは、オペレーティング・システムの/usr/includeサブディレクトリにあります。key_t はヘッダーファイルの 中 で 整 数 型 にするためにtypedefによって 定 義 されています(このヘッダーファイルは 内 部邪 に 含 まれています)。 正 常 終 了 した 場 合にこの 機 能 から 返 される 整 数 はユニークなメッセージ・キュー 識 別 子 msqid です(msqid は 本 章 の「メッセージの 利 用 」セクション 内 で 説 明 されています)。 失 敗 した 場 合 、 外 部邪 変 数 errnoに 失 敗の 理 由 を 知 らせる 値 が 設 定 され、-1が 返 されます。メッセージ・キューとデータ 構 造造 体 に 対 応 する 新 しいmsqid は 以 下 の 条 件 に1つでも 該 当 する 場 合に 作 成 されます。• key がIPC_PRIVATE• メッセージ・キューとデータ 構 造造 体 に 対 応 するmsqid が 存 在 しないkey、かつmsgflgとIPC_CREATの 論 理 積 がゼロではないmsgflg 値 の 組 み 合 わせ:• 制 御 コマンド (フラグ)• 操 作 パーミッション制 御 コマンドはあらかじめ 定 義 された 定 数 です。 以 下 の 制 御 コマンドはmsggetシステムコールに 適遚 用 され、ヘッダーファイル 内 部邪 に 含 まれるヘッダーファイル 内 に 定義 されています。IPC_CREATIPC_EXCL新 しいセグメントを 作 成 するために 使 用 されます。もし 使 用 されない場 合 、msggetはkey に 対 応 するメッセージ・キューの 検 出 、アクセス 許 可 の 確 認 、セグメントに 破 棄 マークがないことを 確 認 します。IPC_CREATと 一 緒 の 使 用 は、 指 定 されたkey に 対 応 するメッセージ・キュー 識 別 子 が 既 に 存 在 している 場 合 、このシステムコールはエラーを 引 き 起 こします。これは 新 しい(ユニークな) 識 別 子 を 受 け 取 らなかった 時 に 受 け 取 ったと 考 えてしまうことからプロセスを 守 るために 必 要 です。操 作 パーミッションは、 対 応 するメッセージ・キュー 上 で 実 行 することを 許 可 されたプロセスの操 作 を 決 定 します。「 読 み 取 り」 許 可 はメッセージを 受 信 するため、またはmsgctlのIPC_STAT3-7


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>操 作 によってキューのステータスを 決 定 するために 必 要 です。“ 書 き 込 み” 許 可 はメッセージを送 信 するために 必 要 です。表 3-1は 有 効 な 操 作 パーミッション・コードの(8 進逭 数 で 示 す) 数 値 を 示 します。表 3-1 メッセージ・キューの 操 作 パーミッション・コード操 作 パーミッションRead by UserWrite by UserRead by GroupWrite by GroupRead by OthersWrite by Others8 進逭 数 値004000020000040000200000400002特 有 の 値 は、 必 要 とする 操 作 パーミッションのために8 進逭 数 値 を 追 加 もしくはビット 単 位 の 論 理 和によって 生 成 されます。これが、もし「Read by User」と「Read/Write by Others」を 要 求 された 場合 、コードの 値 は00406(00400+00006)となります。msgflg 値 は、フラグ 名 称 と8 進逭 数 の 操 作 パーミッション 値 を 一 緒 に 使 用 して 簡 単 に 設 定 することが 可 能 です。使 用 例 :msqid = msgget (key, (IPC_CREAT | 0400));msqid = msgget (key, (IPC_CREAT | IPC_EXCL | 0400));システムコールを 常 に 企 てられます。MSGMNIの 制 限 を 超 えると 常 に 失 敗 を 引 き 起 こします。MSGMNIの 制 限 値 は、その 時 々で 使 用 されている 可 能 性 のあるシステム 全 体 のユニークなメッセージ・キューの 数 で 決 定 します。この 制 限 値 はの 中 にある 固 定 された 定 義 値 です。メッセージ・キュー 制 限 値 のリストは 以 下 のオプションを 使 ってipcs(8)コマンドで 取 得 することができます。さらに 詳 細 はmanページを 参 照 してください。ipcs -q -l特 定 の 関 連連 したデータ 構 造造 体 の 初 期 化 だけでなく 特 定 のエラー 条 件 に 関 してmsgget(2)のmanページを 参 照 してください。3-8


リアルタイム・プロセス 間 通 信msgctlシステムコール3msgctl(2)はメッセージ・キュー 上 の 制 御 操 作 を 実 行 するために 使 用 されます。本 セクションではmsgctl(2)システムコールを 説 明 します。さらに 詳 細 な 情 報 はmsgctl(2)のmanページを 参 照 してください。この 呼 び 出 しの 使 用 を 説 明 しているプログラムは、README.msgctl.txt 内 に 提 供 された 多 くのコメントと 共 に/usr/share/doc/ccur/examples/msgctl.cで 見 つけることが 可 能 です。概 要#include #include #include int msgctl (int msqid, int cmd, struct msqid_ds *buf);上 記 の 全 てのインクルードファイルは、オペレーティング・システムの/usr/includeサブディレクトリにあります。msgctlシステムコールは 正 常 終 了 で0、それ 以 外 で-1の 整 数 値 を 返 します。msqid 変 数 はmsggetシステムコールを 使 って 作 成 された 有 効 な 負 ではない 整 数 値 でなければなりません。cmd 引 数 は 以 下 の 値 のいずれかとなります。IPC_STATIPC_SETIPC_RMID指 定 されたメッセージ・キュー 識 別 子 に 対 応 するデータ 構 造造 体 、ポインタbuf によって 指 し 示 されるユーザーメモリ 空 間 のデータ 構 造造 体の 場 所 を 含 むステータス 情 報 を 返 します。「Read」 許 可 が 必 要 です。有 効 なユーザーIDとグループID、 操 作 パーミッション、メッセージ・キューのバイト 数 を 含 むポインタbuf によって 指 し 示 されるユーザーメモリ 空 間 のデータ 構 造造 体 を 書 き 込 みます。指 定 されたメッセージ・キューと 共 にそれに 対 応 するデータ 構 造造 体 を削 除 します。NOTEmsgctl(2)サービスはIPC_INFO, MSG_STAT, MSG_INFOコマンドもサポートします。しかし、これらのコマンドはipcs(8)ユーティリティで 使 用するためだけに 意 図 されているので、これらのコマンドについての 説 明はありません。3-9


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>IPC_SETまたはIPC_RMID 制 御 コマンドを 実 行 するため、プロセスは 以 下 の 条 件 を1つ 以 上 満 たしていなければなりません。• 有 効 なOWNER のユーザーIDを 所 有• 有 効 なCREATOR のユーザーIDを 所 有• スーパーユーザー• CAP_SYS_ADMINケーパビリティを 所 有さらにMSGMNB(で 定 義 )の 値 を 超 えてmsg_qbytesのサイズを 増 やすIPC_SET 制御 コマンドを 実 行 する 時 、プロセスはCAP_SYS_RESOURCEケーパビリティを 所 有 していなければなりません。メッセージ・キューは、-q msgid(メッセージ・キュー 識 別 子 )または-Q msgkey( 対 応 するメッセージ・キューのキー)オプション 指 定 によるipcrm(8)コマンドの 利 用 で 削 除 される 可 能 性 もあることに 注 意 してください。このコマンドを 使 用 するため、ユーザーは 同 じ 有 効 なユーザーIDもしくはIPC_RMID 制 御 コマンドの 実 行 に 必 要 なケーパビリティを 持 っている 必 要 があります。このコマンドの 使 用 に 関 して 更 なる 情 報 はipcrm(8)のmanページを 参 照 してください。msgsndおよびおよびmsgrcvシステムコール3msgsndおよびmsgrcvのメッセージ 操 作 システムコールは、メッセージの 送 受 信 するために 使 用されます。本 セクションではmsgsndとmsgrcvシステムコールを 説 明 します。より 詳 細 な 情 報 はmsgop (2)のmanページを 参 照 してください。この 呼 び 出 しの 使 用 を 説 明 しているプログラムは、README.msgop.txt 内 に 提 供 された 多 数 のコメントと 共 に/usr/share/doc/ccur/examples/msgop.cで 見 つけることが 可 能 です。概 要メッセージの 送 信 3#include #include #include int msgsnd (int msqid, void *msgp, size_t msgsz, int msgflg);int msgrcv (int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);上 記 の 全 てのインクルードファイルは、オペレーティング・システムの/usr/includeサブディレクトリにあります。msgsndシステムコールは 正 常 終 了 で0、それ 以 外 で-1の 整 数 値 を 返 します。msqid 変 数 はmsggetシステムコールを 使 って 作 成 された 有 効 な 負 ではない 整 数 値 でなければなりません。3-10


リアルタイム・プロセス 間 通 信メッセージの 受 信 3msgp 引 数 はメッセージの 形 式 および 送 信 するメッセージを 含 むユーザーメモリ 空 間 内 の 構 造造 体のポインタです。msgsz 引 数 はmsgp 引 数 によって 指 し 示 されるデータ 構 造造 体 の 文 字 配郤 列 の 長 さを 指 定 します。これはメッセージの 長 さになります。 配郤 列 の 最 大 サイズはの 中 で 定 義 されるMSGMAXによって 決定 されます。msgflg 引 数 は、IPC_NOWAITフラグが 設 定 されていない ((msgflg & IPC_NOWAIT)= = 0) 場 合 はメッセージ 操 作 の 実 行 はブロックされ、 指 定 されたメッセージ・キュー 上 に 割 り 当 てられた 合 計 バイト 数 が 使 用 されている 場 合 (msg_qbytes) は 操 作 はブロックされます。IPC_NOWAITフラグがセットされている 場 合 、システムコールは 失 敗 し、-1を 返 します。msgrcvシステムコールが 成 功 した 時 は 受 信 したバイト 数 を 返 し、 失 敗 した 時 は-1を 返 します。msqid 引 数 は 有 効 な 負 ではない 整 数 値 でなければなりません。つまり、msqid 引 数 はmsggetシステムコールを 使 って 作 成 された 整 数 値 でなければなりません。msgp 引 数 はメッセージの 形 式 やメッセージテキストを 受 信 するユーザー 空 間 内 の 構 造造 体 へのポインタです。msgsz 引 数 は 受 信 するメッセージの 長 さを 指 定 します。もしこの 値 がメッセージの 配郤 列 よりも 小さい 場 合 、 必 要 であればエラーを 返 すことが 可 能 です。( 下 のmsgflg 引 数 を 参 照 してください)msgtyp 引 数 は 指 定 された 特 定 の 形 式 のメッセージ・キュー 上 の 最 初 のメッセージを 遥 ぶために 使用 されます。• msgtyp がゼロの 場 合 、キューの 最 初 のメッセージを 受 信• msgtyp がゼロよりも 大 きくmsgflg にMSG_EXCEPTが 設 定 さていない 場 合 、 同 じ 型 式 の 最 初のメッセージを 受 信• msgtyp がゼロよりも 大 きくmsgflg にMSG_EXCEPTが 設 定 さている 場 合 、msgflg ではないキューの 最 初 のメッセージを 受 信• msgtyp がゼロよりも 小 さい 場 合 、msgtyp の 絶 対 値 以 下 で 最 も 小 さいメッセージの 型 式 を 受信msgflg 引 数 は、IPC_NOWAITフラグが 設 定 されていない((msgflg & IPC_NOWAIT)= = 0) 場 合 はメッセージ 操 作 の 実 行 はブロックされ、 指 定 されたメッセージ・キュー 上 に 割 り 当 てられた 合 計 バイト 数 が 使 用 されている 場 合 (msg_qbytes) は 操 作 はブロックされます。IPC_NOWAITフラグがセットされている 場 合 、システムコールは 失 敗 し、-1を 返 します。そして、 前 述 したとおり、MSG_EXCEPTフラグがmsgflg 引 数 に 設 定 されてmsgtyp 引 数 がゼロより 大 きい 場 合 、msgtyp 引 数とは 異 なるメッセージの 型 式 のキューの 最 初 のメッセージを 受 信 します。IPC_NOWAITフラグが 設 定 された 場 合 、キュー 上 に 必 要 とする 型 式 のメッセージがない 時 にシステムコールは 即 座 に 失 敗 します。msgflg はメッセージが 受 信 するサイズよりも 長 い 場 合 にシステムコールが 失 敗 するように 指 定 します。これはmsgflg 引 数 にMSG_NOERRORを 設 定 しない((msgflg & MSG_NOERROR)) == 0) ことによってなされます。もしMSG_NOERRORフラグを 設 定した 場 合 、メッセージはmsgrcvのmsgsz 引 数 で 指 定 された 長 さに 切 り 捨 てられます。3-11


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>POSIX 共 有 メモリ 3POSIX 共 有 メモリ・インターフェースは、 協 同 プロセスがデータを 共 有 することおよび 共 有 メモリ・オブジェクトの 利 用 を 通 してより 効 率 的 に 通 信 することを 可 能 にします。 共 有 メモリ・オブジェクト はファイル・システムから 独 立 してストレージの 名 前 つき 領 域 として 定 義 され、 関 連連 メモリを 共 有 するために1つ 以 上 のプロセスのアドレス 空 間 にマッピングすることが 可 能 です。以 下 にインターフェースを 簡 単 に 記 述 します。shm_openshm_unlink共 有 メモリ・オブジェクトの 作 成 および 共 有 メモリ・オブジェクトとファイル 記 述 子 間 の 接 続 を 確 立共 有 メモリ・オブジェクトの 名 前 を 削 除shm_openルーチンを 利 用 する 手 順 は「shm_openルーチンの 利 用 」の 中 で 紹 介 されています。shm_unlinkルーチンを 利 用 する 手 順 は「shm_unlinkルーチンの 利 用 」の 中 で 紹 介 されています。データ 共 有 のために 協 同 プロセスがこれらのインターフェースを 使 用 するためには、1つのプロセスは 以 下 のステップを 完 了 します。 紹 介 するステップの 手 順 は 標 準 的 なもので、 利 用 可 能 な 唯 一の 手 順 ではないことに 注 意 してください。STEP 1: shm_openライブラリルーチンの 呼 び 出 し、ユニークな 名 前 の 指 定 、読 み 書 きする 共 有 メモリ・オブジェクトをオープンするためのO_CREATとO_RDWRビットの 設 定 により 共 有 メモリ・オブジェクトの 作 成 およびそのオブジェクトとファイル 記 述 子 間 の 接 続 を 確 立 します。STEP 2:STEP 3:ftruncate(2)システムコールの 呼 び 出 し、STEP 1で 取 得 したファイル記 述 子 の 指 定 により 共 有 メモリ・オブジェクトのサイズを 設 定 します。このシステムコールは 書 き 込 み 用 にメモリ・オブジェクトがオープンされている 必 要 があります。ftruncate(2)に 関 する 更 なる 情 報 は 対 応するmanページを 参 照 してください。mmap(2)システムコールの 呼 び 出 し、およびSTEP 1で 取 得 したファイル 記 述 子 の 指 定 により、プロセスの 仮 想 アドレス 空 間 の 一 部邪 を 共有 メモリ・オブジェクトにマッピングします。( 本 システムコールの解 説 は「メモリ・マッピング」 章 を 参 照 してください)共 有 メモリ・オブジェクトを 使 用 するため、 他 の 協 同 プロセスは 以 下 のステップを 完 了 します。紹 介 するステップの 手 順 は 標 準 的 なもので、 利 用 可 能 な 唯 一 の 手 順 ではないことに 注 意 してください。STEP 1:STEP 2:最 初 のプロセスによって 作 成 された 共 有 メモリ・オブジェクトとshm_openライブラリルーチンの 呼 び 出 し、オブジェクトの 作 成 に 使用 した 同 じ 名 前 の 指 定 によりファイル 記 述 子 間 の 接 続 を 確 立 します。もし 共 有 メモリ・オブジェクトのサイズがわからない 場 合 、fstat(2)システムコールの 呼 び 出 し、STEP 1で 取 得 したファイル 記 述 子 とstat 構 造造 体 (で 定 義 )へのポインタの 指 定 により 共 有 メモリ・オブジェクトのサイズを 取 得 します。3-12


リアルタイム・プロセス 間 通 信オブジェクトのサイズはstat 構 造造 体 のst_size 領 域 の 中 に 返 されます。オブジェクトに 対 応 するアクセス 許 可 はst_modes 領 域 の 中 に返 されます。fstat(2)に 関 する 更 なる 情 報 は 対 応 するシステム・マニュアルのページを 参 照 してください。STEP 3:mmapの 呼 び 出 し、およびSTEP 1で 取 得 したファイル 記 述 子 により、プロセスの 仮 想 アドレス 空 間 の 一 部邪 を 共 有 メモリ・オブジェクトにマッピングします( 本 システムコールの 解 説 は「メモリ・マッピング」章 を 参 照 してください)。shm_openルーチンの 利 用 3shm_open(3) ルーチンは、 呼 び 出 し 元 プロセスのPOSIX 共 有 メモリ・オブジェクトの 作 成 、およびオブジェクトとファイル 記 述 子 間 接 続 の 確 立 が 可 能 です。プロセスは 続 いてftruncate(2),fstat(2), mmap(2)を 呼 び 出 して 共 有 メモリ・オブジェクトを 参 照 するためにshm_openが 返 したファイル 記 述 子 を 使 います。プロセスが 共 有 メモリ・オブジェクトを 作 成 した 後 、 他 のプロセスは 共 有 メモリ・オブジェクトとshm_openの 呼 び 出 し、 同 じ 名 前 の 指 定 によるファイル 記 述 子 間の 接 続 を 確 立 することが 可 能 になります。共 有 メモリ・オブジェクトが 作 成 された 後 、 共 有 メモリ・オブジェクト 内 の 全 データはmunmap(2),exec(2), exit(2)の 呼 び 出 し、および1つのプロセスがshm_unlink(3)を 呼 び 出 して 共 有 メモリ・オブジェクトの 名 前 を 削 除 することにより 全 てのプロセスがアドレス 空 間 と 共 有 メモリ・オブジェクト 間 のマッピングを 削 除 するまで 残 ります。お 使 いのシステムを 再 起 動 した 後 は、 共 有 メモリ・オブジェクトもその 名 前 も 有 効 ではありません。概 要#include #include int shm_open(const char *name, int oflag, mode_t mode);引 数 は 以 下 のように 定 義 されます:name共 有 メモリ・オブジェクトの 名 前 を 指 定 するNULLで 終 わる 文 字 列 のポインタ。この 文 字 列 は 最 大 255 文 字 に 制 限 される 可 能 性 があることに 注 意 してください。これに 先 頭 のスラッシュ(/) 文 字 を 含 めることが 可 能 ですが、 途 中 にスラッシュ 文 字 を 含 めてはいけません。この 名前 はファイル・システムの 一 部邪 ではないことに 注 意 してください: 先頭 のスラッシュも 現 在 の 作 業 ディレクトリも 名 前 の 解 釈 に 影 響 を 及ぼしません(/shared_obj とshared_objは 同 一 の 名 前 として 解 釈 します)。もしPOSIXインターフェースをサポートするあらゆるシステムに 移 植 できるコードを 書 きたいと 考 えているのであれば、name はスラッシュ 文 字 で 始 めることを 推 奨 します。oflag 以 下 のビットをつ 以 上 設 定 した 整 数 値 。O_RDONLYとO_RDWRは 相 互 排 他 的 なビットであり、どちらか 一 方が 設 定 されている 必 要 があることに 注 意 してください。3-13


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>O_RDONLYO_RDWRO_CREAT共 有 メモリ・オブジェクトを 読 み 取 り 専 用 でオープンします。共 有 メモリ・オブジェクトを 読 み 書 き 用 にオープンします。 共 有 メモリ・オブジェクトを 作 成するプロセスはftruncate(2)の 呼 び 出 しによってそのサイズを 設 定 できるようにするために 書き 込 み 用 でオープンしなければならないことに注 意 してください。存 在 しない 場 合 、name で 指 定 された 共 有 メモリ・オブジェクトを 作 成 します。メモリ・オブジェクトのユーザーIDは 呼 び 出 したプロセスの有 効 なユーザーIDに 設 定 され、このグループIDは 呼 び 出 したプロセスの 有 効 なグループIDに 設定 し、mode 引 数 により 指 定 された 許 可 ビットが設 定 されます。name で 指 定 された 共 有 メモリ・オブジェクトが存 在 する 場 合 、O_EXCLを 目 的 として 記 述 されている 以 外 は、 設 定 されたO_CREATは 効 力 がありません。O_EXCLもしO_CREATが 設 定 されname で 指 定 された共 有 メモリ・オブジェクトが 存 在 する 場 合 、shm_openは 失 敗 します。もしO_CREATが 設 定されていない 場 合 、このビットは 無 視 されます。もしオブジェクトが 存 在 し、 読 み 書 き 用 にオープンされた 場 合 、O_TRUNCはname で 指 定 された 共 有 メモリ・オブジェクトの 長 さはゼロに 切り 詰 められます。 所 有 者 と 共 有 メモリ・オブジェクトのモードは 変 更 されません。mode次 の 例 外 と 共 にname で 指 定 された 共 有 メモリ・オブジェクトの 許 可ビットが 設 定 された 整 数 値 :プロセスのファイル・モード 作 成 マスクに 設 定 されたビットは 共 有 メモリ・オブジェクトのモード( 更 なる 情報 はumask(2)とchmod(2)のmanページを 参 照 してください)の 中 でクリアされます。もしmode に 許 可 ビット 以 外 のビットが 設 定 されている 場 合 、それらは 無 視 されます。 共 有 メモリ・オブジェクトを 作 成している 時 のみ、プロセスはmode 引 数 を 指 定 します。もし 呼 び 出 しが 成 功 した 場 合 、shm_openはサイズがゼロの 共 有 メモリ・オブジェクトを 作 成 し、呼 び 出 し 元 プロセスに 対 してオープンしていないファイル 記 述 子 を 返 します。FD_CLOEXECファイル 記 述 子 フラグは 新 しいファイル 記 述 子 のために 設 定 され、このフラグは 共 有 メモリ・オブジェクトを 識 別 するファイル 記 述 子 がexec(2)システムコール( 更 なる 情 報 はfcntl(2) のシステム・マニュアルのページを 参 照 してください)の 実 行 でクローズされることを 示 します。戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 示 すために 設 定 されます。 発 生 する可 能 性 のあるエラーのタイプのリストについてはshm_open(3)のmanページを 参 照 してください。3-14


リアルタイム・プロセス 間 通 信shm_unlinkルーチンの 利 用 3shm_unlink(3)ルーチンは 呼 び 出 し 元 プロセスが 共 有 メモリ・オブジェクトの 名 前 を 削 除 することを 許 可 します。もし1つ 以 上 のプロセスが 呼 び 出 した 時 点 で 共 有 メモリ・オブジェクトにマッピングされたアドレス 空 間 の 一 部邪 を 所 有 している 場 合 、shm_unlinkが 返 す 前 に 名 前 は 削 除 されますが、 共 有 メモリ・オブジェクトの 中 のデータは 最 後 のプロセスがマッピングしたオブジェクトを 削 除 するまで 削 除 されません。もしプロセスがmunmap(2), exec(2), exit(2)を 呼 び 出 した 場合 、マッピングは 削 除 されます。概 要#include #include int shm_unlink(const char *name);引 数 は 以 下 のように 定 義 されます:name削 除 する 共 有 メモリ・オブジェクト 名 を 指 定 するNULLで 終 わる 文 字列 のポインタ。この 文 字 列 は 最 大 255 文 字 に 制 限 される 可 能 性 があることに 注 意 してください。これに 先 頭 のスラッシュ(/) 文 字 を 含 めることが 可 能 ですが、 途 中 にスラッシュ 文 字 を 含 めてはいけません。この 名 前 はファイル・システムの 一 部邪 ではないことに 注 意 してください: 先 頭 のスラッシュも 現 在 の 作 業 ディレクトリも 名 前 の 解 釈 に 影 響を 及 ぼしません(/shared_objとshared_objは 同 一 の 名 前 として 解 釈します)。もしPOSIXインターフェースをサポートするあらゆるシステムに 移 植 できるコードを 書 きたいと 考 えているのであれば、nameはスラッシュ 文 字 で 始 めることを 推 奨 します。System V 共 有 メモリ 3戻 り 値 0はshm_unlinkの 呼 び 出 しが 成 功 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを 示 します。errnoはエラーを 示 すために 設 定 されます。 発 生 する 可 能 性 のあるエラーのタイプのリストについてはshm_ unlink(3)のmanページを 参 照 してください。もしエラーが 発 生 した 場合 、shm_unlinkの 呼 び 出 しは 名 前 付 き 共 有 メモリ・オブジェクトを 変 更 しません。共 有 メモリは2つ 以 上 のプロセスがメモリ、つまりその 中 に 格 納 されているデータを 共 有 することを 可 能 にします。これは 共 通 の 仮 想 メモリアドレス 空 間 へのアクセスの 設 定 を 許 可 することによって 行 われます。この 共 有 は 領 域 ベースで 存 在 し、それはハードウェア 依 存 のメモリ 管 理 となります。プロセスは 最 初 にshmget(2)システムコールを 使 って 共 有 メモリ 領 域 を 作 成 します。 作 成 に 関 し、プロセスは 共 有 メモリ 領 域 のために 全 体 的 な 操 作 許 可 を 設 定 して、サイズをバイトで 設 定 し、 共有 メモリ 領 域 を 参 照 専 用 ( 読 み 取 り 専 用 )で 結 合 するように 指 定 することが 可 能 です。もしメモリ 領 域 が 参 照 専 用 として 指 定 されていない 場 合 、 適遚 切 な 操 作 許 可 を 持 つ 他 の 全 てのプロセスはメモリ 領 域 の 読 み 取 り、または 書 き 込 みが 可 能 です。システム 上 の 共 有 メモリ 領 域 は/proc/sysvipc/shmファイルおよび-mオプションを 使 用 してipcs(8)を 介 して 見 ることができます。3-15


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>共 有 メモリの 利 用 3共 有 メモリの 操 作 、shmat(2)( 共 有 メモリの 結 合 )とshmdt(2)( 共 有 メモリの 分 離 )は、 共 有 メモリ領 域 上 で 実 行 することが 可 能 です。もしプロセスがパーミッションを 所 有 している 場 合 、shmatはプロセスが 共 有 メモリ 領 域 に 結 合 することを 許 可 します。その 後 、 許 可 されて 読 み 取 りまたは書 き 込 みが 可 能 になります。shmdtはプロセスが 共 有 メモリ 領 域 から 分 離 することを 許 可 します。その 結 果 、 共 有 メモリ 領 域 への 読 み 書 きの 機 能 を 失 います。共 有 メモリ 領 域 の 最 初 の 所 有 者 / 作 成 者 は、shmctl(2)システムコールを 使 って 他 のプロセスへ 所有 権 を 放 棄 することが 可 能 です。しかし、 機 能 が 削 除 される、もしくはシステムが 最 初 期 かされるまで 作 成 されたプロセスは 作 成 者 のままとなります。パーミッションを 持 つ 他 のプロセスは、shmctlシステムコールを 使 って 共 有 メモリ 領 域 上 の 他 の 機 能 を 実 行 することが 可 能 です。プロセスはshmbind(2)システムコールを 使 ってI/Oメモリ 領 域 へ 共 有 メモリ 領 域 をバインドすることが 可 能 です。shmbindシステムコールの 詳 細 は「 共 有 メモリ 領 域 をI/O 空 間 へバインド」セクションを 参 照 してください。協 同 プログラムによって 共 有 メモリの 利 用 を 容 易 にするため、shmdefine(1)と 呼 ばれるユーティリティが 提 供 されます。このユーティリティの 利 用 手 順 は「shmdefineユーティリティ」で 説 明 されています。 共 有 メモリ 領 域 の 作 成 と 物 理 メモリの 一 部邪 へのバインドを 援 助 するため、shmconfig(1) と 呼 ばれるユーティリティも 提 供 されます。このユーティリティの 利 用 手 順 は「shmconfigコマンド」で 説 明 されています。プロセス 間 のメモリ 共 有 は 仮 想 領 域 ベース 上 に 存 在 します。 常 にオペレーティング・システム 内に 存 在 する 個 々の 共 有 メモリ 領 域 のコピーが1つだけ 存 在 します。メモリの 共 有 が 稼 働 される 前 にユニークに 識 別 された 共 有 メモリ 領 域 とデータ 構 造造 体 が 作 成 される 必 要 があります。 作 成 されたユニークな 識 別 子 は 共 有 メモリ 識 別 子 (shmid)と 呼 ばれ、これは 対応 するデータ 構 造造 体 を 特 定 する、または 参 照 するために 使 用 されます。 通 常 のアクセス 制 限 を 条件 として、この 識 別 子 はシステム 内 のどのプロセスにも 利 用 可 能 です。各 共 有 メモリ 領 域 用 に 以 下 がデータ 構 造造 体 に 含 まれます。• 操 作 パーミッション• 領 域 サイズ• セグメント 記 述 子 ( 内 部邪 システムのためだけに 使 用 )• 最 後 に 操 作 を 実 行 したPID• 作 成 者 のPID• 現 在 結 合 しているプロセスの 数• 最 後 に 結 合 した 時 間• 最 後 に 切 り 離 した 時 間• 最 後 に 変 更 した 時 間3-16


リアルタイム・プロセス 間 通 信対 応 する 共 有 メモリ 領 域 データ 構 造造 体 shmid_dsの 定 義 は、 図 3-3に 示 すメンバー 含 みます。図 3-3 shmid_ds 構 造造 体 の 定 義struct shmid_ds {struct ipc_perm shm_perm; /* operation perms */int shm_segsz; /* size of segment (bytes) */time_t shm_atime; /* last attach time */time_t shm_dtime; /* last detach time */time_t shm_ctime; /* last change time */unsigned short shm_cpid; /* pid of creator */unsigned short shm_lpid; /* pid of last operator */short shm_nattch; /* no. of current attaches */};共 有 メモリ 領 域 のデータ 構 造造 体 shmid_ds 用 のC 言 語 データ 構 造造 体 の 定 義 は、ヘッダファイルの 中 にあります。この 構 造造 体 のshm_permメンバはテンプレートしてipc_permを 使 うことに 注 意 してください。IPC 機 能 のためにipc_permデータ 構 造造 体 は 全 て 同 じで、これはヘッダファイルの 中にあります。shmget(2)システムコールは2つの 仕 事 を 実 行 :• 新 しい 共 有 メモリ 識 別 子 を 取 得 し、 対 応 する 共 有 メモリ 領 域 データ 構 造造 体 を 作 成 します• 対 応 する 共 有 メモリ 領 域 データ 構 造造 体 を 持 っている 既 存 の 共 有 メモリ 識 別 子 を 返 します実 行 されるタスクは、shmgetシステムコールに 渡 すkey 引 数 の 値 によって 決 定 されます。key は 遥 択 した 整 数 、もしくはftokサブルーチンの 使 用 により 生 成 した 整 数 にすることが 可 能 です。ftokサブルーチンは 提 供 されたパス 名 と 識 別 子 をベースとするキーを 生 成 します。ftokを 使用 することで、ユニークなキーを 取 得 することが 可 能 になり、パス 名 に 関 連連 するファイルへのアクセス 制 限 でキーへのユーザーのアクセス 制 御 が 可 能 となります。もし 協 同 プロセスだけが 使 用可 能 なキーを 確 保 したい 場 合 、ftokを 使 用 することを 推 奨 します。このサブルーチンは 以 下 のように 指 定 されます。key_t ftok( path_name, id )path_name 引 数 は 呼 び 出 し 元 プロセスが 利 用 可 能 である 既 存 のファイルのパス 名 のポインタを 指定 します。id 引 数 は 協 同 プロセスグループを 独 自 に 特 定 する 文 字 を 指 定 します。ftokは 指 定 されたpath_name とid に 基 づくキーを 返 します。ftokの 使 用 に 関 する 追 加 情 報 はftok(3)のmanページの 中 で 提 供 されます。もしkey が 既 に 既 存 の 共 有 メモリ 識 別 子 に 使 用 されておらずshmflg にIPC_CREATフラグ 設 定 されている 場 合 、 新 しい 識 別 子 はシステム・チューニング・パラメータを 超 えない 条 件 で 作 成 された 共 有 メモリ 領 域 データ 構 造造 体 と 一 緒 に 返 されます。3-17


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>プライベート・キー(IPC_PRIVATE) として 知 られている 値 がゼロのkey を 指 定 するための 条 件 も存 在 し、プライベート・キーを 指 定 された 時 、 新 しいshmid はシステム・チューニング・パラメータを 超 えない 限 り、 常 に 作 成 された 共 有 メモリ 領 域 データ 構 造造 体 と 一 緒 に 返 されます。ipcs(8)コマンドはshmid のためのkey フィールドは 全 てゼロで 表 示 します。もし 指 定 されたkey のshmid が 存 在 する 場 合 、 既 存 のshmid の 値 が 返 されます。もし 既 存 のshmidを 返 す 必 要 が 無 い 場 合 、 制 御 コマンド(IPC_EXCL) はシステムコールに 渡 されるshmflg 引 数 の 中に 指 定 ( 設 定 )することが 可 能 です。新 しい 共 有 メモリ 領 域 が 作 成 された 時 shmgetをコールしたプロセスは 所 有 者 / 作 成 者 となり、それに 応 じて 対 応 するデータ 構 造造 体 は 初 期 化 されます。 所 有 権 は 変 更 される 可 能 性 がありますが、作 成 されたプロセスは 常 に 作 成 者 のままであることを 覚 えておいてください( 「shmctlシステムコール」を 参 照 してください)。 共 有 メモリ 領 域 の 作 成 者 はそれのために 最 初 の 操 作 パーミッションも 決 定 します。一 旦 識 別 されたユニークな 共 有 メモリ 領 域 データ 構 造造 体 が 作 成 されると、shmbind, shmctl, 共有 メモリ 操 作 (shmop)が 利 用 可 能 となります。shmbindシステムコールは、I/Oメモリの 一 部邪 に 共 有 メモリ 領 域 をバインドすることが 可 能 です。システムコールの 詳 細 は「 共 有 メモリ 領 域 をI/O 空 間 へバインド」セクションを 参 照 してください。shmctl(2)システムコールは 以 下 の 方 法 で 共 有 メモリ 機 能 を 制 御 することを 許 可 します。• 共 有 メモリ 領 域 に 関 わるデータ 構 造造 体 の 取 得 (IPC_STAT)• 共 有 メモリ 領 域 用 操 作 パーミッションの 変 更 (IPC_SET)• 対 応 する 共 有 メモリ 領 域 データ 構 造造 体 と 共 にオペレーティング・システムより 特 定 の 共 有 メモリ 領 域 を 削 除 (IPC_RMID)• メモリ 上 の 共 有 メモリ 領 域 のロック (SHM_LOCK)• 共 有 メモリ 領 域 のアンロック (SHM_UNLOCK)shmctlシステムコールの 詳 細 は「shmctlシステムコール」セクションを 参 照 してください。共 有 メモリ 領 域 操 作 (shmop)は 共 有 メモリ 領 域 の 結 合 と 分 離 で 構 成 されます。shmatとshmdtはそれらの 操 作 の 各 々のために 提 供 されます(shmatとshmdtシステムコールの 詳 細 は「shmatおよびshmdtシステムコール」セクションを 参 照 してください)。shmdefine(1)とshmconfig(1)ユーティリティは 共 有 メモリ 領 域 を 作 成 することが 可 能 なことに注 意 することは 重 要 です。これらのユーティリティに 関 する 情 報 は「 共 有 メモリ・ユーティリティ」セクションを 参 照 してください。3-18


リアルタイム・プロセス 間 通 信shmgetシステムコール3shmget(2)は 新 しい 共 有 メモリ 領 域 を 作 成 または 既 存 の 共 有 メモリ 領 域 を 特 定 します。本 セクションではshmgetシステムコールを 説 明 します。より 詳 細 な 情 報 はshmget (2)のmanページを 参 照 してください。この 呼 び 出 しの 使 用 を 説 明 しているプログラムは、README.shmget.txt内 に 提 供 された 多 数 のコメントと 共 に/usr/share/doc/ccur/examples/shmget.cで 見 つけることが 可 能 です。概 要#include #include int shmget (key_t key, size_t size, int shmflg);上 記 の 全 てのインクルードファイルは、オペレーティング・システムの/usr/includeサブディレクトリにあります。key_t はヘッダーファイルの 中 で 整 数 型 にするためにtypedefによって 定義 されています(このヘッダーファイルは 内 部邪 に 含 まれています)。 正 常 終 了 した場 合 にこのシステムコールから 返 される 整 数 は、key の 値 に 対 応 する 共 有 メモリ 領 域 識 別 子(shmid) です(shmid は 本 章 の「 共 有 メモリの 利 用 」セクション 内 で 説 明 されています)。 失 敗 した場 合 、 外 部邪 変 数 errnoに 失 敗 の 理 由 を 知 らせる 値 が 設 定 され、-1 が 返 されます。共 有 メモリデータ 構 造造 体 に 対 応 する 新 しいshmid は 以 下 の 条 件 に1つでも 該 当 する 場 合 に 作 成 されます。• key が IPC_PRIVATE• 共 有 メモリデータ 構 造造 体 に 対 応 するshmid が 存 在 しないkey 、かつshmflgとIPC_CREATの 論理 積 がゼロではないshmflg 値 の 組 み 合 わせ:• 制 御 コマンド (フラグ)• 操 作 パーミッション制 御 コマンドはあらかじめ 定 義 された 定 数 です。 以 下 の 制 御 コマンドはshmgetシステムコールに 適遚 用 され、ヘッダーファイル 内 部邪 に 含 まれるヘッダーファイル 内 に 定義 されています。IPC_CREATIPC_EXCL新 しいセグメントを 作 成 するために 使 用 されます。もし 使 用 されない場 合 、shmgetはkey に 対 応 するセグメントの 検 出 、アクセス 許 可 の確 認 、セグメントに 破 棄 マークがないことを 確 認 します。IPC_CREATと 一 緒 の 使 用 は、 指 定 されたkey に 対 応 する 共 有 メモリ識 別 子 が 既 に 存 在 している 場 合 、このシステムコールはエラーを 引 き起 こします。これは 新 しい(ユニークな) 識 別 子 を 受 け 取 らなかった 時に 受 け 取 ったと 考 えてしまうことからプロセスを 守 るために 必 要 です。3-19


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>パーミッション 操 作 はユーザー、グループ、その 他 のために 読 み 取 り/ 書 き 込 み 属 性 を 定 義 します。表 3-2は 有 効 な 操 作 パーミッションコードの(8 進逭 数 で 示 す) 数 値 を 示 します。表 3-2 共 有 メモリ 操 作 パーミッション・コード操 作 パーミッションRead by UserWrite by UserRead by GroupWrite by GroupRead by OthersWrite by Others8 進逭 数 値004000020000040000200000400002特 有 の 値 は、 必 要 とする 操 作 パーミッションのために8 進逭 数 値 を 追 加 もしくはビット 単 位 の 論 理 和によって 生 成 されます。これが、もし「Read by User」と「Read/Write by Others」を 要 求 された 場合 、コードの 値 は00406 (00400+00006)となります。の 中 にある 定 数 SHM_RとSHM_Wは 所 有 者 のために 読 み 書 きパーミッションを 定 義 するために 使 用 することが 可 能 です。shmflg 値 は、フラグ 名 称 と8 進逭 数 の 操 作 パーミッション 値 を 一 緒 に 使 用 して 簡 単 に 設 定 することが 可 能 です。使 用 例 :shmid = shmget (key, size, (IPC_CREAT | 0400));shmid = shmget (key, size, (IPC_CREAT | IPC_EXCL | 0400));以 下 の 値 はの 中 で 定 義 されています。これらの 値 を 超 えると 常 に 失 敗 の 原 因 となります。SHMMNISHMMINSHMMAXSHMALLいつでも 利 用 可 能 なユニークな 共 有 メモリ 領 域 (shmids)の 最 大 数最 小 共 有 メモリ 領 域 サイズ最 大 共 有 メモリ 領 域 サイズ最 大 共 有 メモリ・ページ 数共 有 メモリ 制 限 値 のリストは 以 下 のオプションの 使 用 によりipcs(8)コマンドで 取 得 することが可 能 です。 詳 細 はmanページを 参 照 してください。ipcs -m -l特 定 の 関 連連 するデータ 構 造造 体 の 初 期 化 および 特 定 のエラー 条 件 についてはshmget(2)のmanページを 参 照 してください。3-20


リアルタイム・プロセス 間 通 信shmctlシステムコール3shmctl(2)は 共 有 メモリ 領 域 の 制 御 操 作 を 実 行 するために 使 用 されます。本 セクションではshmctlシステムコールを 説 明 します。さらに 詳 細 な 情 報 はshmctl(2)のmanページを 参 照 してください。この 呼 び 出 しの 使 用 を 説 明 しているプログラムは、README.shmctl.txt内 に 提 供 された 多 くのコメントと 共 に/usr/share/doc/ccur/examples/shmctl.cで 見 つけることが 可 能 です。概 要#include #include int shmctl (int shmid, int cmd, struct shmid_ds *buf);上 記 の 全 てのインクルードファイルは、オペレーティング・システムの/usr/includeサブディレクトリにあります。shmctlシステムコールは 正 常 終 了 で0、それ 以 外 で-1の 整 数 値 を 返 します。shmid 変 数 はshmgetシステムコールを 使 って 作 成 された 有 効 な 負 ではない 整 数 値 でなければなりません。cmd 引 数 は 以 下 の 値 のいずれかとなります。IPC_STATIPC_SETIPC_RMIDSHM_LOCKSHM_UNLOCK指 定 されたshmid に 対 応 するデータ 構 造造 体 、ポインタbuf によって 指し 示 されるユーザーメモリ 空 間 のデータ 構 造造 体 の 場 所 を 含 むステータス 情 報 を 返 します。「Read」 許 可 が 必 要 です。指 定 されたにshmid 対 応 する 有 効 なユーザーIDとグループID、パーミッション 操 作 を 設 定 します。指 定 されたshmid と 共 にそれに 対 応 するデータ 構 造造 体 を 削 除 します。共 有 メモリ 領 域 のスワップを 防 ぎます。ユーザーはロックが 有 効 になった 後 、 存 在 することを 要 するどのページもフォールトする 必 要 があります。プロセスはこの 操 作 を 実 行 するためにスーパーユーザもしくはCAP_IPC_LOCK 権 限 を 持 っている 必 要 があります。メモリから 共 有 メモリ 領 域 をアンロックします。プロセスはこの 操 作を 実 行 するためにスーパーユーザもしくはCAP_IPC_LOCK 権 限 を 持っている 必 要 があります。NOTEmsgctl(2)サービスはIPC_INFO, SHM_STAT, SHM_INFOコマンドもサポートします。しかし、これらのコマンドはipcs(8)ユーティリティで 使 用するためだけに 意 図 されているので、これらのコマンドについての 説 明はありません。3-21


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>IPC_SETまたはIPC_RMID 制 御 コマンドを 実 行 するため、プロセスは 以 下 の 条 件 を1つ 以 上 満 たしていなければなりません。• 有 効 なOWNERのユーザーIDを 所 有• 有 効 なCREATORのユーザーIDを 所 有• スーパーユーザー• CAP_SYS_ADMINケーパビリティを 所 有共 有 メモリ 領 域 は、-m shmid( 共 有 メモリ 領 域 識 別 子 )または-M shmkey( 対 応 する 領 域 のキー)オプション 指 定 によるipcrm(8)コマンドの 利 用 で 削 除 される 可 能 性 もあることに 注 意 してください。このコマンドを 使 用 するため、プロセスはIPC_RMID 制 御 コマンドの 実 行 に 必 要 となるのと 同 じ権 限 を 持 っている 必 要 があります。このコマンドの 使 用 に 関 して 更 なる 情 報 はipcrm(8)のmanページを 参 照 してください。共 有 メモリ 領 域 をI/O 空 間 へバインド 3shmgetの の 利 用 3<strong>RedHawk</strong> <strong>Linux</strong>は 共 有 メモリ 領 域 をI/O 空 間 の 一 部邪 にバインドすることが 可 能 です。そうするための 手 順 は 以 下 となります。1. 共 有 メモリ 領 域 を 作 成 (shmget(2)).2. PCI BAR スキャン・ルーチンを 使 用 してI/O 領 域 の 物 理 アドレスを 取 得3. 領 域 をI/Oメモリにバインド (shmbind(2)).4. 領 域 をユーザーの 仮 想 アドレス 空 間 に 結 合 (shmat(2)).コマンドレベルで、shmconfig(1)ユーティリティは 共 有 メモリ 領 域 を 作 成 して、それを 物 理 メモリへバインドするために 使 用 することが 可 能 です。 詳 細 は「 共 有 メモリ・ユーティリティ」セクションを 参 照 してください。shmatとshmdtのシステムコールを 使 用 することにより、 共 有 メモリ 領 域 とユーザーの 仮 想 アドレス 空 間 との 結 合 および 分 離 が 可 能 となります。これらのシステムコールの 使 用 手 順 は「shmatおよびshmdtシステムコール」の 中 で 説 明 されています。shmget(2)システムコールは 共 有 メモリ 領 域 を 作 成 するために 最 初 に 呼 び 出 されます。 呼 び 出 しの 正 常 終 了 によって、size バイトの 共 有 メモリ 領 域 が 作 成 され、 領 域 の 識 別 子 が 返 されます。I/O 空 間 にバインドした 時 、 領 域 のサイズはPCI BARスキャン・ルーチンを 使 用 して 取 得 することが 可 能 です。(bar_scan_open(3)を 参 照 してください)shmgetの 使 用 に 関 する 全 ての 情 報 は「shmgetシステムコール」の 中 で 提 供 されます。3-22


リアルタイム・プロセス 間 通 信shmbindの の 利 用 3共 有 メモリ 領 域 を 作 成 た 後 、shmbind(2)システムコールを 使 ってI/O 空 間 の 一 部邪 にそれをバインドすることが 可 能 です。この 呼 び 出 しは、ルートまたはCAP_SYS_RAWIO の 権 限 を 持 っている必 要 があることに 注 意 してください。shmbindは 最 初 のプロセスが 領 域 へ 結 合 する 前 に 呼 び 出 される 必 要 があります。その 後 、shmat()を 介 して 領 域 へ 結 合 するため、 呼 び 出 し 元 プロセスの 仮 想 アドレス 空 間 を 物 理 アドレス 空 間 の 一部邪 にマッピングを 効 果 的 に 作 成 します。I/O 空 間 の 一 部邪 は、その 開 始 アドレスおよび 抑 制 された 共 有 メモリ 領 域 のサイズによって 定 義 されます。 開 始 アドレスはページ・バウンダリ( 境 界 線 )に 揃 える 必 要 があります。 共 有 メモリ 領 域 のサイズはshmgetの 呼 び 出 しに 使 用 するsize 引 数 により 確 立 されます。もし1024バイトの 共 有 メモリ 領 域 を 作 成 し、 例 えば、 開 始 位 置 0x2000000 (16 進逭 数 表 示 )で 物 理 メモリの 一 部邪 へバインドしたい 場 合 、 物 理 メモリの 境 界 部邪 分 はメモリ 位 置 0x2000000から0x2000BFFを 含 むことになります。デバイス 用 の 物 理 アドレスはシステム 内 のハードウェア 変 更 が 原 因 で 変 わる 可 能 性 があることに注 意 してください。 確 実 にデバイスを 参 照 するために 物 理 アドレスをPCI BAR スキャンルーチンを 使 って 取 得 する 必 要 があります。bar_scan_open(3)のmanページを 参 照 してください。shmbindを 呼 び 出 すために 必 要 とされる 仕 様 は 以 下 のとおりです。int shmbind(int shmid, unsigned long paddr)引 数 は 以 下 のように 定 義 されます:shmidpaddr物 理 メモリの 一 部邪 へバインドしたい 共 有 メモリ 領 域 の 識 別 子指 定 した 共 有 メモリ 領 域 をバインドしたいメモリの 開 始 物 理 アドレスshmatおよびおよびshmdtシステムコール3共 有 メモリ 操 作 のシステムコールshmatとshmdtは、 呼 び 出 し 元 プロセスのアドレス 空 間 へ 共 有メモリ 領 域 の 結 合 および 分 離 をするために 使 用 されます。 本 セクションはshmatとshmdtのシステムコールを 説 明 します。 更 なる 詳 細 な 情 報 はshmop(2)のmanページを 参 照 してください。これらの 呼 び 出 しの 使 用 を 説 明 しているプログラムは、README.shmop.txt 内 に 提 供 された 多 くのコメントと 共 に/usr/share/doc/ccur/examples/shmop.cで 見 つけることが 可 能 です。概 要#include #include void *shmat (int shmid, const void *shmaddr, int shmflg);int shmdt (const void *shmaddr);上 記 の 全 てのインクルードファイルは、オペレーティング・システムの/usr/includeサブディレクトリにあります。3-23


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>共 有 メモリ 領 域 の 結 合 3共 有 メモリ 領 域 の 分 離 3shmatシステムコールはshmid で 指 定 された 呼 び 出 し 元 プロセスのアドレス 空 間 に 共 有 メモリ 領域 を 結 合 します。これは 文 字 列 のポインタ 値 を 返 します。 正 常 終 了 でその 値 はプロセスが 共 有 メモリ 領 域 に 結 合 されているメモリのアドレスになり、 失 敗 時 は 値 が-1となります。shmid 引 数 は 有 効 な 負 ではない 整 数 値 でなければなりません。これは 前 述 のshmgetシステムコールを 使 って 作 成 されている 必 要 があります。shmaddr 引 数 をshmatシステムコールへ 渡 す 際 にゼロもしくはユーザー 指 定 とすることが 可 能 です。もしそれがゼロの 場 合 、オペレーティング・システムは 共 有 メモリ 領 域 が 結 合 されるアドレスを 遥 びます。もしそれがユーザー 指 定 の 場 合 、そのアドレスはプログラムのアドレス 空 間 内 の有 効 なページ 境 界 アドレスである 必 要 があります。 以 下 に 典 型 的 なアドレスの 範 囲 を 例 示 します。0xc00c00000xc00e00000xc01000000xc0120000オペレーティング・システムがアドレスを 遥 ぶことを 許 可 することは 移 植 性 を 向 上 させます。shmflg 引 数 はshmatシステムコールへSHM_RND( 切 り 捨 て)やSHM_RDONLY( 読 み 取 り 専 用 )フラグを 渡 すために 使 用 されます。shmdtシステムコールは 呼 び 出 し 元 プロセスからshmaddr により 指 定 されたアドレスにある 共有 メモリ 領 域 を 分 離 します。これは 正 常 終 了 で0、それ 以 外 で-1の 整 数 値 を 返 します。3-24


リアルタイム・プロセス 間 通 信共 有 メモリ・ユーティリティ 3shmdefineユーティリティユーティリティ3shmconfigコマンドコマンド3<strong>RedHawk</strong> <strong>Linux</strong>は 共 有 メモリ 領 域 の 利 用 を 容 易 にする2つのユーティリティを 提 供 します。shmdefine(1)ユーティリティは 協 同 プロセスが 使 用 する1つ 以 上 の 共 有 メモリ 領 域 を 作 成 することが 可 能 です。shmconfig(1)コマンドは 共 有 メモリ 領 域 を 作 成 し、 物 理 メモリの 一 部邪 へバインドすることが 可 能 です。これらのユーティリティはこの 後 のセクションで 説 明 します。shmdefineユーティリティは 一 連連 の 協 同 プロセスが 共 有 メモリの 利 用 を 容 易 にするために 設 計されました。 例 え1つ 以 上 の 共 有 メモリ 領 域 を 協 同 する 多 数 のプログラムがあったとしても、1 度だけユーティリティを 呼 び 出 すことが 必 要 です。shmdefineはソース・オブジェクト・ファイルへリンクする 必 要 のあるオブジェクト・ファイルを 生 成 するため、リンクする 以 前 に 呼 び 出 す 必要 があります。<strong>RedHawk</strong> <strong>Linux</strong>システム 上 で 実 行 するプログラム 用 にshmdefineは 現 在 GNU C, Fortran, Adaコンパイラ(gcc, g77 GNAT)で 動 作 します。このユーティリティの 使 用 に 関 する 詳 細 は、Quick Reference for shmdefine ( 文 書 番 号 0898010) とshmdefine(1)のmanページを 参 照 してください。shmconfig(1)コマンドは 特 定 のキーに 対 応 する 共 有 メモリ 領 域 を 作 成 し、 特 定 I/Oメモリの 一 部邪へ 任 意 にバインドすることを 支 援 します。コマンドの 構 文 :/usr/bin/shmconfig -i DEVSTR/usr/bin/shmconfig -b BARSTR [-s SIZE] [-g GROUP] [-m MODE] [-u USER]{key | -t FNAME}/usr/bin/shmconfig -s SIZE [-p ADDR] [-g GROUP] [-m MODE] [-u USER]{key | -t FNAME}共 有 メモリ 領 域 へ 割 り 当 てるNUMAメモリ・ポリシーに 関 する 情 報 については、10 章 またはshmconfig(1)のmanページを 参 照 してください。オプションは 表 3-3で 説 明 しています。3-25


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>表 3-3 shmconfig(1) コマンドのオプションOption--info=DEVSTR, -i DEVSTR--bind=BARSTR, -b BARSTRDescription以 下 で 構 成 されるDEVSTR にマッチしている 各 デバイス 上 の 各 メモリ 領 域 に 関 する 情 報 を 出 力vendor_id:device_id--bindを 使 用 すると 役 に 立 ちます。 DEVSTR 上 の 情 報に 関 しては--bindを 参 照 してください。共 有 領 域 へバインドするためにメモリ 内 のI/O 領 域 を 特定 します。BARSTR は 以 下 で 構 成 されます。vendor_id:device_id:bar_no[:dev_no]vendor_id と device_id はハードウェア・デバイスを 特定 し、 通 常 2つの16 進逭 数 の 値 をコロンで 区 切 って 表 します( 例 8086:100f)。ベンダーのマニュアル、/usr/share/hwdata/pci.ids、lspci –nsより 取 得 することが 可 能 です。これらのIDを 指 定 する 時 、 接 頭 語 “0x” を必 要 とします( 例 0x8086:0x100f)。 後 述 の「 見 本 」を 参 照してください。bar_no はバインドするメモリ 領 域 を 特 定 します。この値 を 取 得 するために-i オプションを 使 用 します( 出 力 は“Region bar_no: Memory at ...” と 表 示 されます)。メモリ領 域 だけをバインすることが 可 能 です。dev_no は 任 意 、ベンダーIDとデバイスIDがマッチしている 複 数 のボード 間 を 識 別 するためだけに 必 要 です。この 値 を 取 得 するために-iオプションを 使 用 します( 出 力は“Logical device: dev_no:” と 表 示 されます)。このオプションを 使 用 するためにユーザーはCAP_SYS_RAWIO 権 限 を 持 っている 必 要 があります。--size=SIZE, -s SIZE--physical=ADDR, -p ADDR--user=USER, -u USER--group=GROUP, -g GROUP--mode=MODE, -m MODE--help, -h--<strong>version</strong>, -vバイトで 領 域 のサイズを 指 定 します。--bindは 必 須 ではなく、デフォルトは 全 てのメモリ 領 域 です。領 域 をバインドする 物 理 I/Oメモリの 一 部邪 の 開 始 アドレスとしてADDR を 指 定 します。このオプションは 廃 止 されましたので、--bindを 使 用 してください。このオプションを 使 用 するためにユーザーはCAP_SYS_RAWIO 権限 を 持 っている 必 要 があります。共 有 メモリ 領 域 所 有 者 のログイン 名 称 を 指 定 します。領 域 へのグループアクセスを 適遚 用 するグループ 名 称 を指 定 します。共 有 メモリ 領 域 へのアクセスを 管 理 するパーミッションのセットとしてmode を 指 定 します。パーミッションを 指 定 するために8 進逭 数 を 使 用 する 必 要 があります。利 用 可 能 なオプションと 使 用 方 法 について 説 明 します。コマンドのバージョンを 印 字 します。3-26


リアルタイム・プロセス 間 通 信/procと/sysファイルシステムはこのコマンドを 使 用 するためにマウントされている 必 要 があります。-s 引 数 により 指 定 された 領 域 のサイズは、そこに 配郤 置 されるデータのサイズと 一 致 している 必 要があることに 注 意 することは 重 要 です。もしshmdefineが 使 用 されている 場 合 、 領 域 のサイズは共 有 メモリの 一 部邪 であると 宣 言 されている 変 数 のサイズと 一 致 している 必 要 があります。より 大きなサイズの 指 定 でも 機 能 します(shmdefineに 関 する 情 報 は、「shmdefineユーティリティ」を 参照 してください)。ユーザーとグループに 関 連連 する 領 域 を 識 別 し、アクセスを 制 御 するパーミッションを 設 定 するために-u, -g, -mオプションを 指 定 することを 推 奨 します。もし 指 定 されていない 場 合 、 領 域 のデフォルトのユーザーIDおよびグループIDはそれらの 所 有 者 で、デフォルトのモードは0644です。key 引 数 は 共 有 メモリ 領 域 用 にユーザーが 遥 択 した 識 別 子 を 表 します。この 識 別 子 は 整 数 もしくは 既 存 ファイルを 参 照 する 標 準 的 なパス 名 称 とすることが 可 能 です。パス 名 称 が 提 供 される 時 、ftok(key,0) はshmget(2)コールのためにキーとなるパラメータとして 使 用 されます。--tmpfs=FNAME / -t FNAME はキーの 代 わりにtmpfsファイルシステムのファイル 名 称 を 指 定 するために 使 用 することが 可 能 です。-u, -g, -mオプションはこの 領 域 のファイル 属 性 を 設 定 もしくは 変 更 するために 使 用 することが 可 能 です。shmconfigが 実 行 される 時 、 内 部邪 のデータ 構 造造 体 と 共 有 メモリ 領 域 は 指 定 されたキーに 対 して 作成 され、もし-pオプションが 使 用 される 場 合 、 共 有 メモリ 領 域 はI/Oメモリの 連連 続 する 領 域 にバインドされます。shmconfigで 作 成 された 共 有 メモリ 領 域 へのアクセスするため、プロセスは 領 域 の 識 別 子 を 取 得するために 最 初 にshmget(2)を 呼 び 出 す 必 要 があります。この 識 別 子 は 共 有 メモリ 領 域 を 操 作 する 他 のシステムコールで 必 要 になります。shmgetの 仕 様 は 以 下 のとおりです。int shmget(key, size, 0)key の 値 はshmconfigで 指 定 されたkey の 値 によって 決 定 されます。もしkey の 値 が 整 数 だった場 合 、その 整 数 はshmgetの 呼 び 出 しでkey に 指 定 される 必 要 があります。もしkey の 値 がパス 名称 だった 場 合 、shmgetの 呼 び 出 しでkey に 指 定 したパス 名 称 に 基 づく 整 数 値 を 取 得 するために 最初 にftokサブルーチンを 呼 び 出 す 必 要 があります。パス 名 称 からキーへ 変 更 するときにshmconfigはid がゼロのftokを 呼 び 出 すため、ftokの 呼 び 出 しにおけるid 引 数 の 値 はゼロである必 要 があることに 注 意 することが 重 要 です。size の 値 はshmconfigの-s 引 数 で 指 定 したバイト 数と 等 しくする 必 要 があります。 共 有 メモリ 領 域 が 既 に 作 成 されたため、ゼロの 値 はflag 引 数 として 指 定 されます。shmgetに 関 するすべての 情 報 は「shmgetシステムコール」を 参 照 してください。ftokの 使 用 方 法については、「 共 有 メモリの 利 用 」とftok(3)のmanページを 参 照 してください。グローバル・リソースとして 処 理 するためにマッピングされたメモリの 領 域 を 作 成 する 時 、shmconfigを 呼 び 出すために/etc/init.dディレクトリ 内 のshmconfigスクリプトへ 行 を 追 加 することにより 有 用 であると 感 じるかもしれません。そうすることで、 非 協 同 プロセスがそれを 使 用 する 機 会 を 得 る 前 にIPCキーを 予 約 することが 可 能 となり、 共 同 プロセスが 領 域 の 使 用 が 必 要 となる 前 に 共 有 メモリ領 域 と 物 理 メモリ 間 のバインドを 確 立 することが 可 能 となります。 以 下 の 例 のような 行 を 追 加 してください。/usr/bin/shmconfig -p 0xf00000 -s 0x10000 -u root -g sys -m 0666 key3-27


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>見 本この 見 本 では、RCIM 上 の 物 理 メモリ 領 域 をlspci(8) 使 って 確 認 し、 共 有 メモリ 領 域 へバインドします。lspciを 使 用 するためにはルートである 必 要 があることに 注 意 してください。もしルート 権限 を 持 っていない 場 合 、/usr/share/hwdata/ pci.idsを 見 てデバイス 名 称 (RCIM)を 探 すことが 可 能で、IDの 値 はベンダー/デバイスの 記 述 の 左 側 に 列 挙 されます。2つ 以 上 のデバイスIDが 同 一 デバイスとして 列 挙 されている 時 、どれを 使 用 するかを 決 めるために 列 挙 された 各 device_id でshmconfig –iを 実 行 します。1. RCIMボードのbus:slot.func 識 別 子 を 見 つけます:# lspci -v | grep -i rcim0d:06.0 System peripheral: Concurrent Computer Corp RCIM IIRealtime Clock ...2. vendor_id:device_id 番 号 を 取 得 するためにRCIM 識 別 子 を 使 用 します:# lspci -ns 0d:06.00d:06.0 Class 0880: 1542:9260 (rev 01)3. このデバイスのメモリ 領 域 を 見 つけます。lspciはvendor_id:device_id の 値 を 接 頭 語 ” 0x”なしの16 進逭 数 形 式 (1542:9260) で 出 力 しますが、shmconfigはベース 識 別 子 (0x1542:0x9260)を 必 要 とすることに 注 意 してください。# shmconfig -i 0x1542:0x9260Region 0: Memory at f8d04000 (non-prefetchable) [size=256]/proc/bus/pci0/bus13/dev6/fn0/bar0Region 1: I/O ports at 7c00 [size=256]/proc/bus/pci0/bus13/dev6/fn0/bar1Region 2: Memory at f8d00000 (non-prefetchable) [size=16384]/proc/bus/pci0/bus13/dev6/fn0/bar24. RCIMメモリ 領 域 #2 へバインドします:# shmconfig -b 0x1542:0x9260:2 -m 0644 -u me -g mygroup 425. システム 上 のIPC 共 有 メモリ 領 域 を 確 認 します。physaddr はバインドした 物 理 アドレスを表 し、 上 述 のステップ3のshmconfig –iコマンドにより 出 力 されたアドレスと 一 致 することに 注 意 してください。# cat /proc/sysvipc/shmkey shmid perms size cpid lpid nattch uidgid cuid cgid atime dtime ctime physaddr42 0 644 16384 1734 0 0 5388100 0 0 0 0 1087227538 f8d000003-28


4244Chapter 4プロセス・スケジューリング本 章 では<strong>RedHawk</strong> <strong>Linux</strong>システム 上 におけるプロセス・スケジューリングの 概 要 を 提 供 します。どのようにプロセス・スケジューラが 次 に 実 行 するプロセスを 決 定 するのかを 説 明 し、POSIXスケジューリング・ポリシーと 優 先 度 を 説 明 します。概 要 4<strong>RedHawk</strong> <strong>Linux</strong> OSの 中 で、スケジュール 可 能 な 存 在 は 常 にプロセスです。スケジューリング 優 先度 とスケジューリング・ポリシーはプロセスの 属 性 です。システム・スケジューラはプロセスが実 行 される 時 に 決 定 します。それは 構 成 パラメータ、プロセスの 性 質 、ユーザー 要 求 に 基 づいて優 先 度 を 保 持 し、CPUへプロセスを 割 り 当 てるためにこれらの 優 先 度 と 同 様 にCPUアフィニティを 使 用 します。スケジューラは3つの 異 なるスケジューリング・ポリシー、1つは 非 クリティカルなプロセス 用(SCHED_OTHER)、2つはリアルタイム・アプリケーション 用 に 固 定 優 先 度 ポリシー(SCHED_FIFOとSCHED_RR) を 提 供 します。これらのポリシーは、4-3ページの「スケジューリング・ポリシー」セクションで 詳 細 が 説 明 されています。デフォルトでは、スケジューラはタイムシェアリング・ポリシーのSCHED_OTHERを 使 います。SCHED_OTHERポリシーの 中 のプロセスに 対 し、 双 方 向 プロセスには 優 れた 応 答 時 間 、CPU 集 中型 プロセスには 優 れたスループットを 提 供 しようとするため、スケジューラは 実 行 可 能 なプロセスの 優 先 度 を 動 的 に 操 作 します。固 定 優 先 度 スケジューリングはプロセス 毎 を 基 準 に 静 的 優 先 度 を 設 定 することが 可 能 です。スケジューラは 固 定 優 先 度 スケジューリング・ポリシーを 使 用 するプロセスの 優 先 度 を 決 して 変 更 しません。 例 え 他 のプロセスが 実 行 可 能 であるとしても、 最 も 高 いリアルタイム 固 定 優 先 度 プロセスは 常 に 実 行 可 能 なCPUを 直 ぐに 確 保 します。 従 って、 設 定 されているプロセス 優 先 度 に 応 じてプロセスが 動 作 する 正 確 な 順 番 をアプリケーションは 指 定 することが 可 能 です。リアルタイム 性 能 を 必 要 としないシステム 環 境 では、デフォルトのスケジューラの 設 定 は 十 分 に機 能 し、 固 定 優 先 度 プロセスは 必 要 とされません。しかし、リアルタイム・アプリケーションもしくは 厳 格 なタイミングな 制 約 を 持 つアプリケーションのために 固 定 優 先 度 プロセスはクリティカルなアプリケーションの 要 求 が 満 たされることを 保 証 する 唯 一 の 方 法 です。 特 定 のプログラムが 非 常 にデターミニスティックな 応 答 時 間 を 要 求 する 時 、 固 定 優 先 度 スケジューリング・ポリシーを 使 用 する 必 要 があり、 最 もデターミニスティックな 応 答 が 必 要 なタスクは 最 も 適遚 した 優 先 度を 割 り 付 ける 必 要 があります。IEEE 規 格 1003.1bに 基 づくシステムコール 一 式 は、プロセスのスケジューリング・ポリシーおよび優 先 度 へのダイレクトなアクセスを 提 供 します。このシステムコール 一 式 に 含 まれているのは、プロセスがスケジューリング・ポリシーおよび 優 先 度 を 取 得 もしくは 設 定 することを 許 可 するシステムコールで、 特 定 のスケジューリング・ポリシーに 関 連連 する 優 先 度 の 最 小 値 ・ 最 大 値 を 取 得し、ラウンドロビン(SCHED_RR)・スケジューリング・ポリシーに 基 づいてスケジュールされたプロセスのタイム・クォンタムを 取 得 。4-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>run(1)コマンドの 使 用 により、コマンド・レベルでプロセスのスケジューリング・ポリシーと 優先 度 を 変 更 することが 可 能 となります。システムコールとrunコマンドは 効 果 的 な 使 用 のための手 順 とヒントと 共 に 本 章 で 後 述 されています。プロセス・スケジューラの 管 理 方 法 4図 4-1にスケジューラの 操 作 方 法 を 図 示 します。図 4-1 スケジューラプロセスが 作 成 される 時 、ポリシーの 範 囲 内 でスケジューリング・ポリシーと 優 先 度 を 含 むスケジューリング・パラメータを 継 承 します。デフォルトの 構 成 では、プロセスはSCHED_OTHERポリシーでスケジュールされたタイムシェアリング・プロセスとして 開 始 します。プロセスが 固 定優 先 度 ポリシーで 正 しくスケジュールされるためには、ユーザー 要 求 がシステムコールもしくはrun(1)コマンドを 介 して 行 われる 必 要 があります。プロセスの 優 先 度 を 設 定 する 時 、プロセスは“User Priority(ユーザー 優 先 度 )” を 設 定 します。これはユーザーが 現 在 の 優 先 度 を 取 り 出 すときに 呼 び 出 すsched_getparam(2)によって 報 告 される優 先 度 でもあります。 移 動 可 能 なアプリケーションは 特 定 のスケジューリング・ポリシー 用 の 有効 な 優 先 度 の 埴 を 判 断 するためにsched_get_priority_min()とsched_get_priority_max()のインターフェースを 使 用 する 必 要 があります。ユーザー 優 先 度 の 値 (sched_priority) は 各 プロセスに 割 り 当 てられます。SCHED_OTHERプロセスは0のユーザー 優 先 度 が 割 り 当 てられるだけです。SCHED_FIFOとSCHED_RRプロセスは1から99の 範 囲 内 のユーザ 優 先 度 を 持 っています。スケジューラはポリシー 固 有 優 先 度 (Policy-Specific Priorities)からグローバル 優 先 度 (GlobalPriorities)へスケジューリングを 変 更 します。グローバル 優 先 度 はカーネル 内 部邪 で 使 用 されるスケジューリング・ポリシーの 値 です。スケジューラは 見 込 まれる 各 グローバル 優 先 度 の 値 に 対 して実 行 可 能 なプロセスの 一 覧 を 保 持 します。SCHED_OTHER スケジューリング・ポリシーに 対 応する40 個 のグローバル・スケジューリング 優 先 度 で、 固 定 優 先 度 スケジューリング・ポリシー(SCHED_RR and SCHED_FIFO) に 対 応 する99 個 のグローバル・スケジューリング 優 先 度 。スケジューラは 空 ではない 最 も 高 いグローバル 優 先 度 のリストを 探 して、 現 在 のCPU 上 で 実 行 するためにそのリストの 先 頭 のプロセスを 遥 びます。4-2


プロセス・スケジューリングスケジューリング・ポリシーは、リスト 内 のプロセスがブロックされるもしくは 実 行 可 能 となる時 、リスト 内 でユーザー 優 先 度 とプロセスの 相 対 位 置 が 等 しいプロセスのリストへ 挿 入 される 各プロセスについて 決 定 します。固 定 優 先 度 プロセスが 特 定 CPUですぐに 実 行 可 能 である 間 は、タイムシェアリング・プロセスがそのCPU 上 で 実 行 することはありません。一 度 スケジューラがCPUへプロセスを 割 り 付 けたら、プロセスはそのタイム・クォンタム 使 い 切る、スリープする、 高 優 先 度 プロセスによりブロックもしくまプリエンプトされるまで 実 行 されます。ps(1)とtop(1)により 表 示 される 優 先 度 は 内 部邪 で 計 算 された 値 でユーザーに 設 定 された 優 先 度 を間 接 的 に 反 映 するだけであることに 注 意 してください。スケジューリング・ポリシー 4POSIXはプロセスをスケジュールする 方 法 を 制 御 する3 種 類 のスケジューリング・ポリシーを 定義 :SCHED_FIFOSCHED_RRSCHED_OTHERファーストイン・ファーストアウト(FIFO)ラウンドロビン (RR)既 定 値 のタイムシェアリングファーストイン・ファーストアウト・スケジューリング(SCHED_FIFO) 4SCHED_FIFOは0より 高 いユーザー 優 先 度 でのみ 使 用 することが 可 能 です。これはSCHED_FIFOプロセスが 実 行 可 能 となった 時 、 現 在 実 行 中 のどのようなSCHED_OTHERプロセスであっても 常に 即 座 にプリエンプトすることを 意 味 します。SCHED_FIFOはタイム・スライシングのない 単 純なスケジューリングのアルゴリズムです。SCHED_FIFO 優 先 度 でスケジュールされたプロセスに対 し、 次 のルールが 適遚 用 されます: 高 優 先 度 の 他 のプロセスにプリエンプトされたSCHED_FIFOプロセスはその 優 先 度 リストの 先 頭 に 留 まり、 全 ての 高 優 先 度 プロセスが 再 びブロックされたら直 ぐに 実 行 を 再 開 します。SCHED_FIFOプロセスが 実 行 可 能 となった 時 、その 優 先 度 リストの 最後 尾 に 挿 入 されます。もし 実 行 可 能 であった 場 合 、sched_setscheduler(2)もしくはsched_setparam(2)の 呼 び 出 しはリストの 最 後 尾 にあるPIDに 一 致 するSCHED_FIFOプロセスを配郤 置 します。sched_yield(2)を 呼 び 出 すプロセスはその 優 先 度 リストの 最 後 尾 へ 配郤 置 されます。その 他 のイベントはユーザー 優 先 度 が 等 しい 実 行 可 能 なプロセス 待 ちリストの 中 でSCHED_FIFO優 先 度 でスケジュールされたプロセスは 移 動 しません。SCHED_FIFOプロセスは、I/O 要 求 によりブロック、 高 優 先 度 プロセスによるプリエンプト、sched_yieldを 呼 び 出 すまで 実 行 されます。4-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>ラウンドロビン・スケジューリング(SCHED_RR) 4SCHED_RRはSCHED_FIFOの 単 純 な 拡 張 機 能 です。 各 プロセスはタイム・クォンタムを 最 大 限 使って 実 行 することが 許 可 されていることを 除 いては、 上 述 のSCHED_FIFO 全 てがSCHED_RRに 適遚用 されます。もしSCHED_RRプロセスが 周 期 時 間 分 もしくはタイム・クォンタムより 長 く 実 行 している 場 合 、その 優 先 度 リストの 最 後 尾 へ 配郤 置 されます。 高 優 先 度 プロセスにプリエンプトされ、その 後 実 行 プロセスとして 実 行 を 再 開 するSCHED_RRプロセスは、 割 り 当 てられたそのラウンドロビンのタイム・クォンタムを 使 い 切 らずに 終 了 します。タイム・クォンタムの 長 さはsched_rr_get_interval(2)で 取 り 出 すことが 可 能 です。タイム・クォンタムの 長 さはSCHED_RRスケジューリング・ポリシーでスケジューリングされたプロセスに 対 応 するナイス 値 に 影 響 されます。 高 いナイス 値 は 大 きなタイム・クォンタムを 割 り 当 てられます。タイムシェアリング・スケジューリング(SCHED_OTHER) 4性 能 向 上 のための 手 続 き4 き優 先 度 設 定 方 法 4SCHED_OTHERはユーザー 優 先 度 0でのみ 使 用 することが 可 能 です。SCHED_OTHERは 特 別 なリアルタイム・メカニズムのユーザー 優 先 度 を 必 要 としない 全 てのプロセスを 対 象 とする 一 般 的 なタイムシェアリングのスケジューラ・ポリシーです。 実 行 されるプロセスは、リストの 中 だけで決 定 される 動 的 な 優 先 度 に 基 づくユーザー 優 先 度 0のリストから 遥 ばれます。 動 的 な 優 先 度 はナイス・レベル(nice(2)もしくはsetpriority(2)システムコールにより 設 定 されます)に 基 づいており、実 行 可 能 な 各 プロセスのタイム・クォンタムのために 増 やされますが、スケジューラにより 実 行を 拒 否 されます。これは 全 てのSCHED_OTHERプロセス 間 で 公 平 な 進逭 行 を 保 証 します。 例 えば、I/O 操 作 の 実 行 によりプロセス 自 身 が 自 主 的 にブロックする 回 数 といったようなその 他 の 要 因 も考 慮 します。次 の 部邪 分 的 なコードは 現 在 のプロセスを60の 固 定 優 先 度 でSCHED_RR 固 定 優 先 度 スケジューリング・ポリシーに 配郤 置 します。POSIXスケジューリング・ルーチンに 関 する 情 報 は 本 章 の「プロセス・スケジューリング・インターフェース」セクションを 参 照 してください。#include ...struct sched_param sparms;sparms.sched_priority = 60;if (sched_setscheduler(0, SCHED_RR, &sparms) < 0){perror("sched_setsched");exit(1);}4-4


プロセス・スケジューリング割 り 込 みルーチン 4固 定 優 先 度 スケジューリング・ポリシーの1つにスケジュールされたプロセスは、ソフトIRQやタスクレットに 関 連連 する 処 理 よりも 高 い 優 先 度 に 割 り 付 けられます。これらの 割 り 込 みルーチンは与 えられたCPU 上 で 実 行 した 割 り 込 みルーチンの 代 わりに 作 業 を 実 行 します。 実 際 の 割 り 込 みルーチンはハードウェア 割 り 込 みレベルで 実 行 され、( 固 定 優 先 度 スケジューリング・ポリシーの1つにスケジュールされたプロセスを 含 む)CPU 上 の 全 ての 機 能 にプリエンプトします。<strong>Linux</strong>のデバイス・ドライバ 作 成 者 は、デバイスが 割 り 込 みをハンドルされたと 確 信 させるためにデバイスとのやり 取 りに 要 求 される 仕 事 量 を 最 小 限 で 実 行 することを 奨 励 します。デバイス・ドライバはデバイス 割 り 込 みルーチンに 関 連連 する 作 業 の 残 りを 処 理 するための 割 り 込 みメカニズムの1つを起 動 することが 出 来 ます。 固 定 優 先 度 プロセスはそれらの 割 り 込 みルーチンより 上 の 優 先 度 で 実行 されているため、この 割 り 込 み 構 造造 は 固 定 優 先 度 プロセスが 割 り 込 みルーチンから 見 込 まれる最 小 限 のジッター 量 を 得 ることが 可 能 となります。デバイス・ドライバーの 割 り 込 みルーチンに関 する 詳 細 な 情 報 については「デバイス・ドライバ」 章 を 参 照 してください。SCHED_FIFO vs SCHED_RR 42つの 固 定 優 先 度 スケジューリング・ポリシーはその 性 質 がとても 似 ており、 殆 どの 条 件 下 で 同 一の 作 法 で 動 作 します。SCHED_RRがプロセスで 使 えるタイム・クォンタムを 所 有 している 間 にタイム・クォンタムを 使 い 切 った 時 、もし 固 定 優 先 度 スケジューリング・ポリシーの1つの 中 に 優 先度 の 等 しい 実 行 可 能 な 状 態 のプロセスが 存 在 する 場 合 、プロセスはCPUを 放 棄 するだけであることを 覚 えることが 重 要 です。もし 優 先 度 の 等 しい 実 行 可 能 な 状 態 のプロセスが 無 い 場 合 、スケジューラは 当 初 のSCHED_RRプロセスがそのCPU 上 で 実 行 可 能 な 最 高 優 先 度 プロセスで 有 り 続 け、同 一 プロセスが 実 行 のために 再 度 遥 択 されることが 確 定 します。これは、 全 く 同 じスケジューリング 優 先 度 にて 固 定 優 先 度 スケジューリング・ポリシーの1つにスケジュールされた 実 行 中 のプロセスが 複 数 存 在 する 場 合 、SCHED_FIFOとSCHED_RRでスケジュールされたプロセス 間 の 遊 いが 唯 一 時 間 だけであることを 意 味 します。この 場 合 、SCHED_RRはプロセスに 割 り 当 てられたタイム・クォンタムに 従 いCPUを 共 有 することをそれらのプロセスに許 可 します。プロセスのタイム・クォンタムはnice(2)システムコールにより 影 響 を 受 けることに注 意 してください。より 高 いナイス 値 を 持 つプロセスは 大 きなタイム・クォンタムが 割 り 当 てられます。プロセスのタイム・クォンタムはrun(1)コマンドを 介 して 変 更 することも 可 能 です( 詳 細は 本 章 の「runコマンド」を 参 照 してください)。CPUをロックする 固 定 優 先 度 プロセス 4SCHED_FIFOとSCHED_RRのスケジューリング・ポリシーでスケジュールされたプロセスの 非 ブロック 無 限 ループはすべての 低 優 先 度 プロセスを 無 期 限 にブロックします。このシナリオが 完 全に 他 のプロセスのCPUを 奪 うため、 予 防 策 としてこれを 避遪 ける 必 要 があります。ソフトウェア 開 発 中 、プログラマはテスト 中 のアプリケーションよりも 高 いユーザー 優 先 度 にスケジュールされたシェルをコンソール 上 で 利 用 可 能 な 状 態 を 保 つことにより、このような 無 限 ループを 中 断 することができます。これは 予 想 通 りにブロックしないもしくは 終 了 しないテスト 中のリアルタイム・アプリケーションの 緊 急 停 止 を 可 能 にします。SCHED_FIFOおよびSCHED_RRプロセスは 絶 えず 他 のプロセスをプリエンプトすることが 可 能 であるため、ルート・プロセスもしくはCAP_SYS_NICEケーパビリティを 持 つプロセスだけはそれらのポリシーを 有 効 にすることが 許 可 されます。4-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>メモリのロック4ページングとスワッピングは 大 抵 の 場 合 、アプリケーション・プログラムに 予 測 不 可 能 な 量 のシステム・オーバヘッド 時 間 を 付 加 します。ページングとスワッピングが 原 因 の 性 能 ロスを 排 除 するため、 物 理 メモリ 内 のプロセスの 仮 想 アドレス 空 間 全 てもしくは 一 部邪 をロックするためにmlockall(2), munlockall(2), mlock(2), munlock(2) 各 システムコールを 使 用 します。CPUアフィニティとシールド・プロセッサ4システム 内 の 各 プロセスはCPUアフィニティ・マスクを 持 っています。CPUアフィニティ・マスクはどのCPU 上 でプロセスの 実 行 を 許 可 するかを 決 定 します。CPUがプロセスからシールドされている 時 、そのCPUでは、シールドされたCPUだけを 含 むCPUセットとなるCPUアフィニティが明 示 的 に 設 定 されたプロセスだけを 実 行 します。これらのテクニックの 利 用 は、プロセスの 実 行をどこでどのように 制 御 するかが 更 に 加 わります。 詳 細 な 情 報 については「リアルタイム 性 能 」 章を 参 照 してください。プロセス・スケジューリング・インターフェース 4IEEE 規 格 1003.1bに 基 づくシステムコール 一 式 はプロセスのスケジューリング・ポリシーおよび 優先 度 への 直 接 アクセスを 提 供 します。run(1)コマンドの 使 用 によりコマンド・レベルでプロセスのスケジューリング・ポリシーおよび 優 先 度 を 変 更 しても 構 いません。システムコールについては 後 述 します。runコマンドについては4-13ページに 詳 述 されています。POSIXスケジューリング・ルーチン4後 に 続 くセクションでPOSIXのスケジューリング・システムコールの 使 用 手 順 を 説 明 します。これらのシステムコールを 以 下 で 簡 単 に 説 明 します。スケジューリング・ポリシー:sched_setscheduler プロセスのスケジューリング・ポリシーと 優 先 度 を 設 定sched_getscheduler プロセスのスケジューリング・ポリシーを 取 得スケジューリング 優 先 度 :sched_setparamsched_getparamプロセスのスケジューリング 優 先 度 を 変 更プロセスのスケジューリング 優 先 度 を 取 得CPUの 放 棄 :sched_yieldCPUの 放 棄4-6


プロセス・スケジューリング最 低 / 最 高 優 先 度 :sched_get_priority_minsched_get_priority_maxスケジューリング・ポリシーに 対 応 する 最 低 優 先 度 を 取 得スケジューリング・ポリシーに 対 応 する 最 高 優 先 度 を 取 得ラウンドロビン・ポリシー:sched_rr_get_intervalSCHED_RRスケジューリング・ポリシースケジュールされたプロセスに 対 応 するタイム・クォンタムを 取 得sched_setschedulerルーチンルーチン4sched_setscheduler(2)システムコールはスケジューリング・ポリシーと 関 連連 するパラメータをプロセスへ 設 定 することが 可 能 です。sched_setschedulerは、(1)プロセスのスケジューリング・ポリシーをSCHED_FIFOもしくはCHED_RRへ 変 更 する、もしくは、(2)SCHED_FIFOもしくはCHED_RRにスケジューリングされたプロセスの 優 先 度 を 変 更 するために 呼 び 出 して 使 用 すること、 以 下 の 条 件 の1つを 満 たす 必 要 があることに 注 意 することが 重 要 です:• 呼 び 出 し 元 プロセスはルート 権 限 を 所 有 している 必 要 がある• 呼 び 出 し 元 プロセスの 有 効 ユーザーID(uid) はターゲットプロセス(スケジューリング・ポリシーと 優 先 度 が 設 定 されているプロセス)の 有 効 ユーザーIDと 一 致 している 必 要 がある、もしくは 呼 び 出 し 元 プロセスはユーパーユーザーもしくはCAP_SYS_NICE ケーパビリティを 所有 している 必 要 がある概 要#include int sched_setscheduler(pid_t pid, int policy, const struct sched_param *p);struct sched_param {...int sched_priority;...};引 数 は 以 下 のように 定 義 されます:pidpolicyスケジューリング・ポリシーと 優 先 度 が 設 定 さているプロセスのプロセス 識 別番 号 (PID)。 現 在 のプロセスを 指 定 するにはpid の 値 をゼロに 設 定 します。ファイル 内 に 定 義 されているスケジューリング・ポリシー。policy の値 は 以 下 の1つである 必 要 があります:SCHED_FIFOSCHED_RRSCHED_OTHERファーストイン・ファーストアウト(FIFO)ラウンドロビン(RR)タイムシェアリング4-7


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>ppid で 識 別 されるプロセスのスケジューリング 優 先 度 を 指 定 する 構 造造 体 へのポインタ。 優 先 度 は、 指 定 されたポリシーに 対 応 するスケジューラ・クラスに 定義 される 優 先 度 の 範 囲 内 にある 整 数 値 です。 次 のシステムコールの1つを 呼 び 出すことにより 対 応 するポリシーの 優 先 度 の 範 囲 を 判 断 することが 可 能 です:sched_get_priority_minもしくはsched_get_priority_max(これらのシステムコールの 説 明 については4-11ページを 参 照 してください)。sched_getschedulerルーチン4もし 指 定 したプロセスのスケジューリング・ポリシーと 優 先 度 の 正 常 に 設 定 された 場 合 、sched_setschedulerシステムコールはプロセスの 以 前 のスケジューリング・ポリシーを 返 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 知 らせるため 設 定 されます。 発生 する 可 能 性 のあるエラーの 種 類 の 一 覧 はsched_setscheduler(2)のmanページを 参 照 してください。もしエラーが 発 生 した 場 合 、プロセスのスケジューリング・ポリシーと 優 先 度 は 変 更 されません。プロセスのスケジューリング・ポリシーを 変 更 した 時 、その 新 しいタイム・クォンタムもポリシーと 優 先 度 に 関 連連 するスケジューラに 定 義 されているデフォルトのタイム・クォンタムへ 変 更 される 事 に 注 意 することが 重 要 です。run(1)コマンドの 使 用 によりコマンド・レベルでSCHED_RRスケジューリング・ポリシーにスケジュールされたプロセスのタイム・クォンタムを 変 更 することが 可 能 です(このコマンドの 情 報 については4-13ページを 参 照 してください)。sched_getscheduler(2)システムコールは 指 定 したプロセスのスケジューリング・ポリシーを 取得 することが 可 能 です。スケジューリング・ポリシーは 次 のようにファイル 内 に 定 義されています:SCHED_FIFOSCHED_RRSCHED_OTHERファーストイン・ファーストアウト(FIFO)ラウンドロビン(RR)タイムシェアリング概 要#include int sched_getscheduler(pid_t pid);引 数 は 以 下 のように 定 義 されます:pidスケジューリング・ポリシーを 取 得 したいプロセスのプロセス 識 別 番 号 (PID)。現 在 のプロセスを 指 定 するにはpid の 値 をゼロに 設 定 します。もし 呼 び 出 しが 成 功 した 場 合 、sched_getschedulerは 指 定 されたプロセスのスケジューリング・ポリシーを 返 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errno はエラーを 知 らせるため 設 定 されます。 発 生 する 可 能 性 のあるエラーの 種 類 の 一 覧 はsched_getscheduler(2)のmanページを 参 照 してください。4-8


プロセス・スケジューリングsched_setparamルーチンルーチン4sched_setparam(2)システムコールは 指 定 されたプロセスのスケジューリング・ポリシーと 関 連連するスケジューリング・パラメータを 設 定 することが 可 能 です。sched_setparamは、SCHED_FIFOもしくはSCHED_RRにスケジュールされたプロセスのスケジューリング 優 先 度 を 変 更 するために 呼 び 出 して 使 用 すること、 以 下 の 条 件 の1つを 満 たす 必 要 があることに 注 意 することが 重 要 です:• 呼 び 出 し 元 プロセスはルート 権 限 を 所 有 している 必 要 がある• 呼 び 出 し 元 プロセスの 有 効 ユーザーID(uid) はターゲットプロセス(スケジューリング・ポリシーと 優 先 度 が 設 定 されているプロセス)の 有 効 ユーザーIDと 一 致 している 必 要 がある、もしくは 呼 び 出 し 元 プロセスはユーパーユーザーもしくはCAP_SYS_NICE ケーパビリティを 所有 している 必 要 がある概 要#include int sched_setparam(pid_t pid, const struct sched_param *p);struct sched_param {...int sched_priority;...};引 数 は 以 下 のように 定 義 されます:pidpスケジューリング 優 先 度 を 変 更 するプロセスのプロセス 識 別 番 号 (PID)。 現 在 のプロセスを 指 定 するにはpid の 値 をゼロに 設 定 します。pid で 識 別 されるプロセスのスケジューリング 優 先 度 を 指 定 する 構 造造 体 へのポインタ。 優 先 度 は、プロセスの 現 在 のスケジューリング・ポリシーに 対 応 する優 先 度 の 範 囲 内 にある 整 数 値 です。 高 い 数 値 はより 有 利 な 優 先 度 とスケジューリングを 表 します。sched_getscheduler(2)システムコールの 呼 び 出 しによりプロセスのスケジューリング・ポリシーを 取 得 することが 可 能 です(このシステムコールの 説 明 は4-8ページを 参 照 してください)。sched_get_priority_min(2)およびsched_get_priority_max(2)システムコールを 呼 び 出 すことにより 対 応 するポリシーの 優 先 度 の 範 囲 を 判 断 することが 可 能 です。(これらのシステムコールの説 明 は4-11ページを 参 照 してください)戻 り 値 0は 指 定 したプロセスのスケジューリング 優 先 度 の 変 更 が 成 功 したことを 表 します。 戻 り 値-1はエラーが 発 生 したことを 示 し、errnoはエラーを 知 らせるため 設 定 されます。 発 生 する 可 能性 のあるエラーの 種 類 の 一 覧 はsched_setparam(2)のmanページを 参 照 してください。もしエラーが 発 生 した 場 合 、プロセスのスケジューリング 優 先 度 は 変 更 されません。4-9


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>sched_getparamルーチン4sched_getparam(2)システムコールは 指 定 したプロセスのスケジューリング・パラメータを 取 得します。Synopsis#include int sched_getparam(pid_t pid, struct sched_param *p);struct sched_param {...int sched_priority;...};引 数 は 以 下 のように 定 義 されます:pidpスケジューリング 優 先 度 を 取 得 したいプロセスのプロセス 識 別 番 号 (PID)。 現 在のプロセスを 指 定 するにはpid の 値 をゼロに 設 定 します。pid で 識 別 されるプロセスのスケジューリング 優 先 度 を 返 す 構 造造 体 へのポインタ。sched_yieldルーチンルーチン4戻 り 値 0はsched_getparamの 呼 び 出 しが 成 功 したことを 表 します。 指 定 したプロセスのスケジューリング 優 先 度 は、p が 示 す 構 造造 体 の 中 に 返 されます。 発 生 する 可 能 性 のあるエラーの 種 類 の 一覧 は、sched_getparam(2)のmanページを 参 照 してください。sched_yield(2)システムコールは、 呼 び 出 し 元 プロセスが 再 び 実 行 可 能 な 状 態 の 最 高 優 先 度 プロセスになるまでCPUを 放 棄 することを 許 可 します。sched_yieldの 呼 び 出 しは、 呼 び 出 し 元 プロセスと 優 先 度 が 等 しいプロセスが 実 行 可 能 な 状 態 である 場 合 にのみ 有 効 であることに 注 意 してください。このシステムコールは、 呼 び 出 し 元 プロセスよりも 低 い 優 先 度 のプロセスの 実 行 を 許 可するために 使 用 することは 出 来 ません。概 要#include int sched_yield(void);戻 り 値 0はsched_yieldの 呼 び 出 しが 成 功 したことを 表 します。 戻 り 値 -1はエラーが 発 生 したことを 示 します。errnoはエラーを 知 らせるため 設 定 されます。4-10


プロセス・スケジューリングsched_get_priority_minルーチンルーチン4sched_get_priority_min(2)システムコールは 指 定 したスケジューリング・ポリシーに 対 応 する最 も 低 い 優 先 度 を 取 得 することが 可 能 です。概 要#include int sched_get_priority_min(int policy);引 数 は 以 下 のように 定 義 されます:policyファイル 内 に 定 義 されるスケジューリング・ポリシー。policy の 値 は 以 下 の1つである 必 要 があります。SCHED_FIFOSCHED_RRSCHED_OTHERファーストイン・ファーストアウト(FIFO)ラウンドロビン(RR)タイムシェアリング数 字 的 に 高 い 優 先 度 値 を 持 つプロセスは 数 字 的 に 低 い 優 先 度 値 を 持 つプロセスよりも 前 にスケジュールされます。sched_get_priority_minより 返 される 値 は、sched_get_priority_maxより 返される 値 よりも 小 さくなります。<strong>RedHawk</strong> <strong>Linux</strong>は、ユーザー 優 先 度 値 の 範 囲 がSCHED_FIFOとSCHED_RRに 対 しては1から99、そしてSCHED_OTHERに 対 しては 優 先 度 0 が 許 可 されます。もし 呼 び 出 しに 成 功 した 場 合 、sched_get_priority_minは 指 定 したスケジューリング・ポリシーに 対 応 する 最 も 低 い 優 先 度 を 返 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 知 らせるため 設 定 されます。 発 生 する 可 能 性 のあるエラーの 一 覧 を 取 得 するにはsched_get_priority_min(2)のmanページを 参 照 してください。sched_get_priority_maxルーチン4sched_get_priority_max(2)システムコールは 指 定 したスケジューリング・ポリシーに 対 応 する最 も 高 い 優 先 度 を 取 得 することが 可 能 です。概 要#include int sched_get_priority_max(int policy);引 数 は 以 下 のように 定 義 されます:policyファイル 内 に 定 義 されるスケジューリング・ポリシー。policy の 値 は 以 下 の1つである 必 要 があります。SCHED_FIFOSCHED_RRSCHED_OTHERファーストイン・ファーストアウト(FIFO)ラウンドロビン(RR)タイムシェアリング数 字 的 に 高 い 優 先 度 値 を 持 つプロセスは 数 字 的 に 低 い 優 先 度 値 を 持 つプロセスよりも 前 にスケジュールされます。sched_get_priority_maxより 返 される 値 は、sched_get_priority_minより 返される 値 よりも 大 きくなります。4-11


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>sched_rr_get_intervalルーチン4<strong>RedHawk</strong> <strong>Linux</strong>は、ユーザー 優 先 度 値 の 範 囲 がSCHED_FIFOとSCHED_RRに 対 しては1から99、そしてSCHED_OTHERに 対 しては 優 先 度 0が 許 可 されます。もし 呼 び 出 しに 成 功 した 場 合 、sched_get_priority_maxは 指 定 したスケジューリング・ポリシーに 対 応 する 最 も 高 い 優 先 度 を 返 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 知 らせるため 設 定 されます。 発 生 する 可 能 性 のあるエラーの 一 覧 を 取 得 するにはsched_get_priority_max(2)のmanページを 参 照 してください。sched_rr_get_interval(2)システムコールはSCHED_RRスケジューリング・ポリシーでスケジュールされたプロセスのタイム・クォンタムを 取 得 することが 可 能 です。タイム・クォンタムとはカーネルがプロセスにCPUを 割 り 当 てる 一 定 の 時 間 です。CPUが 割 り 当 てられたプロセスがそのタイム・クォンタム 分 を 実 行 しているとき、スケジューリングの 決 定 が 行 われます。もし 同 じ 優先 度 の 他 のプロセスが 実 行 可 能 な 状 態 の 場 合 、そのプロセスがスケジュールされます。もしそうでない 場 合 は、 他 のプロセスが 実 行 され 続 けます。概 要include int sched_rr_get_interval(pid_t pid, struct timespec *tp);struct timespec {time_t tv_sec; /* seconds */long tv_nsec; /* nanoseconds */};引 数 は 以 下 のように 定 義 されます:pidtpタイム・クォンタムを 取 得 したいプロセスのプロセス 識 別 番 号 (PID)。 現 在 のプロセスを 指 定 するにはpid の 値 をゼロに 設 定 します。pid で 識 別 されるプロセスのラウンドロビン・タイム・クォンタムが 返 されるtimespec 構 造造 体 へのポインタ。 識 別 されたプロセスはSCHED_RRスケジューリング・ポリシーで 実 行 している 必 要 があります。戻 り 値 0はsched_rr_get_intervalの 呼 び 出 しが 成 功 したことを 表 します。 指 定 したプロセスのタイム・クォンタムはtp が 示 す 構 造造 体 の 中 に 返 されます。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 知 らせるため 設 定 されます。 発 生 する 可 能 性 のあるエラーの 一 覧 はsched_rr_get_interval(2)のmanページを 参 照 してください。4-12


プロセス・スケジューリングrunコマンド4run(1)コマンドは、プロセス・スケジューラ 属 性 とCPUアフィニティを 制 御 するために 使 用 することが 可 能 です。このコマンドの 構 文 は、run [OPTIONS] {COMMAND [ARGS] | PROCESS/THREAD_SPECIFIER}runコマンドは、オプションのリストが 記 述 された 環 境 で 指 定 のコマンドを 実 行 し、コマンドの終 了 値 を 伴 って 終 了 します。もし 指 定 子 (SPECIFIER)が 与 えられた 場 合 、runは 指 定 子 のプロセス/スレッド 一 式 の 環 境 を 変 更 します。 指 定 子 は 以 下 で 定 義 します。コマンドは 同 じコマンド・ラインの 実 施 で 指 定 子 を 組 み 合 わせることはできません。runコマンドは 指 定 したPOSIXスケジューリング・ポリシーおよび 指 定 した 優 先 度 でプログラムを 実 行 することが 可 能 です。(POSIXスケジューリング・ポリシーの 説 明 は4-3ページを 参 照 してください)SCHED_RRポリシーでスケジュールされたプログラムのタイム・クォンタムもやはり 設定 することが 可 能 です。プログラムのスケジューリング・ポリシーと 優 先 度 を 設 定 するため、シェルからrunコマンドを呼 び 出 し、--policy=policy もしくは–s policy オプションおよび--priority=priority もしくは-Ppriority オプションの 両 方 を 指 定 します。policy の 有 効 なキーワードは、SCHED_FIFO or fifoSCHED_RR or rrSCHED_OTHER or otherSCHED_BATCH or batchSCHED_IDLE or idleファーストイン・ファーストアウト・スケジューリングラウンドロビン・スケジューリングタイムシェア・スケジューリング対 話 型 ジョブを 除 く 長 期 実 行CPUがアイドルになった 時 に 実 行priority の 値 は、 指 定 するスケジューリング・ポリシー(もし-sオプションが 使 用 されていない 場合 は 現 在 のスケジューリング・ポリシー)が 有 効 な 整 数 値 である 必 要 があります。より 高 い 数 値 は、より 有 利 なスケジューリング 優 先 度 を 表 します。SCHED_RRスケジューリング・ポリシーにスケジュールされたプログラムのタイム・クォンタムを 設 定 するため、--quantum=quantum もしくは-q quantum オプションも 指 定 します。quantum は、-20から19までをナイス 値 として 指 定 (スライス 時 間 は-20が 最 も 長 く19が 最 も 短 い)、もしくはナイス 値 に 対 応 するミリ 秒 の 値 として 指 定 します。--quantum=listオプションはナイス 値 と 対 応 するミリ 秒 の 値 を 表 示 します。スケジューリング・ポリシーを 設 定 する 時 にSCHED_RESET_ON_FORK 属 性 を 適遚 用 するには、--resetonforkもしくは–rオプションを 使 用 します。スケジューリング・ポリシーがSCHED_FIFOもしくはSCHED_RRのどちらかでこのオプションを--policyオプションと 共 に 使 用 される 時 、 指定 されたプロセスもしくはコマンドによって 続 いて 作 成 される 子 プロセスは、 親 プロセスのリアルタイム・スケジューリング・ポリシーは 継 承 しませんが、その 代 わりに 子 プロセスはSCHED_OTHERスケジューリング・ポリシーが 割 り 当 てられます。また、--resetonforkオプションが 使 用 される 時 、 親 プロセスのスケジューリング・ポリシーに 関 係 なく、もし 親 プロセスのナイス 値 が0 以 下 であっても 子 プロセスは0のナイス 値 が 割 り 当 てられます。--resetonforkオプションは--policyオプションと 一 緒 に 使 用 される 時 にのみ 有 効 です。--bias=list もしくは-b list オプションを 使 用 することでCPUアフィニティを 設 定 することが 可 能です。list は 論 理 CPU 番 号 のカンマ 区 切 りリストもしくは 範 囲 です( 例 :“0, 2-4, 6”)。アクティブな 全 てのプロセッサもしくはブート・プロセッサをそれぞれ 指 定 するため、list は 文 字 列 で“active”もしくは“boot”と 指 定 することも 可 能 です。CAP_SYS_NICEケーパビリティは 更 にCPUをアフィニティへ 追 加 するためには 必 要 となります。4-13


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>--negateもしくは-NオプションはCPUバイアス・リストを 無 効 な 状 態 にします。--negateオプションが 指 定 される 時 、バイアス・リスト・オプションも 指 定 される 必 要 があります。 指 定 されるバイアスはバイアス・リスト 内 に 指 定 されたものを 除 くシステム 上 の 全 てのCPUを 含 みます。--copies=count もしくは-c count オプションは、コマンドの 同 一 コピーを 指 定 した 回 数 実 行 することが 可 能 です。その 他 のオプションで、 情 報 の 表 示 やバックグラウンドでのコマンド 実 行 に 利 用 することが 可 能です。NUMAメモリ・ポリシーを 設 定 するためのオプションは10 章 に 記 述 されています。 詳 細 な情 報 についてはrun(1)のmanページを 参 照 してください。4-14


プロセス・スケジューリングPROCESS/THREAD_SPECIFIERこのパラメータは 対 象 となるプロセスまたはスレッドを 指 定 するために 使 用 します。 以 下 の1つだけを 指 定 することが 出 来 ます。 複 数 のコンマ 区 切 りの 値 は 全 てのlist で 指 定 することが 可 能 で 範囲 は 必 要 に 応 じて 許 可 されます。--all, -a--pid=list, -p list--tid=list, -t lis--group=list, -g list--user=list, -u list--name=list, -n list既 存 のプロセスとスレッドを 全 て 指 定 します。変 更 する 既 存 のPIDのリストを 指 定 します。 全 てのスケジューラ 操 作は、 全 てのサブスレッドを 含 むリストアップされた 全 てのプロセス・セットに 限 定 します。変 更 する 既 存 のTIDのリストを 指 定 します。 全 てのスケジューラ 操 作は、リストアップされたプロセスのスレッドと 不 特 定 ではないシブリング・スレッドだけに 限 定 します。-l list はPowerMAXとの 互 換 性 のために 使 用 することが 可 能 です。変 更 するプロセス・グループのリストを 指 定 し、リストアップされたプロセス・グループ 内 の 既 存 のプロセス 全 てが 変 更 されます。変 更 するユーザーのリストを 指 定 し、リストアップされたユーザが 所有 する 既 存 のプロセス 全 てが 変 更 されます。リスト 内 の 各 ユーザは 有効 なユーザーIDの 数 値 もしくはログインIDの 文 字 のどちらかになります。変 更 する 既 存 のプロセス 名 称 のリストを 指 定 します。見 本1. 次 のコマンドは、make(1)を 既 定 優 先 度 の 既 定 SCHED_OTHERスケジューリング・ポリシーでCPU0-3のいずれかのバックグラウンドにて 実 行 します。run --bias=0-3 make &2. 次 のコマンドは、date(1)を 優 先 度 10のSCHED_RR(ラウンドロビン)スケジューリング・ポリシーにて 実 行 します。run -s SCHED_RR -P 10 date3. 次 のコマンドは、プロセスIDが987のスケジューリング 優 先 度 をレベル32へ 変 更 します。run --priority=32 -p 9874. 次 のコマンドは、プロセス・グループが1456の 全 てのプロセスをCPU3へ 移 動 します。run -b 3 -g 14565. 次 のコマンドは、 名 称 が“pilot” の 全 てのプロセスを 優 先 度 21のSCHED_FIFOスケジューリング・ポリシーで 実 行 するために 設 定 します。run -s fifo -P 21 -n pilot更 なる 情 報 はrun(1)のmanページを 参 照 してください。4-15


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>4-16


5355Chapter 5プロセス 間 同 期プロセス 間 同 期 の 理 解 5本 章 では<strong>RedHawk</strong> <strong>Linux</strong>がプロセス 間 同 期 のニーズに 対 応 するために 提 供 するツールについて 説明 します。ここで 説 明 する 全 てのインターフェースは、 共 有 リソースへのアクセスを 同 期 する 協同 プロセスのための 手 段 を 提 供 します。マルチプロセッサ・システム 内 の 複 数 のプログラムによる 共 有 データへのアクセスを 同 期 させるために 最 も 効 果 的 なメカニズムは、スピンロックを 使 用 することです。しかし、スピンロック 保持 中 のプリエンプションから 保 護 するために 使 用 している 再 スケジューリング 変 数 もなしにユーザー・レベルからスピンロックを 使 用 することは 安 全 ではありません。もし 移 植 性 が 効 率 性 よりも 大 きな 問 題 である 場 合 、POSIXカウンティング・セマフォとミューテックスは 共 有 データへの 同 期 アクセスにとって 次 善 の 遥 択 です。プロセスがセマフォの 値 の 交 換を 通 じて 通 信 することを 許 可 するSystem V セマフォも 提 供 されます。 多 くのアプリケーションが複 数 のセマフォの 利 用 を 必 要 とするため、この 機 能 はセマフォの 集 合 もしくは 配郤 列 を 作 ることが可 能 となります。同 期 する 協 同 プロセスの 共 有 メモリ 内 データへのアクセスに 関 する 問 題 は、Concurrentがこれらの問 題 に 対 する 解 決 策 を 提 供 するために 開 発 したツールも 加 えて 説 明 します。マルチプロセスのリアルタイム・アプリケーションは、 同 じリソース 一 式 ― 例 えば、I/Oバッファ、ハードウェア・デバイス・ユニット、クリティカル・セクション・コード―へのアクセスの 調 整を 協 同 プロセスに 許 可 する 同 期 メカニズムを 必 要 とします<strong>RedHawk</strong> <strong>Linux</strong>は 数 々のプロセス 間 同 期 ツールを 提 供 します。それには、 再 スケジューリングに対 するプロセスの 脆 弱 性 の 制 御 、ビジーウェイト 相 互 排 他 メカニズムプロセスのアクセスを 含 むクリティカル・セクションへのプロセスのアクセスの 整 列 、クリティカル・セクションに 対 する相 互 排 他 のためのセマフォ、プロセス 間 双 方 向 通 信 の 調 整 のためのツールが 含 まれます。共 有 メモリの 利 用 を 通 して 仮 想 メモリ 空 間 の 一 部邪 を 共 有 する2つ 以 上 のプロセスからなるアプリケーション・プログラムは、 効 率 的 に 共 有 メモリへのアクセスを 調 整 できる 必 要 があります。 同期 の2つの 基 本 的 な 方 法 ( 相 互 排 他 と 条 件 同 期 )は、 共 有 メモリへのプロセスのアクセスを 調 整 するために 使 用 されます。 相 互 排 他 メカニズムは 共 有 リソースへの 協 同 プロセスのアクセスを 順 番 に並 べます。 条 件 同 期 メカニズムはアプリケーションが 定 義 する 条 件 が 満 足 するまでプロセスの 進逭行 を 延 ばします。相 互 排 除 メカニズムは 協 同 プロセスがクリティカル・セクションで 同 時 に 実 行 することができるのは1つだけであることを 保 証 します。3 種 類 のメカニズムは 通 常 は 相 互 排 他 を 提 供 するために 使用 されます―ビジーウェイト、スリーピーウェイト、プロセスがロックされたクリティカル・セクションへ 入 ろうとする 時 に2つの 組 み 合 わせを 必 要 とします。スピンロックとして 知 られるビジーウェイト・メカニズムは、テスト&セット 操 作 をサポートしたハードウェアを 使 用 してロックを 取 得 するロッキング 手 法 を 使 用 します。もしプロセスが 現 在 ロックされた 状 態 でビジーウェイト・ロックを 取 得 しようとする 場 合 、5-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>ロックしているプロセスは、テスト&セット 操 作 をプロセスが 現 在 保 有 しているロックがクリアされテスト&セット 操 作 が 成 功 するまでリトライし 続 けます。 対 照 的 にセマフォのようなスリーピーウェイト・メカニズムは、もしそれが 現 在 ロックされた 状 態 でロックを 取 得 しようとするのであればプロセスをスリープ 状 態 にします。ビジーウェイト・メカニズムは、ロックを 取 得 する 試 みの 殆 どが 成 功 する 時 に 非 常 に 効 果 的 です。これは 単 純 なテスト&セット 操 作 がビジーウェイト・ロックを 取 得 するために 必 要 とされる 全 てであるからです。ビジーウェイト・メカニズムは、ロックが 保 持 される 時 間 が 短 い 時 にリソースを 保 護 するために 適遚 しています。それには 次 の2つの 理 由 があります:1) ロックの 保 持 時 間 が 短い 時 、ロック 中 のプロセスがアンロック 状 態 でロックを 取 得 するので、ロック・メカニズムのオーバーヘッドも 最 小 限 となる 可 能 性 があり、2) ロックの 保 持 時 間 が 短 い 時 、ロックを 取 得 する 遅逼れも 短 くなることが 予 想 されます。ビジーウェイト・メカニズムはロックからアンロック 状 態 となるの 待 っている 間 にCPUリソースを 消 費 しようとするため、ロック 取 得 の 遅逼 れが 短 時 間 で 保 たれるビジーウェイト 相 互 排 他 を 使 用 する 場 合 は 重 要 となります。 一 般 的 なルールとして、もしロックを 保 持 する 時 間 が2つのコンテキスト・スイッチの 実 行 に 要 する 時 間 よりも 全 て 少 ない 場 合 、ビジーウェイト・メカニズムは 適遚 切 です。ビジーウェイト 相 互 排 他 を 実 行 するためのツールは、「ビジーウェイト 相 互 排 他 」セクションで 説 明 しています。クリティカル・セクションは 大 抵 は 非 常 に 短 時 間 です。 同 期 のコストを 比 較 的 小 さく 保 つため、クリティカル・セクションの 入 口 / 出 口 で 実 行 される 同 期 処 理 をカーネルへ 入 れることは 出 来 ません。クリティカル・セクションの 入 場 および 退 場 に 関 連連 する 実 行 オーバーヘッドがクリティカル・セクション 自 体 の 長 さよりも 長 くなることは 好 ましくありません。効 果 的 な 相 互 排 他 ツールとしてスピンロックを 使 用 するため、あるプロセスが 他 のプロセスがロックをリリースするのを 待 つためにスピンする 予 想 時 間 は、 短 時 間 だけでなく 予 測 可 能 である 必要 があります。ロック 中 プロセスのページ・フォルト、シグナル、プリエンプションのような 予測 不 可 能 なイベントは、クリティカル・セクション 内 の 本 当 の 経 過遃 時 間 が 期 待 される 実 行 時 間 を著 しく 超 える 原 因 となります。せいぜい、これらのクリティカル・セクション 内 部邪 の 予 測 不 可 能な 遅逼 れは、 他 のCPUの 遅逼 れが 予 想 されるよりも 長 くなる 原 因 となる 可 能 性 があり、 最 悪 の 場 合 、それらはデッドロックを 引 き 起 こす 可 能 性 があります。メモリ 内 のページ・ロックはクリティカル・セクションへ 入 る 時 間 に 影 響 を 与 えないためにプログラムの 初 期 化 中 に 完 了 させることが 可能 です。 再 スケジューリング 制 御 のメカニズムは、 低 オーバーヘッドのシグナル 制 御 とプロセス・プリエンプションの 手 法 を 提 供 します。 再 スケジューリング 制 御 のためのツールは「 再 スケジューリング 制 御 」で 説 明 されています。セマフォは 相 互 排 他 を 提 供 するためのもう1つのメカニズムです。 既 にロックされているセマフォをロックしようとするプロセスはブロックされるもしくはスリープ 状 態 となるため、セマフォはスリーピー・ウェイト 型 の 相 互 排 他 となります。POSIXのカウンティング・セマフォは 移 植 可 能な 共 有 リソースへのアクセス 制 御 の 手 段 を 提 供 します。カウンティング・セマフォは 整 数 値 とそれに 対 して 定 義 される 操 作 の 制 限 セットを 持 つオブジェクトです。カウンティング・セマフォは、ロックとアンロック 操 作 で 最 速 性 能 を 得 るために 実 装 される 単 純 なインターフェースを 提 供 します。POSIXのカウンティング・セマフォは、「POSIXカウンティング・セマフォ」セクションの中 で 説 明 されています。System Vのセマフォは、 多 くの 追 加 機 能 ( 例 えば、セマフォ 上 でいくつくらい 待 ちがあるのかを 調 べる 機 能 、もしくは 一 連連 のセマフォを 操 作 する 機 能 )を 許 可 する 複 雑 なデータ 型 です。System Vのセマフォは「System Vセマフォ」セクションで 説 明 されています。ミューテックスはプログラム 内 の 複 数 のスレッドが 同 時 ではありませんが 同 じリソースを 共 有 することを 可 能 にします。ミューテックスを 作 成 し、リソースを 必 要 とするどのスレッドもリソースを 使 用 している 間 は 他 のスレッドからミューテックスをロックする 必 要 があり、もう 必 要 とされない 時 にそれをアンロックします。POSIXのミューテックスは、 特 にリアルタイム・アプリケーションにとって 便 利 でミューテックス 単 位 に 個 々に 設 定 可 能 な2つの 機 能 (ロウバスト・ミューテックスと 優 先 度 継 承 ミューテックス)を 持 っています。ロウバスト 性 ( 堅 牢 性 )はもしアプリケーションのスレッドの1つがミューテックス 保 持 中 に 死 んだ 場 合 、 回 復 する 機 会 をアプリケーションに 与 えます。5-2


プロセス 間 同 期再 スケジューリング 制 御優 先 度 継 承 ミューテックスを 使 用 するアプリケーションは、 時 々 引 き 上 げられるミューテックスの 所 有 者 の 優 先 度 を 検 出 することが 可 能 です。これらは「POSIXミューテックスへの 機 能 拡 張 」セクションで 説 明 されています。マルチプロセス、リアルタイム・アプリケーションは 頻 繁 に 短 い 時 間 CPUの 再 スケジューリングを 伸 ばすことを 望 みます。 効 果 的 にビジーウェイト 相 互 排 他 を 使 うため、スピンロックの 保 持 時間 は 小 さくかつ 予 測 可 能 である 必 要 があります。CPU 再 スケジューリングとシグナル 処 理 は 予 測 不 可 能 である 主 要 な 原 因 です。プロセスはスピンロックを 得 るときは 再 スケジューリングに 自 分 自 身 が 影 響 を 受 けないようにし、ロックを 開 放 する 時 は 再 び 被 害 を 受 けやすくなります。システムコールは 呼 び 出 し 元 の 優 先 度 をシステムの 中 で最 高 に 引 き 上 げることは 可 能 ですが、それをするときのオーバーヘッドは 法 外 となります。再 スケジューリング 変 数 は 再 スケジューリングとシグナル 処 理 のための 制 御 を 提 供 します。アプリケーション 内 の 変 数 を 登 録 し、アプリケーションから 直 接 それを 操 作 します。 最 スケジューリング 無 効 、クォンタム 終 了 、プリエンプション、 特 定 タイプのシグナルである 間 は 保 持 されます。システムコールと 一 連連 のマクロは 再 スケジューリング 変 数 の 使 用 を 提 供 します。 次 のセクションで 変 数 、システムコール、マクロを 記 述 し、それらの 使 用 方 法 について 説 明 します。ここに 記 述 される 基 礎 的 なものは 低 オーバーヘッドのCPU 再 スケジューリング 制 御 とシグナル 配郤信 を 提 供 します。再 スケジューリング 変 数 の 理 解 5再 スケジューリング 変 数 は、 再 スケジューリングに 対 するシングル・プロセスの 脆 弱 性 を 制 御 するの 中 で 定 義 されるデータ 構 造造 体 :struct resched_var {pid_t rv_pid;...volatile int rv_nlocks;...};これはカーネルではなくアプリケーションによりプロセス 単 位 もしくはスレッド 単 位 に 割 り 付 けられます。resched_cntl(2)システムコールは 変 数 を 登 録 し、カーネルは 最 スケジューリングを 決定 する 前 に 変 数 を 調 べます。resched_cntlシステムコールの 使 用 は「resched_cntlシステムコールの 利 用 」で 説 明 されています。再 スケジューリング 制 御 マクロ 一 式 はアプリケーションから 変 数 の 操 作 を 可 能 にします。それらのマクロの 使 用 は「 再 スケジューリング 制 御 マクロの 利 用 」で 説 明 されています。各 スレッドはそれぞれの 再 スケジューリング 変 数 を 登 録 する 必 要 があります。 最 スケジューリング 変 数 は、 再 スケジューリング 変 数 のロケーションを 登 録 するプロセスもしくはスレッドに 対 してのみ 有 効 です。 現 在 の 実 装 においては、 再 スケジューリング 変 数 はシングル・スレッドのプロセスでのみ 使 用 することを 推 奨 します。 再 スケジューリング 変 数 を 使 用 するマルチスレッド・プログラムでのフォークは 回 避遪 する 必 要 があります。5-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>resched_cntlシステムコールの 利 用 5resched_cntlシステムコールは 様 々な 再 スケジューリング 制 御 操 作 を 実 行 することが 可 能 です。それらには 再 スケジューリング 変 数 の 登 録 と 初 期 化 、ロケーションの 取 得 、 延 長 可 能 な 再 スケジューリング 時 間 長 の 制 限 設 定 が 含 まれています。概 要#include int resched_cntl(cmd, arg)int cmd;char *arg;gcc [options] file -lccur_rt ...引 数 は 以 下 のように 定 義 されます:cmdarg実 行 される 操 作cmd の 値 に 依 存 する 引 数 の 値 へのポインタcmd は 以 下 のいずれかとなります。 各 コマンドに 関 連連 するarg の 値 が 表 示 されています。RESCHED_SET_VARIABLEこのコマンドは 呼 び 出 し 元 の 再 スケジューリング 変 数 を 登 録 します。 再 スケジューリング 変 数 は、MAP_SHAREDにてマップされた 共 有 メモリの 領 域 もしくはファイル 内 のページを 除 くプロセスのプライベート・ページの 中 にある 必 要 があります。同 一 プロセスの2つのスレッドはそれらの 再 スケジューリング 変 数 として 同 じアドレスを 登 録 してはいけません。もしarg がNULLでない 場 合 、それが 指 すstruct resched_varは 初 期 化 され、 物 理 メモリ 内 へロックされます。もしargがNULLの 場 合 、 呼 び 出 し 元 は 既 存 の 変 数 から 分 離 し、 適遚 当 なページがアンロックされます。fork(2)の 後 、 子 プロセスはその 親 プロセスから 再 スケジューリング 変 数 を 継 承します。 子 プロセスの 再 スケジューリング 変 数 のrv_pidフィールドは 子 プロセスIDに 更 新 されます。もし 子 プロセスが 再 スケジューリング 変 数 を 継 承 した 後 に1つ 以 上 の 子 プロセスをフォークした 場 合 、それらの 子 プロセスはrv_pidフィールドが 更 新 された再 スケジューリング 変 数 を 継 承 します。fork, vfork(2), clone(2)を 呼 び 出 したその 時 にもし 再 スケジューリング 変 数 が親 プロセスの 中 でロックされた 場 合 、 再 スケジューリング 変 数 は 停 止 します。このコマンドの 使 用 はルート 権 限 もしくはCAP_IPC_LOCKとCAP_SYS_RAWIOケーパビリティを 必 要 とします。5-4


プロセス 間 同 期RESCHED_SET_LIMITこのコマンドはデバッグ・ツールです。もしarg がNULLでない 場 合 、 呼 び 出 し元 が 望 む 再 スケジューリング 延 長 の 最 大 時 間 長 を 指 定 するstruct timevalを指 定 します。もしCPUのローカル・タイマーが 有 効 である 場 合 、この 制 限 を 超える 時 にSIGABRTシグナルが 呼 び 出 し 元 へ 送 信 されます。もしarg がNULLの場 合 、 以 前 のどのような 制 限 も 無 視 されます。RESCHED_GET_VARIABLEこのコマンドは 再 スケジューリング 変 数 のロケーションを 返 します。arg は 再スケジューリング 変 数 のポインタを 指 定 する 必 要 があります。もし 呼 び 出 し 元が 再 スケジューリング 変 数 を 持 っていない 場 合 はarg が 参 照 するポインタにはNULLが 設 定 され、そうでなければ 再 スケジューリング 変 数 のロケーションが 設定 されます。RESCHED_SERVEこのコマンドはペンディング 中 のシグナルとコンテキスト・スイッチを 提 供 するためにresched_unlockで 使 用 されます。アプリケーションはこのコマンドを直 接 使 用 する 必 要 はありません。arg は0です。再 スケジューリング 制 御 マクロの 利 用 5一 連連 の 再 スケジューリング 制 御 マクロは 再 スケジューリング 変 数 のロックとアンロックおよび 有効 な 再 スケジューリングのロック 数 を 決 定 することが 可 能 です。これらのマクロを 以 下 で 簡 単 に説 明 します:resched_lockresched_unlockresched_nlocks呼 び 出 し 元 プロセスが 保 持 する 再 スケジューリングのロック 数 を 増やします呼 び 出 し 元 プロセスが 保 持 する 再 スケジューリングのロック 数 を 減らします有 効 な 現 在 の 再 スケジューリングのロック 数 を 返 しますresched_lock 5概 要#include void resched_lock(r);struct resched_var *r;引 数 は 以 下 のように 定 義 されます:r呼 び 出 し 元 プロセスの 再 スケジューリング 変 数 へのポインタresched_lockは 値 を 返 しません。これは 呼 び 出 し 元 プロセスが 保 持 する 再 スケジューリングのロック 数 を 増 やします。プロセスがカーネルに 入 らない 限 り、クォンタム 終 了 、プリエンプション、いくつかのシグナル 配郤 信 は 全 ての 再 スケジューリングのロックが 開 放 されるまで 延 長 されます。5-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>resched_unlock 5しかし、もしプロセスが 例 外 ( 例 :ページ・フォルト)を 発 生 もしくはシステムコールを 行 う 場 合 、シグナルを 受 信 する、さもなければ 再 スケジューリングのロック 数 に 関 係 なくコンテキスト・スイッチを 保 持 する 可 能 性 があります。 次 のシグナルはエラー 状 態 を 表 し、 再 スケジューリングのロックに 影 響 されません:SIGILL, SIGTRAP, SIGFPE, SIGKILL, SIGBUS, SIGSEGV, SIGABRT,SIGSYS, SIGPIPE, SIGXCPU, SIGXFSZ再 スケジューリング 変 数 がロックされている 間 にシステムコールを 行 うことは 可 能 ですが、 推 奨できません。また 一 方 、 呼 び 出 し 元 プロセスが 再 スケジューリング 変 数 がロックされている 間 スリープする 状 態 となるシステムコールを 行 うのは 有 効 ではありません。概 要#include void resched_unlock(r);struct resched_var *r;引 数 は 以 下 のように 定 義 されます:r呼 び 出 し 元 プロセスの 再 スケジューリング 変 数 へのポインタresched_nlocks 5resched_unlockは 値 を 返 しません。もしデクリメントやコンテキスト・スイッチの 後 に 未 処 理のロックが 存 在 しない、もしくはシグナルが 保 留 中 の 場 合 、それらは 即 座 に 提 供 されます。概 要NOTErv_nlocksフィールドはロックがアクティブであると 判 断 させるために 正 の 整 数 である 必 要 があります。 従 って、もしこのフィールドがゼロもしくは 負 の 値 であった 場 合 、アンロックである 判 断 されます。#include int resched_nlocks(r);struct resched_var *r;引 数 は 以 下 のように 定 義 されます:r呼 び 出 し 元 プロセスの 再 スケジューリング 変 数 へのポインタresched_nlocksは 有 効 な 現 在 の 再 スケジューリングのロック 数 を 返 します。これらのマクロの使 用 に 関 する 更 なる 情 報 は、resched_cntl(2)のmanページを 参 照 してください。5-6


プロセス 間 同 期再 スケジューリング 制 御 ツールの 適遚 用 5以 下 のCプログラムの 断 片 は、 前 のセクションで 説 明 したツールを 使 って 再 スケジューリングを制 御 するための 手 順 を 説 明 しています。このプログラムの 断 片 はグローバル 変 数 として 再 スケジューリング 変 数 (rv)を 定 義 し、resched_cntlを 呼 び 出 して 変 数 の 登 録 と 初 期 化 を 行 い、そしてresched_lockとresched_unlockをそれぞれ 呼 び 出 して 再 スケジューリング 変 数 をロックおよびアンロックします。static struct resched_var rv;int main (int argc, char *argv[]){resched_cntl (RESCHED_SET_VARIABLE, (char *)&rv);resched_lock (&rv);/* nonpreemptible code */...resched_unlock (&rv);}return 0;ビジーウェイト 相 互 排 他 5spin_mutex 変 数 の 理 解 5ビジーウェイト 相 互 排 他 は、 共 有 リソースの 同 期 変 数 を 関 連連 付 けることにより 遉 成 します。プロセスもしくはスレッドがリソースへのアクセス 増 加 を 望 む 時 、 同 期 変 数 をロックします。リソースの 使 用 が 終 了 する 時 、 同 期 変 数 をアンロックします。 最 初 のプロセスもしくはスレッドがリソースをロックしている 間 にもし 他 のプロセスもしくはスレッドがリソースへのアクセスを 増 やそうとした 時 、そのプロセスもしくはスレッドはロックの 状 態 を 繰 り 返 し 検 査 することにより 遅逼 らせる 必 要 があります。この 同 期 の 形 式 は、ユーザー・モードから 直 接 アクセス 可 能 である 同 期 変数 およびロックとアンロック 操 作 が 非 常 に 低 オーバーヘッドであることを 要 求 します。<strong>RedHawk</strong> <strong>Linux</strong>は2 種 類 の 低 オーバーヘッドのビジーウェイト 相 互 排 他 変 数 (spin_mutex とnopreempt_spin_mutex)を 提 供 します。nopreempt_spin_mutexはミューテックスを 保 持 している 間 、スレッドもしくはプロセスを 非 プリエンプト 状 態 にするために 再 スケジューリング 変 数を 自 動 的 に 使 用 しますが、spin_mutexはそうではありません。後 に 続 くセクションでは、 変 数 とインターフェースを 定 義 し、それらの 使 用 手 順 を 説 明 します。ビジーウェイト 相 互 排 他 変 数 はスピンロックとして 知 られるデータ 構 造造 体 です。spin_mutex 変 数は 以 下 のようにの 中 で 定 義 されています。typedef struct spin_mutex {volatile int count;} spin_mutex_t;5-7


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>スピンロックは2つの 状 態 (ロックとアンロック)を 持 っています。 初 期 化 される 時 、スピンロックはアンロック 状 態 にあります。もし 共 有 リソースへのアクセスを 調 整 するためにスピンロックを使 用 したいと 考 えている 場 合 、アプリケーション・プログラムの 中 にそれらを 割 り 当 てて 同 期 したいプロセスまたはスレッドが 共 有 するメモリの 中 にそれらを 配郤 置 する 必 要 があります。「spin_mutexインターフェースの 利 用 」で 説 明 されているインターフェースを 使 うことによりそれらを 操 作 することが 可 能 です。spin_mutexインターフェースの 利 用 5このビジーウェイト 相 互 排 他 インターフェース 一 式 は、スピンロックの 初 期 化 、ロック、アンロックおよび 特 定 のスピンロックがロックされているかどうかを 判 断 することが 可 能 です。 以 下 で簡 単 に 説 明 します:spin_initspin_lockspin_trylockspin_islockspin_unlockスピンロックをアンロック 状 態 に 初 期 化 しますスピンロックがロックされるまでスピンします指 定 されたスピンロックのロックを 試 みます指 定 されたスピンロックがロックされているかどうかを 確 認 します指 定 されたスピンロックをアンロックしますこれらのインターフェースのいずれも 無 条 件 にスピンロックをロックすることが 可 能 なものはないことに 注 意 することが 重 要 です。 提 供 されるツールを 使 用 することによりこの 機 能 を 構 築 することが 可 能 です。CAUTIONスピンロック 上 の 操 作 は 再 起 的 ではありませんが、もし 既 にロックされたスピンロックを 再 ロック 使 用 とする 場 合 、プロセスまたはスレッドはデッドロックとなる 可 能 性 があります。これらを 使 用 する 前 にspin_initの 呼 び 出 しによりスピンロックを 初 期 化 する 必 要 があります。 各スピンロックに 対 して1 度 だけspin_initを 呼 び 出 します。もし 指 定 するスピンロックがロックされている 場 合 、spin_initは 効 果 的 にアンロックしますが、これは 値 を 返 しません。spin_initインターフェースは 以 下 のように 指 定 されます:#include void spin_init(spin_mutex_t *m);引 数 は 以 下 のように 定 義 されます:mスピンロックの 開 始 アドレスspin_lockはスピンロックがロックされるまでスピンします。これは 値 を 返 しません。このインターフェースは 以 下 のように 指 定 されます:#include void spin_lock(spin_mutex_t *m);5-8


プロセス 間 同 期もし 呼 び 出 し 元 プロセスまたはスレッドがスピンロックのロックに 成 功 した 場 合 、spin_trylockはtrue を 返 し、もし 成 功 しなかった 場 合 はfalse を 返 します。spin_trylockは 呼 び 出 し 元 プロセスまたはスレッドをブロックしません。このインターフェースは 以 下 のように 指 定 されます:#include int spin_trylock(spin_mutex_t *m);もし 指 定 されたスピンロックがロックされている 場 合 、spin_islockはtrue を 返 します。もしアンロックされている 場 合 はfalse が 返 します。これはスピンロックをロックしません。このインターフェースは 以 下 のように 指 定 されます:#include int spin_islock(spin_mutex_t *m);spin_unlockはスピンロックをアンロックします。これは 値 を 返 しません。このインターフェースは 以 下 のように 指 定 されます:#include void spin_unlock(spin_mutex_t *m);spin_lock, spin_trylock, spin_unlockはNightTrace RTで 監 視 するためにトレース・イベントを 記録 することが 可 能 です。アプリケーションはより 前 にSPIN_TRACEを 定 義 することにより、これらのトレース・イベントを 有 効 にすることが 可 能 です。 例 :#define SPIN_TRACE#include spin_mutexツールの 適遚 用 5もし-lpthreadがリンクされる 場 合 、アプリケーションは-lntraceもしく-lntrace_thrもリンクされる 必 要 があります。これらのインターフェースの 使 用 に 関 する 更 なる 情 報 は、spin_init(3)のmanページを 参 照 してください。ビジーウェイト 相 互 排 他 のためのspin_mutex ツールの 使 用 手 順 は、 以 下 のコードの 断 片 で 説 明 します。 最 初 の 部邪 分 は、スピンロックを 取 得 するために 再 スケジューリング 制 御 と 一 緒 にこれらのツールを 使 用 する 方 法 を 示 し、 次 頁 はスピンロックを 開 放 する 方 法 を 示 します。これらのコードの 断 片 にシステムコールもプロシージャコールも 含 まれていないことに 注 意 してください。_m 引 数 はスピンロックを 指 し、 引 数 は 呼 び 出 し 元 プロセスもしくはスレッドの 再 スケジューリング 変 数 を 指 します。これはスピンロックが 共 有 メモリ 内 にあることを 前 提 としています。ページングやスワッピングに 関 連連 するオーバーヘッドを 回 避遪 するため、クリティカル・セクション 内部邪 で 参 照 されるページは 物 理 メモリにロックすることを 推 奨 します。(mlock(2) およびshmctl(2)システムコールを 参 照 してください)#define spin_acquire(_m,_r) ¥{ ¥resched_lock(_r); ¥while (!spin_trylock(_m)) { ¥resched_unlock(_r); ¥while (spin_islock(_m)); ¥resched_lock(_r); ¥} ¥}5-9


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>#define spin_release(_m,_r) ¥{ ¥spin_unlock(_m); ¥resched_unlock(_r); ¥}前 頁 の 断 片 では、spin_trylockとspin_islockのインターフェースの 使 用 に 注 意 してください。もしスピンロックをロックしようとしているプロセスもしくはスレッドがロックされているスピンロックを 見 つけた 場 合 、spin_islockの 呼 び 出 しによりロックが 開 放 されるまで 待 ちます。このシーケンスは 直 接 spin_trylockでポーリングするよりも 効 率 的 です。spin_trylockインターフェースはテスト&セットの 原 始 的 なスピンロックを 実 行 するための 特 別 な 命 令 を 含 みます。これらの命 令 はspin_islockによる 単 純 なメモリ 読 み 取 りの 実 行 よりも 効 果 は 小 さくなります。再 スケジューリング 制 御 インターフェースの 使 用 もまた 注 意 してください。デッドロックを 回 避遪するため、プロセスもしくはスレッドはスピンロックのロックの 前 に 再 スケジューリングを 無 効にし、スピンロックのアンロック 後 にそれを 再 度 有 効 にします。プロセスもしくはスレッドはspin_islockの 呼 び 出 しの 直 前 で 再 スケジューリングを 再 度 有 効 にするので、 再 スケジューリングが 必 要 以 上 に 長 くなることはありません。nopreempt_spin_mutex 変 数 の 理 解 5nopreempt_spin_mutex は、 共 有 リソースへの 同 期 アクセスを 複 数 のスレッドもしくはプロセスに許 可 するビジーウェイト・ミューテックスです。 再 スケジューリング 変 数 はミューテックスがロックされている 間 に 非 プリエンプトなスレッドもしくはプロセスにするために 使 用 されます。スレッドもしくはプロセスは 複 数 のミューテックスのロックを 安 全 に 重 ねることが 可 能 です。nopreempt_spin_mutex は、 以 下 のようにの 中 で 定 義 されています:typedef struct nopreempt_spin_mutex {spin_mutex_t spr_mux;} nopreempt_spin_mutex_t;スピンロックは2つの 状 態 (ロックとアンロック)を 持 っています。 初 期 化 される 時 、スピンロックはアンロック 状 態 にあります。もし 共 有 リソースへのアクセスを 調 整 するために 非 プリエンプト・スピンロックを 使 用 したいと考 えている 場 合 、アプリケーション・プログラムの 中 にそれらを 割 り 当 てて 同 期 したいプロセスまたはスレッドが 共 有 するメモリの 中 にそれらを 配郤 置 する 必 要 があります。「nopreempt_spin_mutexインターフェースの 利 用 」で 説 明 されているインターフェースを 使 うことによりそれらを 操 作 することが 可 能 です。nopreempt_spin_mutexインターフェースの 利 用 5このビジーウェイト 相 互 排 他 インターフェース 一 式 は 非 プリエンプト・スピンロックのロック、アンロックが 可 能 です。 再 スケジューリング 変 数 はロックされたミューテックスを 保 持 する 間 に非 プリエンプトなスレッドもしくはプロセスにするために 使 用 されます。 以 下 で 簡 単 に 説 明 します:nopreempt_spin_initnopreempt_spin_init_threadnopreempt_spin_lockスピンロックをアンロック 状 態 に 初 期 化 しますプリエンプションがブロックさることを 保 証 しますスピンロックがロックされるまでスピンします5-10


プロセス 間 同 期nopreempt_spin_trylocknopreempt_spin_islocknopreempt_spin_unlock指 定 されたスピンロックのロックを 試 みます指 定 されたスピンロックがロックされているかどうかを確 認 します指 定 されたスピンロックをアンロックしますこれらを 使 用 する 前 にnopreempt_spin_initの 呼 び 出 しによりスピンロックを 初 期 化 する 必 要 があります。 各 スピンロックに 対 して1 度 だけこのインターフェースを 呼 び 出 します。もし 指 定 するスピンロックがロックされている 場 合 、nopreempt_spin_initは 効 果 的 にアンロックしますが、これは 値 を 返 しません。このインターフェースは 以 下 のように 指 定 されます:#include void nopreempt_spin_init(nopreempt_spin_mutex_t *m);引 数 は 以 下 のように 定 義 されます:mスピンロックの 開 始 アドレスnopreempt_spin_lockとnopreempt_spin_trylockが 呼 び 出 された 時 、nopreempt_spin_init_threadはプリエンプションがブロックされることを 保 証 します。nopreempt_spin_mutexがマルチ・スレッド・プロセスで 使 用 される 時 、プロセスは-lpthreadがリンクされる 必 要 があり、 各 スレッドはnopreempt_spin_init_threadを 少 なくても1 回 は 呼 び 出 す必 要 があります。もしプロセスがマルチ・スレッド 化 されていない 場 合 、このルーチンを 少 なくても1 回 は 呼 び 出 す 必 要 があります。このルーチンは、プロセスもしくはスレッドが 何 個 ミューテックスを 使 用 しているかに 関 係 なく1 回 は 呼 び 出 される 必 要 があります。もしプリエンプションのブロックが 保 証 される 場 合 ゼロが 返 りますが、そうではない 場 合 errnoが 設 定 されて-1が 返 ります。このインターフェースは 以 下 のように 指 定 されます:#include int nopreempt_spin_init_thread(void)nopreempt_spin_lockはスピンロックがロックされるまでスピンします。これは 値 を 返 しません。このインターフェースは 以 下 のように 指 定 されます:#include void nopreempt_spin_lock(nopreempt_spin_mutex_t *m);もし 呼 び 出 し 元 プロセスもしくはスレッドがスピンロックのロックに 成 功 した 場 合 、nopreempt_spin_trylockはtrue を 返 しますが、もし 成 功 しなかった 場 合 はfalseを 返 します。nopreempt_spin_trylockは 呼 び 出 し 元 プロセスもしくはスレッドをブロックしません。このインターフェースは 以 下 のように 指 定 されます:#include int nopreempt_spin_trylock(nopreempt_spin_mutex_t *m);もし 指 定 されたスピンロックがロックされている 場 合 、nopreempt_spin_islockはtrueを 返 します。もしアンロックされている 場 合 はfalse を 返 します。このインターフェースは 以 下 のように指 定 されます:#include int nopreempt_spin_islock(nopreempt_spin_mutex_t *m);nopreempt_spin_unlockはスピンロックをアンロックします。これは 値 を 返 しません。このインターフェースは 以 下 のように 指 定 されます:#include void nopreempt_spin_unlock(nopreempt_spin_mutex_t *m);5-11


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>nopreempt_spin_lock, nopreempt_spin_trylock, nopreempt_spin_unlockはNightTrace RTで監 視 するためにトレース・イベントを 記 録 することが 可 能 です。アプリケーションはより 前 にSPIN_TRACEを 定 義 することにより、これらのトレース・イベントを 有 効 にすることが 可 能 です。 例 :#define SPIN_TRACE#include もし-lpthreadがリンクされる 場 合 、アプリケーションは-lntraceもしく-lntrace_thrもリンクされる 必 要 があります。これらのインターフェースの 使 用 に 関 する 更 なる 情 報 は、nopreempt_spin_init(3)のmanページを 参 照 してください。POSIXカウンティンカウンティング・セマフォグ・セマフォ5概 要 5カウンティング・セマフォはロックとアンロック 操 作 のための 最 速 性 能 を 遉 成 するために 実 装 可能 な 単 純 なインターフェースを 提 供 します。カウンティング・セマフォは 整 数 値 とそれに 対 して定 義 される 操 作 の 制 限 セットを 持 つオブジェクトです。これらの 操 作 と 対 応 するPOSIXインタフェースは 以 下 を 含 みます:• セマフォをゼロもしく 正 の 値 に 設 定 する 初 期 化 操 作 — sem_initもしくはsem_open• セマフォの 値 をデクリメントするロック 操 作 — sem_waitもしくはsem_timedwait。 結 果 の値 が 負 の 場 合 、 操 作 を 実 行 しているタスクはブロックします• セマフォの 値 をインクリメントするアンロック 操 作 — sem_post。もし 結 果 の 値 がゼロ 以 下の 場 合 、セマフォ 上 でブロックされているタスクの1つが 起 こされます。もし 結 果 の 値 がゼロを 超 える 場 合 、セマフォ 上 でブロックされたタスクはありません。• 値 が 正 の 場 合 のみセマフォの 値 をデクリメントする 条 件 付 きロック 操 作 —sem_trywait。もし 値 がゼロもしくは 負 の 場 合 、 操 作 は 失 敗 します。• セマフォの 値 のスナップショットを 提 供 するクエリ 操 作 —sem_getvalueロック、アンロック、 条 件 付 きロック 操 作 は 強 力 です( 一 連連 の 操 作 が 同 時 に 実 行 され、それらが 全て 同 時 に 完 了 できる 場 合 のみ)。カウンティング・セマフォは 複 数 の 協 同 プロセスで 使 用 できるあらゆるリソースへのアクセスを制 御 するために 使 用 することが 可 能 です。カウンティング・セマフォは 名 前 付 きでも 名 前 なしでも 可 能 です。スレッドはsem_init(3)ルーチンの 呼 び 出 しを 通 して 名 前 なしセマフォを 作 成 し 初 期 化 します。このセマフォは 呼 び 出 しで 指 定 される 値 に 初 期 化 します。アプリケーション 内 の 全 スレッドは、sem_initルーチンの 呼 び 出 しで 作 成 された 名 前 なしセマフォにアクセスします。5-12


プロセス 間 同 期インターフェース5スレッドはsem_openルーチンの 呼 び 出 しおよびユニークな 名 前 ( 分 かりやすいNULLで 終 了 する文 字 列 )の 指 定 することにより 名 前 付 きセマフォを 作 成 します。セマフォは、セマフォを 作 成 するためのsem_open 呼 び 出 しで 供 給 される 値 に 初 期 化 されます。sem_openルーチンはプロセスの仮 想 アドレス 空 間 にセマフォを 含 めますので、 名 前 付 きセマフォのためにプロセスが 空 間 を 割 り当 てることはありません。 他 のプロセスはsem_openの 呼 び 出 しおよび 同 じ 名 前 の 指 定 により 名前 付 きセマフォへアクセスすることが 可 能 です。名 前 なしもしくは 名 前 付 きのセマフォを 初 期 化 する 時 、その 値 は 利 用 可 能 なリソースの 数 に 設 定する 必 要 があります。 相 互 排 他 を 提 供 するためにカウンティング・セマフォを 使 うには、セマフォの 値 は1 に 設 定 する 必 要 があります。クリティカルなリソースへのアクセスを 望 む 協 同 タスクは、そのリソースを 保 護 するセマフォをロックする 必 要 があります。タスクがセマフォをロックする 時 、それはシステム 内 の 他 の 協 同 タスクから 干 渉 されることなくリソースが 使 用 可 能 であることを 知 っています。リソースを 保 護 するセマフォを 取 得 した 後 にリソースがアクセスされるようにアプリケーションが 書 かれている 必要 があります。セマフォの 値 が 正 である 限 りリソースは 利 用 可 能 で、リソースの1つはそれを 取 得 しようとしている 次 のタスクに 割 り 当 てられます。セマフォの 値 がゼロの 時 、 利 用 可 能 なリソースは1つもなく、リソースを 取 得 しようとしているタスクは 利 用 可 能 となる1になるまで 待 つ 必 要 があります。もしセマフォの 値 が 負 である 場 合 、リソースの1つを 取 得 するためにブロックされているもしくは 待 機しているタスクが1つ 以 上 存 在 する 可 能 性 があります。タスクがリソースの 使 用 を 完 了 する 時 、それはセマフォをアンロックし、リソースを 他 のタスクが 使 用 可 能 であることを 知 らせます。所 有 権 の 概 念 はカウンティング・セマフォには 当 てはまりません。あるタスクがセマフォをロックすることが 可 能 で、 他 のタスクはそれをアンロックすることが 可 能 です。セマフォのアンロック 操 作 は 安 全 な 非 同 期 シグナルで、これはタスクがデッドロックを 引 き 起 こすことなくシグナル・ハンドリング・ルーチンからセマフォをアンロックすることが 可 能 です。所 有 権 の 欠 如 は 優 先 度 の 継 承 を 不 可 能 にします。 何 故 ならタスクがセマフォをロックする 時 にタスクはセマフォの 所 有 者 にはならないため、タスクは 同 じセマフォをロックしようとするのをブロックする 高 優 先 度 タスクの 優 先 度 を 一 時 的 に 継 承 することが 出 来 ません。その 結 果 、 無 限 の 優先 度 逆 転 が 生 じる 可 能 性 があります以 降 のセクションでPOSIXカウンティング・セマフォ・インターフェースの 使 用 手 順 を 説 明 します。これらのインターフェースを 以 下 で 簡 単 に 説 明 します:sem_initsem_destroysem_opensem_closesem_unlinksem_waitsem_trywaitsem_timedwaitsem_postsem_getvalue名 前 なしカウンティング・セマフォを 初 期 化 します名 前 なしカウンティング・セマフォを 削 除 します名 前 付 きカウンティング・セマフォの 作 成 、 初 期 化 、 接 続 の 確 立 を行 います名 前 付 きカウンティング・セマフォへのアクセスを 放 棄 します名 前 付 きカウンティング・セマフォの 名 前 を 削 除 しますカウンティング・セマフォをロックしますカウンティング・セマフォがアンロックである 場 合 ロックしますカウンティング・セマフォをタイムアウト 付 きでロックしますカウンティング・セマフォをアンロックしますカウンティング・セマフォをの 値 を 取 得 します5-13


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>The sem_initルーチン5これらのインターフェースを 使 用 るするため、Pスレッド・ライブラリをアプリケーションにリンクする 必 要 があることに 注 意 してください。 以 下 のサンプルは 動 的 に 共 有 ライブラリとリンクする 時 に 実 施 するコマンド・ラインを 示 します。ネイティブPOSIXライブラリ(NPTL) はデフォルトで 使 用 されます。gcc [options] file.c -lpthread同 じアプリケーションを 以 下 のコマンド・ラインで 静 的 にリンクさせることが 可 能 です。これは<strong>Linux</strong>スレッド・ライブラリを 使 用 します。gcc [options] -static file.c -lpthreadプロセス 共 有 セマフォのサポートが<strong>Linux</strong>スレッド・ライブラリにはないことに 注 意 してください。sem_init(3)ライブラリ・ルーチンは、セマフォによって 保 護 されている 利 用 可 能 なリソースの 数にセマフォの 値 を 設 定 することにより、 呼 び 出 し 元 プロセスが 名 前 なしカウンティング・セマフォを 初 期 化 することが 可 能 です。 相 互 排 他 のためにカウンティング・セマフォを 使 用 するには、プロセスは 値 を1に 設 定 します。NPTLライブラリを 使 用 して 動 的 にリンクされたプログラムは、pshared パラメータがゼロではない 値 に 設 定 される 時 にプロセス 間 でセマフォを 共 有 することが 可 能 です。もしpshared にゼロが設 定 された 場 合 、セマフォは 同 じプロセス 内 のスレッド 間 だけで 共 有 します。<strong>Linux</strong>スレッド・ライブラリを 使 用 して 静 的 にリンクされたプログラムは、 同 じプロセス 内 のスレッド 間 で 共 有 するカウンティング・セマフォを 所 有 することのみ 可 能 です(pshared は0を 設 定 する 必 要 があります)。プロセス 内 の1つのスレッドがセマフォを 作 成 、 初 期 化 した 後 、 同 一 プロセスの 他 の 協 同 スレッドはこのセマフォを 操 作 することが 可 能 です。fork(2)システムコールにより作 成 される 子 プロセスは、 親 プロセスが 既 に 初 期 化 したセマフォへのアクセスを 継 承 しません。exec(3)もしくはexit(2)システムコールを 呼 び 出 した 後 、プロセスもまたセマフォへのアクセスを失 います。sem_wait, sem_timedwait, sem_trywait, sem_post, sem_getvalue ライブラリ・ルーチンはセマフォを 操 作 するために 使 用 されます。 名 前 なしカウンティング・セマフォはsem_destroyルーチンの 呼 び 出 しにより 削 除 されます。これらのルーチンはこの 後 のセクションで 説 明 します。CAUTIONIEEE 1003.1b-1993 規 格 は、 複 数 のプロセスが 同 一 セマフォに 対 してsem_initを 呼 び 出 した 時 に 発 生 することを 示 していません。 現 在 、<strong>RedHawk</strong> <strong>Linux</strong>の 実 装 は、 単 に 最 初 のsem_init 呼 び 出 しの 後 に 行 われるsem_initの 呼 び 出 しで 指 定 される 値 にセマフォを 再 初 期 化 します。アプリケーション・コードがPOSIXインターフェース( 将 来 のConcurrentのシステムを 含 む)をサポートするどのようなシステムにも 移 植 することが 出 来 ることを 確 実 にするため、sem_initを 使 う 協 同 プロセスはシングル・プロセスが 特 定 のセマフォの 初 期 化 が1 度 だけ 行 われることを 守 る必 要 があります。もしsem_initの 呼 び 出 しの 前 に 既 に 初 期 化 され、この 同 じセマフォを 待機 中 のスレッドが 複 数 存 在 している 後 にsem_initが 呼 び 出 された 場 合 、これらのスレッドはsem_waitの 呼 び 出 しから 返 ることは 決 してなく、 明示 的 に 終 了 させることが 必 要 となります。5-14


プロセス 間 同 期概 要#include int sem_init(sem_t *sem, int pshared, unsigned int value);引 数 は 以 下 のように 定 義 されます:sempsharedvalue初 期 化 する 名 前 なしカウンティングセマフォを 表 すsem_t 構 造造 体 へのポインタセマフォを 他 のプロセスが 共 有 するかどうかを 示 す 整 数 値 。もしpshared にゼロ以 外 の 値 が 設 定 されている 場 合 、セマフォはプロセス 間 で 共 有 されます。もしpshared にゼロが 設 定 されている 場 合 、セマフォは 同 一 プロセス 内 のスレッド 間でのみ 共 有 されます。<strong>Linux</strong>スレッド・ライブラリを 使 って 静 的 にリンクされたプログラムは、プロセス 間 で 共 有 するセマフォを 使 用 することは 出 来 ず、psharedにゼロを 設 定 する 必 要 があり、もしゼロが 設 定 されていない 場 合 はsem_initは-1を 返 し、errnoにENOSYSが 設 定 されます。ゼロもしくは、セマフォの 値 を 現 在 利 用 可 能 なリソースの 数 へ 初 期 化 する 正 の整 数 値 。この 数 はSEM_VALUE_MAXの 値 を 超 えることができません(この 値 を確 認 するにはを 参 照 してください)。The sem_destroyルーチン5戻 り 値 0はsem_initの 呼 び 出 しが 成 功 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを 示し、errnoはエラーを 知 らせるため 設 定 されます。 発 生 する 可 能 性 のあるエラーの 種 類 の 一 覧 はsem_init(3)のmanページを 参 照 してください。概 要CAUTION名 前 なしカウンティング・セマフォは、どのプロセスもセマフォを 操 作する 必 要 がなくなり、 現 在 セマフォをブロックするプロセスが 存 在 しなくなるまで 削 除 してはいけません。#include int sem_destroy(sem_t *sem);引 数 は 以 下 のように 定 義 されます:sem削 除 する 名 前 なしカウンティング・セマフォへのポインタ。sem_init(3)の 呼 び出 しで 作 成 されたカウンティング・セマフォだけをsem_destroyの 呼 び 出 しで削 除 することが 可 能 です。戻 り 値 0はsem_destroyの 呼 び 出 しが 成 功 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 知 らせるため 設 定 されます。 発 生 する 可 能 性 のあるエラーの 種 類 の一 覧 はsem_destroy(3)のmanページを 参 照 してください。5-15


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>The sem_openルーチンルーチン5sem_open(3)ライブラリ・ルーチンは、 呼 び 出 し 元 プロセスが 名 前 付 きカウンティング・セマフォの 作 成 、 初 期 化 、 接 続 を 確 立 することが 可 能 です。プロセスが 名 前 付 きカウンティング・セマフォを 作 成 する 時 、ユニークな 名 前 をセマフォへ 関 連連 付 けます。これもやはりセマフォに 保 護 されている 利 用 可 能 なリソースの 数 にセマフォの 値 を 設 定 します。 相 互 排 他 のために 名 前 付 きカウンティング・セマフォを 使 用 するには、プロセスは 値 を1に 設 定 します。名 前 付 きセマフォを 作 成 した 後 、 他 のプロセスはsem_openの 呼 び 出 しおよび 同 じ 名 前 の 指 定 によりそのセマフォへの 接 続 を 確 立 することが 可 能 となります。 正 常 に 完 了 するとsem_openルーチンは 名 前 付 きカウンティング・セマフォのアドレスを 返 します。プロセスはその 後 、sem_wait,sem_trywaitとsem_postの 呼 び 出 しでセマフォを 参 照 するためにそのアドレスを 使 用 します。プロセスはsem_closeルーチンもしくはexec(2), _exit(2)システムコールを 呼 び 出 すまで 名 前 付 きセマフォを 操 作 し 続 ける 可 能 性 があります。execもしくはexitの 呼 び 出 しで 名 前 付 きセマフォはsem_closeの 呼 び 出 しであるかのように 終 了 します。fork(2)システムコールにより 作 成 される 子プロセスは 親 プロセスが 確 立 した 名 前 付 きセマフォへのアクセスを 継 承 します。もしシングル・プロセスがsem_openを 同 じ 名 前 を 指 定 して 複 数 呼 び 出 しを 行 う 場 合 、(1)プロセス 自 身 がsem_closeの 呼 び 出 しを 通 してセマフォを 閉 じていない、もしくは、(2)いくつかのプロセスがsem_unlinkの 呼 び 出 しを 通 して 名 前 を 削 除 していない 限 り 同 じアドレスが 各 々の 呼 び 出し 元 に 返 されます。もし 複 数 のプロセスがsem_openを 同 じ 名 前 を 指 定 して 複 数 呼 び 出 しを 行 う 場 合 、いくつかのプロセスがsem_unlinkの 呼 び 出 しを 通 して 名 前 を 削 除 していない 限 り、 同 じセマフォ・オブジェクトのアドレスが 各 々の 呼 び 出 し 元 に 返 されます( 各 呼 び 出 しにおいて 必 ずしも 同 じアドレスが返 さるわけではないことに 注 意 してください)。もしプロセスがsem_unlinkの 呼 び 出 しを 通 して名 前 を 削 除 した 場 合 、セマフォ・オブジェクトの 新 しいインスタンスのアドレスが 返 されます。概 要#include sem_t *sem_open(const char *name, int oflag[, mode_t mode, unsigned int value ]);引 数 は 以 下 のように 定 義 されます:nameoflagセマフォの 名 前 を 指 定 するNULLで 終 了 する 文 字 列 。 接 頭 語 “sem” はname の 前に 付 加 され、セマフォは/dev/shmにデータファイルとして 作 成 されます。 先 頭のスラッシュ(/) 文 字 は 可 能 ( 移 植 性 のあるアプリケーションのために 推 奨 )ですがスラッシュを 途 中 に 埋 め 込 めません。 先 頭 のスラッシュ 文 字 も 現 在 の 作 業 ディレクトリも 名 前 の 解 釈 に 影 響 を 与 えません。 例 えば、/mysemとmysemは 両方 とも/dev/shm/sem.mysemとして 解 釈 されます。 接 頭 語 4 文 字 を 含 むこの 文字 列 は/usr/include/limits.hで 定 義 されるNAME_MAX 未 満 で 構 成 されている 事に 注 意 が 必 要 です。呼 び 出 し 元 プロセスが 名 前 付 きカウンティング・セマフォもしくは 既 存 の 名 前付 きカウンティング・セマフォへの 接 続 の 確 率 かどうかを 示 す 整 数 値 。 以 下 のビットが 設 定 することが 可 能 です:5-16


プロセス 間 同 期O_CREATname で 指 定 されるカウンティング・セマフォが 存 在 しない 場 合 、 作 成 されます。セマフォのユーザーIDは 呼 び 出 し元 プロセスの 有 効 なユーザーIDに 設 定 され、そのグループIDは 呼 び 出 し 元 プロセスの 有 効 なグループIDに 設 定 され、そのパーミッション・ビットはmode 引 数 で 指 定 されたとおりに 設 定 されます。セマフォの 初 期 値 はvalue 引 数 で 指定 されたとおりに 設 定 されます。このビットを 設 定 する 時 、mode とvalue 引 数 の 両 方 を 指 定 する 必 要 があることに 注意 してください。もしname で 指 定 されるカウンティング・セマフォが 存 在する 場 合 、O_EXCLに 記 述 されている 事 以 外 は 設 定 されたO_CREATは 効 力 を 持 ちません。O_EXCLもしO_CREATが 設 定 され、name で 指 定 されたカウンティング・セマフォが 存 在 する 場 合 、sem_openは 失 敗 します。もしO_CREATが 設 定 されていない 場 合 、このビットは 無 視されます。もしO_CREATとO_EXCL 以 外 のフラグ・ビットがoflag 引数 に 設 定 されている 場 合 、sem_openルーチンはエラーを返 すことに 注 意 してください。modevalue次 の 例 外 を 含 むname で 指 定 されるカウンティング・セマフォのパーミッション・ビットを 設 定 する 整 数 値 :プロセスのファイル・モード 作 成 マスクに 設 定されたビットはカウンティング・セマフォのモードでクリアされます( 更 なる 情報 についてはumask(2)とchmod(2)のmanページを 参 照 してください)。パーミッション・ビット 以 外 のビットがmode に 設 定 されている 場 合 、それらは 無 視 されます。プロセスは 名 前 付 きカウンティング・セマフォを 作 成 するときのみmode引 数 を 指 定 します。ゼロもしくは 現 在 利 用 可 能 なリソースの 数 にセマフォの 値 を 初 期 化 する 正 の 整数 値 。この 数 はで 定 義 されるSEM_VALUE_MAXの 値 を 超 えることは出 来 ません。プロセスは 名 前 付 きカウンティング・セマフォを 作 成 するときのみvalue 引 数 を 指 定 します。The sem_closeルーチンルーチン5もし 呼 び 出 しが 成 功 した 場 合 、sem_openは 名 前 付 きカウンティング・セマフォのアドレスを 返します。SEM_FAILEDの 戻 り 値 はエラーが 発 生 したことを 示 し、errnoはエラーを 示 すために 設定 されます。 発 生 する 可 能 性 のあるエラーのタイプのリストについてはsem_open(3)のmanページを 参 照 してください。sem_close(3)ライブラリ・ルーチンは 呼 び 出 し 元 プロセスが 名 前 付 きカウンティング・セマフォへのアクセスを 放 棄 することが 可 能 です。sem_closeルーチンはセマフォを 利 用 するプロセスに割 り 当 てられたシステム・リソースを 開 放 します。その 後 、セマフォを 操 作 しようとするプロセスがSIGSEGVシグナルの 配郤 信 を 招 く 結 果 となる 可 能 性 があります。セマフォに 関 連連 するカウントはプロセスのsem_close 呼 び 出 しに 影 響 を 受 けません。Synopsis#include int sem_close(sem_t *sem);5-17


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>引 数 は 以 下 のように 定 義 されます:semアクセスを 開 放 する 名 前 付 きカウンティング・セマフォへのポインタ。sem_open(3)の 呼 び 出 しを 通 して 確 立 したカウンティング・セマフォとの 接 続のみを 指 定 することが 可 能 です。The sem_unlinkルーチンルーチン5戻 り 値 0はsem_closeの 呼 び 出 しが 成 功 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを示 し、errnoはエラーを 示 すために 設 定 されます。 発 生 する 可 能 性 のあるエラーのタイプのリストについてはsem_close(3)のmanページを 参 照 してください。sem_unlink(3)ライブラリ・ルーチンは 呼 び 出 し 元 プロセスがカウンティング・セマフォの 名 前を 削 除 することが 可 能 です。その 後 同 じ 名 前 を 使 用 してセマフォへの 接 続 を 確 立 しようとするプロセスはセマフォの 異 なるインスタンスに 対 し 接 続 を 確 立 します。 呼 び 出 し 時 点 でセマフォを 参照 しているプロセスは、sem_close(3), exec(2), exit(2)システムコールを 呼 び 出 すまでセマフォを 使 用 し 続 けることが 可 能 です。概 要#include int sem_unlink(const char *name);引 数 は 以 下 のように 定 義 されます:nameセマフォの 名 前 を 指 定 するNULLで 終 了 する 文 字 列 。 接 頭 語 “sem” はname の 前に 付 加 され、セマフォは/dev/shmにデータファイルとして 作 成 されます。 先 頭のスラッシュ(/) 文 字 は 可 能 ( 移 植 性 のあるアプリケーションのために 推 奨 )ですがスラッシュを 途 中 に 埋 め 込 めません。 先 頭 のスラッシュ 文 字 も 現 在 の 作 業 ディレクトリも 名 前 の 解 釈 に 影 響 を 与 えません。 例 えば、/mysemとmysemは 両方 とも/dev/shm/sem.mysemとして 解 釈 されます。 接 頭 語 4 文 字 を 含 むこの 文字 列 は/usr/include/limits.hで 定 義 されるNAME_MAX 未 満 で 構 成 されている事 に 注 意 が 必 要 です。戻 り 値 0はsem_unlinkの 呼 び 出 しが 成 功 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 示 すために 設 定 されます。 発 生 する 可 能 性 のあるエラーのタイプのリストについてはsem_unlink(3)のmanページを 参 照 してください。5-18


プロセス 間 同 期The sem_waitルーチンルーチン5sem_wait(3)ライブラリ・ルーチンは 呼 び 出 し 元 プロセスが 名 前 なしカウンティング・セマフォをロックすることが 可 能 です。もしセマフォの 値 がゼロである 場 合 、セマフォは 既 にロックされています。この 場 合 、プロセスはシグナルもしくはセマフォがアンロックされるまでブロックします。もしセマフォの 値 がゼロより 大 きい 場 合 、プロセスはセマフォをロックし 続 けます。いずれにせよ、セマフォの 値 は 減 少 します。概 要#include int sem_wait(sem_t *sem);引 数 は 以 下 のように 定 義 されます:semロックする 名 前 なしカウンティング・セマフォへのポインタThe sem_timedwaitルーチンルーチン5戻 り 値 0はプロセスが 指 定 したセマフォのロックに 成 功 したことを 示 します。 戻 り 値 -1はエラーが発 生 したことを 示 し、errnoはエラーを 示 すために 設 定 されます。 発 生 する 可 能 性 のあるエラーのタイプのリストについてはsem_wait(3)のmanページを 参 照 してください。sem_timedwait(3)ライブラリ・ルーチンは 呼 び 出 し 元 プロセスが 名 前 なしカウンティング・セマフォをロックすることが 可 能 ですが、もしsem_postを 介 してアンロックする 他 のプロセスもしくはスレッドを 待 つことなしにセマフォがロックできない 場 合 、 指 定 されたタイムアウトの 期 限が 切 れた 時 に 待 機 は 終 了 します。概 要#include #include int sem_timedwait(sem_t *sem, const struct timespec *ts);引 数 は 以 下 のように 定 義 されます:semtsロックする 名 前 なしカウンティング・セマフォへのポインタ待 機 が 終 了 する 単 一 時 間 を 秒 とナノ 秒 で 指 定 したに 定 義 されているtimespec 構 造造 体 へのポインタ例 :ts.tv_sec = (NULL)+2ts.tv_nsec = 02 秒 のタイムアウトを 設 定 。POSIX 時 間 構 造造 体 に 関 する 詳 細 な 情 報 については、6 章 の「POSIX 時 間 構 造造 体 の 理 解 」を 参 照 してください。戻 り 値 0はプロセスが 指 定 したセマフォのロックに 成 功 したことを 示 します。 戻 り 値 -1はエラーが発 生 したことを 示 し、errno はエラーを 示 すために 設 定 されます。 発 生 する 可 能 性 のあるエラーのタイプのリストについてはsem_wait(3)のmanページを 参 照 してください。5-19


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>The sem_trywaitルーチンルーチン5sem_trywait(3)ライブラリ・ルーチンはセマフォがアンロックされていることを 示 すセマフォの値 が0より 大 きい 場 合 のみ、 呼 び 出 し 元 プロセスがカウンティング・セマフォをロックすることが可 能 です。もしセマフォの 値 がゼロである 場 合 、セマフォを 既 にロックされており、sem_trywaitの 呼 び 出 しは 失 敗 します。もしプロセスがセマフォのロックに 成 功 する 場 合 、セマフォの 値 は 減少 し、そうでない 場 合 は 変 わりません。概 要#include int sem_trywait(sem_t *sem);引 数 は 以 下 のように 定 義 されます:sem呼 び 出 し 元 プロセスがロックする 名 前 なしカウンティング・セマフォへのポインタThe sem_postルーチンルーチン5戻 り 値 0は 呼 び 出 し 元 プロセスが 指 定 したセマフォのロックに 成 功 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errno はエラーを 示 すために 設 定 されます。 発 生 する 可 能 性 のあるエラーのタイプのリストについてはsem_trywait(3)のmanページを 参 照 してください。sem_post(3)ライブラリ・ルーチンは 呼 び 出 し 元 プロセスがカウンティング・セマフォをアンロックすることが 可 能 です。もし1つ 以 上 のプロセスがセマフォを 待 ってブロックしている 場 合 、 最高 優 先 度 の 待 機 中 プロセスがセマフォがアンロックされた 時 に 起 こされます。概 要#include int sem_post(sem_t *sem);引 数 は 以 下 のように 定 義 されます:semアンロックする 名 前 なしカウンティング・セマフォへのポインタ戻 り 値 0はsem_postの 呼 び 出 しが 成 功 したことを 示 します。もし 正 しくないセマフォ 記 述 子 が 提供 された 場 合 、セグメンテーション・フォルトが 生 じます。 戻 り 値 -1はエラーが 発 生 したことを示 し、errnoはエラーを 示 すために 設 定 されます。 発 生 する 可 能 性 のあるエラーのタイプのリストについてはsem_post(3)のmanページを 参 照 してください。5-20


プロセス 間 同 期The sem_getvalueルーチンルーチン5sem_getvalue(3)ライブラリ・ルーチンは 呼 び 出 し 元 プロセスが 名 前 なしカウンティング・セマフォの 値 を 取 得 することが 可 能 です。概 要#include int sem_getvalue(sem_t *sem, int *sval);引 数 は 以 下 のように 定 義 されます:semsval値 を 取 得 したい 名 前 なしカウンティング・セマフォへのポインタ名 前 なしカウンティング・セマフォの 値 が 返 される 場 所 へのポインタ。 返 される 値 はコール 中 のあるタイミングでのセマフォの 実 際 の 値 を 表 します。この 値は 呼 び 出 しから 戻 るその 時 点 でのセマフォの 実 際 値 ではないかもしれない 事 に注 意 することが 重 要 です。戻 り 値 0はsem_getvalueの 呼 び 出 しに 成 功 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 示 すために 設 定 されます。 発 生 する 可 能 性 のあるエラーのタイプのリストについてはsem_getvalue(3)のmanページを 参 照 してください。POSIXミューテックスへの 機 能 拡 張 5ミューテックスは 同 時 更 新 やクリティカル・セクションの 実 行 から 共 有 データ 構 造造 体 を 保 護 するために 便 利 な 相 互 排 他 デバイスです。ミューテックスはアンロック(どのスレッドにも 所 有 されていない)とロック(1つのスレッドが 所 有 )の2つの 状 態 を 持 っています。 他 のスレッドが 既 にロックしているミューテックスをロックしようとするスレッドは、まず 所 有 しているスレッドがミューテックスをアンロックするまで 停 止 します。<strong>RedHawk</strong>で 利 用 可 能 な 標 準 的 なPOSIXのPスレッド・ミューテックス 機 能 には 以 下 のサービスが 含まれます。これらのサービスのすべての 情 報 はmanページを 参 照 してください。pthread_mutex_init(3)pthread_mutex_lock(3)pthread_mutex_trylock(3)pthread_mutex_unlock(3)pthread_mutex_destroy(3)pthread_mutexattr_init(3)ミューテックスを 初 期 化ミューテックスをロックミューテックスのロックを 試 すミューテックスをアンロックミューテックスを 破 棄ミューテックスの 属 性 オブジェクトを 初 期 化pthread_mutexattr_destroy(3) ミューテックスの 属 性 オブジェクトを 破 棄pthread_mutexattr_settype(3) ミューテックスの 属 性 タイプを 設 定pthread_mutexattr_gettype(3) ミューテックスの 属 性 タイプを 取 得5-21


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>それらのサービスに 加 え、<strong>RedHawk</strong>にはロウバスト 性 ( 堅 牢 性 )と 優 先 度 継 承 を 提 供 する 以 下 のPOSIXのPスレッド 拡 張 が 含 まれます。ロウバスト 性 はもしアプリケーションのスレッドの1つがミューテックス 保 持 中 に 死 んだ 場 合 、 回 復 する 機 会 をアプリケーションに 与 えます。「 優 先 度 継承 」は、ミューテックスを 所 有 するどのスレッドも 直 接 的 または 間 接 的 にスレッドの 優 先 度 のスケジューリングをスリープ 中 の 最 高 優 先 度 スレッドの 優 先 度 へ 自 動 的 に 引 き 上 げます。これらの条 件 の 詳 細 を 以 下 に 記 述 します。サービスは 以 降 のセクションおよびmanページで 説 明 されています。pthread_mutex_consistent_np(3)pthread_mutex_getunlock_np(3)pthread_mutex_setconsistency_np(3)pthread_mutex_setunlock_np(3)pthread_mutexattr_getfast_np(3)pthread_mutexattr_getprotocol(3)pthread_mutexattr_getrobust_np(3)pthread_mutexattr_getunlock_np(3)pthread_mutexattr_setfast_np(3)pthread_mutexattr_setprotocol(3)pthread_mutexattr_setrobust_np(3)pthread_mutexattr_setunlock_np(3)矛 盾 するミューテックスの 矛 盾 をなくすミューテックスのアンロック・ポリシーを 返 すミューテックスの 整 合 性 状 態 を 設 定ミューテックスのアンロック・ポリシーを 設 定操 作 モードを 返 すプロトコルを 返 すロウバスト・レベルを 返 すアンロック・ポリシーを 返 す操 作 モードを 設 定プロトコルを 設 定ロウバスト・レベルを 設 定アンロック・ポリシーを 設 定ロウバスト・ミューテックス 5ロウバスト・ミューテックスを 使 用 するアプリケーションは、ミューテックスを 保 持 中 に 前 のミューテックス 所 有 者 が 終 了 したかどうかを 検 出 することが 可 能 です。 新 しい 所 有 者 はミューテックスに 保 護 されている 状 態 を 除 去 しようとし、もしそれが 出 来 た 場 合 、 再 び 正 常 なミューテックスをマークするすることが 可 能 となります。もし 状 態 の 除 去 が 出 来 なかった 場 合 、ミューテックスをロックしようとする 際 に 回 復 不 可 能 であることを 表 すステータスを 取 得 するようにするためにミューテックスは 回 復 不 可 能 とマークする 可 能 性 があります。これを 実 装 するため、EOWNERDEADとENOTRECOVERABLEの2つの 新 しいerrnoコードを 利 用できます。ミューテックス 保 持 中 にスレッドが 死 んだ 時 、ミューテックスは 自 動 的 にアンロックし 死 んだとマークされます。デッド・ミューテックスにおいて 各 々の 成 功 したロックが 成 功 ではなくEOWNERDEADエラーを 返 すことを 除 いては、デッド・ロックは 通 常 のロックのように 動 作します。従 って、ロウバストに 関 係 するアプリケーションは 戻 された 全 ロック 要 求 のステータスを 調 べる必 要 があります。EOWNERDEADである 時 、アプリケーションはそれを 無 視 することが 可 能 で、所 有 者 が 死 んだおよび 矛 盾 ( 正 常 )がマークされたことに 起 因 するアプリケーションの 不 正 を 何 でも 回 復 、もし 回 復 出 来 なかった 場 合 、 回 復 不 可 能 をマークします。回 復 不 可 能 をマークされたミューテックスはENOTRECOVERABLEエラーを 伴 うミューテックスの 将 来 全 ての 操 作 を 拒 否 します。 唯 一 の 例 外 はミューテックスを 最 初 期 化 するサービスとミューテックスの 状 態 を 問 い 合 わせるサービスです。 回 復 不 可 能 になるミューテックスでスリープしているスレッドはENOTRECOVERABLEエラーを 伴 い 直 ぐに 起 き 上 がります。5-22


プロセス 間 同 期優 先 度 継 承 5優 先 度 継 承 ミューテックスを 使 用 するアプリケーションは、その 時 々に 一 時 的 に 引 き 上 げられる優 先 度 を 検 出 することが 可 能 です。 引 き 上 げはミューテックスを 取 得 したそれらのスレッドで 発生 し、 他 の 高 優 先 度 スレッドはそのミューテックスを 待 ってスリープ 状 態 に 入 ります。この 場 合 、スリープしているスレッドの 優 先 度 は 所 有 者 がロックを 保 持 する 間 は 一 時 的 にロック 所 有 者 に 移されます。それらのスリープしているスレッドは 他 のミューテックスを 順 に 所 有 することができるため、それら 自 身 が 優 先 度 を 引 き 上 げ、 最 大 機 能 はどの 優 先 度 へ 引 き 上 げるかを 決 定 する 際 に 優 先 度 を 引き 上 げられるスリープ・スレッドを 使 用 して 解 決 します。ユーザー・インターフェース5ここに 記 載 されたサービスの 完 全 な 説 明 は 後 に 続 くセクションおよび 対 応 するオンラインのmanページで 提 供 されます。以 下 のサービスはミューテックスの 状 態 で 操 作 します。pthread_mutex_consistent_np(3)pthread_mutex_getunlock_np(3)pthread_mutex_setconsistency_np(3)pthread_mutex_setunlock_np(3)矛 盾 するミューテックスの 矛 盾 をなくすミューテックスのアンロック・ポリシーを 返 すミューテックスの 整 合 性 状 態 を 設 定ミューテックスのアンロック・ポリシーを 設 定以 下 に 記 載 されたサービスはミューテックス 属 性 オブジェクト 内 に 格 納 されている 属 性 に 関 して修 正 もしくは 問 い 合 わせを 行 います。「ミューテックス 属 性 オブジェクト」は 属 性 オブジェクトを 伴 い 作 成 されたミューテックス 内 で 利 用 可 能 であるミューテックスの 機 能 を 定 義 するデータ 構造造 体 です。ミューテックスは 多 くの 機 能 を 持 っているので、ミューテックス 属 性 オブジェクトはアプリケーションが1つのミューテックス 属 性 オブジェクト 内 で 要 求 されるすべての 属 性 を 定 義するためにそれの 使 い 勝 手 を 良 くして、 一 連連 の 属 性 オブジェクトを 持 つことになる 全 てのミューテックスを 作 成 します。更 にミューテックスの 寿 命 のために 固 定 される 必 要 のあるそれらの 属 性 は、ミューテックス 属 性オブジェクトを 通 してのみ 定 義 することが 可 能 です。 同 様 にミューテックスの 寿 命 を 変 更 可 能 な属 性 は、ミューテックス 属 性 オブジェクトを 通 して 最 初 の 定 義 を 与 えることが 可 能 で、その 後 、対 応 するミューテックス 自 身 の 属 性 操 作 を 介 して 変 更 することが 可 能 です。属 性 の 取 得 :pthread_mutexattr_getfast_np(3)pthread_mutexattr_getprotocol(3)pthread_mutexattr_getrobust_np(3)pthread_mutexattr_getunlock_np(3)操 作 モードを 返 すプロトコルを 返 すロウバスト・レベルを 返 すアンロック・ポリシーを 返 す属 性 の 設 定 :pthread_mutexattr_setfast_np(3)pthread_mutexattr_setprotocol(3)pthread_mutexattr_setrobust_np(3)pthread_mutexattr_setunlock_np(3)操 作 モードを 設 定プロトコルを 設 定ロウバスト・レベルを 設 定アンロック・ポリシーを 設 定5-23


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>pthread_mutex_consistent_np 5このサービスは 矛 盾 するミューテックスの 矛 盾 をなくします。概 要pthread_mutex_getunlock_np 5int pthread_mutex_consistent_np (pthread_mutex_t *mutex)もしミューテックスの 所 有 者 がそれを 保 持 中 に 死 んだ 場 合 に 矛 盾 のないミューテックスは 矛 盾 することになります。 更 に、 所 有 者 の 死 の 検 出 においては、まるでpthread_mutex_unlockが 実 行されたかのようにミューテックスはアンロック 状 態 となります。 後 続 の 所 有 者 が 所 有 権 を 与 えられたpthread_mutex_lockから 戻 りEOWNERDEADエラーを 受 信 することを 除 いて、ロックは 通常 のように 機 能 し 続 けます。これは 取 得 したミューテックスが 矛 盾 していることを 新 しい 所 有 者へ 知 らせています。このサービスは 矛 盾 するミューテックスの 所 有 者 に 呼 ばれることのみ 可 能 です。このサービスはミューテックスのアンロック・ポリシーを 返 します。int pthread_mutex_getunlock_np(const pthread_mutex_t *mutex, int *policy)アンロック・ポリシーは*policy に 次 の 値 が 設 定 されて 返 されます:pthread_mutex_setconsistency_np 5PTHREAD_MUTEX_UNLOCK_SERIAL_NPpthread_mutex_unlockは、 所 有 者 からロックを 待 っている 最 高 優 先 度 スレッドへ 直 接 ロックを 渡 します。PTHREAD_MUTEX_UNLOCK_PARALLEL_NPロックがアンロックされ、ロックを 待 っている 所 有 者 がいる 場 合 、 最 も 重 要 なスレッドが 起 こされます。 起 こされたスレッドは 初 めてロックを 取 得 しようとする 場 合 と 同 じようにロックを 競 います。PTHREAD_MUTEX_UNLOCK_AUTO_NP起 こされるスレッドのPOSIXスケジューリング・ポリシーに 基 づく 上 記 2つのポリシーの 間 で 遥 択 します。もしスレッドがSCHED_OTHERである 場 合 、パラレル・ポリシーを 使 用 し、そうでない 場 合 はシリアル・ポリシーを 使 用 します。このサービスは 与 えられたミューテックスの 整 合 性 状 態 を 設 定 します。int pthread_mutex_setconsistency_np(pthread_mutex_t *mutex, int state)state は 以 下 のいずれかとなります::PTHREAD_MUTEX_ROBUST_CONSISTENT_NP矛 盾 するミューテックスの 矛 盾 をなくします。アプリケーションは、ミューテックスが 矛 盾 しているとマークされる 原 因 となった 問 題 を 解 決 できた 場 合 のみこれを 実 行 する 必 要 があります。5-24


プロセス 間 同 期pthread_mutex_setunlock_np 5PTHREAD_MUTEX_ROBUST_NOTRECOVERABLE_NP回 復 不 可 能 として 矛 盾 するミューテックスをマークします。アプリケーションは、 矛 盾 するとマークされるミューテックスの 原 因 となった 問 題 を 解 決 できない 場 合 にこれを 実 行 する 必 要 があります。ミューテックスは 当 初 は 矛 盾 する 状 態 である 必 要 があり、さもなければこのサービスはエラーを返 します。ミューテックスの 所 有 者 のみこの 整 合 性 状 態 を 変 更 することが 可 能 です。このサービスはこのミューテックスのアンロック・ポリシーを 設 定 します。概 要pthread_mutexattr_getfast_np 5int pthread_mutex_setunlock_np(pthread_mutex_t *mutex, int policy)policy は、PTHREAD_MUTEX_UNLOCK_SERIAL_NP,PTHREAD_MUTEX_UNLOCK_PARALLEL_NP, PTHREAD_MUTEX_UNLOCK_AUTO_NPのいずれかとなります。 上 述 の 定 義 は「pthread_mutex_getunlock_np」セクションを 参 照 してください。このサービスはattr の 属 性 一 式 で 初 期 化 されたミューテックスが 高 速 モードもしくは 低 速 モードで 実 行 するのかどうかを 返 します。概 要int pthread_mutexattr_getfast_np(const pthread_mutexattr_t *attr,int *mode)*mode に 次 の 値 が 設 定 されて 返 されます:pthread_mutexattr_getprotocol 5PTHREAD_MUTEX_FASTPATH_NPattr と 共 に 初 期 化 されるミューテックスは 高 速 モードで 実 行 されます。このモードでは、 非 競 合 ロックおよびアンロックはカーネルには 入 りません。PTHREAD_MUTEX_SLOWPATH_NPattr と 共 に 初 期 化 されるミューテックスは 低 速 モードで 実 行 されます。このモードでは、pthread_mutex_lockおよびpthread_mutex_unlock 毎 にカーネルに入 ります。このサービスはこの 属 性 一 式 で 初 期 化 されるミューテックスのためのプロトコルを 返 します。概 要int pthread_mutexattr_getprotocol(pthread_mutexattr_t *attr,int *protocol)利 用 可 能 なプロトコル:PTHREAD_PRIO_NONEスレッドのスケジューリング・ポリシーはこのミューテックスの 動 作 に 影 響 を受 けません。5-25


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>pthread_mutexattr_getrobust_np 5PTHREAD_PRIO_INHERITスレッドのスケジューリング・ポリシーは 優 先 度 継 承 のルールに 従 い 変 更 されます:スレッドがミューテックスの 所 有 者 である 限 り、それは 直 接 的 もしくは間 接 的 にミューテックスを 取 得 するために 待 機 している 最 高 優 先 度 スレッドの優 先 度 を 継 承 します。このサービスはこの 属 性 一 式 で 初 期 化 されるミューテックスのためのロウバスト・レベルを 返 します。概 要int pthread_mutexattr_getrobust_np(const pthread_mutexattr_t *attr,int *robustness)利 用 可 能 なレベル:PTHREAD_MUTEX_ROBUST_NPこの 属 性 オブジェクトで 初 期 化 されるミューテックスはロウバストになります。PTHREAD_MUTEX_STALLED_NPこの 属 性 オブジェクトで 初 期 化 されるミューテックスはロウバストにはなりません。ロウバスト・ミューテックスはこの 所 有 者 が 死 んで 矛 盾 状 態 へ 移 行 した 時 に 検 出 するものです。矛 盾 状 態 の 定 義 については「pthread_mutex_consistent_np」を 参 照 してください。非 ロウバスト・ミューテックスはこの 所 有 者 が 死 んで 無 期 限 (これは、シグナルに 割 り 込 まれるまで、もしくは 何 か 他 のスレッドが 死 んだプロセスに 代 わりミューテックスをアンロックするまで)でロックされたままの 場 合 に 検 出 しません。pthread_mutexattr_getunlock_np 5このサービスはこの 属 性 一 式 で 初 期 化 されるミューテックスのためのアンロック・ポリシーを 返します。概 要pthread_mutexattr_setfast_np 5int pthread_mutexattr_getunlock_np(const phtread_mutexattr_t *attr,int *mode)利 用 可 能 なポリシーは、PTHREAD_MUTEX_UNLOCK_SERIAL_NP,PTHREAD_MUTEX_UNLOCK_PARALLEL_NP, PTHREAD_MUTEX_UNLOCK_AUTO_NPとなります。これらの 定 義 については「pthread_mutex_getunlock_np」セクションを 参 照 してください。このサービスはこの 属 性 一 式 で 作 成 されるミューテックスのための 操 作 モードを 設 定 します。概 要int pthread_mutexattr_setfast_np(pthread_mutexattr_t *attr, int mode)modeは、PTHREAD_MUTEX_FASTPATH_NPもしくはPTHREAD_MUTEX_SLOWPATH_NPとなります。これらの 定 義 については「pthread_mutexattr_getfast_np」セクションを 参 照 してください。5-26


プロセス 間 同 期pthread_mutexattr_setprotocol 5このサービスはこのミューテックス 属 性 一 式 から 作 成 されるどのミューテックスのプロトコルでも 設 定 します。概 要int pthread_mutexattr_setprotocol(pthread_mutexattr_t *attr, int protocol)protocol は、PTHREAD_PRIO_NONEもしくはPTHREAD_PRIO_INHERITになります。これらの 定義 については「pthread_mutexattr_getprotocol」を 参 照 してください。pthread_mutexattr_setrobust_np 5このサービスはこのミューテックス 属 性 オブジェクトで 作 成 されるミューテックスのためのロウバスト・レベルを 設 定 します。概 要int pthread_mutexattr_setrobust_np(pthread_mutexattr_t *attr,int robustness)robustness は、PTHREAD_MUTEX_ROBUST_NPもしくはPTHREAD_MUTEX_STALLED_NPになります。これらの 定 義 については「pthread_mutexattr_getrobust_np」を 参 照 してください。pthread_mutexattr_setunlock_np 5このサービスはこのミューテックス 属 性 オブジェクトで 作 成 されるミューテックスのためのアンロック・モードを 設 定 します。int pthread_mutexattr_setunlock_np(pthread_mutexattr_t *attr, int mode)mode は、PTHREAD_MUTEX_UNLOCK_SERIAL_NP,PTHREAD_MUTEX_UNLOCK_PARALLEL_NP, PTHREAD_MUTEX_UNLOCK_AUTO_NPのいずれかになります。これらの 定 義 については「pthread_mutex_getunlock_np」を 参 照 してください。POSIXミューテックス・プログラムのコンパイルミューテックス・プログラムのコンパイル5上 述 の 優 先 度 継 承 、ロウバスト・ミューテックスを 使 用 するプログラムは 標 準 的 なcc(1), gcc(1),g++(1)ツールでコンパイルします。<strong>RedHawk</strong>の 以 前 のバージョンには、ccur-gccもしくはccur-g++でアプリケーションをコンパイルおよびリンクすることでアクセスされるこれらのミューテックスための 拡 張 部邪 分 を 提 供 する 代 替えのglibcが 含 まれていたことに 注 意 してください。この 機 能 は 現 在 標 準 glibcに 含 まれており、代 替 えglibcやccur-* コンパイル・スクリプトは 既 に 利 用 できません。標 準 glibc 追 加 は 代 替 えglibcを 通 して 提 供 された 拡 張 部邪 分 と 完 全 なバイナリ 互 換 です。<strong>RedHawk</strong>の 以 前 のバージョン 上 でccur-gccおよびccur-g++でコンパイルされた 既 存 のバイナリは、 現 在 の<strong>RedHawk</strong>のバージョン 上 で 変 更 なく 動 き 続 けます。 優 先 度 継 承 、ロウバスト・ミューテックスを使 用 する 既 存 のプログラムは 標 準 ツールでソースの 変 更 を 必 要 とせずコンパイルが 可 能 です。しかしながら、ccur-* を 明 記 するMakefileは 標 準 ツールを 使 用 するために 変 更 する 必 要 があることに 注 意 してください。その 代 わり、シンボリック・リンクは 名 前 をccur-gcc, ccur-g++からgcc,g++へ 指 すためにそれぞれ/usr/binに 作 成 することが 可 能 です。5-27


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>System Vセマフォセマフォ5概 要 5System Vセマフォはプロセスがセマフォ 値 の 交 換 を 介 して 同 期 することが 可 能 なプロセス 間 通 信(IPC)メカニズムです。 多 くのアプリケーションが1つ 以 上 のセマフォの 使 用 を 必 要 としているため、オペレーティング・システムはセマフォの 集 合 もしくは 配郤 列 を 初 期 化 するための 機 能 を 持 っています。セマフォの 集 合 は1つ 以 上 、 最 大 SEMMSL( 内 に 定 義 )の 制 限 値 までのセマフォを 収 納 することが 可 能 です。セマフォのセットはsemget(2)システムコールを 使 用 することで 作 成 されます。単 純 なセマフォだけが 必 要 とされる 時 、カウンティング・セマフォはより 効 果 的 です。( 「POSIXカウンティング・セマフォ」セクションを 参 照 してください)semgetシステムコールを 実 行 しているプロセスは 所 有 者 / 作 成 者 になり、いくつのセマフォが 集合 の 中 にあるのかを 割 り 出 し、 自 分 自 身 を 含 む 全 てのプロセスに 対 して 最 初 の 操 作 パーミッションを 設 定 します。このプロセスはその 後 集 合 の 所 有 権 を 放 棄 することが 可 能 、さもなければsemctl(2)システムコールを 使 って 操 作 権 限 を 変 更 することが 可 能 です。 作 成 されたプロセスは 機能 が 存 在 する 限 り 常 に 作 成 者 のままです。 操 作 パーミッションを 持 つ 他 のプロセスは、 他 の 制 御機 能 を 実 行 するためにsemctlを 使 用 することが 可 能 です。セマフォの 所 有 者 がパーミッションを 許 可 する 場 合 、どのプロセスでもセマフォを 操 作 することが 可 能 です。 集 合 内 の 各 セマフォをsemop(2)システムコールによりインクリメントおよびデクリメントすることが 可 能 です( 後 述 の「semopシステムコール」セクションを 参 照 してください)。セマフォをインクリメントするには、 望 む 大 きさの 整 数 値 をsemopシステムコールへ 渡 します。セマフォをデクリメントするには、 望 む 大 きさのマイナス(-) 値 を 渡 します。オペレーティング・システムは、 確 実 にその 時 点 で 設 定 されるセマフォが 操 作 可 能 なのは1つのプロセスだけとします。 同 時 リクエストは 任 意 の 方 法 で 順 番 に 実 行 されます。プロセスは 値 の 大 きなセマフォの1つをデクリメントすることによりセマフォ 値 を 特 定 の 値 よりも 大 きくするためにテストすることが 可 能 です。もしプロセスが 成 功 する 場 合 、セマフォ 値 は 特定 値 よりも 大 きくなります。さもなければセマフォ 値 はそうなりません。それをしている 間 、プロセスはセマフォ 値 が 実 行 を 許 可 ( 他 のプロセスがセマフォをインクリメント)するまでその 実 行を 停 止 (IPC_NOWAITフラグ 未 設 定 )することが 可 能 で、さもなければセマフォ 機 能 は 削 除 されます。実 行 を 停 止 する 機 能 は「ブロッキング・セマフォ 操 作 」と 呼 ばれます。この 機 能 もまたゼロと 等しいセマフォをテスト( 読 み 取 り 専 用 パーミッションが 必 要 )しているプロセスを 利 用 可 能 で、これはsemopシステムコールへゼロの 値 を 渡 すことで 実 現 されます。一 方 、プロセスが 成 功 せずその 実 行 を 停 止 するリクエストが 無 い 場 合 、これは「 非 ブロッキング・セマフォ 操 作 」と 呼 ばれます。この 場 合 、プロセスは-1を 返 し、 外 部邪 変 数 errnoにその 結 果 が 設定 されます。ブロッキング・セマフォ 操 作 は、プロセスが 異 なるタイミングでセマフォの 値 を 介 して 同 期 することが 可 能 です。IPC 機 能 は 許 可 されたプロセスにより 削 除 されるまで、もしくはシステムが 再初 期 化 されるまでオペレーティング・システムの 中 に 留 まることを 思 い 出 してください。セマフォの 集 合 が 作 成 された 時 、 集 合 内 の 最 初 のセマフォはセマフォ 番 号 がゼロです。 集 合 内 の最 後 のセマフォ 番 号 は 集 合 の 総 数 よりも1 小 さい 数 が 設 定 されます。5-28


プロセス 間 同 期System Vセマフォの 利 用 51つのシステムコールは、セマフォの 集 合 において 一 連連 のこれらのブロッキング/ 非 ブロッキング操 作 を 実 行 するために 使 用 することが 可 能 です。 一 連連 の 操 作 を 実 行 する 時 、ブロッキング/ 非 ブロッキング 操 作 は 集 合 の 一 部邪 または 全 てのセマフォに 適遚 用 することが 可 能 です。また、 操 作 はセマフォの 数 のどんな 順 番 でも 適遚 用 することが 可 能 です。しかし、それらが 全 て 正 常 に 処 理 されるまでは 操 作 されません。 例 えば、もし10 個 のセマフォの 集 合 の6 個 の 処 理 のうち 最 初 の3 個 が 正 常 終了 し、4つ 目 の 操 作 でブロックされた 場 合 、6 個 の 操 作 全 てがブロック 無 しで 実 行 できるようになるまで、 集 合 に 対 して 変 更 を 行 うことはありません。 操 作 全 てが 成 功 およびセマフォが 変 更 のどちらか 一 方 、もしくは1つ 以 上 の( 非 ブロック) 操 作 が 失 敗 では、 何 も 変 更 されません。つまり、 操作 はアトミックに 実 行 されます。単 一 のセマフォもしくはセマフォの 集 合 のための 非 ブロック 操 作 のどのような 失 敗 も、 操 作 が 少しも 実 行 されずに 即 座 に 戻 る 原 因 となることを 思 い 出 してください。これが 発 生 した 時 、プロセスから-1が 返 され、 外 部邪 変 数 errnoにその 結 果 が 設 定 されます。システムコールはプロセスが 利 用 可 能 なこれらのセマフォ 機 能 を 構 成 します。 呼 び 出 し 元 プロセスシステムコールへ 引 数 を 渡 し、システムコールはその 機 能 を 実 行 して 成 功 もしくは 失 敗 のどちらか 一 方 となります。もしシステムコールが 成 功 する 場 合 、その 機 能 が 実 行 され 適遚 切 な 情 報 を 返します。そうではない 場 合 、プロセスから-1が 返 され、 外 部邪 変 数 errnoにその 結 果 が 設 定 されます。セマフォが 使 用 する( 実 行 するまたは 制 御 される) 前 に 一 意 に 識 別 されるデータ 構 造造 体 およびセマフォの 集 合 ( 配郤 列 )は 作 成 される 必 要 があります。ユニークな 識 別 子 はセマフォ 集 合 識 別 子 (semid)と 呼 ばれ、これは 特 定 のデータ 構 造造 体 やセマフォの 集 合 を 識 別 するため、もしくは 参 照 するために 使 用 されます。この 識 別 子 はシステム 内 のどのプロセスでもアクセス 可 能 で、 通 常 のアクセス制 限 事 項 の 対 象 となります。セマフォ 集 合 は 配郤 列 に 所 定 の 数 の 構 造造 体 を 含 みます( 集 合 中 のセマフォにつき1つの 構 造造 体 )。セマフォ 集 合 内 のセマフォの 数 (nsems)はユーザーが 遥 択 可 能 です。semop(2)システムコールで 使 用 されるsembuf 構 造造 体 を 図 5-1に 示 します。図 5-1 sembuf 構 造造 体 の 定 義struct sembuf {unsigned short int sem_num; /* semaphore number */short int sem_op; /* semaphore operation */short int sem_flg; /* operation flag */};sembuf 構 造造 体 はヘッダ・ファイル 内 に 定 義 されています。5-29


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>semctl(2)サービスコールで 使 用 されるsemid_ds 構 造造 体 を 図 5-2に 示 します。図 5-2 semid_ds 構 造造 体 の 定 義struct semid_ds {struct ipc_perm sem_perm; /* operation permission struct */__time_t sem_otime; /* last semop() time */unsigned long int __unused1;__time_t sem_ctime; /* last time changed by semctl() */unsigned long int __unused2;unsigned long int sem_nsems; /* number of semaphores in set */unsigned long int __unused3;unsigned long int __unused4;};semid_dsデータ 構 造造 体 はにありますが、ユーザー・アプリケーションはヘッダ・ファイルを 内 部邪 的 に 含 むヘッダ・ファイルを 含 める 必 要 があります。この 構 造造 体 のメンバーsem_permはipc_perm 型 であることに 注 意 してください。このデータ 構造造 体 は 全 てのIPC 機 能 (ヘッダ・ファイル)と 同 じですが、ユーザー・アプリケーションはヘッダ・ファイルを 内 部邪 的 に 含 むファイルを 含 める 必 要 があります。ipc_permデータ 構 造造 体 の 詳 細 は3 章 の「System Vメッセージ」セクション 内 に 記 述 されています。semget(2)システムコールは2つの 仕 事 のうち1つを 実 行 します:• 新 しいセマフォ 集 合 識 別 子 を 作 成 し、それ 用 に 対 応 するデータ 構 造造 体 とセマフォ 集 合 を作 成 します• 既 に 関 連連 付 けられたデータ 構 造造 体 とセマフォ 集 合 を 持 つ 既 存 のセマフォ 集 合 識 別 子 を 見つけます実 行 されるタスクはsemgetシステムコールへ 渡 すkey 引 数 の 値 により 決 まります。もしkey が 既存 のsemid で 使 用 されておらずIPC_CREATフラグが 設 定 されていない 場 合 、 新 しいsemid はシステム・チューニング・パラメータを 超 えない 条 件 で 関 連連 付 けられたデータ 構 造造 体 と 作 成 されたセマフォの 集 合 と 共 に 返 されます。key の 値 をゼロに 指 定 するためにプライベート・キー(IPC_PRIVATE) として 知 られる 条 件 もあります。このキーが 指 定 される 時 、 新 しい 識 別 子 はシステム・チューニング・パラメータを 超 えない 限 り、 常 に 関 連連 付 けられたデータ 構 造造 体 と 作 成 されたセマフォの 集 合 と 共 に 返 されます。ipcs(8)コマンドはsemid 用 のkey フィールドを 全 てゼロとして 表 示 します。セマフォ 集 合 が 作 成 される 時 、semgetを 呼 び 出 すプロセスは 所 有 者 / 作 成 者 になり、 関 連連 付 けられるデータ 構 造造 体 はそれに 応 じて 初 期 化 されます。 所 有 権 は 変 更 される 可 能 性 がありますが、 作成 されるプロセスは 常 に 作 成 者 のままでいることを 思 い 出 してください(「semctlシステムコール」セクションを 参 照 してください)。セマフォ 集 合 の 作 成 者 はこの 機 能 のために 最 初 の 操 作 パーミッションもまた 決 定 します。5-30


プロセス 間 同 期もし 指 定 されたキーに 対 するセマフォ 集 合 識 別 子 が 存 在 する 場 合 、 既 存 の 識 別 子 の 値 が 返 されます。もし 既 存 のセマフォ 集 合 識 別 子 が 返 されることを 望 まないのであれば、 制 御 コマンド(IPC_EXCL)をシステムコールへ 渡 すsemflg 引 数 の 中 に 指 定 ( 設 定 )することが 可 能 です。 実 際 の 集合 の 数 よりも 大 きなセマフォの 数 (nsems)を 値 として 渡 された 場 合 はシステムコールは 失 敗 します。もし 集 合 にセマフォがいくつあるのか 分 からない 場 合 は、nsems に 対 し0を 指 定 してください( 詳 細 な 情 報 については「semgetシステムコール」を 参 照 してください)。一 旦 、 一 意 に 識 別 されるセマフォの 集 合 とデータ 構 造造 体 が 作 成 される、もしくは 既 存 のものが 見つかるとsemop(2)およびsemctl(2)を 使 用 することが 可 能 になります。セマフォの 操 作 はインクリメント、デクリメント、ゼロにするための 試 験 から 構 成 されます。semopシステムコールはこれらの 操 作 を 実 行 するために 使 用 されます(semopシステムコールの詳 細 については「semopシステムコール」を 参 照 してください)。semctlシステムコールは 以 下 の 方 法 によりセマフォ 機 能 の 制 御 を 許 可 します:• セマフォの 値 を 返 す(GETVAL)• セマフォの 値 を 設 定 する(SETVAL)• セマフォ 集 合 に 関 する 操 作 を 実 行 する 最 後 のプロセスのPIDを 返 す(GETPID)• 現 在 の 値 よりもセマフォ 値 を 大 きくなるのを 待 っているプロセスの 数 を 返 す(GETNCNT)• セマフォ 値 がゼロになるのを 待 っているプロセスの 数 を 返 す(GETZCNT)• 集 合 の 中 の 全 てのセマフォ 値 を 取 得 しユーザー・メモリ 内 の 配郤 列 の 中 に 収 納 します(GETALL)semgetシステムコールシステムコール5• ユーザー・メモリ 内 の 配郤 列 からセマフォ 集 合 内 の 全 てのセマフォ 値 を 設 定 します(SETALL)• セマフォ 集 合 に 関 連連 付 けられたデータ 構 造造 体 を 取 得 します(IPC_STAT)• セマフォ 集 合 のために 操 作 パーミッションを 変 更 します(IPC_SET)• セマフォ 集 合 に 関 連連 付 けられたデータ 構 造造 体 とセマフォ 集 合 と 共 にオペレーティング・システムから 特 定 のセマフォ 集 合 識 別 子 を 削 除 します(IPC_RMID)semctlシステムコールの 詳 細 は「semctlシステムコール」セクションを 参 照 してください。semget(2)は 新 しいセマフォ 集 合 を 作 成 もしくは 既 存 のセマフォ 集 合 を 特 定 します。本 セクションシではsemgetシテムコールの 使 用 方 法 について 説 明 します。より 詳 細 な 情 報 については、semget(2)のmanページを 参 照 してください。このシステムコールの 使 用 を 例 示 するプログラムは、README.semget.txt 内 に 提 供 された 多 数 のコメントと 共 に/usr/share/doc/ccur/examples/semget.cで 見 つけることが 可 能 です。5-31


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>概 要#include #include #include int semget (key_t key, int nsems, int semflg);上 記 の 全 てのインクルードファイルは、オペレーティング・システムの/usr/includeサブディレクトリにあります。key_t はヘッダーファイルの 中 で 整 数 型 にするためにtypedefによって 定義 されています(このヘッダーファイルは 内 部邪 に 含 まれています)。 正 常 終 了 した場 合 にこのシステムコールから 返 される 整 数 は、key の 値 に 対 応 するセマフォ 集 合 識 別 子 (semid)です。semid は 本 章 の「System Vセマフォの 利 用 」セクション 内 で 説 明 されています。セマフォ 集 合 およびデータ 構 造造 体 に 対 応 する 新 しいsemid は 以 下 の 条 件 に1つでも 該 当 する 場 合に 作 成 されます。• key が IPC_PRIVATE• セマフォ 集 合 およびデータ 構 造造 体 に 対 応 するsemid が 存 在 しないkey 、かつsemflgとIPC_CREAT の 論 理 積 がゼロではないsemflg 値 の 組 み 合 わせ:• 制 御 コマンド (フラグ)• 操 作 パーミッション制 御 コマンドはあらかじめ 定 義 された 定 数 です。 以 下 の 制 御 コマンドはsemgetシステムコールに 適遚 用 され、ヘッダーファイル 内 部邪 に 含 まれるヘッダーファイル 内 に 定義 されています。IPC_CREATIPC_EXCL新 しいセグメントをセマフォ 集 合 するために 使 用 されます。もし 使 用されない 場 合 、semgetはkey に 対 応 するセマフォ 集 合 の 検 出 し、アクセス 許 可 の 確 認 します。IPC_CREATと 一 緒 の 使 用 は、 指 定 されたkey に 対 応 するセマフォ 集合 識 別 子 が 既 に 存 在 している 場 合 、このシステムコールはエラーを 引き 起 こします。これは 新 しい(ユニークな) 識 別 子 を 受 け 取 らなかった時 に 受 け 取 ったと 考 えてしまうことからプロセスを 守 るために 必 要です。パーミッション 操 作 はユーザー、グループ、その 他 のために 読 み 取 り/ 書 き 込 み 属 性 を 定 義 します。表 5-1は 有 効 な 操 作 パーミッションコードの(8 進逭 数 で 示 す) 数 値 を 示 します。5-32


プロセス 間 同 期表 5-1 セマフォ 操 作 パーミッション・コード操 作 パーミッションRead by UserAlter by UserRead by GroupAlter by GroupRead by OthersAlter by Others8 進逭 数 値004000020000040000200000400002特 有 の 値 は、 必 要 とする 操 作 パーミッションのために8 進逭 数 値 を 追 加 もしくはビット 単 位 の 論 理 和によって 生 成 されます。これが、もし「Read by User」と「Read/Write by Others」を 要 求 された 場合 、コードの 値 は00406 (00400+00006)となります。semflg 値 は、フラグ 名 称 と8 進逭 数 の 操 作 パーミッション 値 を 一 緒 に 使 用 して 簡 単 に 設 定 することが 可 能 です。使 用 例 :semid = semget (key, nsems, (IPC_CREAT | 0400));semid = semget (key, nsems, (IPC_CREAT | IPC_EXCL | 0400));以 下 の 値 はの 中 で 定 義 されています。これらの 値 を 超 えると 常 に 失 敗 の 原 因 となります。SHMMNISEMMSLSEMMNSいつでも 利 用 可 能 なユニークなセマフォ 集 合 (semids)の 最 大 数各 セマフォ 集 合 内 のセマフォの 最 大 数システム 全 体 の 全 セマフォ 集 合 内 のセマフォの 最 大 数セマフォ 制 限 値 のリストは 以 下 のオプションの 使 用 によりipcs(8)コマンドで 取 得 することが 可能 です。 詳 細 はmanページを 参 照 してください。ipcs -s -l特 定 の 関 連連 するデータ 構 造造 体 の 初 期 化 および 特 定 のエラー 条 件 についてはsemget(2)のmanページを 参 照 してください。5-33


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>semctlシステムコール5semctl(2)はセマフォ 集 合 の 制 御 操 作 を 実 行 するために 使 用 されます。本 セクションではsemctl システムコールを 説 明 します。さらに 詳 細 な 情 報 はsemctl(2)のmanページを 参 照 してください。この 呼 び 出 しの 使 用 を 説 明 しているプログラムは、README.semctl.txt 内 に 提 供 された 多 くのコメントと 共 に/usr/share/doc/ccur/examples/semctl.cで 見 つけることが 可 能 です。概 要#include #include #include int semctl (int semid, int semnum, int cmd, int arg);union semun{int val;struct semid_ds *buf;ushort *array;} arg;上 記 の 全 てのインクルードファイルは、オペレーティング・システムの/usr/includeサブディレクトリにあります。semid 変 数 はsemgetシステムコールを 使 って 作 成 された 有 効 な 負 ではない 整 数 値 でなければなりません。semnum 引 数 はその 数 でセマフォを 遥 択 するために 使 用 されます。これは 集 合 の(アトミックに 実行 される) 操 作 の 順 番 に 関 連連 します。セマフォの 集 合 が 作 成 される 時 、 最 初 のセマフォは 数 が0、最 後 のセマフォは 集 合 の 総 数 よりも1 小 さい 数 が 設 定 されます。cmd 引 数 は 以 下 の 値 のいずれかとなります。GETVALSETVALGETPIDGETNCNTGETZCNTGETALLSETALLセマフォ 集 合 内 の 単 一 のセマフォ 値 を 返 しますセマフォ 集 合 内 の 単 一 のセマフォ 値 を 設 定 しますセマフォ 集 合 内 のセマフォの 操 作 を 最 後 に 実 行 したプロセスのPIDを 返 します現 在 値 よりも 大 きくなるために 特 定 のセマフォの 値 を 待 っているプロセスの 数を 返 しますゼロになるために 特 定 のセマフォの 値 を 待 っているプロセスの 数 を 返 しますセマフォ 集 合 内 の 全 てのセマフォの 値 を 返 しますセマフォ 集 合 内 の 全 てのセマフォの 値 を 設 定 します5-34


プロセス 間 同 期IPC_STAT 指 定 されたsemid に 関 連連 するデータ 構 造造 体 に 含 まれるステータス 情 報 を 返 し、arg.buf で 指 し 示 されたデータ 構 造造 体 の 中 に 格 納 しますIPC_SETIPC_RMID指 定 されたセマフォ 集 合 (semid) に 対 して 有 効 なユーザー/グループIDと 操 作 パーミッションを 設 定 します指 定 されたセマフォ 集 合 とそれに 関 連連 するデータ 構 造造 体 と 共 に 削 除 しますNOTEsemctl(2)サービスはIPC_INFO, SEM_STAT, SEM_INFOコマンドもサポートします。しかし、これらのコマンドはipcs(8)ユーティリティで 使 用するためだけに 意 図 されているので、これらのコマンドについての 説 明はありません。IPC_SETまたはIPC_RMID 制 御 コマンドを 実 行 するため、プロセスは 以 下 の 条 件 を1つ 以 上 満 たしていなければなりません。• 有 効 なOWNERのユーザーIDを 所 有• 有 効 なCREATORのユーザーIDを 所 有• スーパーユーザー• CAP_SYS_ADMINケーパビリティを 所 有セマフォ 集 合 は、-s semid (セマフォ 集 合 識 別 子 )または-S semkey ( 対 応 するセマフォ 集 合 のキー)オプション 指 定 によるipcrm(8)コマンドの 利 用 で 削 除 される 可 能 性 もあることに 注 意 してください。このコマンドを 使 用 するため、プロセスはIPC_RMID 制 御 コマンドの 実 行 に 必 要 となるのと同 じ 権 限 を 持 っている 必 要 があります。このコマンドの 使 用 に 関 して 更 なる 情 報 はipcrm(8)のmanページを 参 照 してください。残 りの 制 御 コマンドは 必 要 に 応 じて 読 み 取 りもしくは 書 き 込 みパーミッションのいずれかが 必 要になります。arg 引 数 は 制 御 コマンドが 実 行 するために 適遚 切 な 共 用 体 をシステムコールに 渡 して 使 用 されます。制 御 コマンドの 一 部邪 に 関 しては、arg 引 数 は 必 要 とされずに 単 に 無 視 されます。• arg.valに 必 須 : SETVAL• arg.bufに 必 須 : IPC_STAT, IPC_SET• arg.arrayに 必 須 : GETALL, SETALL• arg は 無 視 : GETVAL, GETPID, GETNCNT, GETZCNT, IPC_RMID5-35


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>semopシステムコール5semop(2)は 遥 択 されたセマフォ 集 合 のメンバの 操 作 を 実 行 するために 使 用 されます。本 セクションではsemopシステムコールを 説 明 します。さらに 詳 細 な 情 報 はsemop(2)のmanページを 参 照 してください。この 呼 び 出 しの 使 用 を 説 明 しているプログラムは、README.semop.txt内 に 提 供 された 多 くのコメントと 共 に/usr/share/doc/ccur/examples/semop.cで 見 つけることが 可 能 です。概 要#include #include #include int semop (int semid, struct sembuf *sops, unsigned nsops);上 記 の 全 てのインクルードファイルは、オペレーティング・システムの/usr/includeサブディレクトリにあります。semopシステムコールは 正 常 終 了 でゼロ、そうでない 場 合 は-1の 整 数 値 を 返 します。semid 引 数 は 有 効 な 正 の 整 数 値 である 必 要 があります。または、それは 事 前 にsemget(2)システムコールから 返 されている 必 要 があります。sops 引 数 は 各 セマフォを 変 更 するために 以 下 を 含 むユーザー・メモリ 領 域 内 の 構 造造 体 の 配郤 列 を 指し 示 します:• セマフォの 番 号 (sem_num)• 実 行 する 操 作 (sem_op)• 制 御 フラグ (sem_flg)*sops 宣 言 は 配郤 列 名 称 ( 配郤 列 の 最 初 の 要 素 のアドレス)もしくは 使 用 可 能 な 配郤 列 へのポインタを 意味 します。sembuf は 配郤 列 内 の 構 造造 体 メンバのテンプレートして 使 用 されるデータ 構 造造 体 のタグ名 称 で、それはヘッダ・ファイルにあります。nsops 引 数 は 配郤 列 の 長 さ( 配郤 列 内 の 構 造造 体 の 数 )を 指 定 します。この 配郤 列 の 最 大 サイズはSEMOPMシステム・チューニング・パラメータによって 決 定 されます。 従 って、SEMOPM 操 作 の 上 限 は 各semopシステムコールに 対 して 実 行 されることが 可 能 です。セマフォ 番 号 (sem_num) は 操 作 が 実 行 される 集 合 内 の 特 定 のセマフォを 確 定 します。実 行 される 操 作 は 以 下 によって 決 定 されます:• sem_op が 正 の 場 合 、セマフォ 値 はsem_op の 値 によりインクリメントされます• sem_op が 負 の 場 合 、セマフォ 値 はsem_op の 絶 対 値 によりデクリメントされます• sem_op がゼロの 場 合 、セマフォ 値 はゼロと 等 しくなるまでテストされます5-36


プロセス 間 同 期The following operation commands (flags) can be used:IPC_NOWAITSEM_UNDO配郤 列 内 のどのような 操 作 でも 設 定 することが 可 能 です。もしIPC_NOWAITが 設 定 されているどのような 操 作 もうまく 実 行 できない 場 合 、セマフォの 値 を 少 しも 変 更 することなくシステムコールは 失敗 して 戻 ります。セマフォの 現 在 の 値 よりもデクリメントしようとする 時 、そうではなくセマフォをゼロと 等 しくするためにテストをする時 にシステムコールは 失 敗 します。プロセスが 終 了 する 時 に 自 動 的 にプロセスのセマフォの 変 更 を 元 に戻 すことをシステムに 指 示 し、これはプロセスがデッドロック 問 題 を回 避遪 することを 可 能 にします。この 機 能 を 実 装 するため、システム 内のプロセス 毎 のエントリを 含 むテーブルをシステムは 維 持 します。 各エントリはプロセスに 使 用 される 各 セマフォのためのアンドゥ 構 造造体 の 集 合 を 指 し 示 します。システムは 最 終 的 な 変 更 を 記 録 します。条 件 同 期 5postwaitシステムコール5以 下 のセクションでは、 協 同 プロセスを 操 作 するために 使 用 することが 可 能 なpostwait(2),server_block/server_wake(2)の 各 システムコールを 説 明 します。postwait(2)ファンクションは 協 同 グループのスレッド 間 で 使 用 する 高 速 で 効 果 的 なスリープ/ウェイクアップ/タイマーのメカニズムです。スレッドは 同 じプロセスのメンバーである 必 要 はありません。概 要#include #include #include int pw_getukid(ukid_t *ukid);int pw_wait(struct timespec *t, struct resched_var *r);int pw_post(ukid_t ukid, struct resched_var *r);int pw_postv(int count, ukid_t targets[], int errors[], structresched_var *r );int pw_getvmax(void);gcc [options] file -lccur_rt ...スリープ 状 態 にするため、スレッドはpw_wait()を 呼 び 出 します。スレッドは 次 の 時 に 起 き 上 がります:• タイマーが 終 了 する• スレッドが、pw_wait 中 スレッドのukid によるpw_post()またはpw_postv()の 呼 び 出 しで 他のスレッドよりポストされる• 呼 び 出 しが 割 り 込 まれる5-37


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>postwait(2)サービスを 使 用 しているスレッドはukid によって 識 別 されます。スレッドはukid を取 得 するためにpw_getukid()を 呼 び 出 す 必 要 があります。ukid は 呼 び 出 し 元 のユニークなグローバル・スレッドIDへマッピングします。この 値 はこのスレッドへポストする 可 能 性 のある 他 の 共同 スレッドと 共 有 することが 可 能 です。スレッド 毎 に、postwait(2)は 多 くても1つの 未 消 費 ポストを 覚 えています。 未 消 費 ポストを 持 っているスレッドへポストしても 効 果 はありません。再 スケジューリング 変 数 のポインタ 引 数 を 持 つ 全 てのpostwait(2)サービスにおいて、もしそのポインタがNULLではない 場 合 、 関 連連 する 再 スケジューリング 変 数 のロック・カウントはデクリメントされます。pw_wait()はポストを 消 費 するために 使 用 されます。これは 任 意 のタイムアウト 値 および 任 意 の再 スケジューリング 変 数 と 一 緒 に 呼 び 出 します。これは、ポストを 消 費 した 場 合 は1の 値 、もしくはポストを 消 費 するための 待 機 がタイムアウトした 場 合 は0の 値 を 返 します。もしタイムアウト 値 に 指 定 された 時 間 が0より 大 きい 場 合 、スレッドはポストの 消 費 を 待 つため 多くてもその 時 間 分 スリープします。もしポストとの 接 触 なしにこの 時 間 が 終 了 する 場 合 は0が 返 されます。もし 呼 び 出 しが 割 り 込 まれた 場 合 はEINTRが 返 され、タイムアウト 値 は 残 り 時 間 を 反 映するために 更 新 されます。もしこのインターバル 中 にポストされた、もしくは 以 前 の 未 消 費 ポストに 接 触 した 場 合 、ポストは 消 費 され1が 返 されます。もしタイムアウト 値 が0の 場 合 、pw_wait()は 即 座 に 戻 ります。これは、 以 前 の 未 消 費 ポストが 消費 された 場 合 は1を 返 し、もしくは 消 費 可 能 なポストが 存 在 しない 場 合 はEAGAINを 返 します。もしタイムアウト 値 のへのポインタがNULLである 場 合 、 動 作 はスレッドが 決 してタイムアウトしないこと 以 外 は 同 じです。もし 割 り 込 まれた 場 合 、EINTRが 返 されますが 指 定 されていないタイムアウト 値 は 更 新 されません。pw_post() ukid で 指 定 されたスレッドへポストを 送 信 します。もしそのスレッドがポストを 待 っている 場 合 、スレッドは 起 き 上 がりポストを 消 費 します。もしそのスレッドがポストを 待っていなかった 場 合 、 次 回 そのスレッドはポストを 待 とうとするために 未 消 費 ポストは 記 憶 され、それは 保 存 されたポストを 消 費 して 警 告 なしで 返 します。 多 くても1つの 未 消 費 ポストがスレッド 毎 に 記 憶 されます。pw_postv() 一 度 で 複 数 のスレッドへポストするために 使 用 することが 可 能 です。 全 てのポストが 完 了 するまで 誰 もポストしているスレッドにプリエンプトすることが 許 可 されないという点 でこれらのポストはアトミックとなります。ターゲットスレッドのukid は、targets 配郤 列 の 中 に格 納 されている 必 要 があります。それぞれのターゲットのエラーはerrors 配郤 列 の 中 に 返 されます。targets とerrors 配郤 列 で 使 用 されるエントリの 数 は、count 引 数 を 通 して 渡 す 必 要 があります。pw_postv() 全 て 成 功 した 場 合 は0を 返 し、いくつかエラーがある 場 合 は 最 後 のターゲットで発 生 したエラーのエラー 値 を 返 します。pw_getvmax() ポストすることが 可 能 なターゲットの 最 大 数 を 返 します。pw_postv()この 値 はカーネル・チューニング・パラメータPW_VMAXにより 決 定 されます。発 生 する 可 能 性 があるエラーの 種 類 のリストについてはpostwait(2)のmanページを 参 照 してください。5-38


プロセス 間 同 期serverシステムコール5一 連連 のシステムコールは、PowerMAXオペレーティング・システムと 互 換 性 のあるインターフェースを 使 うサーバとして 動 作 するプロセスを 操 作 することが 可 能 です。これらのシステムコールを 以 下 で 簡 単 に 説 明 します:server_blockserver_wake1server_wakevecserver_blockから 最 後 に 戻 った 後 にウェイクアップ・リクエストが発 生 しなかった 場 合 のみ 呼 び 出 し 元 プロセスをブロックします。もしウェイクアップが 発 生 した 場 合 、server_blockは 即 座 に 戻 ります。server_blockシステムコールでブロックされた 場 合 にサーバを起 こし、もし 指 定 されたサーバがこの 呼 び 出 しでブロックされない 場合 、ウェイクアップ・リクエストはサーバの 次 のserver_blockの 呼び 出 しに 適遚 用 します。プロセスのべクトルが1つのプロセスよりも 指 定 される 可 能 性 があることを 除 いてはserver_wake1と 同 じ 目 的 で 扱 います。CAUTIONこれらのシステムコールはシングル・スレッドのプロセスでのみ 使 用 する 必 要 があります。 多 重 スレッドのグローバル・プロセスIDはスレッドが 現 在 スケジュールされているプロセス 次 第 で 変 わります。 従 って、これらのインターフェースを 多 重 スレッドで 使 用 する 時 、 間 遊 ったスレッドが 起 こされるもしくはブロックされる 可 能 性 があります。server_block 5server_blockから 最 後 に 戻 った 後 にウェイクアップ・リクエストが 発 生 しなかった 場 合 のみ、server_blockは 呼 び 出 し 元 プロセスをブロックします。概 要#include #include #include int server_block(options, r, timeout)int options;struct resched_var *r;struct timeval *timeout;gcc [options] file -lccur_rt ...引 数 は 以 下 のように 定 義 されます:optionsrtimeoutこの 引 数 の 値 はゼロである 必 要 があります。呼 び 出 し 元 プロセスの 再 スケジューリング 変 数 へのポインタ。この 引 数 は 任 意で、この 値 をNULLにすることが 可 能 です。呼 び 出 し 元 プロセスをブロックする 最 大 時 間 を 含 むtimeval 構 造造 体 へのポインタ。この 引 数 は 任 意 でこの 値 をNULLにすることが 可 能 です。もしこの 値 がNULLの 場 合 、タイムアウトはありません。5-39


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>server_wake1 5もし 呼 び 出 し 元 プロセスが 保 留 中 のウェイクアップ・リクエストを 持 っている 場 合 、server_blockシステムコールは 即 座 に 戻 り、さもなければ 呼 び 出 し 元 プロセスが 次 のウェイクアップ・リクエストを 受 信 する 時 に 返 ります。 戻 り 値 0は 呼 び 出 しが 成 功 したことを 示 します。 戻 り値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 示 すために 設 定 されます。 戻 るときに 呼び 出 し 元 プロセスはブロックする 原 因 になった 条 件 を 再 テストする 必 要 がありますが、プロセスが 早 期 にシグナルで 起 こされることもあるので 条 件 が 変 わったことを 保 証 しないことに 注 意 してください。server_wake1はserver_blockの 呼 び 出 しでブロックされているサーバを 起 こすために 呼 び 出 されます。概 要#include #include #include int server_wake1(server, r)global_lwpid_t server;struct resched_var *r;gcc [options] file -lccur_rt ...引 数 は 以 下 のように 定 義 されます:serverr起 こされるサーバ・プロセスのグローバル・プロセスID呼 び 出 し 元 プロセスの 再 スケジューリング 変 数 へのポインタ。この 引 数 は 任 意で、この 値 をNULLにすることが 可 能 です。server_wake1 呼 び 出 しで 使 用 するために、 呼 び 出 し 元 プロセスの 実 在 するもしくは 有 効 なユーザーIDは、server で 指 定 されたプロセスの 実 在 するもしくは(execで) 保 存 されたユーザーIDと 一致 しなければならないことに 注 意 することが 重 要 です。もしserver_block 呼 び 出 しで 指 定 されたサーバがブロックされている 場 合 、server_wake1はそれを 起 こします。もしこの 呼 び 出 しでサーバがブロックされていない 場 合 、ウェイクアップ・リクエストはサーバの 次 のserver_block 呼 び 出 しまで 持 っています。server_wake1もやはりr に指 定 された 再 スケジューリング 変 数 に 関 連連 付 けられた 再 スケジューリング・ロックの 数 をデクリメントします。戻 り 値 0は 呼 び 出 しが 成 功 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 示 すために 設 定 されます。5-40


プロセス 間 同 期server_wakevec 5server_wakevecシステムコールはserver_blockの 呼 び 出 しでブロックされたサーバのグループを 起 こすために 呼 び 出 されます。概 要#include #include #include int server_wakevec(servers, nservers, r)global_lwpid_t *servers;int nservers;struct resched_var *r;gcc [options] file -lccur_rt ...引 数 は 以 下 のように 定 義 されます:serversnserversr起 こされるサーバ・プロセスのグローバル・プロセスIDの 配郤 列 へのポインタ配郤 列 のエレメント 数 を 指 定 する 整 数 値呼 び 出 し 元 プロセスの 再 スケジューリング 変 数 へのポインタ。この 引 数 は 任 意で、この 値 をNULLにすることが 可 能 です。server_wakevec 呼 び 出 しで 使 用 するために、 呼 び 出 し 元 プロセスの 実 在 するもしくは 有 効 なユーザーIDは、servers で 指 定 されたプロセスの 実 在 するもしくは(execで) 保 存 されたユーザーIDと 一 致 しなければならないことに 注 意 することが 重 要 です。もしserver_block 呼 び 出 しで 指 定 されたサーバがブロックされている 場 合 、server_wakevecはそれらを 起 こします。もしこの 呼 び 出 しでサーバがブロックされていない 場 合 、ウェイクアップ・リクエストはサーバの 次 のserver_block 呼 び 出 しまで 適遚 用 します。server_wakevecもやはりrに 指 定 された 再 スケジューリング 変 数 に 関 連連 付 けられた 再 スケジューリング・ロックの 数 をデクリメントします。戻 り 値 0は 呼 び 出 しが 成 功 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 示 すために 設 定 されます。これらの 呼 び 出 しの 使 用 に 関 する 追 加 の 情 報 については、server_block(2)のmanページを 参 照 してください。5-41


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>条 件 同 期 ツールの 適遚 用 5再 スケジューリング 変 数 、スピンロック、サーバ・システムコールは、 共 有 メモリ 領 域 内 のメールボックスの 使 用 を 通 して 生 産 者 プロセスと 消 費 者 プロセスのデータ 交 換 を 可 能 にする 機 能 を 設計 するために 使 用 することが 可 能 です。 消 費 者 が 空 のメールボックスを 見 つけた 時 、それは 新 しいデータが 到 着 するまでブロックします。 生 産 者 がメールボックスの 中 に 新 しいデータを 挿 入 した 後 、それは 待 機 中 の 消 費 者 を 起 こします。 消 費 者 がそれを 処 理 するよりも 早 く、 生 産 者 がデータを 生 成 した 時 、 類 似 の 状 況 が 発 生 します。 生 産 者 が 満 杯 のメールボックスを 見 つけた 時 、それはデータが 削 除 されるまでプロックします。 消 費 者 がデータを 削 除 した 後 、それは 待 機 中 の 生 産者 を 起 こします。メールボックスは 以 下 のように 表 すことが 可 能 です:struct mailbox {struct spin_mutex mx; /* serializes access to mailbox */queue_of consumers; /* waiting consumers */queue_of data; /* the data, type varies */};mx フィールドはメールボックスへ 順 番 にアクセスするために 使 用 されます。dataフィールドは生 産 者 から 消 費 者 へ 渡 される 情 報 を 表 します。fullフィールドはメールボックスが 満 杯 なのか 空なのかを 示 すために 使 用 されます。producerフィールドはメールボックスが 空 になるのを 待 っているプロセスを 確 認 します。consumerフィールドはデータの 到 着 を 待 っているプロセスを 確認 します。spin_acquireとspin_releaseの 機 能 の 使 用 して、 消 費 者 がメールボックスからデータを 取 り 出 すことが 可 能 になる 関 数 は 以 下 のように 定 義 することが 可 能 です:voidconsume (box, data)struct mailbox *box;any_t *data;{spin_acquire (&box–>mx, &rv);while (box–>data == empty) {enqueue (box–>consumers, rv.rv_glwpid);spin_unlock (&box–>mx);server_block (0, &rv, 0);spin_acquire (&box–>mx, &rv);}*data = dequeue (box–>data;spin_release (&box–>mx, &rv);}この 関 数 では、 消 費 者 プロセスはデータのチェックおよび 削 除 の 前 にメールボックスをロックすることに 注 意 してください。もしこれが 空 のメールボックス 見 つけた 場 合 、 生 産 者 がデータを 挿入 するのを 許 可 するためにメールボックスをアンロックし、データの 到 着 を 待 つためにserver_blockを 呼 び 出 します。 消 費 者 が 起 こされた 時 に 再 度 メールボックスをロックし、データをチェックする 必 要 があります( 消 費 者 が 早 期 にシグナルによって 起 こされる 可 能 性 があり、メールボックスがデータを 収 容 している 保 証 がない)。5-42


プロセス 間 同 期同 様 に 生 産 者 がメールボックスにデータを 収 納 することを 可 能 にする 関 数 は 以 下 のように 定 義 することが 可 能 です:voidproduce (box, data)struct mailbox *box;any_t data;{spin_acquire (&box–>mx, &rv);enqueue (box–>data, data);if (box–>consumer == empty)spin_release (&box–>mx, &rv);else {global_lwpid_t id = dequeue (box–>consumers);spin_unlock (&box->mx);server_wake1 (id, &rv);}}この 関 数 では、 生 産 者 プロセスは 新 しいデータを 挿 入 する 前 にメールボックスが 空 になるのを 待ちます。 生 産 者 は 消 費 者 が 待 機 している 時 のみデータの 到 着 を 通 知 、これはメールボックスをアンロックした 後 にそうすることに 注 意 して 下 さい。 起 き 上 がった 消 費 者 はデータのチェックおよび 削 除 のためにメールボックスをロックする 可 能 性 があるため、 生 産 者 は 最 初 にメールボックスをアンロックする 必 要 があります。server_wake1の 呼 び 出 しの 前 にメールボックスをアンロックすることもやはり 相 互 排 除 を 短 時 間 保 持 することを 確 実 にします。 不 必 要 なコンテキスト・スイッチを 回 避遪 するため、 再 スケジューリングは 消 費 者 が 起 こされるまで 無 効 にします。5-43


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>5-44


6466Chapter 6プログラム 可 能 なクロックおよびタイマー本 章 ではタイミングのために 使 用 可 能 ないくつかの 機 能 の 概 要 を 提 供 します。POSIXクロックおよびタイマー・インターフェースはIEEE 規 格 1003.1b-1993に 準 拠 しています。クロック・インターフェースは、タイムスタンプまたはコード・セグメント 長 の 時 間 計 測 などの 目 的 のために 使 用することが 可 能 な 高 分 解 能 クロックを 提 供 します。タイマー・インターフェースは 将 来 シグナルを 受 信 する 手 段 もしくは 非 同 期 にプロセスを 起 こす 手 段 を 提 供 します。 更 に 非 常 に 短 い 時 間 プロセスをスリープ 状 態 にするために 利 用 可 能 で、スリープ 時 間 の 測 定 に 使 用 できるクロックを 指 定できる 高 分 解 能 システムコールを 提 供 します。 追 加 のクロックとタイマーはRCIM PCIカードにより 提 供 されます。クロックおよびタイマーの 理 解 6リアルタイム・アプリケーションはアプリケーションまたはシステムイベントをスケジュールするために 厳 格 なタイミングの 制 約 内 でデータを 操 作 できる 必 要 があります。 高 分 解 能 のクロックとタイマーは、アプリケーションが 高 分 解 能 クロックに 基 づく 相 対 または 絶 対 時 間 を 使 用 する 事やワンショットまたは 定 期 的 にイベントをスケジュールすることが 可 能 です。アプリケーションは 各 プロセスのために 複 数 のタイマーを 作 成 することが 可 能 です。いくつかのタイミング 機 能 はiHawkシステム 上 で 利 用 可 能 です。これらはPOSIXクロックとタイマーも 非 割 り 込 みクロックやリアルタイム・クロック&インタラプト・モジュール(RCIM) PCIカードにより 提 供 されるリアルタイム・クロック・タイマーも 含 みます。これらのクロックとタイマーおよびそれらのインターフェースは 以 下 のセクションで 説 明 しています。システム・クロックとタイマーに 関 する 情 報 は7 章 を 参 照 してください。RCIMクロックおよびタイマー6リアルタイム・クロック&インタラプト・モジュール(RCIM)は2つの 非 割 り 込 みクロックを 提 供します。これらのクロックはRCIMがチェーン 接 続 されている 時 に 他 のRCIMと 同 期 させることが可 能 です。2つのRCIMクロックは 以 下 のとおり:tick clock一 般 的 な400nsのクロック 信 号 のティックを1づつインクリメントする64 bit 非 割 り 込 みクロック。このクロックは 共 通 のタイムスタンプを 提 供 するチェーン 接 続 されたRCIM 全 体 でゼロにリセットおよび 同期 することが 可 能 です。ティック・クロックはマスターでもスレーブでもどのシステムでもプログラムのアドレス 空 間 に/dev/rcim/sclk デバイス・ファイルをマッピングしている 時 にダイレクト・リードを 使 用 して 読 み 取 ることが 可能 です。POSIXPOSIX1003.1フォーマットにコード 化 された64 bit 非 割 り 込 みカウンター。 上 位 32 bitは 秒 を 収 容 し、 下 位 32 bitはナノ 秒 を 収 容 します。このクロックは 一 般 的 な400nsのクロック 信 号 のティックを400づつインクリメントされます。 主 に 高 分 解 能 ローカル・クロックとして 使 用されます。6-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>RCIM POSIXクロックは、 同 じユーティリティとデバイス・ファイルが 使 われているという 点 ではティック・クロックと 類 似 する 方 法 でアクセスされます。POSIXクロックは 任 意 の 時 間 をロードすることが 可能 ですが、ロードした 値 はチェーン 接 続 されたRCIMの 他 のクロックとは 同 期 されません。ホストに 接 続 されているRCIMのPOSIXクロックだけは 更 新 されます。RCIMは 最 大 8 個 のリアルタイム・クロック(RTC)タイマーも 供 給 します。これらの 各 カウンタは特 別 なデバイス・ファイルを 使 ってアクセス 可 能 で 各 々は 殆 どのタイミングまたは 周 波 数 を 制 御する 機 能 のために 使 用 することが 可 能 です。それらはクロック・カウント 値 を 組 み 合 わせる 事 で様 々なタイミング 間 隔 を 供 与 しそれぞれ 異 なる 分 解 能 にてプログラム 可 能 です。これは 所 定 の 周波 数 ( 例 えば100Hz)でプロセスを 実 行 する、もしくコード・セグメントのタイミングには 理 想 的 な状 態 となります。ホスト・システム 上 で 割 り 込 みを 生 成 することが 出 来 ることに 加 えて、RTCの出 力 が 対 応 するホストに 対 して 配郤 信 するため、またはRCIMの 外 部邪 出 力 割 り 込 み 線 の1つに 接 続 された 外 部邪 機 器 へ 配郤 信 するため、 他 のRCIMボードに 対 して 分 配郤 することが 可 能 となります。RTCタイマーはopen(2), close(2), ioctl(2)の 各 システムコールにより 制 御 されます。RCIMクロックおよびタイマーに 関 する 全 ての 情 報 についてはReal-Time Clock and InterruptModule (RCIM) User’s <strong>Guide</strong> を 参 照 してください。POSIXクロックおよびタクロックおよびタイマーイマー6POSIXクロックは 時 間 の 測 定 および 表 示 のために 高 分 解 能 メカニズムを 提 供 します。POSIXクロックには2 種 類 のタイマー(ワン・ショットと 周 期 )があります。これらは 最 初 の 満 了 時間 と 繰 り 返 し 間 隔 に 関 して 定 義 されます。これは 絶 対 時 刻 ( 例 : 午 前 8:30)もしくは 現 在 時 刻 からの相 対 時 間 ( 例 :30 秒 後 )にすることが 可 能 です。 繰 り 返 し 間 隔 はタイマー 満 了 から 次 までに 経 過遃 する 時 間 量 を 指 示 します。タイミング 用 に 使 用 されるクロックは、タイマーが 作 成 された 時 に 指 定されます。ワン・ショット・タイマーは 絶 対 または 相 対 初 期 満 了 時 間 とゼロの 繰 り 返 し 間 隔 のいずれも 実 装されています。これは( 初 期 満 了 時 間 の)たった1 回 で 終 了 し、その 後 実 装 が 解 除 されます。周 期 タイマーは 絶 対 または 相 対 初 期 満 了 時 間 とゼロよりも 大 きな 繰 り 返 し 間 隔 のいずれも 実 装 されます。 繰 り 返 し 間 隔 は、 常 に 最 後 のタイマー 満 了 時 点 との 相 対 です。 最 初 の 満 了 時 間 が 来 た 時 、タイマーは 繰 り 返 し 間 隔 の 値 をリロードし、カウントを 継 続 します。タイマーは 初 期 満 了 時 間 をゼロへ 設 定 することにより 実 装 を 解 除 することが 可 能 です。ローカルタイマーはPOSIXタイマー 満 了 スケジューリングの 割 り 込 みソースとして 使 用 されます。ローカル・タイマーに 関 する 情 報 については7 章 を 参 照 してください。6-2


プログラム 可 能 なクロックおよびタイマーPOSIX 時 間 構 造造 体 の 理 解 6NOTE高 分 解 能 クロックおよびタイマーへのアクセスは、libccur_rtおよびlibrt 内 のシステムコールにより 提 供 されますが、libccur_rtルーチンは軽 視 されることになります。 常 に‘ccur_rt’ の 前 に‘rt’ をリンクしてlibrt内 のルーチンを 使 用 することを 推 奨 します。例 :gcc [options] file -lrt -lccur_rt ...POSIXルーチンに 関 連連 するクロックおよびタイマーは 時 間 指 定 のために2つの 構 造造 体 (timespec構 造造 体 とitimerspec 構 造造 体 )を 使 用 します。これらの 構 造造 体 はファイルの 中 で 定 義 されます。timespec 構 造造 体 は 秒 とナノ 秒 で 単 一 時 間 値 を 指 定 します。クロックの 時 間 設 定 もしくは 時 間 /クロックの 分 解 能 を 取 得 するためにルーチン(これらのルーチンに 関 する 情 報 は「POSIX clockルーチンの 利 用 」を 参 照 してください)を 呼 び 出 す 時 にtimespec 構 造造 体 へのポインタを 指 定 します。構 造造 体 は 以 下 のように 定 義 されます:struct timespec {time_t tv_sec;long tv_nsec;};構 造造 体 内 のフィールドは 以 下 で 説 明 します:tv_sectv_nsec時 間 値 内 の 秒 数 を 指 定 します。specifies the number of seconds in the time value時 間 値 内 の 追 加 のナノ 秒 数 を 指 定 します。このフィールドの 値 は、ゼロから999,999,999の 範 囲 内 である 必 要 があります。itimerspec 構 造造 体 はタイマー 用 に 最 初 の 満 了 時 間 と 繰 り 返 し 間 隔 を 指 定 します。タイマーが 満了 する 時 間 の 設 定 もしくはタイマーの 満 了 時 間 に 関 する 情 報 の 取 得 のためにルーチン(これらのルーチンに 関 する 情 報 は「POSIX clockルーチンの 利 用 」を 参 照 してください)を 呼 び 出 す 時 にitimerspec 構 造造 体 へのポインタを 指 定 します。 構 造造 体 は 以 下 のように 定 義 されます:struct itimerspec {struct timespec it_interval;struct timespec it_value;};構 造造 体 内 のフィールドは 以 下 で 説 明 します:it_intervalit_valueタイマーの 繰 り 返 し 間 隔 を 指 定 しますタイマーの 最 初 の 満 了 時 間 を 指 定 します6-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>POSIX clockルーチンルーチンの 利 用 6クロックに 関 連連 する 様 々な 機 能 を 実 行 することが 可 能 なPOSIXルーチンを 以 下 で 簡 単 に 説 明 します。clock_settimeclock_gettimeclock_getres指 定 したクロックの 時 間 を 設 定 します。指 定 したクロックから 時 間 を 取 得 します。指 定 したクロックのナノ 秒 単 位 の 分 解 能 を 取 得 します。clock_settimeルーチンルーチンの 利 用 6これらのルーチンの 各 々の 使 用 手 順 は 以 降 のセクションで 説 明 します。clock_settime(2)システムコールはシステムtime-of-dayクロック、CLOCK_REALTIMEの 時 間 を設 定 することが 可 能 です。 呼 び 出 し 元 プロセスはルートもしくはCAP_SYS_NICEケーパビリティを 所 有 している 必 要 があります。 定 義 上 、CLOCK_MONOTONICクロックは 設 定 することができません。もしシステム 起 動 後 にCLOCK_REALTIMEを 設 定 した 場 合 、 以 下 の 時 間 は 正 確 ではない 可 能 性 があることに 注 意 する 必 要 があります:• ファイル・システムの 作 成 および 変 更 時 間• アカウンティングおよび 監 査 記 録 内 の 時 間• カーネル・タイマー・キュー・エントリの 満 了 時 間システム・クロックの 設 定 はキューイングされたPOSIXタイマーに 影 響 を 及 ぼしません。概 要#include int clock_settime(clockid_t which_clock, const struct timespec *setting);引 数 は 以 下 のように 定 義 されます:which_clocksetting時 間 が 設 定 されるクロックの 識 別 子 。CLOCK_REALTIMEだけが 設 定することが 可 能 です。which_clock へ 設 定 する 時 間 を 指 定 する 構 造造 体 へのポインタ。which_clock がCLOCK_REALTIMEの 時 、time-of-dayクロックは 新 しい値 が 設 定 されます。クロック 分 解 能 の 整 数 倍 ではない 時 間 値 は 切 り 捨てられます。戻 り 値 0は 指 定 したクロックの 設 定 に 成 功 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 示 すために 設 定 されます。 発 生 する 可 能 性 があるエラーの 種 類 のリストについてはclock_settime(2)のmanページを 参 照 してください。6-4


プログラム 可 能 なクロックおよびタイマーclock_gettimeルーチンの 利 用 6clock_gettime(2)システムコールは 指 定 したクロックから 時 間 を 取 得 することが 可 能 です。この呼 び 出 しは 常 に 利 用 可 能 な 最 高 のクロック( 通 常 は1マイクロ 秒 より 上 )の 分 解 能 を 返 します。概 要#include int clock_gettime(clockid_t which_clock, struct timespec *setting);引 数 は 以 下 のように 定 義 されます:which_clocksetting時 間 を 取 得 するクロックの 識 別 子 。which_clock の 値 はCLOCK_REALTIMEまたはCLOCK_MONOTONICにすることが 可 能です。which_clock の 時 間 が 返 される 構 造造 体 へのポインタ。clock_getresルーチンの 利 用 6戻 り 値 0はclock_gettimeの 呼 び 出 しが 成 功 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 示 すために 設 定 されます。 発 生 する 可 能 性 があるエラーの 種 類 のリストについてはclock_gettime(2)のmanページを 参 照 してください。clock_getres(2)システムコールは 指 定 したクロックのナノ 秒 単 位 の 分 解 能 を 取 得 することが 可能 です。 分 解 能 は、clock_settime(2)で 設 定 したタイミング 満 了 を 丸 めた 精 度 に 決 定 し、その 精度 は 同 じクロックを 使 用 するclock_nanosleep(2)とnanosleep(2)の 呼 び 出 しで 使 用 されます。クロックの 分 解 能 はシステム 依 存 でありユーザーが 設 定 することはできません。概 要#include int clock_getres(clockid_t which_clock, struct timespec *resolution);引 数 は 以 下 のように 定 義 されます:which_clockresolution分 解 能 を 取 得 するクロックの 識 別 子 。which_clock の 値 はCLOCK_REALTIMEまたはCLOCK_MONOTONICにすることが 可 能です。which_clock の 分 解 能 が 返 される 構 造造 体 へのポインタ。6-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>戻 り 値 0はclock_getresの 呼 び 出 しが 成 功 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 示 すために 設 定 されます。 発 生 する 可 能 性 があるエラーの 種 類 のリストについてはclock_getres(2)のmanページを 参 照 してください。POSIX timerルーチンルーチンの 利 用 6プロセスはタイマーを 作 成 、 削 除 、 設 定 、 問 い 合 わせすることが 可 能 でタイマーが 満 了 した 時 に通 知 を 受 け 取 ることが 可 能 です。タイマーに 関 連連 した 様 々な 機 能 を 実 行 可 能 なPOSIXシステムコールを 以 下 で 簡 単 に 説 明 します。timer_createtimer_deletetimer_settimetimer_gettimetimer_getoverrunnanosleepclock_nanosleep指 定 したクロックを 使 用 するタイマーを 作 成指 定 したタイマーを 削 除満 了 時 間 の 設 定 で 指 定 したタイマーを 実 装 または 解 除指 定 したタイマーの 繰 り 返 し 間 隔 とタイマー 満 了 までの 残 り 時 間 を取 得指 定 した 周 期 タイマーのオーバーラン 総 数 を 取 得指 定 した 時 間 だけ 実 行 を 一 時 停 止指 定 したクロックに 基 づき 高 分 解 能 一 時 停 止 を 提 供timer_createルーチンルーチンの 利 用 6これらの 各 システムコールの 使 用 手 順 は 以 降 のセクションで 説 明 します。timer_create(2)システムコールは、 呼 び 出 し 元 プロセスがタイミング・ソースとして 指 定 されたクロックを 使 用 するタイマーを 作 成 することが 可 能 です。それが 作 成 される 時 、タイマーは 解 除 されます。プロセスがtimer_settime(2)システムコールを呼 び 出 した 時 に 実 装 されます(このシステムコールの 説 明 は「timer_settimeルーチンの 利 用 」を 参照 してください)。以 下 に 注 意 することが 重 要 です:• プロセスがfork システムコールを 呼 び 出 す 時 、 作 成 されたタイマーは 子 プロセスには 継 承 しません。• プロセスがexec システムコールを 呼 び 出 す 時 、 作 成 されたタイマーは 解 除 および 削 除 されます。6-6


プログラム 可 能 なクロックおよびタイマー同 じスレッド・グループ 内 の<strong>Linux</strong>スレッドはタイマーを 共 有 することが 可 能 です。timer_createを 呼 び 出 したスレッドはシグナル 全 てを 受 信 しますが、 同 じスレッド・グループ 内 の 他 のスレッドはtimer_settime(2)の 呼 び 出 しを 通 してタイマーを 操 作 することが 可 能 です。概 要#include #include int timer_create(clockid_t which_clock, struct sigevent *timer_event_spec,timer_t created_timer_id);引 数 は 以 下 のように 定 義 されます:which_clocktimer_event_specタイマーに 使 用 されるクロックの 識 別 子 。which_clock の 値 はCLOCK_REALTIMEである 必 要 があります。NULLポインタ 定 数 または 呼 び 出 し 元 プロセスにタイマー 満 了 を 非 同期 で 通 知 する 方 法 を 指 定 する 構 造造 体 へのポインタ:NULLタイマー 満 了 時 にSIGALRMがプロセスへ 送 信 されますsigev_notify=SIGEV_SIGNALsigev_signo に 指 定 されたシグナルはタイマー 満 了 時 にプロセスへ 送 信 されます。sigev_notify=SIGEV_THREAD指 定 したsigev_notify 機 能 はタイマー 満 了 時 にsigev_valueを 引 数 として 新 しいスレッドの 中 から 呼 ばれます。 現 在 、-lccur_rtではサポートされていないため、-lrtを 最 初 にリンクして 使 用 します。sigev_notify=SIGEV_THREAD_IDsigev_notify_thread_id の 番 号 にはタイマー 満 了 時 にsigev_signoシグナルを 受 信 するスレッドのID(pthread_t)を 収 納 する 必 要 があります。sigev_notify=SIGEV_NONEタイマー 満 了 時 に 通 知 は 配郤 信 されません。NOTEタイマー 満 了 を 意 味 するシグナルは、シグナルを 処 理 するシステムコールを 指 定 しない 限 りプロセスを 終 了 させる 原 因 となる 可 能 性 があります。特 定 のシグナルへの 既 定 のアクションを 決 定 するためにsignal(2)のmanページを 参 照 してください。created_timer_idタイマーIDが 格 納 されている 場 所 へのポインタ。この 識 別 子 は他 のPOSIXタイマーのシステムコールで 必 要 とされ、システムコールでタイマーが 削 除 されるまで 呼 び 出 し 元 プロセスの 中 では 一 意 です。戻 り 値 0はtimer_createの 呼 び 出 しが 成 功 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 示 すために 設 定 されます。 発 生 する 可 能 性 があるエラーの 種 類 のリストについてはtimer_create(2)のmanページを 参 照 してください。6-7


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>timer_deleteルーチンルーチンの 利 用 6timer_delete(2)システムコールは 呼 び 出 し 元 プロセスが 指 定 されたタイマーを 削 除 することが可 能 です。もし 遥 択 されたタイマーが 既 に 開 始 されている 場 合 、これは 無 効 になりタイマーに 割り 付 けられているシグナルもしくはアクションは 配郤 信 または 実 行 されません。タイマー 満 了 からシグナルが 保 留 中 であっても 削 除 されません。概 要#include int timer_delete(timer_t timer_id);引 数 は 以 下 のように 定 義 されます:timer_id削 除 するタイマーの 識 別 子 。この 識 別 子 は 前 のtimer_create(2) 呼 び出 しから 来 ています(このシステムコールの 説 明 は「timer_createルーチンの 利 用 」を 参 照 してください)。戻 り 値 0は 指 定 したタイマーの 削 除 に 成 功 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 示 すために 設 定 されます。 発 生 する 可 能 性 があるエラーの 種 類 のリストについてはtimer_delete(2)のmanページを 参 照 してください。timer_settimeルーチンルーチンの 利 用 6timer_settime(2)システムコールは、タイマーが 満 了 する 時 間 を 設 定 することで 呼 び 出 し 元 プロセスが 指 定 されたタイマーを 実 装 することが 可 能 です。 満 了 する 時 間 は 絶 対 値 または 相 対 値 で 定義 します。 呼 び 出 し 元 プロセスは、 実 装 されたタイマーに 対 して 次 のタイマー 満 了 までに(1)タイマーの 解 除 、または(2) 時 間 のリセットをするためにこのシステムコールを 使 用 することが 可 能 です。概 要#include int timer_settime(timer_t timer_id, int flags, const struct itimerspec*new_setting, const struct itimerspec *old_setting);引 数 は 以 下 のように 定 義 されます:timer_id設 定 するタイマーの 識 別 子 。この 識 別 子 は 前 のtimer_create(2) 呼 び出 しから 来 ています(このシステムコールの 説 明 は「timer_createルーチンの 利 用 」を 参 照 してください)。flags 以 下 のいずれかを 指 定 する 整 数 値 :TIMER_ABSTIME遥 択 されたタイマーは 絶 対 満 了 時 間 を 実 装 します。タイマーは、タイマーに 関 連連 付 けられたクロックがit_value で 指 定 された 値 に 到 遉 する 時に 満 了 となります。もしこの 時 間 が 既 に 過遃 ぎている 場 合 、timer_settimeは 成 功 し、タイマー 満了 通 知 が 行 われます。6-8


プログラム 可 能 なクロックおよびタイマー0 遥 択 されたタイマーは 相 対 満 了 時 間 を 実 装 します。タイマーは、タイマーに 関 連連 付 けられたクロックがit_value で 指 定 された 値 に 到 遉 する 時に 満 了 となります。new_setting繰 り 返 し 間 隔 とタイマーの 初 期 満 了 時 間 を 格 納 する 構 造造 体 へのポインタ。もしワン・ショット・タイマーを 望 む 場 合 はゼロの 繰 り 返 し 間 隔(it_interval)を 指 定 します。この 場 合 、 初 期 満 了 時 間 になった 時 、 一 旦タイマーが 満 了 となり 解 除 されます。もし 周 期 的 なタイマーを 望 む 場 合 はゼロではない 繰 り 返 し 間 隔(it_interval)を 指 定 します。この 場 合 、 初 期 満 了 時 間 になった 時 、タイマーは 繰 り 返 し 間 隔 の 値 をリロードしてカウントを 続 けます。いずれにせよ、 初 期 満 了 時 間 として 絶 対 値 ( 例 : 午 後 3:00)または 現 在時 刻 からの 相 対 値 ( 例 :30 秒 後 )を 設 定 することが 可 能 です。 初 期 満 了時 間 に 絶 対 値 を 設 定 するにはflags 引 数 にTIMER_ABSTIMEビットを設 定 する 必 要 があります。 指 定 されたタイマーが 前 に 満 了 となったことが 原 因 で 既 に 保 留 中 のどのようなシグナルもやはりプロセスへ 配郤信 されます。タイマーを 解 除 するために 初 期 満 了 時 間 をゼロに 設 定 します。 指 定 されたタイマーが 前 に 満 了 となったことが 原 因 で 既 に 保 留 中 のどのようなシグナルもやはりプロセスへ 配郤 信 されます。old_settingNULLポインタ 定 数 または 前 の 繰 り 返 し 間 隔 とタイマーの 初 期 満 了 時間 を 返 す 構 造造 体 へのポインタ。もしタイマーが 解 除 されていた 場 合 、初 期 満 了 時 間 の 値 はゼロとなります。old_setting のメンバーはタイマーの 分 解 能 に 左 右 され、その 時 点 で 呼 び 出 すtimer_gettime(2)より 返される 値 と 同 じになります。戻 り 値 0は 指 定 したタイマーの 設 定 に 成 功 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 示 すために 設 定 されます。 発 生 する 可 能 性 があるエラーの 種 類 のリストについてはtimer_settime(2)のmanページを 参 照 してください。timer_gettimeルーチンルーチンの 利 用 6timer_gettime(2)システムコールは 呼 び 出 し 元 プロセスが 指 定 したタイマーの 繰 り 返 し 間 隔 とタイマーが 満 了 になるまでの 残 り 時 間 量 を 取 得 することが 可 能 です。概 要#include int timer_gettime(timer_t timer_id, struct itimerspec *setting);6-9


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>引 数 は 以 下 のように 定 義 されます:timer_idsetting繰 り 返 し 時 間 と 残 り 時 間 をリクエストするタイマーの 識 別 子 。この 識別 子 は 前 のtimer_create(2) 呼 び 出 しから 来 ています(このシステムコールの 説 明 は「timer_createルーチンの 利 用 」を 参 照 してください)。繰 り 返 し 間 隔 とタイマーの 残 り 時 間 量 を 返 す 構 造造 体 へのポインタ。 残り 時 間 量 は 現 在 時 間 との 相 対 です。もしタイマーが 解 除 されている 場合 、 値 はゼロになります。戻 り 値 0はtimer_gettimeの 呼 び 出 しに 成 功 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 示 すために 設 定 されます。 発 生 する 可 能 性 があるエラーの 種 類 のリストについてはtimer_gettime(2)のmanページを 参 照 してください。timer_getoverrunルーチンルーチンの 利 用 6timer_getoverrun(2)システムコールは 呼 び 出 し 元 プロセスが 特 定 の 周 期 タイマーのオーバーラン 回 数 を 取 得 することが 可 能 です。タイマーはシステムがアプリケーションへシグナルを 配郤 信 するよりも 速 く 満 了 となる 可 能 性 があります。もしシグナルが 他 のシグナルのキューイングではなく 前 回 のタイマー 満 了 から 保 留 中 である 場 合 、 満 了 を 見 逃 した 総 数 は 保 留 のシグナルと 一 緒 に 保持 されます。これはオーバーランの 総 数 となります。シグナルがアプリケーションにブロックされたため、またはタイマーがオーバーコミットしたためにタイマーがオーバーランとなる 可 能 性 があります。シグナルは 常 にタイマー 満 了 通 知 SIGEV_SIGNALを 使 うタイマー 付 きプロセスをキューイングまたは 保 留 することを 前 提 とします。もしシグナルがキューイングもしくは 保 留 している 間 にこのタイマーが 満 了 となる 場 合 、タイマーのオーバーランが 発 生 し、 追 加 のシグナルは 送 信 されません。概 要NOTEタイマー 満 了 シグナル・ハンドラーからこのシステムコールを 呼 び 出 す必 要 があります。もし 外 側 でこのシステムコールを 呼 び 出 す 場 合 、 返 されるオーバーラン 回 数 は 最 後 に 取 得 したタイマー 満 了 シグナルに 関 しては 有 効 ではありません。#include int timer_getoverrun(timer_t timer_id);引 数 は 以 下 のように 定 義 されます:timer_idオーバーラン 回 数 を 取 得 したい 周 期 タイマーの 識 別 子 。この 識 別 子 は前 のtimer_create(2) 呼 び 出 しから 来 ています(このシステムコールの説 明 は「timer_createルーチンの 利 用 」を 参 照 してください)。6-10


プログラム 可 能 なクロックおよびタイマーもし 呼 び 出 しが 成 功 した 場 合 、timer_getoverrunは 指 定 されたタイマーのオーバーラン 回 数 を 返します。この 回 数 はファイル 内 のDELAYTIMER_MAXを 超 えることはできません。 戻り 値 -1はエラーが 発 生 したことを 示 し、errno はエラーを 示 すために 設 定 されます。 発 生 する 可能 性 があるエラーの 種 類 のリストについてはtimer_getoverrun(2)のmanページを 参 照 してください。POSIX sleepルーチンルーチンの 利 用 6nanosleepルーチンルーチンの 利 用 6nanosleep(2)とclock_nanosleep(2)のPOSIXシステムコールは、 呼 び 出 し 元 プロセスまたはスレッドを(1) 指 定 された 時 間 が 経 過遃 するまで、または(2)シグナルを 受 信 し 関 連連 する 処 理 がシグナル・ハンドリング・システムコールを 実 行 するもしくはプロセスが 終 了 するまで 停 止 させる 高 分 解 能スリープのメカニズムを 提 供 します。clock_nanosleep(2)システムコールは 指 定 されたクロックによる 高 分 解 能 スリープを 提 供 します。これは 現 在 動 作 中 スレッドの 実 行 をrqtp により 指 定 された 時 間 が 経 過遃 するもしくはスレッドがシグナルを 受 信 するまで 一 時 停 止 します。これらのシステムコールの 利 用 はどのシグナルの 動 作 にも 影 響 を 与 えません。概 要#include int nanosleep(const struct timespec *req, struct timespec *rem);引 数 は 以 下 のように 定 義 されます:reqremプロセスをスリープする 時 間 の 長 さを 含 むtimespec 構 造造 体 へのポインタ。req の 値 はスリープの 分 解 能 の 整 数 倍 へ 切 り 上 げるため、またはシステムによる 他 の 動 作 スケジュールのために 一 時 停 止 時 間 はリクエストされたよりも 長 くなる 可 能 性 があります。シグナルに 割 り込 まれるケースを 除 き、 一 時 停 止 時 間 はCLOCK_REALTIMEで 測 定 されるreq によって 指 定 される 時 間 よりも 短 くはなりません。ブロック要 求 に 関 しては1μ 秒 の 分 解 能 を 得 られます。NULLポインタ 定 数 またはnanosleepがシグナルに 割 り 込 まれた 場 合のスリープ 間 隔 の 残 り 時 間 が 返 されるtimespec 構 造造 体 へのポインタ。もしrem がNULLかつnanosleepがシグナルに 割 り 込 まれた 場 合 、残 り 時 間 は 返 されません。戻 り 値 0は 要 求 した 時 間 が 経 過遃 したことを 示 します。 戻 り 値 -1はエラーが 発 生 したことを 示 し、errnoはエラーを 示 すために 設 定 されます。 発 生 する 可 能 性 があるエラーの 種 類 のリストについてはnanosleep(2)のmanページを 参 照 してください。6-11


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>clock_nanosleepルーチンルーチンの 利 用 6概 要#include int clock_nanosleep(clockid_t which_clock, int flags, const struct timespec *rqtp,struct timespec *rmtp);引 数 は 以 下 のように 定 義 されます:which_clock使 用 するクロックの 識 別 子 。which_clock の 値 はCLOCK_REALTIMEまたはCLOCK_MONOTONICとなります。flags 以 下 のいずれかを 指 定 する 整 数 値 :TIMER_ABSTIMErqtp で 指 定 された 時 間 はwhich_clock で 指 定 されたクロック 値 に 関 する 絶 対 値 であると 解 釈 します。0 rqtp で 指 定 された 時 間 は 現 在 時 刻 の 相 対 値 であると 解 釈 します。rqtpプロセスをスリープする 時 間 の 長 さを 含 むtimespec 構 造造 体 へのポインタ。もしTIMER_ABSTIMEフラグが 指 定 され、rqtp で 指 定 された 時 間 が 指 定 したクロックの 現 在 時 刻 以 下 である(またはクロックの値 がその 時 間 へ 変 更 される) 場 合 、この 機 能 は 即 座 に 戻 ります。 更 にスリープする 時 間 はclock_nanosleep(2)を 呼 び 出 した 後 のクロックのどのような 変 更 にも 影 響 を 受 けます。つまり、 設 定 または 実 際 の 通過遃 時 間 またはこれらの 組 み 合 わせを 通 して、 現 在 の 時 間 が 要 求 した 時間 以 上 の 時 にクロックがその 時 間 に 遉 したかどうかを 問 わず 呼 び 出しが 完 了 します。指 定 された 時 間 値 がクロック 分 解 能 の 整 数 倍 へ 切 り 上 げられる、またはスケジューリングや 他 のシステムの 動 作 のためにスリープする 時間 は 要 求 よりも 長 くなる 可 能 性 があります。シグナルによる 割 り 込 みのケースを 除 いて、 一 時 停 止 時 間 は 決 して 要 求 よりも 小 さくはなりません。rmtpTIMER_ABSTIMEが 指 定 されていない 場 合 、rmtp で 示 されるtimespec 構 造造 体 は 間 隔 の 残 り 時 間 量 を 収 納 するために 更 新 されます(すなわち、 要 求 時 間 - 実 際 にスリープした 時 間 )。もしrmtp がNULLの 場 合 、 残 り 時 間 は 設 定 されません。rmtp の 値 は 絶 対 時 間 値 のケースでは 設 定 されません。成 功 した 場 合 、clock_nanosleepは 少 なくても 指 定 した 時 間 が 過遃 ぎた 後 に0の 値 を 返 します。 失敗 した 場 合 、clock_nanosleepは-1の 値 を 返 し、errnoはエラーを 示 すために 設 定 されます。 発生 する 可 能 性 があるエラーの 種 類 のリストについてはclock_nanosleep(2)のmanページを 参 照してください。6-12


757Chapter 7システム・クロックおよびタイマーシステム 時 間 計 測 7ローカル・タイマー 7本 章 ではシステム 機 能 上 のシステム 時 間 計 測 、ローカル・タイマー、ローカル・タイマー 無 効 時の 影 響 について 説 明 します。標 準 <strong>Linux</strong>のシステム 時 間 計 測 は、タイマー・カウントからナノ 秒 へ 変 換 するためにタイマーとキャリブレーションの 値 を 読 み 取 るルーチンにて 構 成 される 独 立 したアーキテクチャーのドライバを 含 む“clocksource” メカニズムを 使 用 します。<strong>RedHawk</strong>では、TSCベースのクロックが 殆 どの 時 間 計 測 の 要 求 を 満 たすために 使 用 されます。カーネル・チューニング・パラメータREQUIRE_TSCおよびREQUIRE_RELIABLE_TSC(カーネル 構成 GUI 上 の「Processor Type & Features」 項 目 でアクセス 可 能 )は、TSCが 構 成 されていないカーネルの 信 頼 性 は 損 害 を 与 えることで 知 られている 電 源 管 理 の 側 面 を 保 証 するためにデフォルトでプレビルト・カーネルの 中 で 有 効 になっています。更 にTSCはクロックの 安 定 性 を 向 上 させるために2 番 目 のクロックソースに 統 制 されます。RCIMがシステム 内 に 存 在 する 時 、RCIMは2 番 目 のクロックソースとして 使 用 されます。そうでなければ、HPETまたはPMタイマーが 使 用 されます。/sys/devices/system/clocksource/clocksource0/current_clocksourceファイルを 読 み 取 ると現 在 の2 番 目 のクロックソースが 表 示 されます。echo(1)を 使 ってこのファイルへ 他 のクロックソース 名 称 を 書 き 込 むと 割 り 当 てが 変 更 されます。ブート・コマンドライン・オプションは、 適遚 切 なTSC 同 期 のためにBIOSをチェックしTSCが 正 しく 同 期 しない 場 合 はブートの 最 後 で 再 同 期 (tsc_sync=auto [デフォルト])、 強 制 的 に 再 同 期(tsc_sync=force)、BIOSをチェックし 同 期 していない 場 合 は 実 行 できるクロックソースとしてTSCを 正 確 に 無 効 (tsc_sync=check)にすることが 可 能 です。ホットプラグCPUはオペレーティング・システムにより 再 同 期 させる 機 会 を 持 っていないことに 注 意 してください。それらのためにTSC 同期 のチェックだけは 利 用 可 能 です。これらの 時 間 計 測 機 能 に 関 して 更 に 理 解 するために/kernel-source/Documentation/hrtimers 内 のテキスト・ファイルを 参 照 してください。Concurrent 社 のihawkシステムでは、 各 CPUがそのCPUへの 周 期 割 り 込 みのソースとして 使 用 されるローカル(プライベート)・タイマーを 持 っています。1つのCPUだけがローカル・タイマー 割 り込 みを 同 時 に 処 理 するために 既 定 値 ではそれらの 割 り 込 みは1 秒 につき100 回 、 正 しいテンポでずらして 発 生 させます、ローカル・タイマー 割 り 込 みルーチンは 次 のローカル・タイミング 機 能 ( 以 降 のセクションで 詳 細に 説 明 します)を 実 行 します。7-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>機 能 7CPUアカウンティング7• top(1)および 他 のユーティリティを 使 ってCPU 使 用 率 の 統 計 データを 収 集 します• 周 期 的 にタイム・クォンタムを 消 費 するためにCPU 上 で 実 行 中 のプロセスを 起 こします• タイム・クォンタムを 使 い 果 たした 時 に 実 行 中 のプロセスをCPUから 解 放 し 他 の 実 行 中 のプロセスを 優 先 させます• 周 期 的 にCPU 間 で 実 行 可 能 なプロセスの 負 荷 バランスを 保 ちます• プロセスとシステム・プロファイリングを 実 行 します• この 機 能 が 利 用 可 能 なプロセスのためのシステムtime-of-dayクロックおよび 実 行 時 間 のクォータ 制 限 を 実 装 します• POSIXタイマーのための 割 り 込 みソースを 提 供 します• リード・コピー・アップデート(RCU) 処 理 中 に 構 造造 体 のデータを 解 放 するために 各 CPUの 正状 態 をポーリングします• システムtime-of-dayクロックとブート 時 からのティック 回 数 を 更 新 します• システム・タイマー・リストのイベント 停 止 を 送 り 出 します。これにはウォッチドッグ・タイマー・ドライバやalarm(2)のようなプロセス・タイマー 機 能 を 含 みますローカル・タイマーのシールディングは、ローカルCPUへのアフィニティを 持 つプロセスによって 要 求 されたスケジューリング・イベントへのローカル・タイマーの 使 用 を 制 限 します。ローカル・タイマー・シールディングは 非 シールドCPUへ 重 要 ではない 仕 事 を 移 動 するプロセス・シールディングと 連連 動 します。これは、「リアルタイム 性 能 」 章 の 中 で 説 明 したように 割 り 込 み 応 答の 最 悪 のケースとCPU 上 のプログラム 実 行 のデターミニズムの 両 方 を 改 善 します。しかし、ローカル・タイマーを 無 効 にすることは<strong>RedHawk</strong> <strong>Linux</strong>により 標 準 的 に 提 供 されるいくつかの 機 能 に関 して 影 響 を 及 ぼします。これらの 影 響 は 以 下 で 説 明 します。ローカル・タイマーは 以 降 のセクションの 中 で 説 明 する 機 能 を 実 行 します。ローカル・タイマーを 無 効 にする 影 響 は、いくつかの 機 能 のために 実 行 可 能 な 代 案 についても 説 明 します。プロセス 毎 のCPU 利 用 率 はtop(1)やps(1)のようなユーティリティにより 報 告 されます。これらのユーティリティはtimes(2), wait4(2), sigaction(2), acct(2)のようなシステム・サービスから 利 用率 の 統 計 値 を 集 めます。標 準 的 な 非 <strong>RedHawk</strong> <strong>Linux</strong>カーネルにおいて、プロセスのCPU 利 用 を 決 定 するためにこれらのサービスはローカル・タイマーに 依 存 します。 一 方 、<strong>RedHawk</strong>カーネルはこれを 実 現 するためにローカル・タイマーの 代 わりに 高 分 解 能 プロセス・アカウンティング 機 能 を 使 用 します。 高 分 解 能プロセス・アカウンティングはローカル・タイマーが 無 効 であっても 機 能 し 続 けます。高 分 解 能 プロセス・アカウンティングは、カーネル 構 成 GUI 上 の「General Setup」 項 目 のHRACCTカーネル・チューニング・パラメータを 介 して 全 てのプレビルト<strong>RedHawk</strong> カーネルにて 有 効 です。この 機 能 に 関 するすべての 情 報 はhracct(3)およびhracct(7)のmanページを 参 照 してください。7-2


システム・クロックおよびタイマープロセス 実 行 時 間 および 制 限 7ローカル・タイマーはSCHED_OTHERおよびSCHED_RRスケジューリング・ポリシーでスケジュールされたプロセスのクォンタムを 満 了 するために 使 用 されます。これは 同 じスケジューリング・ポリシーのプロセスがラウンドロビン 方 式 でCPUを 共 有 することを 可 能 にします。もしローカル・タイマーがCPU 上 で 無 効 である 場 合 、CPU 上 のプロセスはもはやそれらのクォンタムを 満了 することはありません。これは、このCPU 上 で 実 行 中 のプロセスはブロックするまで、または高 優 先 度 プロセスが 実 行 可 能 となるまで 実 行 されることを 意 味 します。つまり、ローカル・タイマー 割 り 込 みが 無 効 であるCPU 上 では、SCHED_RRスケジューリング・ポリシーにスケジュールされたプロセスはまるでSCHED_FIFOスケジューリング・ポリシーにスケジュールされたように動 作 します。ローカル・タイマーが 有 効 のままであるCPU 上 にスケジュールされたプロセスは 影響 を 受 けないことを 注 意 してください。プロセス・スケジューリング・ポリシーに 関 する 詳 細 な情 報 については4 章 の「プロセス・スケジューリング」を 参 照 してください。setrlimit(2)およびgetrlimit(2)システムコールは、プロセスが 消 費 可 能 なCPU 時 間 に 関 する 制 限 をプロセスが 設 定 および 取 得 することを 可 能 にします。この 時 間 が 満 了 となった 時 、プロセスにSIGXCPUシグナルが 送 信 されます。CPU 時 間 の 蓄 積 はローカル・タイマー 割 り 込 みルーチンの 中で 行 われます。 従 って、もしCPU 上 のローカル・タイマーが 無 効 である 場 合 、CPU 上 のプロセスが 実 行 する 時 間 は 計 上 されません。もしこれがプロセスを 実 行 する 唯 一 のCPUである 場 合 、SIGXCPUシグナルを 受 信 することは 決 してありません。インターバル・タイマーのデクリメント 7システム・プロファイリング 7CPU 負 荷 バランシングング 7setitimer(2)およびgetitimer(2)システムコールはプロセスが 個 々に“ 仮 想 タイマー”のセットアップ、タイマーの 値 の 取 得 を 可 能 にします。 仮 想 タイマーはプロセスが 実 行 中 の 時 だけデクリメントされます。 仮 想 タイマーには、ユーザー・レベルでプロセスが 実 行 している 時 だけデクリメントするものとユーザー・レベルとカーネル・レベルのどちらでもプロセスが 実 行 している 時 にデクリメントするものの2 種 類 が 存 在 します。 仮 想 タイマーが 満 了 する 時 、シグナルがプロセスへ送 信 されます。 仮 想 タイマーのデクリメントはローカル・タイマー・ルーチンで 行 われます。 従って、ローカル・タイマーがCPU 上 で 無 効 である 時 、 使 用 時 間 が 仮 想 タイマーからデクリメントされることはありません。もしこれがプロセスを 実 行 している 唯 一 のCPUである 場 合 、その 仮 想タイマーは 決 して 満 了 となりません。ローカル・タイマーはシステム・プロファイリングを 操 作 します。プロファイラーが 記 録 するサンプルはローカル・タイマー 割 り 込 みの 発 生 により 始 動 します。もしローカル・タイマーが 任 意のCPU 上 で 無 効 である 場 合 、gprof(1)コマンドとprofil(2)システム・サービスはそのCPU 上 で 動 作するプロセスに 対 して 正 しく 機 能 しません。ローカル・タイマー 割 り 込 みルーチンは、このCPU 上 で 実 行 可 能 なプロセスの 数 がシステム 内 の他 のCPU 上 で 実 行 可 能 なプロセスよりも 極 めて 少 なくないことを 確 認 するために 周 期 的 にロード・バランサーを 呼 びます。このような 場 合 、ロード・バランサーは 全 てのCPU 間 の 負 荷 のバランスをとるために 他 のCPUからプロセスを 移 動 します。ローカル・タイマー 割 り 込 みが 無 効 になっているCPUで、 実 行 するプロセスがCPUにない 時 にロード・バランサーは 呼 ばれます。シールドCPU 上 でバックグラウンド・プロセスが 実 行 することは 通 常 望 ましいことではないため、この機 能 の 損 失 はシールドCPUにおいて 通 常 は 問 題 ではありません。7-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>CPU 再 スケジューリング 7POSIXタイマータイマー7RCU 処 理 7その 他 7resched_cntl(2)システムコールのRESCHED_SET_LIMIT 機 能 は、 再 スケジューリング 変 数 がロックされた 状 態 を 維 持 可 能 な 時 間 の 上 限 を 設 定 することが 可 能 です。 制 限 時 間 を 超 えたときにSIGABRTシグナルがプロセスへ 送 信 されます。この 機 能 はアプリケーション 開 発 中 に 問 題 をデバッグするために 提 供 されます。 再 スケジューリング 変 数 がロックされたプロセスがローカル・タイマーが 無 効 のCPU 上 で 動 作 する 時 、 制 限 時 間 はデクリメントされず、その 結 果 プロセスが 指 定された 制 限 時 間 をオーバーランした 時 にシグナルは 送 信 されない 可 能 性 があります。ローカル・タイマーはPOSIXタイマーのためのタイミング・ソースを 提 供 します。もしCPUがローカル・タイマー 割 り 込 みからシールドされた 場 合 、そのCPU 上 のプロセスがPOSIXタイマーまたはnanosleep(2) 機 能 が 動 作 中 の 場 合 にローカル・タイマー 割 り 込 みはシールドCPU 上 で 発 生 し続 けます。もしプロセスがシールドCPU 上 で 実 行 することが 許 可 されていない 場 合 、このタイマーはプロセスが 動 作 可 能 なCPUへ 移 動 されます。カーネルのリード・コピー・アップデート(RCU)・コードは、 伝 統 的 にデータ 構 造造 体 を 解 放 するために 各 CPU 上 で 静 止 状 態 をポーリングするためにローカル・タイマーに 頼 っています。CPUがローカル・タイマー 割 り 込 みからシールドされている 時 、そのCPUは 必 要 とするRCU 処 理 を 実 行することができません。 同 期 メカニズムは 任 意 のポイントでRCU 処 理 を 起 動 し、RCU 処 理 へのローカル・タイマーの 関 与 を 除 いてタイマー 駆 動 型 ポーリングを 待 つことなく 完 了 します。RCU_ALTERNATIVEパラメータが 全 てのプレビルト・カーネルでデフォルトのSHIELDパラメータと 関 連連 して 設 定 された 時 にこの 同 期 が 発 生 します。RCU_ALTERNATIVEがカーネルに 設 定 されていない 時 、RCUコードはローカル・タイマーを 使 用 します。上 述 の 機 能 に 加 えて、ローカル・タイマーが 無 効 である 時 、 標 準 <strong>Linux</strong>のコマンドやユーティリティが 提 供 する 一 部邪 の 機 能 はCPU 上 で 正 しく 機 能 しない 可 能 性 があります。これらは 以 下 を 含 みます:bash(1)sh(1)strace(1)ローカル・タイマーの 禁 止 7これらのコマンドやユーティリティの 詳 細 な 情 報 については、 対 応 するmanページを 参 照 してくださいローカル・タイマーをシールドすることにより、ローカル・タイマーはどのようなCPUの 組 み 合わせに 対 しても 無 効 となります。シールディングはshield(1)コマンドを 介 して、または/proc/shield/ltmrsへの16 進逭 数 値 を 割 り 当 てることにより 行 われます。この16 進逭 数 値 はCPUのビット・マスクで、 各 々のビットのポジションが1つのCPUを 特 定 し、そのビットの 値 はそのCPUのローカル・タイマーが 無 効 (=1)なのか 有 効 (=0)なのかを 特 定 します。 詳 細 な 情 報 については2 章 の「リアルタイム 性 能 」とshield(1)のmanページを 参 照 してください。7-4


システム・クロックおよびタイマー7-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>7-6


8Chapter 8ファイル・システムとディスクファイル・システムとディスクI/O本 章 ではxfsジャーナリング・ファイル・システムおよび<strong>RedHawk</strong> <strong>Linux</strong>オペレーティング・システム 上 でのダイレクト・ディスクI/Oの 実 行 手 順 について 説 明 します。ジャーナリング・ファイル・システム 8従 来 のファイル・システムは 障 害 の 後 にファイル・システムの 大 きさ 次 第 で 完 了 までに 多 くの 時間 を 必 要 とする 特 殊 なファイル・システム・チェックを 実 行 する 必 要 があります。ジャーナリング・ファイル・システムは「ジャーナル」と 呼 ばれる 特 殊 なログ・ファイルを 保 存 することによりデータ 完 全 性 を 確 保 する 障 害 回 復 可 能 なファイル・システムです。ファイルが 更 新 された 時 、ファイルのメタデータは 本 来 のディスク・ブロックを 更 新 する 前 にディスク 上 のジャーナルへ 書き 込 まれます。もしジャーナル・エントリーがコミットされる 前 にシステム・クラッシュが 発 生した 場 合 、オリジナル・データはまだディスク 上 にあり、 新 しく 変 更 したものだけが 失 われます。もしディスク 更 新 中 にクラッシュが 発 生 した 場 合 、ジャーナル・エントリは 発 生 したと 考 えられることを 示 します。 再 起 動 時 にジャーナル・エントリは 再 生 されて 中 断 された 更 新 は 完 了 します。これはファイル・システム・チェックの 複 雑 さを 大 幅 にカットし、 回 復 時 間 を 削 減 します。SGIからのXFSジャーナリング・ファイル・システムのサポートは、<strong>RedHawk</strong> <strong>Linux</strong>ではデフォルトで 有 効 となっています。XFSはマルチスレッド 化 され、100 万 テラバイト 程 の 大 きさのファイルが 取 り 扱 い 可 能 な64bitファイル・システムです。 大 容 量 ファイルおよび 大 容 量 ファイル・システムに 加 えて、XFSがサポート 可 能 な 拡 張 属 性 、 可 変 ブロックサイズは、 容 量 をベースにして 性 能と 拡 張 性 の 両 方 を 補 助 するためにBtree(ディレクトリ、 大 きさ、 空 き 容 量 )を 広 範 囲 に 使 用 します。ユーザー 割 り 当 ておよびグループ 割 り 当 ての 両 方 がサポートされます。ジャーナリングの 構 造造 とアルゴリズムは、ジャーナリングのパフォーマンスへの 影 響 を 最 小 限 にして 迅 速 にデータ・トランザクションの 読 み 書 きを 記 録 します。XFSはほぼRAW I/O 性 能 を 提 供することが 可 能 です。拡 張 属 性 はファイルに 関 連連 付 けられた 名 前 と 値 のペアとなります。 属 性 は 普 通 のファイル、ディレクトリ、シンボリック・リンク、デバイス・ノード、 他 のiノードの 型 全 てに 付 随 させることが可 能 です。 属 性 値 は 最 大 64KBの 任 意 のバイナリ・データを 含 めることが 可 能 です。 通 常 のファイルのアクセス 権 により 保 護 されている 全 てのユーザーが 利 用 可 能 なユーザー 名 前 空 間 、および 特権 のあるユーザーだけがアクセス 可 能 なシステム 名 前 空 間 の2つの 属 性 の 名 前 空 間 が 利 用 可 能 です。システム 名 前 空 間 はアクセス 制 御 リスト(ACLs:Access Control Lists)や 階 層 ストレージ 管 理(HSM:Hierarchical Storage Manage)ファイルの 移 動 状 況 のような 保 護 されたファイル・システムのメタデータに 使 用 することが 可 能 です。NFSバージョン3は、そのプロトコルをサポートする 他 のシステムへ64bitファイル・システムにエクスポートするために 使 用 することが 可 能 です。NFS V2システムはプロトコルにより 強 いられる32bitの 制 限 があります。ローカルおよびリモートのSCSIテープまたはファイルへのXFSファイル・システムのバックアップとリストアは、xfsdumpとxfsrestoreの 使 用 で 行 えます。 拡 張 属 性 と 割 り 当 て 情 報 のダンプがサポートされています。8-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>データ 管 理 API(DMAPI/XDSM) は、ディスクへのRAWアクセスやファイル・システム 構 造造 の 知識 の 必 要 なしに 高 性 能 ダンプ・プログラムと 同 様 に 階 層 ストレージに 管 理 ソフトウェアの 実 行 を可 能 にします。ツールのフルセットはXFSを 提 供 します。XFSファイル・システムのための 多 くの 文 書 は 以 下 で見 つけることが 可 能 です:http://oss.sgi.com/projects/xfs/XFSファイル・システムの 作 成 8XFSファイル・システムを 作 成 するため、 以 下 が 必 須 となります:• XFSファイル・システムを 作 成 するパーティションを 確 認 します。これは 新 しいディスク、パーティションで 区 切 られていない 既 存 のディスク、 既 存 のパーティションの 上 書 きで 可 能です。 新 しいパーティションを 作 成 する 場 合 はfdisk(1)のmanページを 参 照 してください。• パーティション 上 にXFSファイル・システムを 作 成 するためにmkfs.xfs(8)を 使 用 します。もしターゲット・ディスクのパーティションが 現 在 ファイル・システムでフォーマットされている 場 合 、–f ( 強 制 )オプションを 使 用 してください。mkfs.xfs [-f] /dev/devfiledevfile はファイル・システムを 作 成 したいパーティションの 場 所 ( 例 :sdb3)。これはパーティション 上 の 現 在 のあらゆるデータを 破 壊 しますので 注 意 してください。XFSファイル・システムのマウント8データ 管 理 API (DMAPI) 8XFSファイル・システムをマウントするためにmount(8)コマンドを 使 用 します:mount -t xfs /dev/devfile /mountpointXFSファイル・システムをマウントする 時 に 利 用 可 能 なオプションはmount(8)のmanページを 参照 してください。XFSはジャーナリング・ファイル・システムであるため、ファイル・システムをマウントする 前に 未 完 了 のトランザクションのためにファイル・システムトランザクション・ログをチェックし、最 新 のファイル・システムにします。DMAPI(Data Management API)はカーネルと 階 層 ストレージ 管 理 システム(HSM)との 間 のファイル管 理 要 求 を 渡 すためのXFSファイル・システム 内 のメカニズムです。DMAPIを 構 築 するため、リビルドの 一 部邪 としてカーネル 構 成 GUI 上 の「File Systems」 項 目 のXFS_DMAPIシステム・パラメータを 設 定 します。DMAPI 構 築 に 関 する 詳 細 な 情 報 は、 以 下 を 参 照 してください:http://oss.sgi.com/projects/xfs/dmapi.html8-2


ファイル・システムとディスクI/Oダイレクト・ディスクI/O 8普 通 は、ファイルの 読 み 書 きはファイル・システム・キャッシュ・バッファを 通 り 抜 けます。データベース・プログラムのようないくつかのアプリケーションはそれら 自 身 がキャッシングすることが 必 要 となる 可 能 性 があります。ダイレクトI/Oはデータのカーネルのバッファリングを 回 避遪するバッファがないI/O 方 式 です。ダイレクトI/Oは、ファイル・システムがディスクとユーザー提 供 のバッファとの 間 で 直 接 データを 転 送 します。<strong>RedHawk</strong> <strong>Linux</strong> はその 仮 想 アドレス 空 間 へディスクからの 直 接 読 み 取 り、ディスクへの 直 接 書 き込 みの 両 方 がユーザー・プロセスで 有 効 で、 中 間 オペレーティング・システムのバッファリングを 回 避遪 し、ディスクI/O 速 度 を 向 上 します。ダイレクト・ディスクI/Oは 転 送 データのコピーを 排除 することによりシステムのオーバ・ヘッドもまた 減 らします。ダイレクトI/O 用 にディスク・ファイルを 設 定 するためにopen(2)またはfcntl(2)システムコールを使 用 します。 以 下 の 手 順 のいずれかを 使 用 します:• ディスク・ファイルの 名 称 パスを 指 定 、arg 引 数 の 中 にO_DIRECTビットを 設 定 してプログラムからのopenシステムコールを 呼 び 出 します。• 開 いているファイルに 対 して 開 いているファイル 記 述 子 を 指 定 、F_SETFLコマンを 指 定 、arg引 数 の 中 にO_DIRECTビットを 設 定 してfcntlシステムコールを 呼 び 出 します。ダイレクト・ディスクI/O 転 送 は 以 下 の 要 求 の 全 てを 満 足 する 必 要 があります:• ユーザー・バッファは_PC_REC_XFER_ALIGN pathconf(2) 変 数 の 整 数 倍 のバイト・バウンダリに 整 列 されている 必 要 があります。• 現 在 のファイル・ポインタの 設 定 が 次 のI/O 操 作 を 開 始 するファイル 内 のオフセットに 位 置 します。この 設 定 は_PC_REC_XFER_ALIGN pathconf(2) 変 数 が 返 す 値 の 整 数 倍 である 必 要 があります。• I/O 操 作 で 転 送 されるバイト 数 は_PC_REC_XFER_ALIGN pathconf(2) 変 数 が 返 す 値 の 整 数 倍である 必 要 がります。ダイレクトI/Oをサポートしていないファイル・システム 上 のファイルに 対 してダイレクトI/Oを有 効 にするとエラーを 返 します。ファイル・システム 固 有 のsoftオプションでマウントしたファイル・システム 内 のファイルをダイレクト・ディスクI/Oを 有 効 にしようとするとエラーを 引 き 起こします。softオプションはファイル・システムがアンマウントする 直 前 までキャッシュから 物理 ディスクへデータを 書 き 込 む 必 要 がないことを 指 定 します。推 奨 はしませんが、 両 方 のモードの 性 能 を 犠 牲 にしてダイレクト・モードとキャッシュ(ノンダイレクト)・モードの 両 方 で 同 時 にファイルを 開 くことが 可 能 です。ダイレクトI/Oの 使 用 する 場 合 、システム 障 害 後 にファイルが 復 旧 可 能 であることを 保 証 しません。そうするためにはPOSIX 同 期 I/Oフラグを 設 定 する 必 要 があります。プロセスがmmap(2)システムコールでファイルの 一 部邪 を 現 在 マッピングしている 場 合 はダイレクト・モードでファイルを 開 くことはできません。 同 様 に 呼 び 出 しで 使 われているファイル 記 述子 がダイレクト・モードで 開 かれている 場 合 、mmapの 呼 び 出 しは 失 敗 します。8-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>ダイレクトI/Oがより 良 いI/Oスループットをタスクに 提 供 するかどうかは、アプリケーションに依 存 します:• 全 てのダイレクトI/O 要 求 はどうきしているため、アプリケーションによるI/Oと 処 理 は 重 複できません。• オペレーティング・システムはダイレクトI/Oをキャッシングできないため、read-ahead( 先 読み)またはwritebehind( 分 散 書 き 込 み)のアルゴリズムのスループットは 向 上 しません。しかしながら、 他 のデータのコピーがなくデータが 直 接 ユーザー・メモリからデバイスへ 移 動 するため、ダイレクトI/Oはシステム 全 体 のオーバーヘッドを 減 らします。システム・オーバーヘッドの 削 減 は、 同 じプロセッサー・ボード 上 の 内 蔵 型 SCSIディスク・コントローラとローカル・メモリ 間 のダイレクト・ディスクI/Oを 行 うときに 特 に 顕 著 です。8-4


9Chapter 9メモリ・マッピング本 章 ではプロセスが 他 のプロセスのアドレス 空 間 の 内 容 をアクセスするために<strong>RedHawk</strong> <strong>Linux</strong>が提 供 する 方 法 について 説 明 します。ターゲット・プロセスのアドレス 空 間 へのマッピングの 確 立 9mmap(2)の の 利 用 9各 実 行 中 のプロセスにおいて、/procファイル・システムはプロセスのアドレス 空 間 を 表 すファイルを 提 供 します。このファイルの 名 称 は/proc/pid/memで、pid はアドレス 空 間 が 表 されているプロセスのIDを 意 味 します。プロセスはopen(2)で/proc/pid/memファイルを 開 き、 他 のプロセスのアドレス 空 間 の 内 容 を 読 むためおよび 変 更 するためにread(2)およびwrite(2)システムコールを 使うことが 可 能 です。libccur_rtライブラリに 備 わっているusermap(3)ライブラリ・ルーチンは、 簡 単 なCPUの 読 み 書きを 利 用 して 現 在 実 行 中 のプログラムの 場 所 を 効 率 的 に 監 視 および 修 正 する 方 法 をアプリケーションに 提 供 します。このルーチンのための 基 本 的 なカーネル・サポートは、プロセスが 自 分 自 身 のアドレス 空 間 に 他のプロセスのアドレス 空 間 の 一 部邪 のマッピングを 許 可 する/procファイル・システムのmmap(2)システム・サービスコールです。 従 って、 他 の 実 行 中 のプログラムの 監 視 と 修 正 は、/procファイル・システムのread(2)およびwrite(2) 呼 び 出 しによるオーバーヘッドを 負 うことなく、アプリケーション 自 身 のアドレス 空 間 内 での 簡 単 なCPUの 読 み 書 きになります。以 降 のセクションでこれらのインターフェースの 説 明 およびアプリケーション 内 でmmap(2)またはusermap(3)を 使 うかどうかを 決 定 する 時 に 考 慮 すべき 事 項 を 紹 介 します。プロセスは/proc/pid/memファイルのアドレス 空 間 の 一 部邪 をマッピングするためにmmap(2)を 使用 することが 可 能 であり、このようにして 他 のプロセスのアドレス 空 間 の 内 容 を 直 接 アクセスします。/proc/pid/memファイルへのマッピングを 確 立 したプロセスを 以 下 モニタリング・プロセスと 呼 びます。アドレス 空 間 をマッピングされたプロセスをターゲット・プロセスと 呼 びます。/proc/pid/memファイルへのマッピングを 確 立 するため、 以 下 の 条 件 を 満 足 する 必 要 があります:• ファイルは 少 なくても 読 み 取 り 権 限 で 開 かれている 必 要 があります。もしターゲット・プロセスのアドレス 空 間 を 修 正 するつもりならば、ファイルは 書 き 込 み 権 限 で 開 かれている 必 要があります。• マッピングを 確 立 するためのmmapの 呼 び 出 しに 関 して、flags 引 数 はMAP_SHAREDを 指 定する 必 要 があり、それ 故 にターゲット・プロセスのアドレス 空 間 の 読 み 書 きはターゲット・プロセスとモニタリング・プロセスとの 間 で 共 有 されます。• ターゲットのマッピングはHUGETLB 領 域 内 ではない 実 際 のメモリ・ページとする 必 要 があります。 現 在 の 実 装 ではHUGETLB 領 域 へのマッピング 作 成 はサポートしていません。9-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>モニタリング・プロセスで 生 じるmmapマッピングは、 現 在 のレンジ 内 [offset, offset + length) にマッピングされたターゲット・プロセスの 物 理 メモリになることに 注 意 することが 重 要 です。 結果 、mmap 呼 び 出 しがされた 後 にターゲットのマッピングが 変 更 された 場 合 、ターゲット・プロセスのアドレス 空 間 へのモニタリング・プロセスのマッピングは 無 効 となる 可 能 性 があります。このような 状 況 では、モニタリング・プロセスは 物 理 ページ 下 へのマッピングを 保 持 しますが、マッピングはターゲット・プロセスとはもはや 共 有 されていません。 何 故 ならモニタリング・プロセスはマッピングが 有 効 ではないことを 検 知 できないため、モニタリング・プロセスとターゲット・プロセス 間 の 関 係 を 制 御 するためのアプリケーションを 準 備 する 必 要 があります( 表 記[start, end]は、start からend への 区 間 (start を 含 みend を 含 まない)を 意 味 します)。ターゲット・プロセスのアドレス 空 間 へのモニタリング・プロセスのマッピングが 無 効 になる 状況 は 以 下 のとおり:• ターゲット・プロセスが 終 了 。• ターゲット・プロセスがmunmap(2)またはmremap(2)のどちらかでレンジ 内 [offset, offset +length) のページをアンマップ。• ターゲット・プロセスがmmap(2)で 異 なるオブジェクトへレンジ 内 [offset, offset + length) のページにマッピング。• ターゲット・プロセスがfork(2)を 呼 び 出 し、 子 プロセスがする 前 にレンジ 内 [offset, offset +length) のアンロック 済 み、プライベート、 書 き 込 み 可 能 なページへ 書 き 込 む。このケースでは、ターゲット・プロセスはページのプライベート・コピーを 受 け 入 れ、そのマッピングと書 き 込 み 操 作 はコピーされたページへリダイレクトされる。モニタリング・プロセスはオリジナル・ページへのマッピングを 保 持 。• ターゲット・プロセスがfork(2)を 呼 び 出 してから、 子 プロセスと 共 有 し 続 けているレンジ 内[offset, offset + length) のプライベート、 書 き 込 み 可 能 な(copy-on-writeにマークされた)ページをメモリにロック。このケースでは、ロック 操 作 を 実 行 したプロセスは(ページに 最 初 の 書 き込 みを 実 行 したかのように)ページのプライベート・コピーを 受 け 入 れる。もしこれがページをロックするターゲット( 親 )・プロセスの 場 合 、モニタリング・プロセスのマッピングはもはや 有 効 ではない。• ターゲット・プロセスが 子 プロセスと 共 有 し 続 けているレンジ 内 [offset, offset + length) のロック 済 み、プライベート、 読 み 取 り 専 用 の(copy-on-writeにマークされた)ページの 書 き 込 み 権限 を 有 効 にするためにmprotect(2)を 呼 び 出 す。このケースでは、ターゲット・プロセスはページのコピーを 受 け 取 る。モニタリング・プロセスはオリジナルのメモリ・オブジェクトへのマッピングを 保 持 。もしアプリケーションがモニタリング・プロセスのアドレス 空 間 のマッピングの 対 象 になることを 要 求 されている 場 合 、 以 下 を 推 奨 します:• ターゲット・プロセスのアドレス 空 間 がモニタリング・プロセスにマッピングされる 前 にターゲット・プロセスにてメモリ・ロック 操 作 を 実 行• fork(2)を 呼 び 出 す 前 に 親 プロセスやモニタリング・プロセスによるマッピングが 保 持 される必 要 のあるあらゆるページをメモリにロックもしアプリケーションがアドレス 空 間 のマッピングの 対 象 になることを 要 求 されていない 場 合 、forkを 呼 び 出 した 後 までメモリ 内 のページのロックを 延 期 することも 可 能 です。詳 細 な 情 報 についてはmmap(2)のmanページを 参 照 してください。9-2


メモリ・マッピングusermap(3)の の 利 用 9/procファイル・システムのmmap(2)システムサービスコールのサポートに 加 え、<strong>RedHawk</strong> <strong>Linux</strong>はモニタリング・プロセスの 仮 想 アドレス 空 間 の 中 へターゲット・プロセスのアドレス 空 間 の 一部邪 をマッピングするための 代 替 え 方 法 としてusermap(3)ライブラリ・ルーチンも 提 供 します。このルーチンはlibccur_rtライブラリの 中 に 備 わっています。usermapライブラリ・ルーチンはターゲット・アドレス 空 間 のマッピングを 作 成 するための/procmmapシステムサービスコール・インターフェースを 基 本 に 内 部邪 的 に 使 用 する 一 方 、usermapは以 下 の 特 別 な 機 能 を 提 供 します:• 呼 び 出 し 元 プロセスは 仮 想 アドレスとターゲット・プロセスのアドレス 空 間 内 の 当 該 仮 想 空間 の 長 さを 指 定 する 必 要 があります。usermapルーチンは、mmapの 呼 び 出 しの 前 にこの 要求 の 変 換 内 容 を 整 列 した 開 始 アドレスのページとページ・サイズの 倍 数 の 長 さに 処 理 します。• usermapルーチンは 複 数 のターゲット・プロセスのデータ 項 目 をマッピングするために 使 用されることを 目 的 としており、 従 ってこれは 重 複 するmmapマッピングの 作 成 を 回 避遪 するるために 書 かれました。usermapは 既 存 の 全 てのマッピングに 関 するmmap 情 報 を 内 部邪 的 に 保持 し、 要 求 されたデータ 項 目 のマッピングが 既 に 存 在 するマッピングのレンジ 内 に 収 まる 時 、重 複 する 新 しいマッピングを 作 成 する 代 わりにこの 既 存 のマッピングを 再 利 用 します。• mmapを 呼 び 出 す 時 、 既 に 開 かれているファイル 記 述 子 を 提 供 する 必 要 があります。 適遚 切 なタイミングでターゲット・プロセスのファイル 記 述 子 を 開 くおよび 閉 じることは 義 務 となります。usermapを 使 用 する 時 、 呼 び 出 し 元 プロセスはターゲット・プロセスのプロセスID (pid_t)を 指 定 する 必 要 があります。usermapルーチンは/proc/pid/memファイルを 正 確 に 開 く 処 理をします。 同 じターゲット・プロセスIDに 対 して 更 なるusermap(3)の 呼 び 出 しは、この/procファイル 記 述 子 を 再 度 開 く 必 要 がないため、このファイル 記 述 子 は 開 いた 状 態 にしておきます。ファイル 記 述 子 を 開 いたままにしておくことは 全 ての 場 合 において 適遚 切 ではない 可 能 性 が 或ことに 注 意 してください。しかしながら、 明 示 的 にファイル 記 述 子 を 閉 じて“len”パラメータの 値 が0でルーチンを 呼 び 出 すことによりusermapが 使 用 している 内 部邪 マッピング 情 報 をフラッシュすることが 可 能 です。 呼 び 出 し 元 プロセスがusermapに 組 み 込 まれている 最 適遚 化 機能 を 続 いて 利 用 する 可 能 性 があるため、モニタリング・プロセスは 全 てのターゲット・マッピングが 作 成 された 後 にのみこのclose-and-flush 機 能 を 使 うことを 推 奨 します。 詳 細 な 情 報についてはusermap(3)のmanページを 参 照 してください。usermapライブラリ・ルーチンもまた 同 じ/proc/pid/mem mmap(2)システムコール・サポートを基 に 内 部邪 的 に 使 用 するため、もはや 有 効 ではないモニタリング・プロセスのマッピングに 関 して「mmap(2)の 利 用 」で 説 明 した 同 じ 制 限 をusermapマッピングにも 適遚 用 されることに 注 意 してください。usermap(3)ルーチンの 使 用 に 関 する 詳 細 な 情 報 についてはusermap(3)のmanページを 参 照 してください。9-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>検 討 事 項 9カーネル 構 成 パラメータ 9前 述 したusermap 機 能 に 加 えて、アプリケーションの 中 でusermap(3)ライブラリ・ルーチンもしくはmmap(2)システム・サービスコールを 使 用 するのかどうかを 決 定 する 時 に 以 下 の 残 りのポイントもまた 検 討 することを 推 奨 します:• /proc/pid/memファイルへのマッピングを 確 立 するために 使 用 する 機 能 はConcurrent<strong>RedHawk</strong> <strong>Linux</strong>の 拡 張 ですが、mmap(2)システムコールは 標 準 的 なSystem Vです。usermap(3)ルーチンは 完 全 にConcurrent <strong>RedHawk</strong> <strong>Linux</strong>の 拡 張 です。• mmap(2)はモニタリング・プロセス 内 のページ 保 護 とマッピングの 位 置 の 直 接 制 御 を 提 供 します。usermap(3)はそうではありません。/procファイル・システムmmap(2)コールの 動 作 に 直 接 影 響 を 与 えるConcurrent <strong>RedHawk</strong> <strong>Linux</strong>カーネル 構 成 パラメータが2つ 存 在 します。usermap(3)もまた/procファイル・システムmmap(2)サポートを 使 用 するため、usermap(3)はこれらの 構 成 パラメータに 同 様 に 影 響 を 受 けます。カーネル 構 成 パラメータは、カーネル 構 成 GUI 上 の「Pseudo File Systems」 項 目 でアクセス 可 能です:PROCMEM_MMAPもしこのカーネル 構 成 パラメータが 有 効 である 場 合 、/procファイル・システムmmap(2)サポートがカーネルに 組 み 込 まれます。もしこのカーネル 構 成 パラメータが 無 効 である 場 合 、/procファイル・システムmmap(2)サポートはカーネルに 組 み 込 まれません。このケースで、usermap(3)と/proc mmap(2)の 呼 び 出 しはerrnoの 値がENODEVで 返 されます。このカーネル 構 成 パラメータは、 全 てのConcurrent <strong>RedHawk</strong> <strong>Linux</strong>のカーネル 構 成 ファイルにおいて 既 定 値 で 有 効 になっています。PROCMEM_ANYONE もしこのカーネル 構 成 パラメータが 有 効 である 場 合 、モニタリング・プロセスが 読 み 取 りまたは 読 み 書 きによるopen(2)が 成 功 するどの/proc/pid/memファイルも/proc mmap(2)またはusermap(3)の 呼 び出 しのためにターゲット・プロセスとして 使 用 される 可 能 性 があります。もしカーネル 構 成 パラメータが 無 効 である 場 合 、モニタリング・プロセスにより 現 在 ptraceを 実 行 されているターゲット・プロセスで/procmmap(2)またはusermap(3)を 使 用 することが 可 能 です。 更 にptraceを 実 行 されたターゲット・プロセスは/proc mmap(2)システム・サービスコールが 行 われた 時 点 で 停 止 した 状 態 である 必 要 があります( 他のプロセスへのptrace 実 行 に 関 する 詳 細 な 情 報 についてはptrace(2)のmanページを 参 照 してください)。このカーネル 構 成 パラメータは、 全 てのConcurrent <strong>RedHawk</strong> <strong>Linux</strong>のカーネル 構 成 ファイルにおいて 既 定 値 で 有 効 になっています。9-4


10Chapter 10Non-Uniform Memory Access (NUMA)AMD Opteronシステムおよび(Nehalem, Sandy Bridge, Ivy Bridge 等 を 含 む) 最 新 のIntelシステムで 利用 可 能 なNUMAサポートは、プログラムのページに 割 り 当 てられることになるメモリ 場 所 に 影 響を 及 ぼす 可 能 性 があります。概 要 10不 均 等 メモリアクセス(NUMA: Non-Uniform Memory Access)を 持 つシステムにおいて、 他 よりも一 部邪 のメモリ 領 域 へのアクセスに 時 間 がかかります。AMD Opteron (または 最 新 のIntel)マルチプロセッサ・システムはNUMAアーキテクチャです。これは 各 CPUチップがそれ 自 身 のメモリ・リソースと 一 体 となっているからです。CPUとそれに 対 応 するメモリはユニークな 物 理 バス 上 に 置かれています。CPUはそのローカル・メモリ・バス 上 にあるメモリ 領 域 へは 速 くアクセスすることが 可 能 ですが、 他 のCPUはローカルではないCPUのメモリへアクセスするために1つ 以 上 の 余 計な 物 理 バス 接 続 を 横 断 する 必 要 があります。CPU-バス 間 の 関 係 を 図 10-1に 示 します。図 10-1 NUMAシステム 上 のCPU/Busの のの 関 係AMD Opteron (または 最 新 のIntel)システム 上 のメモリへアクセスする 時 間 は、プログラムが 実 行されるCPUとプログラムのページが 割 り 当 てられるメモリ 領 域 に 依 存 することになることを 意 味します。NUMAノードは、1つのメモリ 領 域 とNUMAノードのメモリ 領 域 として 同 じ 物 理 バス 上 に 存 在 する 全 てのCPUとすることを 定 義 します。システムのブート 中 にカーネルはNUMAメモリ-CPUレイアウトを 決 定 し、CPUとNUMAノードの 関 連連 を 定 義 する 仕 組 みを 作 成 します。 現 在 のNUMAシステム 上 では、メモリ 領 域 に 存 在 する 物 理 バスは1つのCPUにのみ 直 接 接 続 されています。最 適遚 な 性 能 を 得 るため、プログラムに 利 用 されているメモリ・ページのローカルCPU 上 でプログラムは 実 行 される 必 要 があります。 本 章 内 で 説 明 されるNUMAインターフェースは、プログラムがプログラムのページが 割 り 当 てられる 場 所 からノードを 指 定 すること、および、リアルタイム・アプリケーション 用 にリモート・メモリへのアクセス 量 を 減 らすためにユーザー・ページをシールドされたノードのメモリへ(から) 移 動 するためNUMAノードをシールドすることが 可 能 です。10-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>メモリ・ポリシー 10プロセスのCPUアフィニティを 設 定 するためのメカニズムと 組 み 合 わせた 時 、これらのインターフェースはプログラムが 極 めてデターミニスティックなメモリ・アクセス 時 間 を 獲 得 することを可 能 にします。NUMAサポートはAMD Opteronおよび 最 新 のIntelプロセッサのiHawkシステム 上 だけで 利 用 可 能です。ローカルに 少 しのメモリも 備 えていない 一 部邪 のCPUのためにNUMAシステムを 構 成 することが 可 能 です。メモリを 持 たないCPUのような 状 況 では、メモリ・リソースなしのNUMAノード(32bitモード)を 割 り 当 てる、もしくはメモリ 付 きNUMAノード(64bitモード)に 人 工 的 に 割 り 当 てられます。どちらのケースでも、 全 てのCPUからのメモリ・アクセスはリモート・メモリ・アクセスになります。これはローカル・メモリなしのCPU 上 で 実 行 中 のプロセスのメモリ 性 能 だけでなくリモート・アクセス 要 求 が 発 生 しているNUMAノード 上 で 実 行 中 のこれらのプロセスに 影 響 を与 えます。これはデターミニスティックなプログラム 実 行 のための 最 適遚 な 構 成 ではありません。 構 成 の 詳 細については 本 章 で 後 述 する「 構 成 」セクションを 参 照 してください。メモリ 性 能 の 最 適遚 化 やデターミニスティックなメモリ・アクセス 時 間 を 得 るための 方 法 に 関 する 詳 細 な 情 報 については「 性能 ガイドライン」セクションを 参 照 してください。デターミニスティックなメモリ・アクセスはデターミニスティックなプログラム 実 行 時 間 を 得 るためにも 重 要 であることに 注 意 してください。NUMAサポートはメモリ・ポリシーの 概 念 を 実 装 しています。これらのメモリ・ポリシーはユーザー 単 位 タスクを 基 準 にしてタスク 全 体 に 適遚 用 されます。 任 意 のタスク 内 の 仮 想 アドレス 空 間 の範 囲 もまたそれら 自 身 にそれらのページに 対 しタスク 全 体 メモリ・ポリシーを 優 先 する 個 別 のメモリ・ポリシーを 所 有 する 可 能 性 があります。タスク 全 体 および 仮 想 アドレス 空 間 の 両 方 のメモリ・ポリシーはfork/clone 操 作 中 の 子 タスクに 継 承 されます。NUMAメモリ・ポリシーは 以 下 のとおり:MPOL_DEFAULTMPOL_BINDこれは、メモリが 利 用 可 能 である 場 合 、メモリ・ページはローカル・メモリから 現 在 のCPUへ 割 り 当 てられたところがデフォルトになります。これはタスクまたはこの 子 タスクが 特 定 のメモリ・ポリシーを割 り 当 てなかった 時 に 使 用 されるポリシーです。タスク 全 体 メモリ・ポリシーとして、もしくは 異 なるタスク 全 体 メモリ・ポリシーが 設 定されているタスク 内 の 仮 想 メモリ 空 間 のために 明 示 的 にMPOL_DEFAULTポリシーを 設 定 することが 可 能 です。これは、このメモリ・ポリシーが 設 定 される 時 点 でノードマスクに 指定 されたノードのみにメモリ 割 り 当 てを 制 限 する 厳 格 なポリシーです。ページは 指 定 されたノードからのみ 割 り 当 てられ、ページ 割 り 当てはバインドしたノードマスクではないほかのノードでメモリが 利用 可 能 であっても 失 敗 する 可 能 性 があります。この 種 のページ 割 り 当て 失 敗 が 発 生 する 時 、プロセスおよび 同 じアドレス 空 間 を 共 有 するこの 子 プロセス 全 てとスレッド 全 てはカーネルのSIGKILLシグナルにより 終 了 します。このポリシーはどのノードからページが 割 り 当 てられるかに 関 しては 他 のメモリ・ポリシーよりもより 多 くの 確 実 性 を 提供 します。留 意 すべきは、プロセスのローカル・メモリになるのために 将 来 のメモリ 割 り 当 て 全 てを 保 証 する 唯 一 の 方 法 は、シングルCPUまたは 同 じNUMAノード 内 に 存 在 する 全 てのCPUセットへCPUアフィニティとMPOL_BINDポリシーの 両 方 を 設 定 することです。10-2


Non-Uniform Memory Access (NUMA)MPOL_PREFERREDこのポリシーは 割 り 当 てのために 優 先 される( 単 一 の)ノードを 設 定 します。カーネルは 最 初 にこのノードからページを 割 り 当 てようとし、優 先 されるノードがメモリ 不 足 の 時 は 他 のノードを 使 用 します。MPOL_INTERLEAVE このポリシーはノードマスクに 指 定 されたノードへの 割 り 当 てを(ラウンド・ロビン 方 式 で) 交 互 に 行 います。これは 遅逼 延 の 代 わりに 処 理能 力 を 最 適遚 化 します。 効 果 的 にするためには、メモリ 領 域 を 相 当 大 きくする 必 要 があります。ユーザー 空 間 ページ 割 り 当 てに 加 えて、カーネル・メモリ 割 り 当 て 要 求 の 多 くもまた 現 在 実 行 中タスクのタスク 全 体 メモリ・ポリシーにより 決 定 されます。しかし、 全 てのカーネル・ページ 割り 当 てが 現 在 のタスクのメモリ・ポリシーに 制 御 されているわけではありません。 例 えば、DMA目 的 のためにメモリを 割 り 当 てる 殆 どのデバイス・ドライバは、デバイスのI/Oに 存 在 するノード、もしくはそのI/Oバスに 最 も 近 いノードからメモリを 代 わりに 割 り 当 てます。既 に 行 われたページ 割 り 当 てはタスクのメモリ・ポリシーの 変 更 に 影 響 されません。 例 えば、2つのCPUを 搭 載 したシステムにおいてCPUとノードが1 対 1に 対 応 しているものと 仮 定 します:タスクがCPUアフィニティが0x1かつメモリ・ポリシーがMPOL_DEFAULTでCPU0 上 でしばらくの 間 実 行 している 状 況 で、その 後 、そのCPUアフィニティが0x2、メモリ・ポリシーがノードマスク 値 が0x2のMPOL_BINDへ 変 更 すると、 大 抵 は 一 旦 そのタスクがCPU1 上 で 実 行 を開 始 したらタスクに 対 して 非 ローカルにあるそのアドレス 空 間 内 のページとなります。以 下 のセクションでNUMA 管 理 のための 利 用 可 能 なシステム・サービス、ライブラリ 機 能 、ユーティリティについて 説 明 します。NUMAユーザー・インターフェースユーザー・インターフェース10shield(1)コマンドはNUMAノード・メモリ・シールディングの 制 御 および 問 合 せに 使 用 することが 可 能 です。run(1)コマンドは 実 行 時 にタスクのメモリ・ポリシーを 固 定 するもしくは 変 更 するため、 指 定 したプロセスもしくはスレッドの 各 NUMAノード 内 ページのユーザー・ページ 数 を 表示 するために 使 用 することが 可 能 です。shmconfig(1)は 共 有 メモリ 領 域 のために 使 用 することが可 能 です。ライブラリ 機 能 、システム・サービス、 他 のユーティリティやファイルもまたNUMA 制 御 に 利 用可 能 です。このサポートの 詳 細 は 以 降 のセクションで 提 供 します。メモリ・シールドされたノード 10shield(1)コマンドはメモリ・シールドされたNUMAノードを 作 成 するために 使 用 することが 可 能です。NUMAノードのメモリがシールドされた 時 、シールドされたノード 上 で 実 行 するために 割 り 付 けられていないアプリケーションに 属 するユーザー・ページはシールドされたノードのメモリの 外へ 移 動 されるためにリモート・メモリ・アクセス 量 は 減 ります。 同 様 にシールドされたノードに割 り 付 けられたアプリケーションに 属 するユーザー・ページはシールドされたノードのメモリ 内へ 移 動 されます。NUMAノードが 最 初 にメモリ・シールドされた 時 、タスクのCPUアフィニティが 修 正 される 度 に、 現 在 1つ 以 上 のメモリ・シールドされたNUMAノードが 構 成 されたシステムでこの「ページ 移 動 」は 自 動 的 に 実 行 されます。メモリ・シールディングに 関 する 詳 細 な 情 報 は、memory_shielding(7)のmanページを 参 照 してください。10-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>shieldのための 以 下 のオプションは、メモリ・シールディング・サポートの 有 効 、 無 効 、 問 合 せをするために 使 用 されます:--mem=MEMSHIELD, -m MEMSHIELDMEMSHIELDメモリ・シールディング・サポートの 無 効 、 有 効 、 問 合 せをするためにそれぞれ0, 1, qのいずれかを 指 定 します。オプションなしもしくは-cオプション 付 きのマルチ・ノードNUMAシステムで 使 用 されるshieldは、メモリ・シールドされているCPUを 表 示 します。cpu(1)コマンドもまたメモリ・シールドされたCPUを 表 示 します。NUMAノードをメモリ・シールドするためには2つの 条 件 があります:• メモリ・シールディング・サポートをshield -m1コマンドにより 有 効 にする 必 要 があります。• 同 じNUMAノード 上 に 存 在 する 全 てのCPUはshield -pもしくはshield -aのどちらかによりプロセス・シールドする 必 要 があります。run(1)コマンドの-Mn オプションはシステムの 各NUMAノード 上 のCPUを 見 るために 使 用 することが 可 能 です。これらの2つのステップは 一 緒 にもしくは 個 別 にshieldを 呼 び 出 して 使 用 することが 可 能 です。 詳細 はshield(1)のmanページを 参 照 してください。最 高 のパフォーマンスのために 以 下 の 手 順 に 従 うことを 推 奨 します:• 最 初 にメモリ・シールドされたNUMAノードを 作 成 し、その 後 、• そのノード 上 でリアルタイム・アプリケーションを 実 行以 下 の 例 は4CPU-Dual Coreシステム 上 での 正 しい 手 順 を 示 します:shield -m1 -p 2,3run -b 2,3 rt-app &共 有 された(システム・ライブラリ・テキストや 読 み 取 り 専 用 データ・ページのような) 読 み 取 り専 用 ページがマッピングされ 多 くのタスクからアクセスすることが 可 能 であるため、これらのページがリクエスト 中 のCPUもしくはプロセスが 存 在 するノードとは 異 なるノード 内 に 存 在 する 場合 、これらのページはローカルNUMAノードのメモリに 複 製 ( 同 じアイデンティティを 保 持 している 間 はそれらの 内 容 をコピー)されます。これはなお 一 層 システムのリモート・メモリ・アクセス回 数 を 減 らします。numapgs(1)と/proc/pid/numa_mapsは 現 在 プロセスの 複 製 されたページを( 存 在 するときに) 見るために 使 用 することが 可 能 です。このサポートを 常 にアクティブとするため、または 手 動 で 起 動 するためにカーネルへ 組 み 込 むことが 可 能 です。 詳 細 はページ10-17の「 構 成 」を 参 照 してください。ページ 複 製 の 実 行 方 法 に 関 する 更 に 詳 細 は、page_replication(7)のmanページを 参 照 してください。10-4


Non-Uniform Memory Access (NUMA)メモリ・シールドとプリアロケート・グラフィック・ページ 10プリアロケート・グラフィック・ページ・サポートの 概 要 については、 付 録 Gの「グラフィクス割 り 込 み」セクションを 参 照 してください。NVIDIAグラフィックカード 付 きNUMAシステム 上 では、シールディング 構 成 のシステム・メモリの 一 部邪 としてプリアロケート・グラフィック・ページを 特 定 のNUMAノードに 任 意 に 設 定 することが 可 能 です。ノードがメモリ・シールドされた 時 にプリアロケート・グラフィック・ページは 非 メモリ・シールド・ノードに 自 動 的 に 再 割 り 当 てされないことに 注 意 してください。プリアロケート・グラフィック・ページは、4GB 境 界 以 下 のアドレスに 置 かれたメモリを 持 つ 全てのNUMAノード 間 でインターリーブ 方 式 により 最 初 に 割 り 当 てられます。XやXorgのようなグラフィック・アプリケーションはそれらのアドレス 空 間 内 にグラフィック・ページをマッピング、従 って、 通 常 はシステム 内 の 様 々なNUMAノード 間 に 広 がったグラフィックのマッピングを 持 ちます。これらのマッピングはグラフィック・アプリケーションが 実 行 しているときにI/Oのためにロック・ダウンされるため、これらのページはカーネルのメモリ・シールド・サポートにアンマップまたはフリーされることはなく、 従 ってこれらのマッピングのどのような 自 動 によるページ移 動 でも 保 護 されます。メモリ・シールドNUMAノード 構 成 の 一 部邪 として 特 定 のNUMAノード・セットへプリアロケート・グラフィック・ページを 任 意 にセットするため、 以 下 の 手 順 を 取 ることができます:1. 全 てのグラフィック 機 能 (X/Xorg)を 停 止 。システムをX 機 能 のない 最 も 大 きなinitの 状 態 3(ランレベル3)へ 移 行 します。2. コマンドにより1つ 以 上 のNUMAノードをメモリ・シールド。3. /proc/driver/graphics-memoryファイルへゼロを 書 き 込 んで 全 てのグラフィック・ページを 解 放 します。 現 時 点 で/proc/driver/graphics-memoryファイルを 読 み 出 して 全 てのグラフィック・ページが 解 放 されたことを 確 認 。グラフィック・アプリケーションがプリアロケート・グラフィック・ページを 使 用 し 続 けている 場 合 、このファイルへゼロの 値 を 書 こうとするとエラーにより 失 敗 することに 注 意 が 必 要 です。これらのアプリケーションは 全 てのページを 解 放 する 前 に 終 了 する 必 要 があります。4. グラフィック・ページを 割 り 当 てるNUMAノードに 属 する 少 なくても1つのCPUを 含 むインターリーブ・メモリ・ポリシーでシェル(bash, ksh, 等 )を 作 成 します。5. 新 しいページ 数 の 値 を/proc/driver/graphics-memoryファイルへ 書 き 込 んで 希 望 するノードにグラフィック・ページを 再 割 り 当 てします。/proc/driver/graphics-memoryファイルを 読 み 出 して 希 望 するNUMAノードにページが 割 り 当 てられたことを 確 認 。 読 み 取 ったファイルの 出 力 はノード 毎 のページ 割 り 当 て 数 を 提 供 します。6. init 5(ランレベル5)へ 戻 る、もしくは 希 望 するX 機 能 を 再 起 動 します。例以 下 の 例 は、4つのNUMAノード、16CPU-Quad Coreのシステムの 最 初 のノードにメモリ・シールド・ノードを 作 成 します。この 例 のグラフィック・ページは2つの 非 メモリ・シールドNUMAノード 間 (ノード1と2)に 広 がっています。この 例 では、ノード3のメモリは4GB 境 界 よりも 上 に 位 置しており、 従 って、ノード3の 中 にプリアロケート・グラフィック・ページは 存 在 しないことに 注意 してください。10-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>1. 全 てのグラフィック 機 能 を 停 止 します。 全 てのXアプリケーション, X, Xorgを 終 了 します。例 えば、ルートでログインでしてinit 3(ランレベル3)へ 移 行 します。# init 32. 最 初 のノードをメモリ・シールドし、 構 成 を 確 認 します:# /usr/bin/shield -m1 -a 0-3 -cCPUID irqs ltmrs procs mem-----------------------------------------0 yes yes yes yes1 yes yes yes yes2 yes yes yes yes3 yes yes yes yes4 no no no no5 no no no no6 no no no no7 no no no no8 no no no no9 no no no no10 no no no no11 no no no no12 no no no no13 no no no no14 no no no no15 no no no no3. 全 てのプリアロケート・グラフィック・ページを 解 放 します。graphics-memoryファイルを 読 み 込 んで 全 てのページが 解 放 されたことを 確 認 します:# /bin/cat /proc/driver/graphics-memoryPre-allocated graphics memory: 10240 pagesTotal allocated graphics memory: 10240 pagesGraphics memory in use:0 pagesMaximum graphics memory used:0 pagesNode 0 Node 1 Node 2 Node 3Preal: 5121 2712 2407 0Total: 5121 2712 2407 0InUse: 0 0 0 0Max: 0 0 0 0# /bin/echo 0 > /proc/driver/graphics-memory# /bin/cat /proc/driver/graphics-memoryPre-allocated graphics memory:Total allocated graphics memory:Graphics memory in use:Maximum graphics memory used:0 pages0 pages0 pages0 pagesNode 0 Node 1 Node 2 Node 3Preal: 0 0 0 0Total: 0 0 0 0InUse: 0 0 0 0Max: 0 0 0 010-6


Non-Uniform Memory Access (NUMA)4. NUMAノード1と2の 両 方 から 少 なくても1つのCPUを 含 むインターリーブ・メモリ・ポリシーにてbashシェルを 作 成 します。これはページ 割 り 当 てを 非 メモリ・シールド・ノード 間 に展 開 する 要 因 になります。run(1)コマンドの「--mempolicy view」オプションにより 新しいbashシェルを 確 認 します。# /usr/bin/run --mempolicy interleave=4,8 bash# /usr/bin/run --mempolicy viewMempolicy NextCpu Cpus Nameinterleave 0x00f0 0x0ff0 run5. メモリ・ポリシーのbashシェルを 使 ってグラフィック・ページを 再 割 り 当 てします。graphics-memoryファイルを 読 み 込 んで 割 り 当 てたノード 位 置 を 確 認 します:# /bin/echo 10240 > /proc/driver/graphics-memory# /bin/cat /proc/driver/graphics-memoryPre-allocated graphics memory: 10240 pagesTotal allocated graphics memory: 10240 pagesGraphics memory in use:0 pagesMaximum graphics memory used:0 pagesNode 0 Node 1 Node 2 Node 3Preal: 0 5120 5120 0Total: 0 5120 5120 0InUse: 0 0 0 0Max: 0 0 0 06. インターリーブ・メモリ・ポリシーのbashシェルを 終 了 します:# exit7. Xを 再 起 動 、もしくはinit 5(ランレベル5)へ 戻 ります:# init 5上 述 の 例 では、bashシェルが 起 動 される 手 順 4でインターリーブ・メモリ・ポリシーのCPUに 変 更することで、 割 り 当 てられるグラフィック・ページのノードを 変 更 することが 可 能 です。<strong>RedHawk</strong>カーネルは、 全 てのプリアロケート・グラフィック・ページ・サポートを 無 効 にするためにno_pregraph_pgsブート・パラメータにてブートできることに 注 意 してください。run(1)を を 利 用 したNUMAサポートサポート(プロセス 用 )10run(1)の“mempolicy” オプションは、 関 連連 する 情 報 を 表 示 するだけでなく、 実 行 しようとするプロセスにタスク 全 体 NUMAメモリ・ポリシーを 規 定 するために 使 用 することが 可 能 です。概 要 :run [OPTIONS] COMMAND [ARGS]“mempolicy” は 利 用 可 能 なOPTIONS の1つで 以 下 の 書 式 があります:10-7


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>--mempolicy=MEMPOLICY_SPECIFIER-M MEMPOLICY_SPECIFIERrunで 実 行 された 既 存 のプロセスまたはスレッドを 特 定 するPROCESS/THREAD_SPECIFIER は、生 成 されようとするプロセスにだけ 影 響 を 与 えるmempolicyオプションを 使 用 することはできません。MEMPOLICY_SPECIFIER は 以 下 の1つのみを 含 みます。 各 々はその 最 初 のユニークな 文 字 に 省 略することが 可 能 です。list はカンマ 区 切 りリストまたはCPUの 範 囲 です( 例 :“0,2-4,6”)。“active” または “boot” は 全 てのアクティブなプロセッサまたはブート・プロセッサをそれぞれ 指 定 するために 使 用 することが 可 能 です。オプションのティルダ[~]はリストの 否 定 ですが、“active”では 否 定を 使 用 できません。[~]listb[ind]=listb[ind]ローカルからlist 内 のCPUのメモリを 使 いMPOL_BINDメモリ・ポリシーを 使 って 指 定 されたプログラムを 実 行 します。ローカルから--biasオプションで 指 定 されたCPUのメモリを 使 いCPUMPOL_BINDメモリ・ポリシーを 使 って 指 定 されたプログラムを 実 行 します。--biasオプションは 実 行 する 予 定 およびこの 遥 択 肢 を 指 定 する 必 要 のあるプログラムのCPUを 定 義 します。i[nterleave]=[~]listローカルからlist 内 のCPUのメモリを 使 いMPOL_INTERLEAVEメモリ・ポリシーを 使 って 指 定 されたプログラムを 実 行 します。p[referred]=cpuローカルから 単 一 の 指 定 されたCPUの 使 用 を 遥 び、MPOL_PREFERREDメモリ・ポリシーを 使 って 指 定 されたプログラムを 実 行 します。p[referred]d[efault]n[odes]v[iew]遥 択 されたメモリは、(’local’ 割 り 当 てポリシーで) 割 り 当 てを 開 始 するCPUを 含むノード 上 に 置 かれ、MPOL_PREFERREDタスク 全 体 NUMAメモリ・ポリシーにて 指 定 されたプログラムを 実 行 します。MPOL_DEFAULTメモリ・ポリシーを 使 って 指 定 されたプログラムを 実 行 します。これは 既 定 のメモリ・ポリシーです。各 ノード 上 のトータル・メモリと 現 在 の 空 きメモリに 加 えて 各 NUMAノードに含 まれるCPUを 表 示 します。runのこの 呼 び 出 しで 指 定 される 他 のオプションやプログラムはありません。現 在 のプロセスのメモリ・ポリシー 設 定 を 表 示 します。runのこの 呼 び 出 しで 指定 される 他 のオプションやプログラムはありません。システムに1つ 以 上 のローカル・メモリなしCPUを 含 む 時 、これらのCPUはシステム 初 期 化 中 にラウンドロビン 方 式 でノードに 割 り 当 てられます。ノードへ 割 り 当 てられますが、これらは 実 際 はローカル・メモリを 所 有 しておらず、 常 に( 所 有 する 割 り 当 てられたノードへのメモリ・アクセスを 含 む) 非 ローカル・メモリ・アクセスが 行 われます。このタイプの 構 成 下 では、v[iew]の 出 力 はローカル・メモリを 含 まない 各 NUMAノード 上 のCPUを 表 示 する 追 加 の“NoMemCpus” 列 を 含 みます。NUMA 対 応 カーネルを 使 用 する 時 は 各 CPUにメモリ・モジュールが 組 み 込 まれた 構 成 になっているハードウェアを 推 奨 します。10-8


Non-Uniform Memory Access (NUMA)マルチ・ノード・システム 上 で--mappings/-mオプション 付 きでrunを 指 定 するとPROCESS/THREAD_SPECIFIER 引 数 により 指 定 されたプロセスまたはスレッドのこの 各 NUMAノードのユーザー・マッピング・ページ 数 を 表 示 します。このオプションは 実 行 時 に‘command’パラメータを 使 用 することができません。runのほかのオプションについては、run(1)のmanページまたは4 章 の「runコマンド」セクションを 参 照 してください。もしnumactl(8)がシステム 上 で 利 用 可 能 である 場 合 、NUMAメモリ・ポリシーを 設 定 するために使 用 することが 可 能 です。shmconfig(1)を を 利 用 したNUMAサポートサポート( 共 有 メモリ 領 域 用 ) 10NUMAポリシーは“mempolicy” オプションによりshmconfig(1)を 使 用 して 新 しい 共 有 メモリ 領域 を 割 り 当 てるまたは 既 存 の 共 有 メモリ 領 域 を 変 更 することが 可 能 です。概 要 :/usr/bin/shmconfig -M MEMPOLICY [-s SIZE] [-g GROUP] [-m MODE] [-u USER][-o offset] [-S] [-T] {key | -t FNAME}“mempolicy” オプションは 以 下 の 書 式 があります:--mempolicy=MEMPOLICY-M MEMPOLICYMEMPOLICY は 以 下 の1つのみを 含 みます。 各 々はその 最 初 のユニークな 文 字 に 省 略 することが可 能 です。LIST はカンマ 区 切 りリストまたはCPUの 範 囲 です( 例 :“0,2-4,6”)。“active” または“boot” は 全 てのアクティブなプロセッサまたはブート・プロセッサをそれぞれ 指 定 するために 使用 することが 可 能 です。オプションのティルダ[~]はリストの 否 定 ですが、“active”では 否 定 を 使 用できません。各 ノードに 含 まれているCPU、 各 ノードのトータルおよび 利 用 可 能 な 空 きメモリを 見 るためにrun -M nodesを 使 用 します。[~]LISTb[ind]=LISTローカルからLIST 内 のCPUのメモリを 使 い 指 定 された 領 域 をMPOL_BINDメモリ・ポリシーに 設 定 します。i[nterleave]=[~]LISTローカルからLIST 内 のCPUのメモリを 使 い 指 定 された 領 域 をMPOL_INTERLEAVEメモリ・ポリシーに 設 定 します。p[referred]=CPUローカルから 単 一 の 指 定 されたCPUの 使 用 を 遥 び、 指 定 された 領 域 をMPOL_PREFERREDメモリ・ポリシーに 設 定 します。p[referred]d[efault]遥 択 されたメモリは、(’local’ 割 り 当 てポリシーで) 割 り 当 てを 開 始 するCPUを 含むノード 上 に 置 かれ、 指 定 された 領 域 をMPOL_PREFERRED NUMAメモリ・ポリシーに 設 定 します。指 定 された 領 域 をMPOL_DEFAULTメモリ・ポリシーを 設 定 します。これは 既定 値 です。10-9


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>v[iew]指 定 した 領 域 の 現 在 のメモリ・ポリシー 設 定 を 表 示 します。mempolicyオプションで 使 用 可 能 な 追 加 のオプションは 以 下 となります:--size=SIZE-s SIZE--offset OFFSET-o OFFSET--user=USER-u USER--group=GROUP-g GROUP--mode=MODE-m MODE--strict-S--touch-T領 域 のサイズをバイトで 指 定 します。既 存 の 領 域 の 先 頭 からのオフセットをバイトで 指 定 します。この 値 はページサイズの 倍 数 へ 切 り 上 げられます。もし-sオプションも 指 定 された 場 合 、offset+sizeの 合 計 値 は 領 域 の 合 計 サイズ 以 下 である 必 要 があります。共 有 メモリ 領 域 の 所 有 者 のログイン 名 を 指 定 します。領 域 へのグループ・アクセスが 適遚 用 可 能 なグループの 名 称 を 指 定 します。共 有 メモリ 領 域 へのアクセスを 管 理 するパーミッションのセットを 指 定 します。パーミッションを 指 定 するために8 進逭 数 を 使 用 する 必 要 があります( 既 定 値 は0644)。領 域 の 範 囲 内 のページが 指 定 された 現 在 適遚 用 されているメモリ・ポリシーと 一致 しない 場 合 はエラーを 出 力 します。範 囲 内 の 各 ページへ 接 触 ( 読 み 取 り)させ、 早 期 にメモリ・ポリシーを 適遚 用 します。既 定 値 では、アプリケーションがこれらの 領 域 およびページ 内 ( 割 り 当 てたページ)の 傷 害 へアクセスする 時 にポリシーが 適遚 用 されます。key 引 数 は 共 有 メモリ 領 域 のユーザ 遥 択 識 別 子 を 意 味 します。この 識 別 子 は 整 数 または 既 存 のファイルを 参 照 する 標 準 的 なパス 名 のどちらも 可 能 です。パス 名 が 提 供 される 時 、ftok(key,0)はshmget(2) 呼 び 出 しのkeyパラメータとして 使 用 されます。--tmpfs=FNAME / -t FNAME はkeyの 代 わりにtmpfsファイルシステムのファイル 名 を 指 定 するために 使 用 することが 可 能 です。-u, -g, -mオプションはこの 領 域 のファイル 属 性 を 設 定 または 変 更するために 使 用 することが 可 能 です。shmconfigの 他 のオプションについては、manページまたは3 章 内 の「shmconfigコマンド」セクションを 参 照 してください。もしnumactl(8)がシステム 上 で 利 用 可 能 である 場 合 、それもまたNUMAメモリ・ポリシーを 設 定するために 使 用 することが 可 能 です。10-10


Non-Uniform Memory Access (NUMA)システムコール 10以 下 のシステム・サービス・コールが 利 用 可 能 です。numaif.hヘッダー・ファイルはこれらいずれの 呼 び 出 しを 行 うときもインクルードする 必 要 があることに 注 意 してください。set_mempolicy(2)get_mempolicy(2)mbind(2)move_pages(2)現 在 のプロセスにタスク 全 体 メモリ・ポリシーを 設 定 します現 在 のプロセスまたはメモリ・アドレスのメモリ・ポリシーを 取 得 します共 有 メモリを 含 むアドレス 空 間 の 特 定 範 囲 にポリシーを 設 定 しますプロセスのページ・セットを 異 なるNUMAノードへ 移 動 しますライブラリ 機 能 10/usr/lib64/libnuma.soライブラリは、NUMA 対 応 の 単 純 なプログラミング・インターフェースを提 供 します。これはNUMAメモリ・ポリシーやノードをサポートするルーチンの 様 々な 種 類 、および 基 礎 となるNUMAシステム・サービス・コールを 使 用 するための 代 わりのインターフェースを 含 みます。 詳 細 についてはnuma(3)のmanページを 参 照 してください。情 報 提 供 ファイルおよびユーティリティ 10ノード 統 計 値 10以 降 のセクションでは、NUMAノードに 関 連連 する 情 報 を 表 示 するために 使 用 可 能 なファイルやユーティリティについて 説 明 します。NUMAがカーネル 内 で 有 効 である 時 、 各 ノードは/sys/devices/system/node/node# サブディレクトリ 内 のファイル 情 報 セットを 所 有 します(# はノード 番 号 、 例 :0, 1, 2... )。これらのファイルを 以 下 に 記 載 します。cpumap このノード 内 のCPUの16 進逭 数 ビットマップを 表 示 します。 例 :> cat /sys/devices/system/node/node3/cpumap08cpulist このノード 内 のCPUのリストを 表 示 します。 例 :> cat cpulist4-7numastatmeminfoノードのhit/miss 統 計 値 を 表 示 します。 表 示 されるフィールドの 説 明については 次 のセクションを 参 照 してください。ノードの 様 々なメモリ 統 計 値 を 表 示 します( 空 き、 使 用 済 み、ハイ、ロー、 全 メモリの 合 計 を 含 みます)。10-11


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>distanceローカル・ノードから 各 ノードのメモリの 距 離 を 表 示 します。“10”の値 はメモリがローカルであることを 示 し、“20”の 値 はメモリが、 例 えば 離 れた1つのハイパーチャネル 接 続 を 示 します。マッピングされたページのノードID 10cpu# ノードに 関 連連 付 けられているCPUデバイス・ファイルです。 例 :$ ls -l /sys/devices/system/node/node3/cpu3lrwxrwxrwx 1 root root 0 jan 21 03:01 cpu3->../../../../devices/system/cpu/cpu3指 定 したプロセスまたはスレッドに 現 在 マッピングされている 各 ページのNUMAノードIDによりnumapgs(1)は 場 所 を 表 示 します。-aオプションを 指 定 しない 限 り、 物 理 メモリ・ページにマッピングされている 場 所 だけを 出 力 します。構 文 :numapgs [OPTIONS]OPTIONS は 以 下 のとおり:--pid=pid, -p pidプロセスIDまたはスレッドIDのアドレス 空 間 が 表 示 されます。--start=saddr, -s saddr表 示 されるマッピングの 範 囲 を 制 限 するため、このsaddr 16 進逭 の 仮 想 アドレス 値未 満 にマッピングされているノードIDは 表 示 されません。もし--endが 指 定 されていない 場 合 、saddr からアドレス 空 間 の 最 後 までの 全 てのノードIDエントリが 表 示 されます。--end=eaddr, -e eaddr表 示 されるマッピングの 範 囲 を 制 限 するため、このeaddr 16 進逭 の 仮 想 アドレス 値以 上 にマッピングされているノードIDは 表 示 されません。もし--startが 指 定 されていない 場 合 、アドレス 空 間 の 先 頭 からeaddr-1までの 全 てのノードIDエントリが 表 示 されます。--all, -a物 理 メモリへの 有 効 なマッピングを 含 んでいるこれらの 場 所 だけでなく、プロセスのアドレス 内 の 全 仮 想 アドレス・ページの 場 所 を 表 示 します。 出 力 のピリオド(.)はマッピングされていない 場 所 または(I/O 空 間 マッピングのような)メモリ・オブジェクトへのマッピングを 表 します。このオプションは 指 定 した 範 囲内 の 全 てのページの 場 所 を 表 示 するために--startまたは--endと 一 緒 に 使 用 することが 可 能 です。--<strong>version</strong>, -vnumapgsの 現 在 のバージョンを 表 示 して 終 了 します。--help, -h利 用 可 能 なオプションを 表 示 して 終 了 します。各 出 力 ラインは 最 大 8 個 の10 進逭 数 のノードID 値 を 含 みます。10-12


Non-Uniform Memory Access (NUMA)もし(mlock(2)またはmlockall(2)を 通 して) 現 在 ロックされている 場 合 、“L” がNUMAノードID 値の 右 側 に 表 示 されます。もしページが 現 在 複 製 されている 場 合 (「メモリ・シールドされたノード」を 参 照 してください)、“R” がNUMAノードID 値 の 右 側 に 表 示 されます。以 下 は、 各 ノードID 値 の 隣 のLが 示 すとおりmlockall(2)を 使 い 全 てのページがロックされたプロセスのnumapgs 出 力 のサンプルの 抜 粋 です。 複 製 されたページはそれらのノードID 値 の 隣 にRで表 されます。3a9b000000-3a9b12b000 r-xp /lib64/tls/libc-2.3.4.so3a9b000000: 0L 0L 0L 0L 0L 0L 0L 0L3a9b008000: 0L 0L 0L 0L 0L 0L 0L 0LR3a9b010000: 0L 0L 0L 0L 0L 0L 0L 0Lnumastatを を 利 用 したNUMA 成 功 / 失 敗 統 計 値 10numastatは 全 てのノードの/sys/devices/system/node/node#/numastatファイルから 情 報 を 結合 するスクリプトです。$ numastatnode 3 node 2 node 1 node 0numa_hit 43674 64884 79038 81643numa_miss 0 0 0 0numa_foreign 0 0 0 0interleave_hit 7840 5885 4975 7015local_node 37923 59861 75202 76404other_node 5751 5023 3836 5239numa_hitnuma_missnuma_foreigninterleave_hitlocal_nodeother_nodeこのノードで 行 われたメモリ 割 り 当 てが 成 功 した 数このノードで 行 うことが 出 来 ず、 代 わりに 他 のノードへ 割 り 当 てたメモリ 割 り 当 ての 数他 のノードでメモリ 割 り 当 てに 失 敗 し、 代 わりにこのノードから 割 り当 てられた 割 り 当 ての 数このノードで 行 われたインターリーブ・メモリ 割 り 当 てが 成 功 した 数ローカル・ノードから 行 われたメモリ 割 り 当 ての 数非 ローカル・ノードへ 行 ったメモリ 割 り 当 ての 数kdbサポートサポート10以 下 のkdbコマンドがNUMAをサポートするために 追 加 または 修 正 されました。この 追 加 のサポートはカーネルがNUMAサポート 有 効 として 構 成 された 時 にだけ 現 れることに 注 意 してください。memmap [node_id]taskシステムの 全 てのページ、または 指 定 したノードだけの 情 報 を 出 力 しますメモリ・ポリシーとタスク 構 造造 体 フィールドを 更 に 出 力 します10-13


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>mempolicy addrpgdat [node_id]vmp –v指 定 したメモリ・ポリシー 構 造造 体 の 情 報 を 出 力 します指 定 したノードのゾーンリスト、またはnode_idが 指 定 されない 場 合はゾーン0をデコードします仮 想 メモリ 領 域 のメモリ・ポリシー 情 報 を 更 に 出 力 しますカーネル・テキスト・ページの 複 製 10<strong>RedHawk</strong> <strong>Linux</strong>カーネルは、 各 NUMAノード 内 のカーネル・テキストおよび 読 み 取 り 専 用 データ・ページの 複 製 をサポートしています。この 複 製 は、カーネル 命 令 および 読 み 取 り 専 用 データがローカルから 各 ノードへアクセスすることによってシステム 全 体 のノード 間 のメモリ・トラフィックを 減 らすことに 役 立 ちます。プレビルト<strong>RedHawk</strong> <strong>Linux</strong>カーネルを 使 っている 場 合 、 常 駐 カーネル・テキストおよび 動 的 にロードされたカーネル・モジュール・テキストの 両 方 は 自 動 的 に 複 数 ノードのNUMAシステムに 複製 されます。このサポートを 制 御 する2つのカーネル 構 成 オプションが 存 在 します:カーネル・テキストの 複 製を 有 効 および 無 効 にするCONFIG_KTEXT_REPLICATION、およびカーネル 常 駐 テキスト 複 製 は有 効 にしたままの 状 態 でカーネル・モジュール・テキストの 複 製 を 無 効 にするだけに 使 用 することが 可 能 なCONFIG_KMOD_REPLICATION。ブート 時 にカーネル・テキスト 複 製 サポートを 無 効にするために2つのgrubオプションが 追 加 されました。 詳 細 についてはページ10-17の「 構 成 」を参 照 してください。ktrinfo(1)ユーティリティは、カーネル・テキストの 複 製 情 報 や 統 計 データを 表 示 するために 利 用可 能 です。オプションなしでktrinfoが 呼 び 出 された 場 合 、システム 内 の 全 てのNUMAノードの 複 製 情 報 を 表示 します。-nオプションは 単 一 ノードに 出 力 を 制 限 するために 使 用 することが 可 能 です。ノード1の 情 報 を 表 示 する 例 を 以 下 に 示 します:> ktrinfo -n1Node 1 Text Translationsvirtual_addressphysical_address sizeffffffff81000000-ffffffff811fffff 0000000236a00000-0000000236bfffff 2048 kBffffffff81200000-ffffffff813fffff 0000000236400000-00000002365fffff 2048 kBffffffff81400000-ffffffff81469fff 0000000236600000-0000000236669fff 424 kBNode 1 Read-only Data Translationsvirtual_addressphysical_address sizeffffffff81600000-ffffffff817fffff 0000000236000000-00000002361fffff 2048 kBffffffff81800000-ffffffff81852fff 0000000236200000-0000000236252fff 332 kBNode 1 statisticstotal_repli_pages 17676 kBrepli_resident_pages 6900 kBrepli_module_pages 10740 kBrepli_module_pgtbls36 kBpage_alloc_failures 0pagetbl_alloc_failures 0上 記 の 出 力 は、ノード1に 対 するカーネル・テキストとカーネル 読 み 取 り 専 用 データの 両 方 の 常 駐カーネル 仮 想 アドレスから 物 理 アドレスへの 変 換 に 続 いて、ノード1で 常 駐 およびモジュールの 複製 に 使 用 されているメモリの 量 を 示 してします。 最 後 の2つの 割 り 当 て 失 敗 ページ・カウンターは、カーネル・モジュールがロードされた 時 にページがノード1へ 正 常 に 割 り 当 てできなかった 場 合 にゼロ 以 外 の 値 となります。10-14


Non-Uniform Memory Access (NUMA)ktrinfo(1)ユーティリティは、-mオプションによりモジュール 単 位 で 各 ノードに 複 製 されたモジュール 空 間 の 量 を 表 示 するために 使 用 することも 可 能 です。-mオプション 出 力 の 一 部邪 を 以 下 に 示 します:> ktrinfo -mModule Text_RO_sz Node0 Node1 Node2 Node3sr_mod 16384 16384 16384 16384 -cdrom 28672 28672 28672 28672 -sd_mod 32768 32768 32768 - 32768crc_t10dif 8192 8192 8192 - 8192crc32c_intel 8192 8192 8192 8192 -aesni_intel 36864 36864 36864 36864 -cryptd 8192 8192 8192 8192 -aes_x86_64 12288 12288 12288 12288 -aes_generic 32768 32768 32768 32768 -ahci 20480 20480 20480 20480 -igb 102400 102400 102400 - 102400dca 8192 8192 8192 - 8192megaraid_sas 49152 49152 - 49152 49152button 8192 8192 8192 - 8192dm_mirror 16384 16384 - 16384 16384dm_region_hash 8192 8192 - 8192 8192dm_log 8192 8192 - 8192 8192dm_mod 49152 49152 49152 49152 -2 番 目 の 列 (Text_RO_sz)は、 各 モジュール 内 のテキストと 読 み 取 り 専 用 データの 合 計 サイズをKバイトで 記 述 しています。node# 行 は 現 在 ロードされた 各 モジュールの 各 ノードに 実 際 に 割 り 当てられたKバイト 量 を 示 します。ノードのKバイトのサイズがText_RO_szの 値 未 満 である 場 合 、これはモジュールがロードされた 時 のノードにおいてページが 正 常 に 割 り 当 てられなかったことを 示 します。長 音 記 号 "-"は、カーネル・モジュールがシステムのほかのノードに 複 製 される 前 に 初 めはそのノードに 動 的 にロードされたことを 示 すことに 注 意 して 下 さい。カーネル・モジュールモジュール・ページの割 り 当 て10カーネル・モジュールは 通 常 何 の 問 題 もなく 全 てのNUMAノードにロードされ 複 製 されます。しかし、ノード 内 のメモリの 空 き 容 量 が 小 さい 場 合 、 複 製 されるモジュール・テキストと 読 み 取 り専 用 データを 設 定 するためのそのノードへのページ 割 り 当 ては 失 敗 する 可 能 性 があります。これはシステム 起 動 中 に 発 生 する 可 能 性 がある 一 方 、システムが 起 動 し、 様 々なシステムのアクティビティが 既 にアクティブになった 後 にカーネル・モジュールがロードされ、 利 用 可 能 な 空 きメモリが 少 なくなった 後 に 発 生 する 可 能 性 がそれ 以 上 にあります。1つ 以 上 のページがページ 複 製 でノードに 割 り 当 てることが 出 来 ない 場 合 、モジュールが 最 初 にロードされたノード 上 のページは 小 さなメモリ・ノード 上 の 仮 想 アドレス 転 送 のために 使 用 されます。カーネル・モジュール・ページ 割 り 当 てに 失 敗 した 場 合 、メッセージがコンソール 及 び/var/log/messagesファイルに 出 力 されます。 例 :Kernel text replication: nvidia module page allocfailure(s) in node 1: no space上 述 のメッセージはノード1 上 のnvidia.koのカーネル・モジュール・テキストおよび 読 み 取 り 専用 データの 複 製 に 必 要 な 全 てのページが 利 用 可 能 なメモリの 不 足 により 遉 成 できなかったことを示 します。10-15


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>性 能 ガイドライン 10ノード1 上 でのカーネル・モジュール 複 製 中 に 失 敗 したページおよびページ・テーブル 割 り 当 ての数 を 以 下 のコマンドで 表 示 することが 可 能 です:# ktrinfo -n1 | grep failurespage_alloc_failures 68pagetbl_alloc_failures 4ノード1 上 に 複 製 された 空 間 の 実 際 の 総 量 に 対 するnvidia.koモジュールのテキストおよび 読 み 取り 専 用 データ(Text_RO_sz)の 合 計 は 以 下 のコマンドで 表 示 することが 可 能 ですが、 表 示 される値 はKバイトです:# ktrinfo -m | grep Module ; ktrinfo -m | grep nvidiaModule Text_RO_sz Node0 Node1nvidia 8581120 - 331776最 後 に 以 下 のコマンドは 各 NUMAノード 上 で 利 用 可 能 および 空 きメモリの 量 を 速 やかに 表 示 するために 使 用 することが 可 能 です:# run -McNode MemSize MemFree Cpulist0 4094 MB 3709 MB 0-31 4096 MB 55 MB 4-7アプリケーションを 特 定 NUMAノードへ 割 り 付 けおよびバインドするCPUシールディングを 通して、ページの 割 り 当 てをNUMAシステム 上 で 最 も 効 率 的 な 方 法 で 行 うことが 可 能 です。タスクや 共 有 メモリ 領 域 を 扱 うためのガイドラインを 以 下 に 示 します。タスク 全 体 のNUMA mempolicy 10MPOL_BINDポリシーはタイム・クリティカル・アプリケーションにとって 通 常 もっとも 有 用 なポリシーです。ページ 割 り 当 てのためにデターミニスティックにノードを 指 定 することを 許 可 する 唯 一 のポリシーです。もしメモリ 割 り 当 てが 指 定 するノードまたは 指 定 するノード 一 式 から 行えない 場 合 、プログラムはSIGKILLシグナルにより 終 了 します。MPOL_BINDメモリ・ポリシーでCPUシールドとCPU 割 り 付 けを 組 み 合 わせることにより、シールドCPUが 作 成 され、シールドCPUのNUMAノードからだけ 割 り 当 てられるアプリケーションのページのあるシールドCPU 上 でそのアプリケーションが 実 行 されます。 書 き 込 みデータ・ページ上 のコピーは 一 旦 書 き 込 まれるとローカルになりますが、 書 き 込 みデータ・ページ 上 の 既 存 の 共有 テキスト・ページのコピーはローカルではない 可 能 性 があることに 注 意 してください。run(1)コマンドはMPOL_BINDメモリ・ポリシーによりシールドされたCPU 上 でアプリケーションを 起 動 するために 使 用 することが 可 能 です。あるいは、アプリケーションのアドレス 空 間 内 に既 に 存 在 するページがNUMAメモリ・ポリシーのその 後 の 変 更 により 影 響 されないために、mpadvise(3)やset_mempolicy(2)またはNUMAライブラリ 機 能 の 呼 び 出 しで 実 行 を 開 始 した 後直 ぐにそのCPUアフィニティとNUMAメモリ・ポリシーをアプリケーションに 設 定 することが 可能 です。10-16


Non-Uniform Memory Access (NUMA)共 有 メモリ 領 域 10構 成 10以 下 の 例 は、run(1)コマンドのバイアスとメモリ・ポリシー・オプションを 使 い、CPU2にあるNUMAノードだけからメモリを 割 り 当 てるMPOL_BINDメモリ・ポリシーのシールドCPU 上 でアプリケーションを 起 動 する 方 法 を 示 します。$ shield -a 2$ run -b 2 -M b my-appシールドCPUおよびshield(1)コマンドに 関 する 詳 細 な 情 報 は、2 章 とshield(1)のmanページを 参 照してください。MPOL_BINDメモリ・ポリシーを 共 有 メモリ 領 域 のために 使 用 することも 通 常 は 推 奨 します。 共有 領 域 のNUMAメモリ・ポリシーはmbind(2)システム・サービスコールまたはshmconfig(1)ユーティリティにより 指 定 することが 可 能 です。もし 共 有 メモリ 領 域 が 複 数 のCPUから 参 照 されることになる 場 合 、メモリ・アクセス 性 能 を 最 大にするために 共 有 メモリ 領 域 の 異 なる 部邪 分 に 異 なるMPOL_BINDメモリ・ポリシー 属 性 を 指 定 することが 可 能 です。例 として、 主 に 共 有 メモリ 領 域 の 下 半 分 へ 書 き 込 む “low” アプリケーションと 主 に 共 有 メモリ 領域 の 上 半 分 へ 書 き 込 む “high” アプリケーションがあると 見 なします。1. ‘123’ の 値 をキーとする 共 有 メモリ 領 域 を 作 成 します。ページ 割 り 当 てのためにCPU2のNUMAノードでMPOL_BINDメモリ・ポリシーを 使 う 領 域 の 下 半 分 、ページ 割 り 当 てのためにCPU3のNUMAノードでMPOL_BINDを 使 う 上 半 分 を 変 更 します。$ shmconfig -s 0x2000 123$ shmconfig -s 0x1000 -M b=2 123$ shmconfig -o 0x1000 -M b=3 1232. CPU2とCPU3の 両 方 をシールドします。$ shield -a 1,23. メモリ 割 り 当 てのためにCPU2のNUMAノードを 使 うMPOL_BINDメモリ・ポリシーのCPU2上 で “low” アプリケーションを 実 行 開 始 、メモリ 割 り 当 てのためにCPU3のNUMAノードを使 うMPOL_BINDメモリ・ポリシーのCPU3 上 で “high” アプリケーションを 実 行 開 始 します。$ run -b 2 -M b low$ run -b 3 -M b highAMD Opteronと 最 新 のIntelプロセッサーだけはNUMAアーキテクチャを 持 っています。 以 下 のカーネル・パラメータはNUMAノード 上 の 処 理 に 影 響 を 及 ぼします。これら 全 てのパラメータは<strong>RedHawk</strong>プレビルト・カーネルでデフォルトで 有 効 になっています( 一 部邪 は32bitモードにのみ 適遚 用され、 一 部邪 は64bitモードにのみ 適遚 用 されます)。10-17


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>NUMAとACPI_NUMA ( 全 モード), X86_64_ACPI_NUMAとK8_NUMA (64-bitモードのみ)これらのカーネル・パラメータはNUMAカーネル・サポートのために有 効 である 必 要 があります。これらはカーネル 構 成 GUIの「ProcessorType and Features」 項 目 でアクセス 可 能 であり、 全 てのプレビルト<strong>RedHawk</strong>カーネルでデフォルトで 有 効 となっています。numa=off はブート 時 にNUMAシステム 上 でNUMAカーネル・サポートを 無 効 にするために 指 定 することが 可 能 なブート・オプションです。これはノードに 全 CPUが 属 する 単 一 ノードのシステムを 作 成 します。NUMAサポートが 組 み 込 まれていないカーネルとは 異 なり、この場 合 にはノードなしのフラット・メモリ・システムであり、NUMAユーザー・インターフェースが 呼 ばれた 時 エラーを 返 します。AMD Opteronまたは 最 新 のIntelシステム 上 でNUMAが 有 効 なカーネルを 使 用 する 時 、 以 下 のハードウェアを 推 奨 します:• システムの 各 CPUにメモリ・モジュールが 組 み 込 まれていることを 大 いに 推 奨 します。さもなければ、ローカル・メモリ・モージュールのないCPUはメモリ・アクセスの 度 に 他 のメモリ・モジュールへ 離 れてアクセスすることになり、 従 ってシステム 性 能 が 低下 します。• いくつかのBIOSがサポートするメモリ・モジュール・インターリーブ・ハードウェア・サポートはBIOSで 無 効 にする 必 要 があります。もし 無 効 ではない 場 合 、NUMAが 有 効 なカーネルのNUMAサポートは 無 効 となり、 結 果 、システムの 全 てのCPUを 含 む 単 一NUMAノードとなります。PAGE_REPLICATION有 効 にすると、ページキャッシュ 複 製 サポートはカーネルへ 纏 められます。PAGE_REPLICATION_DYNAMICの 設 定 次 第 で、ページキャッシュ 複 製 はシステム 起 動 時 からシステム 上 で 常 にアクティブとなる、または 手 動 で 起 動 するまで 非 アクティブとなります。PAGE_REPLICATION_DYNAMICPAGE_REPLICATIONと 一 緒 に 有 効 にすると、ページキャッシュ 複 製はシステム 起 動 時 はアクティブではありませんが、/proc/sys/vm/page_replication_enabledへ「1」を 書 き 込 むことにより、または1つ 以 上 のメモリ・シールドされたNUMAノードを 作 成するためにshield(1)を 使 うことにより、 手 動 で 起 動 することが 可 能 です。これを 無 効 にしPAGE_REPLICATIONを 有 効 にすると、ページキャッシュ 複 製 はシステム 起 動 時 からシステム 上 で 常 にアクティブとなります。MEMSHIELD_ZONE_NORMAL (32-bitモードのみ)32bitモードのNUMAカーネルで 有 効 にすると、 離 れたノードのHIGHMEM 領 域 ページを 遥 択 する 前 に(もしあれば)ローカル・ノードのノーマル 領 域 ページを 使 用 するように 領 域 リストを 設 定 します。ローカル・ノードのHIGHMEM 領 域 ページは 最 初 に 使 い 果 たされます。この 機 能 はgrubカーネル・ブート・オプション “prefer_highmem” により<strong>RedHawk</strong> 32bitモードのプレビルト・カーネルを 無 効 にすることが 可 能 です。10-18


Non-Uniform Memory Access (NUMA)MEMSHIELD_ZONELIST_ORDER有 効 にすると、NUMAノードの 領 域 リストはNUMAノードがメモリ・シールドされた 時 に 再 指 示 されます。これらの 領 域 リストはローカル・ノードのメモリ・リソースが 低 下 した 時 に 利 用 可 能 なメモリのノード 検 索 順 序 を 制 御 します。 領 域 リストは、ローカル・ノードがメモリ 割 り 当 て 要 求 に 満 足 できない 時 、シールドされたノードのメモリの使 用 に 頼 る 前 に 他 の 非 シールド・ノードからのメモリを 使 用 するように 再 指 示 されます。システムにシールドされたメモリもない 場 合 、オリジナルの 領 域 リストの 支 持 は 自 動 的 に 元 に 戻 されます。CONFIG_KTEXT_REPLICATION (64bitモードのみ)64bit NUMAカーネルが 有 効 である 場 合 、カーネル 常 駐 部邪 分 のカーネル・テキストおよび 読 み 取 り 専 用 データ・ページの 複 製 は 有 効 です。このパラメータは 全 ての<strong>RedHawk</strong> <strong>Linux</strong>プレビルト64bitカーネルで有 効 です。このパラメータが 有 効 である 場 合 、grubオプション"no_ktext_repli"をブート 時 にこのサポートを 無 効 にするために 使 用 することが 可 能 です。CONFIG_KMOD_REPLICATION (64bitモードのみ)CONFIG_KTEXT_REPLICATIONが 有 効 である 場 合 、このパラメータは 更 にモジュールのロード 時 にカーネル・モジュール・テキストおよび 読 み 取 り 専 用 データの 複 製 を 有 効 にすることが 可 能 です。このパラメータは 全 ての<strong>RedHawk</strong> <strong>Linux</strong>プレビルト64bitカーネルで 有 効 です。このパラメータが 有 効 である 場 合 、grubオプション"no_kmod_repli"をブート 時 にモジュール 複 製 サポートを 無 効 にするために 使 用 することが 可 能 です。10-19


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>10-20


811Chapter 11カーネルの 構 成 および 構 築611序 文 11本 章 では<strong>RedHawk</strong> <strong>Linux</strong>カーネルの 構 成 および 構 築 方 法 に 関 する 情 報 を 説 明 します。<strong>RedHawk</strong>カーネルは/bootディレクトリ 内 に 置 かれています。 実 際 のカーネル・ファイル 名 称 はリリースからリリースへ 変 更 されますが、 通 常 は 以 下 の 形 式 となります:vmlinuz-kernel<strong>version</strong>-<strong>RedHawk</strong>-x.x[-flavor]kernel<strong>version</strong>x.xflavor<strong>RedHawk</strong>カーネルのベースとなる(-rclまたは-pre7のような 接 尾 語 を含 む 可 能 性 のある)<strong>Linux</strong>カーネル・ソース・コードの 公 式 なバージョンです。<strong>RedHawk</strong>リリースのバージョン・ 番 号 です。特 有 のカーネルにより 提 供 される 追 加 のカーネル 機 能 を 特 定 するオプションのキーワードです。システムがブートするたびにカーネルはメモリへロードされます。それはシステムの 基 本 的 な 機能 を 実 行 する 最 も 重 要 なコードの 核 です。システムが 動 作 している 間 中 、カーネルは 物 理 メモリ内 に 留 まります(ほとんどのユーザー・プログラムのようにスワップされません)。カーネルの 正 確 な 構 成 は 以 下 次 第 です:• システム 実 行 時 の 動 作 を 定 義 する 多 数 のチューニング・パラメータ• オプションのデバイス・ドライバとローダブル・モジュールの 数カーネル 構 成 または 再 構 成 は、1つ 以 上 のカーネル 変 数 を 再 定 義 し、 新 しい 定 義 に 従 い 新 しいカーネルを 作 成 する 処 理 となります。一 般 的 には、 供 給 されるカーネルは 殆 どのシステムに 適遚 合 するチューニング・パラメータやデバイス・ドライバにより 作 成 されています。しかし、 特 定 のニーズに 対 しカーネル 性 能 を 最 適遚 化 するためにチューニング・パラメータのいずれかを 変 更 したい 場 合 、カーネルの 再 構 成 を 遥 択 することが 可 能 です。チューニング・パラメータの 変 更 またはハードウェア 構 成 を 変 更 した 後 は、カーネルの 再 構 築 、インストール、 再 起 動 が 必 要 となります。11-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>ccur-configを を 利 用 したカーネルの 構 成 11<strong>RedHawk</strong> <strong>Linux</strong> 製 品 にはいくつかのプレビルト・カーネルが 含 まれています。カーネルは“-flavor”接 尾 語 により 互 いに 区 別 されます。 以 下 のフレバーが 定 義 されています:generic (no suffix)tracedebugジェネリック・カーネル(4GB 以 下 )。このカーネルは 最 も 最 適遚 化 され、最 高 の 総 合 的 な 性 能 を 提 供 しますが、NightStar RTツールを 十 分 に 活用 するために 必 要 な 特 定 の 機 能 が 不 足 しています。トレース・カーネル。このカーネルはジェネリック・カーネルの 全 機能 をサポートし、 更 にNightStar RT 性 能 分 析 ツールのカーネル・トレース 機 能 のサポートを 提 供 するため 殆 どのユーザーに 推 奨 します。デバッグ・カーネル。このカーネルはトレース・カーネルの 全 ての 機能 をサポートし、 更 にカーネル・レベル・デバッグのサポートを 提 供します。このカーネルはドライバを 開 発 する、またはシステムの 問 題をデバッグしようとするユーザーに 推 奨 します。各 プレビルト・カーネルは、 対 応 するカーネル 構 成 の 詳 細 全 てを 保 存 する 構 成 ファイルを 持 っています。これらのファイルはカーネル・ソース・ツリーのconfigsディレクトリの 中 に 置 かれています。プレビルト・カーネルのための 構 成 ファイルは 以 下 のように 指 定 されています:i386アーキテクチャ 上 (32-bit):ジェネリック・カーネルトレース・カーネルデバッグ・カーネルstatic.configtrace-static.configdebug-static.configx86_64アーキテクチャ 上 (64-bit):ジェネリック・カーネルトレース・カーネルデバッグ・カーネルstatic-x86_64.configtrace-static-x86_64.configdebug-static-x86_64.configプレビルト・カーネルの1つと 一 致 するカーネルを 構 成 および 構 築 するため、カーネル・ソース・ツリーの 最 上 層 へcdを 行 い、ccur-config(8)ツールを 実 行 する 必 要 があります。NOTEccur-configスクリプトはルートで 実 行 する 必 要 があります。もしカーネル 変 更 が 行 われる 場 合 、システムはグラフィック・モード(ランレベル5)である、または 有 効 なDISPLAY 変 数 が 設 定 されている 必 要 があります。以 下 の 例 では、<strong>RedHawk</strong> <strong>Linux</strong> 5.2トレース・カーネルの 構 成 をベースとする 新 しいカーネルを 構築 するためにカーネル・ソース・ツリーを 構 成 します。 構 成 ファイルの“.config” 接 尾 語 は 自 動 的に 添 えられますので、 指 定 する 必 要 がないことに 注 意 してください。# cd /usr/src/linux-2.6.26.6-<strong>RedHawk</strong>5.2# ./ccur-config trace-static11-2


カーネルの 構 成 および 構 築ccur-configは、configsディレクトリ 内 にある 適遚 切 なカスタム 構 成 ファイルを 指 定 することによりカスタマイズされたカーネルに 使 用 することも 可 能 です。-k name オプションは 新 しいフレバーの 名 前 を 付 けるため、-sオプションはconfigsディレクトリ 内 に 構 成 ファイルを 保 存 するために使 用 することが 可 能 です。 使 用 例 :# ./ccur-config -s -k test debug-staticは、<strong>RedHawk</strong> i386 debug-staticカーネルがベースとなる-testフレバー 接 尾 語 のカーネルを 構 成 し、その 結 果 の 構 成 をconfigs/test.configとして 保 存 します。ccur-configの 実 行 中 、<strong>RedHawk</strong> <strong>Linux</strong>カーネルの 多 くの 異 なる 機 能 がカスタマイズ 可 能 なグラフィカル 構 成 インターフェース(GUI)で 表 示 されます。カーネル 構 成 GUIの 例 については 画 面 11-1を参 照 してください。「File」メニューから「Save」の 遥 択 は、 変 更 を 保 存 しプログラムを 終 了 するために 遥 択 する 必要 があります。たとえ 構 成 パラメータを 変 更 していなくても、カーネル 構 成 ファイルを 適遚 切 に 更新 するために「Save」をやはり 遥 択 する 必 要 があることに 注 意 してください。グラフィカル 構 成 ウィンドウを 経 て 利 用 可 能 な 設 定 と 構 成 オプションの 完 全 なリストはこの 文 書の 範 疇 を 超 えていますが、ユニークな<strong>RedHawk</strong>の 機 能 とリアルタイム 性 能 に 関 連連 する 多 くのチューニング・パラメータは 本 マニュアルの 至 る 所 で 明 文 化 され、また、 付 録 Bに 一 覧 表 となっています。 更 に、パラメータが 遥 択 された 時 、そのパラメータに 関 する 情 報 はGUIの 別 ウィンドウ 内に 表 示 されます。もしカーネル・パラメータを 変 更 したくない 場 合 、-nオプションをccur-configに 指 定 することでGUIは 表 示 されません。画 面 11-1 カーネル 構 成 GUIRCIM Realtime Clock and Interrupt Module (RCIM)11-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>カーネルの 構 築 11どのカーネル 構 成 が 使 用 されているかに 関 わらず、トップレベルのMakefile 内 に 定 義 される 時 、カーネルは 接 頭 語 “vmlinuz” の 後 に 現 在 のカーネルのバージョンの 文 字 列 、 引 き 続 き 接 尾 語“-custom” が 加 えられた 名 前 が 付 けられます。 例 :vmlinuz-2.6.25.6-<strong>RedHawk</strong>-5.2-custom最 終 的 な 接 尾 語 は-k name オプションをccur-configへ 指 定 することにより 変 更 することが 可 能です。これはトップレベルのMakefile 内 でREDHAWKFLAVOR 変 数 としてname を 定 義 し、 再 び-kオプションまたはMakefileの 編 集 により 変 更 されるまで 有 効 のままとなります。 同 じカーネル・ソース・ツリーから 複 数 のカーネルを 構 築 する 時 、 既 存 のカーネルを 誤 って 上 書 きすることを 回 避遪 するために 接 尾 語 を 変 更 することが 重 要 となります。NOTESConcurrentより 提 供 されるプレビルト・カーネルは、Concurrentが 使 用 するために 予 約 されている 接 尾 語 を 持 っています。 従 って、 次 の 接 尾 語 を設 定 してはいけません:( 文 字 列 なし)、“-trace”、 “-debug”カーネル 用 のドライバ・モジュールを 構 築 する 必 要 がある 場 合 は、ccur-config -cオプションを 使 用 してください。( 本 章 で 後 述 する「ドライバ・モジュールの 構 築 」セクションを 参 照 してください)一 旦 カーネル 構 成 が 完 了 すると、カーネルは 適遚 切 なmake(1)コマンドの 発 行 により 構 築 することが 可 能 となります。トップレベルのMakefileにはいくつものターゲットが 存 在 しますが、 以 下 は特 に 重 要 です:make bzImagemake modulesmake modules_installmake installスタンドアロン・カーネルを 構 築 します。カーネル 構 成 内 で 指 定 されたカーネル・モジュールを 構 築 します。現 在 構 成 されたカーネルに 関 連連 するモジュールのディレクトリへモジュールをインストールします。このディレクトリの 名 称 は、トップレベルのMakefileで 定 義 されるカーネルのバージョンの 文 字 列 から生 成 されます。 例 えば、REDHAWKFLAVORが “-custom” として 定義 される 場 合 、 結 果 として 生 じるモジュールのディレクトリは“/lib/modules/kernel<strong>version</strong>-<strong>RedHawk</strong>-x.x-custom” となります。/bootディレクトリに 関 連連 するSystem.mapファイルと 一 緒 にカーネルをインストールします。NOTE新 しいカーネルを 完 全 に 構 築 しインストールするためには、Makefileのターゲットの 全 てを 上 記 の 順 序 で 発 行 される 必 要 があります。カーネルの 構 成 および 構 築 セッションの 実 例 については、 図 11-1を 参 照 してください。11-4


カーネルの 構 成 および 構 築図 11-1 カーネルの 構 成 および 構 築 セッションの 実 例# cd /usr/src/linux-2.6.26.6-<strong>RedHawk</strong>-5.2# ./ccur-config -k test debug-staticConfiguring <strong>version</strong>: 2.6.26.6-<strong>RedHawk</strong>-5.2-testCleaning source tree...Starting graphical configuration tool...[ 要 望 に 応 じてカーネルパラメータを 設 定 ]Configuration complete.# make bzImage# make modules# make modules_install# make install[ 新 しいカーネルを 参 照 するように/etc/grub.confを 編 集 し、 再 起 動 ]ドライバ・モジュールの 構 築 11既 存 のConcurrent 提 供 のカーネルもしくはカスタム・カーネルのいずれかを 使 用 するためにしばしばドライバ・モジュールを 構 築 することが 必 要 となります。カーネル 用 にドライバ・モジュールを 構 築 するため、 以 下 の 条 件 を 満 足 する 必 要 があります:• 要 求 するカーネルは 現 在 実 行 中 のカーネルである 必 要 があります。• カーネル・ソースのディレクトリは、ccur-configを 通 して 現 在 実 行 中 のカーネル 用 に 適遚 切 に構 成 されている 必 要 があります。もしカスタム・カーネルが「カーネルの 構 築 」セクション 内 で 解 説 された 手 順 を 使 用 して 構 築 された 場 合 、カーネル・ソース・ディレクトリが 既 に 適遚 切 に 構 成 されccur_configを 実 行 している必 要 がないことに 注 意 してください。ccur_configへの-cオプションは、カーネル・ソースのディレクトリが 適遚 切 に 構 成 されていることを 保 証 するために 使 用 することが 可 能 です。このオプションは 実 行 中 のカーネルを 自 動 的 に 検知 し、 実 行 中 のカーネルに 一 致 するソース・ツリーを 構 成 します。ドライバ・モジュールは 実 行中 のカーネルでその 後 に 使 用 するために 適遚 切 にコンパイルすることが 可 能 です。NOTEccur_configへの-cオプションは、ドライバ・モジュールを 構 築 するためにカーネル・ソース・ツリーを 構 成 することだけを 目 的 とし、 新 しいカーネルを 構 築 する 時 に 使 用 すべきではありません。ccur_configへの-nオプションは、 構 成 パラメータを 変 更 する 必 要 のない 時 に 指 定 することも 可能 です。-n 付 きで 構 成 GUIは 表 示 されず、 構 成 のカスタマイズは 実 行 されません。プレビルト<strong>RedHawk</strong>カーネルへの 動 的 なロード・モジュールを 構 築 する 例 については、 次 のセクションを 参 照 してください。11-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>プレビルト<strong>RedHawk</strong>カーネルで 動 的 にロード 可 能 なモジュールの 構 築 例<strong>RedHawk</strong>システムへの 機 能 追 加 は、システムに 追 加 のハードウェア・コントローラを 設 置 することで 遉 成 されます。 静 的 カーネル・ドライバの 要 求 がない 限 り、 新 しいハードウェア・デバイス用 にサポートを 追 加 するためにカスタム・カーネルを 作 る 必 要 はありません。以 下 の 例 では、<strong>RedHawk</strong>システムへComtrol RocketPortのシリアル・カード・サポートを 追 加 します。Comtrol RocketPortドライバのソースは<strong>RedHawk</strong>カーネル・ソース・ツリーに 含 まれています。<strong>RedHawk</strong> traceカーネルがこの 例 で 実 行 中 のカーネルとなります。1. カーネル・ソース・ツリーを 構 成 するためにccur-configを 実 行 します。kernelname は 実 行中 カーネルの ‘uname -r’ による 出 力 であることに 注 意 してください:# cd /lib/modules/kernelname/build# ./ccur-config -c2. GUIウィンドウ 内 で、「Device Drivers ->Character Devices->Non-standard serial portsupport->Comtrol RocketPort support」の 値 を “M” (モジュール)に 設 定 します。 GUIの 図 例 については 画 面 11-2を 参 照 してください。(Show Name, Show Range, Show Dataオプションを 遥択 して 表 示 しています)3. 構 成 を 保 存 し、GUIを 終 了 します。画 面 11-2 カーネル 構 成 GUIでシリアル・カード・サポートの 追 加11-6


カーネルの 構 成 および 構 築4. 新 しいカーネル・モジュールを 構 築 するためにmakeを 実 行 します:# make REDHAWKFLAVOR=-trace modules5. makeが 終 了 すると 出 力 にRocketPortドライバが 見 つかります。 出 力 例 :LD [M] drivers/char/rocket.koそして 以 下 のようにコピーします:# mkdir /lib/modules/kernelname/kernel/extras# cp drivers/char/rocket.ko /lib/modules/kernelname/kernel/extras/6. モジュールをロードするため、modprobe(8)を 使 って 依 存 ファイルを 設 定 します。# depmod7. /lib/modules/kernelname/build/Documentation/rocket.txtファイルにはComtrol RocketPortカードに 関 する 構 成 要 件 が 含 まれています。デバイス・エントリが 作 成 され、 適遚 切 なコマンド(MAKEDEV(8)およびmodprobe(8))でカーネル 初 期 化 時 に 実 行 される/etc/rc.modulesファイルへ 挿 入 することによってドライバは 自 動 的 にロードされます。a. /etc/modprobe.confへ 以 下 のエイリアスを 挿 入 します:alias char-major-46 rocketb. もし/etc/rc.modulesファイルがシステム 上 に 存 在 しない 場 合 は 作 成 する 必 要 があります。それは 機 能 させるために0x755のファイル・パーミッションを 持 つ 必 要 があります。そのファイルには 以 下 を 含 めてください:#!/bin/bash/sbin/MAKEDEV ttyRmodprobe rocketカーネル・ソース・ツリー 内 に 存 在 しないドライバを 追 加 する 例 については、<strong>RedHawk</strong>システム上 の/usr/share/doc/ccur/examples/driverを 参 照 してください。追 加 情 報 11<strong>Linux</strong>カーネルの 構 成 と 構 築 の 理 解 および 謎 解 きに 役 立 つ 情 報 を 提 供 することが 利 用 できるリソースが 多 く 存 在 します。 有 効 な 最 初 の 方 法 はインストールされた<strong>RedHawk</strong>カーネル・ソース・ツリーのトップレベルにあるREADMEファイルを 読 むことです。 更 にThe <strong>Linux</strong> DocumentationProject and <strong>Linux</strong>topiaを 含 むいくつかの<strong>Linux</strong> 資 料 サイトでオンライン・ガイドが 利 用 可 能 です。例 :<strong>Linux</strong> Kernel in a Nutshellhttp://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/index.html11-7


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>11-8


12Chapter 12カーネル・デバッギング本 章 は<strong>RedHawk</strong> <strong>Linux</strong>が 提 供 するカーネル・デバッギングやクラッシュ・ダンプ 解 析 のためのツールについて 説 明 します。概 要 12Concurrentの 機 能 強 化 を 含 む 様 々なオープン・ソースのパッチは、カーネルの 問 題 解 析 のために<strong>RedHawk</strong>に 組 み 込 まれています。強 化 されたカーネル・デバッガkdbは<strong>RedHawk</strong> “debug” カーネルで 提 供 されます。クラッシュ・ダンプを 読 み 取 るためのcrash(8)ユーティリティと 一 緒 に 強 化 された<strong>Linux</strong>カーネルのkexecをベースとするクラッシュ・ダンプ(kdump)メカニズムは、システム・クラッシュを 取り 込 んで 解 析 するために 使 用 されます。crashは 実 メモリを 解 析 することも 可 能 です。KLCDおよびlcrashの 機 能 はもはやサポートされていないことに 注 意 してください。以 降 のセクションでクラッシュ・ダンプと<strong>RedHawk</strong>システムの 解 析 について 説 明 します。システム・クラッシュの 取 得 および 解 析 12kdumpの の 起 動 12<strong>RedHawk</strong>にはkdump(8)、クラッシュ・ダンプを 取 り 込 むために 使 用 するkexecベースのクラッシュ・ダンプ・サービス、ダンプを 解 析 するために 使 用 可 能 なcrash(8)ユーティリティが 含 まれます。これらは 以 降 のセクションで 説 明 されています。/etc/sysconfig/kdump 構 成 ファイルには、どのようにkdumpを 開 始 し 操 作 するかを 制 御 する 定義 が 含 まれます。kdumpは/etc/sysconfig/kdumpの 中 で「ACTIVE=1」の 設 定 を 通 してアクティブとなります。これはデフォルトの 設 定 となります。ファイルの 変 更 またはservice kdump onコマンドの 発 行 でそのファイルに「ACTIVE=1」を 設 定 します。 反 対 に、kdumpはファイルを 編 集 し「ACTIVE=0」と 設 定 することにより、またはservice kdump offを 実 行 することにより 非 アクティブとすることが 可 能 です。デフォルトでは、kdumpサービスはrc.sysinitから 開 始 します。これはkexecベースのクラッシュ・ダンプがシングル・ユーザ・モードでサポートされ、 更 に 出 来 るだけ 早 く 準 備 を 確 実 にすることが 可 能 な 唯 一 の 方 法 です。12-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>LATE 起 動 オプションは、kdumpが 必 要 とするファイル・システム/パスが、 他 のサービスが 開 始した 後 もマウントされないクラスターのようなディスクレス 環 境 のために 設 定 することが 可 能 です。/etc/sysconfig/kdumpの 使 用 方 法 に 関 する 更 に 詳 細 な 情 報 については、「 構 成 ファイルで 定 義 されるkdumpオプション」セクションを 参 照 してください。クラッシュ・ダンプの 作 成 方 法 12kdumpはカーネル・パニックの 事 象 を 解 析 するためにクラッシュ・ファイル 一 式 を 保 存 するために 実 行 中 カーネルの 環 境 を 用 意 します。crashユーティリティはクラッシュ・ダンプの 仮 想 メモリ・イメージ “vmcore” ファイルを 読 み 取 るためにデバッグ 情 報 が 必 要 となります。デバッグ 情報 は、 実 行 中 のDEBUG_INFOオプションで 構 築 されたカーネルのvmlinuxイメージに 含 まれています。vmlinuxイメージは「namelist」と 呼 ばれます。もし「crashkernel=size@16M」ブート・パラメータが 指 定 され/etc/sysconfig/kdump 構 成 ファイルにACTIVE=1が 定 義 されている 場 合 、kdumpサービスは/kdump/kerninfoディレクトリのカーネル/proc/config.gzファイルと 一 緒 に 一 致 するカーネルに 関 連連 するvmlinuxイメージ(namelist)を 先 行 保 存 します。その 後 、「kexec –p」を 使 ってクラッシュ・カーネルを 先 行 ロードします。(kexec(8)を 参 照 してください)kdumpサービスは、「kexec –p」コマンドで 提 供 される/etc/sysconfig/kdumpに 設 定 された 値をベースにして 文 字 列 を 構 成 します。 既 定 の 文 字 列 はインストールされた<strong>RedHawk</strong>クラッシュ・カーネルを 指 定 し、 現 在 のルート・ファイル・システムとコンソール・デバイスを 使 用 するようにクラッシュ・カーネルに 命 令 して、「maxcpus=1 irqpoll 1」ブート・パラメータを 渡 します。もしcrashkernelブート・パラメータが 供 給 されない 場 合 、kdumpサービスは 全 ての 設 定をスキップします。「service kdump echo」コマンドは「kexec –p」コマンドの 予 行 演 習を 見 るために 使 用 することが 可 能 です。クラッシュ・カーネルを 正 常 にロードした 後 、システム・クラッシュが 引 き 起 こされる 場 合 、システムはクラッシュ・カーネルを 再 起 動 します。トリガー・ポイントはpanic()に 設 定 されています。以 下 の 状 況 は、クラッシュ・トリガー・ポイントを 実 行 します:• カーネル・パニックが 発 生• /proc/sys/kernel/panic_on_oopsが 設 定 され、oopsが 発 生• /proc/sys/vm/panic_on_oomが 設 定 されメモリ 不 足 状 況 が 発 生• /proc/sys/kernel/unknown_nmi_panicが 設 定 され、 不 明 のNMIが 発 生• /proc/sys/kernel/unknown_nmi_panicが 設 定 され、NMIボタンが 押 された( 詳 細 な 情 報 は「NMIボタン」セクションを 参 照 してください)• /proc/sys/kernel/sysrqが 設 定 され、キーボードから「Alt-Sysrq-c」を 押 下• /proc/sys/kernel/sysrqが 設 定 され、echo c > /proc/sysrqtriggerを 実 行• kdumpコマンドをkdbプロンプトから 発 行12-2


カーネル・デバッギングインストール/ 構 成 の 詳 細 12ccur-kexec-tools-kexec-<strong>version</strong>-kdump RPMは2つのバイナリ 実 行 ファイル(/sbin/kexecと/sbin/kdump)と 同 時 に/etc/init.d/kdumpサービスとその 構 成 ファイル/etc/sysconfig/kdumpもインストールします。kexec(8)とkdump(8)のmanページもこのRPMでインストールされます。以 下 はシステムがクラッシュ・ダンプの 取 り 込 みと 解 析 を 可 能 にするための 要 件 です。カーネル構 成 パラメータは、 全 てのプレビルト<strong>RedHawk</strong>カーネルにデフォルトで 含 まれています。• 実 行 中 のカーネル(デバッグ 対 象 のカーネル)は、カーネル 構 成 GUIの「Processor Type andFeatures」 項 目 にてKEXECとDEBUG_INFOのカーネル・パラメータを「Y」に 設 定 して 構 築されている 必 要 があります。• クラッシュ・カーネルは、カーネル 構 成 GUIの「Processor Type and Features」 項 目 にてKEXECとCRASH_DUMPのカーネルパラメータを「Y」に 設 定 して 構 築 されている 必 要 があります。• カーネルは「crashkernel=size@16M」ブート・オプションにて 起 動 されている 必 要 があります。これはメモリ 予 約 とクラッシュ・カーネルがカーネル・パニックの 状 態 で 起 動 されるオフセットを 指 定 します。• /etc/sysconfig/kdumpを 通 して、オプションはkdumpサービスの 動 作 を 定 義 します。 詳 細については 後 述 の「 構 成 ファイルで 定 義 されるkdumpオプション」セクションを 参 照 してください。プレビルト<strong>RedHawk</strong> 4.2 以 降 のカーネル 構 成 ファイルをベースにしてccur-config(8)とmakeinstallを 利 用 したカスタム・カーネルは、kdumpとcrashを 使 用 するための 全 ての 要 件 を 満 たします。もし 別 のカスタム・カーネルを 使 用 している 場 合 、 上 記 の 全 ての 要 件 を 満 たしていることを 確 認 してください。カスタム・カーネルの 構 築 に 関 する 詳 細 な 情 報 は11 章 の「カーネルの 構 成および 構 築 」を 参 照 してください。構 成 ファイルで 定 義 されるkdumpオプション12kdumpサービスによる 動 作 は、kdumpの 構 成 ファイル/etc/sysconfig/kdumpに 設 定 されたオプションにより 左 右 されます。このファイルはオプションと 推 奨 設 定 値 を 記 載 している 情 報 については 完 全 にコメントアウトされています。現 在 の 設 定 は、kdumpにconfig 引 数 を 使 用 することで 見 ることが 可 能 となります。( 後 述 する「kdumpコマンド・ライン・インターフェース」セクションを 参 照 してください)デフォルトでは、kdumpはアクティブではありません。kdumpをアクティブにするため、 構 成ファイルに「ACTIVE=1」を 設 定 、または「service kdump on」コマンドを 発 行 して 構 成 ファイルに「ACTIVE=1」を 設 定 します。kdumpがアクティブであることで、デフォルトで 以 下 が 発 生 します:• rc.sysinitからkdumpサービスが 開 始 します。LATE 起 動 オプションはkdumpが 必 要 とするファイル・システム/パスが、 他 のサービスが 開始 した 後 もマウントされないクラスターのようなディスクレス 環 境 のために 設 定 することが可 能 です。「LATE=1」を 設 定 すると、kdumpサービスは「chkconfig: 12345 26 95」のように 定 義 されデフォルトで 開 始 します。これは、サービスはランレベル1, 2, 3, 4, 5でアクティブとなり、 優 先 度 26で 開 始 、 優 先 度 95で 終 了 となることを 意 味 します。12-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>これらの 値 を 変 更 するためにkdump 構 成 ファイルでLEVELS, START, STOPオプションを 使用 してください。 通 常 のinitスクリプトのようにkdumpサービスのinitスクリプトを 直 接 編 集しないでください。 現 在 のkdumpスタートアップ 構 成 を 見 るために「kdump status」コマンドを 使 用 してください。( 後 述 の「kdumpコマンド・ライン・インターフェース」セクションを 参 照 してください)• namelistの 設 定 が 実 行 されクラッシュ・カーネルは 先 行 ロードされます。もし「crashkernel=size@16M」がブート 時 に 指 定 されていない 場 合 、 動 作 は 実 行 されません。• デフォルトでは、ダンプはカーネル・パニック、oopsに 関 するダンプ(PANIC_ON_OOPS=1)、メモリ 不 足 (PANIC_ON_OOM=1)で 取 り 込 まれます。オプションで 不 明 NMIに 関 するダンプ(UNKNOWN_NMI_PANIC)を 強 制 的 に 設 定 することも 可 能 です。 必 要 に 応 じて、ダンプをカーネル・パニックに 関 してのみ 取 り 込 むためにこれらのオプションを 設 定 解 除 することが 可能 です。• kexecは 現 在 のルート・ファイル・システムおよびコンソール・デバイスを 使 ってクラッシュ・カーネルをランレベル1で 開 始 するために 使 用 されます。• クラッシュ・ファイルはgzip 圧 縮 を 利 用 してディスクへ 保 存 されます。• クラッシュ・ファイルが 保 存 された 後 、 即 座 に 再 起 動 が 実 行 されます。オプションで、 保 存された 後 にカーネルは 実 行 し 続 け 再 起 動 しないように 設 定 することも 可 能 です。これらや 他 の 動 作 は/etc/sysconfig/kdumpを 編 集 することによりカスタマイズすることが 可 能です。 追 加 のオプションは 次 のとおりです:• 必 要 に 応 じてカスタム・クラッシュ・カーネルとカスタムinitrdを 指 定 します。• 異 なるルート・ファイル・システム、kerninfoディレクトリ、コンソール、 保 存 ディレクトリ、圧 縮 、またはランレベルを 指 定 します。• クラッシュ・ファイルを 保 存 しない、scpを 通 して 保 存 、または 適遚 切 な 設 定 全 てをNFSを 通して 保 存 します。• パニック 動 作 の 後 をカスタマイズするためにスクリプトを 提 供 します。/etc/sysconfig/kdumpへの 修 正 を 行 った 後 、 以 下 を 実 行 します:# service kdump restartkdumpコマンド・ライン・インターフェース12kdumpサービスの 開 始 、 停 止 、 再 開 、 再 ロードに 加 えて、 他 のkdumpコマンドはシステムへの問 合 せやデバッギング 構 成 の 問 題 を 容 易 にします。kdumpサービスは 以 下 の 様 式 で 引 数 を 受 け 取 ります:# service kdump argarg 引 数 には 次 が 含 まれます::helpstartstop引 数 の 簡 単 な 解 説 を 表 示適遚 切 に 構 成 されている 場 合 はクラッシュ・カーネルを 再 ロード、さもなければクラッシュ・カーネルが 実 行 中 の 場 合 に 設 定 されたクラッシュ・カーネル・ルーチンを 実 行クラッシュ・カーネルの 除 去 およびアンロード12-4


カーネル・デバッギングrestart orreloadconfigonoffechostatstatusstopを 呼 び 出 した 後 start初 期 化 の 後 、/etc/sysconfig/kdumpに 設 定 されている 現 在 有 効 な 構 成 値 を 表 示start/stop/restart/reloadの 動 作 が 有 効start/stop/restart/reloadの 動 作 が 無 効クラッシュ・カーネルのkexec 文 字 列 “dry run” を 表 示カーネルの 状 態 (kdumpのstart/stop/restart/reload 動 作 、アーキテクチャ、カーネル 名 称 、 稼 働 時 間 、 現 在 のランレベル、システムRAM、/proc/cmdline 構 文 解析 、kexec 構 築 オプション、kexecクラッシュ・カーネルのシステム 状 況 、NMIボタン・ダンプ 応 答 とアクティブSysRq、パニック・トリガ)を 表 示ブート 中 のkdumpのON/OFF 状 況 とkdumpが 開 始 したことを 表 示例 :With ACTIVE=1 and LATE=0 (starts from rc.sysinit):# service kdump statuskdump rc:on 0:off 1:off 2:off 3:off4:off 5:off 6:off 26 95With ACTIVE=1 and LATE=1 (starts as a normal service):# service kdump statuskdump rc:off 0:off 1:on 2:on 3:on4:on 5:on 6:off 26 95filessetupステータス 行 の 最 後 の2つの 数 字 は、chkconfig(8)で 使 用 される 開 始 と 停 止 の 優先 度 を 示 すことに 注 意 してください。この 開 始 優 先 度 は“26”、 停 止 優 先 度 は“95”となります。クラッシュ・ファイルの 保 存 ディレクトリの 場 所 、ファイル・システム、 合 計サイズ、 個 々のダンプのサイズ、ローカル・ファイル・システム 使 用 状 況 の 統計 値 を 表 示パスワードなしscp 保 存 オプションのscpサーバーを 設 定crashを を 利 用 したダンプの 解 析 12ダンプ・ファイルの 解 析 12crashはダンプ・ファイル 上 または 動 作 中 のシステム 上 で 実 行 することが 可 能 です。crashコマンドは、 特 定 のカーネル・サブシステムに 及 ぶ 調 査 を 行 う 様 々なコマンドと 一 緒 に 全 プロセス、ソース・コード 逆 アセンブル、フォーマット 済 みカーネル 構 造造 と 変 数 の 表 示 、 仮 想 メモリ・データ、リンク 先 リストのダンプ 等 のカーネル・スタック・バック・トレースのような 共 通 カーネル・コア 分 析 ツールで 構 成 されます。 関 連連 するgdbコマンドは 入 力 することも 可 能 ですが、 実 行 するためにgdbモジュールへは 順 番 に 渡 されます。ダンプ・ファイル 上 でcrashを 実 行 するため、 少 なくても2つの 引 数 が 必 要 となります:• カーネルnamelist と 呼 ばれるカーネル・オブジェクト・ファイル 名 称 。このファイルはvmlinuxを 指 定 し、/kdump/date-timeへコピーします。12-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>• ダンプファイルはvmcoreを 指 名 します。カーネル・パニックの 場 合 、 以 下 で 示 すようにcrashを 呼 び 出 します。 引 数 は 任 意 の 順 序 で 提 供することが 可 能 です。# cd /kdump/date-time# pwd/kdump/02-27-08.0711.04# lsconfig.gz vmcore.gz vmlinux.gz If the files are compressed,# gunzip * unzip them before using crash# crash vmlinux vmcoreKERNEL: vmlinuxDUMPFILE: vmcoreCPUS: 4DATE: Tue Feb 27 07:11:04 2008UPTIME: 00:02:34LOAD AVERAGE: 0.12, 0.59, 0.46TASKS: 85NODENAME: ihawkRELEASE: 2.6.26.6-<strong>RedHawk</strong>-5.2-traceVERSION: #1 SMP PREEMPT Tue Feb 13 14:25:24 EST 2008MACHINE: i686 (3046 Mhz)MEMORY: 1 GBPANIC: "SysRq : Trigger a crashdump"PID: 4236COMMAND: "crashme"TASK: f787acd0 [THREAD_INFO: f5582000]CPU: SysRq : Trigger a crashdumpSTATE: TASK_RUNNING (SYSRQ)crash>12-6


カーネル・デバッギング実 行 中 システムの 解 析 12ヘルプの 入 手 12実 行 中 のシステム 上 でcrashを 実 行 するため、 引 数 なしで 指 定 します。crashはvmlinuxファイルを 検 索 し、メモリ・イメージとして/dev/memを 開 きます:# crashKERNEL: /boot/vmlinux-2.6.26.6-<strong>RedHawk</strong>-5.2-traceDUMPFILE: /dev/memCPUS: 16DATE: Tue Feb 27 15:32:45 2008UPTIME: 1 days, 06:36:30LOAD AVERAGE: 0.45, 1.06, 0.96TASKS: 258NODENAME: ihawkRELEASE: 2.6.26.6-<strong>RedHawk</strong>-5.2-traceVERSION: #1 SMP PREEMPT Tue Feb 20 18:11:17 EST 2008MACHINE: i686 (2660 Mhz)MEMORY: 4 GBPID: 32078COMMAND: "crash"TASK: f7aac0b0 [THREAD_INFO: e6e64000]CPU: 8STATE: TASK_RUNNING (ACTIVE)crash>crashのオンライン・ヘルプは 以 下 の 動 作 を 通 して 利 用 可 能 です:• crashコマンドのリスト、そのコマンドのヘルプ・ページを 表 示 するリンクを 表 示 するために「crash>」プロンプトでhelpを 指 定 します。• 利 用 可 能 な 全 てのオプション 一 覧 のヘルプ 画 面 を 表 示 するためにシステム・プロンプトで「crash -h」を 指 定 します。• opt で 指 定 されたコマンドに 関 するヘルプ・ページを 見 るためにシステム・プロンプトで「crash -h [opt]」を 指 定 します。12-7


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>カーネル・デバッガ 12kdb 12NMI 割 り 込 み12みkdb <strong>Linux</strong>カーネル・デバッガは、プレビルト<strong>RedHawk</strong> “debug” カーネルで 提 供 されます。kdbデバッガは、プログラムがカーネル・メモリを 対 話 的 に 調 査 、カーネル 機 能 の 逆 アセンブル、カーネル・コードにブレークポイントを 設 定 、レジスタの 内 容 を 表 示 および 修 正 することが 可 能です。kdbは<strong>RedHawk</strong>デバッグ・カーネルでデフォルトで 構 成 されます。もしPAUSEキーが 押 された、またはシリアル・コンソールで「CTRL-A」が 入 力 された 場 合 、kdbはシステム・パニックを 自 動的 に 発 動 します。kdbはUSBキーボードを 一 部邪 サポートしますが、これが 信 頼 性 がないと 検 出 されると<strong>RedHawk</strong>デバッグ・カーネルはサポートしません。USBキーボードのシステム 上 では、シリアル・コンソールを 設 定 しシリアル・ポートを 通 してkdbを 使 用 することを 推 奨 します。シリアル・コンソールの 設 定 については 付 録 Hの 解 説 を 参 照 して 下 さい。NMIボタンを 所 有 するシステム 上 では、デバッグ・カーネルはkdbへ 入 り 終 了 時 にクラッシュ・ダンプを 取 り 込 むためにNMIボタンの 押 下 を 許 可 する 構 成 にすることが 可 能 です( 後 述 の「NMIボタン」セクションを 参 照 して 下 さい)。kdbへのkdumpコマンドはkdumpクラッシュ・ダンプを 要 求 するために 使 用 することも 可 能 です。「kdb=off」ブート・コマンドはkdbへのエントリを 無 効 にします。「kdb= early」ブート・コマンドはカーネルがブート 処 理 の 早 い 段 階 でkdbへ 入 ります。kdbの 利 用 に 関 する 情 報 はこの 文 書 の 範 囲 を 超 えています。/kernel-source/Documentation/kdbの文 書 を 参 照 して 下 さい。<strong>Linux</strong>のNMIウォッチドッグ 機 能 は、「ウォッチドッグ」NMI 割 り 込 みを 生 成 します。NMI(Nonmaskable Interrupts)は、たとえシステムがロックされた 状 態 でも 実 行 します。 周 期 的 なNMI割 り 込 みの 実 行 により、CPUロックやデバッグ・メッセージ 出 力 が 発 生 したかどうかをカーネルは 監 視 することが 可 能 です。NMIウォッチドッグ・サポートを 有 効 とするには、「nmi_watchdog=N」ブート・コマンド・ライン・パラメータが 必 要 です。「N = 1」の 時 、 各 CPUは 自 身 のNMIタイミングで 実 行 ( 現 在 この設 定 は 機 能 せず2へ 変 更 されます)し、「N = 2」の 時 、 生 成 されたNMIはブロードキャストを 介 して 全 CPUへ 送 信 されます。カーネルにモード(1または2)を 遥 択 させる「nmi_watchdog=-1」はx86_64カーネル 上 で 使 用 することが 可 能 です。デフォルトで、nmi_watchdogは<strong>RedHawk</strong>デバッグ・カーネル(i386ではnmi_watchdog=2、x86_64ではnmi_watchdog=-1)ではオン、 他 の 全 ての<strong>RedHawk</strong>カーネルではオフとなっています。NMIウォッチドッグ 機 能 に 関 する 更 なる 情 報 は、/kernel-source/Documentation/nmi_watchdog.txtで 見 ることが 可 能 です。12-8


カーネル・デバッギングNMIボタンボタン12一 部邪 のシステムはNMIボタンを 所 有 しています。デフォルトではそれは 機 能 しません。 問 題 はNMIボタンを 押 された 結 果 なのか 周 期 的 なNMIウォッチドッグの 結 果 なのかをNMIが 検 出 することが出 来 ないという 事 実 にあります。有 用 な 何 かをNMIボタンに 持 たせるため、NMIウォッチドッグは 無 効 にする 必 要 があります。これは「nmi_watchdog=0」ブート・コマンドを 介 して 行 われます。これはボタンを 押 された 時 にkdbへ 入 ります。kdbのkdumpコマンドは、クラッシュ・ダンプを 必 要 とする 場 合 にキャプチャするために 使 用 することが 可 能 です。nmi_dumpブート・コマンドの 使 用 は、kdumpクラッシュ・ダンプを(システムが 適遚 切 に 構 成 されカーネルがロードされた 時 に)キャプチャするきっかけとなります。ページ12-2の「クラッシュ・ダンプの 作 成 方 法 」を 参 照 して 下 さい。12-9


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>12-10


91213Chapter 13Pluggable Authentication Modules (PAM)本 章 では、アプリケーションがユーザー 認 証 要 求 を 使 用 する 可 能 性 のある 機 能 のライブラリを 通して 遉 成 される 安 全 と 適遚 切 な 認 証 スキームを 提 供 するPAM 機 能 について 説 明 します。序 文 13PAMモジュール13PAM(Pluggable Authentication Modules)は、 認 証 プログラムの 再 コンパイルを 必 要 とせずにシステム 管 理 者 が 認 証 ポリシーの 設 定 を 許 可 する 手 段 です。PAMを 用 いて、 構 成 ファイルの 編 集 によりプログラムへモジュールを 接 続 させる 方 法 を 制 御 します。殆 どのユーザーはこの 構 成 ファイルに 触 れる 必 要 はありません。 認 証 を 必 要 とするプログラムをrpm(8)を 使 ってインストールする 時 、 通 常 のパスワード 認 証 をする 必 要 のある 変 更 を 自 動 的 に 行います。しかしながら、 構 成 をカスタマイズしたい 場 合 には、 構 成 ファイルを 理 解 する 必 要 があります。PAM 標 準 で 定 義 される4 種 類 のモジュールが 存 在 します:authaccountpasswordsession実 際 の 認 証 、 場 合 によりパスワードの 要 求 およびチェック、グループ・メンバーシップのような「 証 明 書 (Credential)」の 設 定 を 提 供 します。認 証 が 許 可 されていることを 確 認 するためにチェックします(アカウントが 有 効 期 限 切 れではない、この 時 点 でユーザーがログインを 許可 されている、その 他 )。パスワードを 設 定 するために 使 用 します。一 旦 、ユーザーがそのアカウントを 使 用 することの 許 可 が 認 証 されると、 場 合 によってはユーザーのホーム・ディレクトリのマウントもしくはメールボックスを 利 用 可 能 にするために 使 用 します。複 数 のモジュールが 使 用 されるため、これらのモジュールは 積 み 重 ねることが 可 能 です。 例 えば、rlogin は 通 常 少 なくても2つの 認 証 方 法 (rhosts 認 証 が 成 功 した 場 合 は 接 続 を 許 可 するのに 十 分 であり、もしそれが 失 敗 した 場 合 はその 後 通 常 のパスワード 認 証 が 行 われます)を 使 用 します。新 しいモジュールはいつでも 追 加 することが 可 能 で、PAM 認 識 アプリケーションはその 後 にそれを 利 用 させることが 可 能 です。13-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>サービス 13PAMを 使 用 する 各 々のプログラムはそれ 自 身 の「サービス」 名 称 を 定 義 します。loginプログラムはサービス・タイプをlogin と 定 義 し、ftpdはサービス・タイプをftp と 定 義 します。 一 般 的 にサービス・タイプはサービスへアクセスするために 利 用 されるプログラムの 名 称 で、(もしそれが異 なる 場 合 は)サービスを 提 供 するためにプログラムは 利 用 されません。ロール・ベース・アクセス 制 御 13<strong>RedHawk</strong> <strong>Linux</strong>のロール・ベース・アクセス 制 御 はPAMを 使 って 実 行 されます。ロール・ベース・アクセス 制 御 スキームでは、capability.conf(5)ファイル 内 に 一 連連 のロール( 役 割 )を 設 定 します。ロールは 有 効 な<strong>Linux</strong>ケーパビリティ 一 式 として 定 義 されます。 現 在 の 全 ての 有 効 な<strong>Linux</strong>ケーパビリティは/usr/include/linux/capability.hカーネル・ヘッダ・ファイルの 中 、または_cap_names[] 文 字 配郤 列 の 使 用 により 見 ることが 可 能 です。これらは 付 録 Cで 更 に 詳 しく 説 明 されています。一 旦 ロールを 定 義 するとそれはその 次 のロールのケーパビリティの1つとして 使 用 されるという点 では、ロールは 積 み 木 のように 作 用 します。このように 新 たに 定 義 されたロールは、 以 前 に 定義 されたロールのケーパビリティを 継 承 します。この 機 能 の 例 は 後 述 されています。 詳 細 な 情 報についてはcapability.conf(5)のmanページを 参 照 して 下 さい。一 旦 役 割 を 定 義 したら、それはcapability.conf(5)ファイル 内 のユーザーまたはグループへ 割 り 当てられます。ユーザーは、 現 在 のシステムのログインで 有 効 なユーザーと 一 致 する 標 準 <strong>Linux</strong>ユーザーのログイン 名 です。グループは、 現 在 のシステムで 定 義 されている 有 効 なグループと 一 致 する 標 準 <strong>Linux</strong>グループ 名 称 です。/etc/pam.dにあるファイルは、ユーザーがシステムへログインするために 使 用 することが 可 能 なサービスに 対 応 します。これらのファイルはpam_capabilityセッション 行 (pam_capabilityセッション 行 をサービス・ファイルへ 追 加 する 例 は「 例 」セクションで 後 述 )を 含 めて 変 更 される 必 要があります。 例 :/etc/pam.d/login (または/etc/pam.d/remote)ファイルは、telnetを 介 してのログインをカバーするのに 良 い 候 補 です。もしユーザーが 変 更 されていないサービスを 使 いシステムへログインする 場 合 、 特 別 なケーパビリティの 割 り 当 ては 行 われません。NOTE: もしケーパビリティが 使 用 される 場 合 、/etc/pam.d/suファイルは、su -l nobody daemonのような 呼 び 出 しがnobodyユーザーに 対 してケーパビリティの 一 覧 だけをdaemon へ与 え、 呼 び 出 しユーザーからは 余 分 なケーパビリティは 与 えられないことを 確 実 に 行 うセキュリティ 措 置 として 修 正 される 必 要 があります。以 下 のオプションは、/etc/pam.dのファイルにpam_capabilityセッション 行 が 供 給 する 時 に 指 定することが 可 能 です:conf=conf_filedebug構 成 ファイルの 場 所 を 指 定 します。もしこのオプションが 指 定 されない 場 合 、 既 定 の 場 所 は/etc/security/capability.confとなります。syslogを 介 してデバッグ 情 報 をロギングします。デバッグ 情 報 はsyslog authprivクラスに 記 録 されます。 通 常 、このログ 情 報 は/var/log/secureファイルに 集 められます。13-2


Pluggable Authentication Modules (PAM)例 13ケーパビリティの 定 義 13以 下 の 例 は、/etc/pam.d/loginへセッション 行 の 追 加 を 説 明 しています。/etc/pam.d/remoteが 存在 する 場 合 はそれの 変 更 も 行 います。NOTE: i386システム 上 のPAMファイルへのパスは/lib/securityです。x86_64 システム 上 のパスは/lib64/securityです。1. telnet(1)を 介 してシステムにログインするユーザーへ 割 り 当 るために/etc/security/capability.confファイルに 定 義 されたロールを 許 可 するためには 以 下 の 行 を/etc/pam.d/loginへ 追 加 します:session required /lib/security/pam_capability.so2. ssh(1)を 介 してシステムにログインするユーザーへ 割 り 当 るために/etc/security/capability.confファイルに 定 義 されたロールを 許 可 するためには 以 下 の 行 を/etc/pam.d/sshdへ 追 加 します:session required /lib/security/pam_capability.so3. su(1)を 介 してユーザーが 入 れ 替 わるために/etc/security/capability.confファイルに 定 義 されたロールを 許 可 するため、そして 入 れ 替 わったユーザーがsu(1)の 呼 び 出 しから 不 適遚 切 なケーパビリティを 継 承 しないことを 確 実 にするため、 以 下 の 行 を/etc/pam.d/suへ 追 加 します:session required /lib/security/pam_capability.so4. sshユーザーが/etc/securityに 置 かれているものとは 異 なるcapability.confファイルからロール 定 義 を 取 得 するためには 以 下 の 行 を/etc/pam.d/sshdへ 追 加 します:session required /lib/security/pam_capability.so ¥conf=/root/ssh-capability.confこのようにして/root/ssh-capability.confファイルに 定 義 されるロールをsshを 介 してログインするユーザーに 適遚 用 します。capability.confファイルはユーザーやグループへ 定 義 および 割 り 当 てが 可 能 なロールに 関 する情 報 を 提 供 します。このファイルはロール、ユーザー、グループの3 種 類 のエントリがあります。Rolesロールは 有 効 な<strong>Linux</strong>ケーパビリティの 定 義 一 式 です。 現 在 有 効 な 全 <strong>Linux</strong>ケーパビリティ 一 式 は/usr/include/linux/capability.hカーネル・ヘッダ・ファイルの中 、またはcap_from_text(3)のmanページで 説 明 されている_cap_names[] 文字 配郤 列 を 使 って 見 る 事 が 可 能 です。このケーパビリティは 付 録 Cの 中 でも 詳 細 に説 明 されています。 尚 、 次 のケーパビリティのキーワードは 予 め 定 義 されています:13-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>allcap_fs_masknone(cap_setcapを 除 く) 全 ケーパビリティファイル・システムに 関 する 全 ケーパビリティ如 何 なるケーパビリティもなし名 前 が 示 すとおり、 様 々なシステムのユーザーおよびグループが 実 行 する 必 要のある 職 務 に 準 じて、 異 なるロールが 定 義 されることが 求 められます。capability.confファイル 内 のロール・エントリの 書 式 は 以 下 となります:role rolename capability_listケーパビリティ・リストのエントリは 以 前 定 義 されたロールを 参 照 することが可 能 です。 例 えば、ファイル 内 でbasic と 呼 ばれるロールを 定 義 して、それに 続くロールのケーパビリティ・リストにケーパビリティの1つとしてそのロールを追 加 することが 可 能 です。ケーパビリティ・リストは、 空 白 またはカンマで 区切 ったユーザーの 継 承 設 定 をONにするケーパビリティのリストであることに注 意 してください。Usersユーザーは、 現 在 のシステムのログインが 有 効 なユーザーに 一 致 する 標 準 <strong>Linux</strong>ユーザーのログイン 名 です。(getpwnam(3)による 確 認 で) 現 在 のシステムで 有 効なユーザーと 一 致 しないユーザー・エントリは 無 視 されます。capability.confファイル 内 のユーザー・エントリの 書 式 は 以 下 となります:user username rolename特 殊 なユーザー 名 ‘*’は、リストアップされたどのユーザとも 一 致 しないユーザー、またはリストアップされたグループのメンバーシップを 所 有 していないユーザーに 対 して 既 定 のロールを 割 り 当 てるために 使 用 することが 可 能 です。user * default_rolenameGroupsグループは、 現 在 のシステムで 定 義 される 有 効 なグループに 一 致 する 標 準 <strong>Linux</strong>のグループ 名 です。(getgrnam(3)による 確 認 で) 現 在 のシステムで 有 効 なグループと 一 致 しないグループ・エントリは 無 視 されます。capability.confファイル 内 のグループ・エントリの 書 式 は 以 下 となります:group groupname rolename例 131. 次 の 例 は、ルートとほぼ 等 しい 管 理 用 のロール(admin)を 設 定 します:role admin all2. 次 の 例 は、 継 承 可 能 なケーパビリティセットにsys_bootとsys_timeを 追 加 するデスクトップ・ユーザー 用 のロールを 設 定 します:role desktopuser cap_sys_boot ¥cap_sys_time13-4


Pluggable Authentication Modules (PAM)3. 次 の 例 は、 前 もって 作 成 されたデスクトップ・ユーザー・ロールを 使 い、パワー・ユーザー用 のロールを 設 定 します:role poweruser desktopuser¥cap_sys_ptrace¥cap_sys_nice¥cap_net_admin4. ユーザーへdesktopuserロールを 割 り 当 てるため、capability.confファイルのUSERSセクションに 以 下 を 入 力 します:user joe desktopuser5. グループへpoweruserロールを 割 り 当 てるため、capability.confファイルのGROUPSセクションに 以 下 を 入 力 します:group hackers poweruser実 装 詳 細 13以 下 の 項 目 は、 完 全 なPAM 機 能 の 実 現 のための 要 件 に 対 応 します:• pam_capabilityは、 実 行 中 のカーネルがexec()システムコール 中 に 継 承 するケーパビリティを 修 正 することを 要 求 します。このモジュールに 同 梱 しているカーネル・パッチが 適遚 用 されたカーネルは、カーネル 構 成GUI( 本 書 の「カーネルの 構 成 および 構 築 」 章 を 参 照 して 下 さい)の「General Setup」 項 目 にあるINHERIT_CAPS_ACROSS_EXEC 構 成 オプションを 使 いケーパビリティ 継 承 を 有 効 にすることが 可 能 です。 全 ての<strong>RedHawk</strong> <strong>Linux</strong>カーネルはデフォルトでこのオプションが 有 効 となっています。13-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>13-6


1214Chapter 14デバイス・ドライバ本 章 は、<strong>RedHawk</strong> <strong>Linux</strong> 下 のユーザー・レベルおよびカーネル・レベルのデバイス・ドライバに関 する 問 題 点 に 対 応 します。これはリアルタイム 性 能 の 問 題 に 加 えてデバイス・ドライバの 書 き方 を 容 易 にする 追 加 機 能 に 関 する 情 報 も 含 まれています。<strong>Linux</strong>ベースのデバイス・ドライバを 記述 する 方 法 の 予 備 知 識 を 前 提 とします。ユーザー 空 間 I/O(UIO)ドライバも 説 明 します。PCI-to-VMEブリッジ・デバイスの<strong>RedHawk</strong>サポートに 関 する 情 報 は15 章 の「PCI-to-VMEサポート」で 見 ることが 可 能 です。デバイス・ドライバの 種 類 の 理 解 14<strong>RedHawk</strong> <strong>Linux</strong>の 下 ではユーザー・レベル・デバイス・ドライバを 簡 単 に 書 く 事 が 可 能 です。ユーザー・レベル・ドライバはデバイス・レジスタを 読 み 書 きする、つまりプログラムI/O 操 作 を 開始 するため、I/O 空 間 にアクセスすることが 可 能 です。カーネル・ドライバ・スケルトンの 支 援 により、ユーザー・レベル・ドライバは 割 り 込 みの 受 信 と 同 時 に 処 理 を 開 始 することも 可 能 になります。これは 割 り 込 みルーチンに 付 随 するユーザー・レベル・ドライバの 中 でシグナル・ハンドラを 許 可 する 機 能 をサポートすることにより 得 られます。 割 り 込 みのハンドリングやユーザー・レベル・プロセスへシグナルを 送 信 するためのサンプルのカーネル・ドライバ・テンプレートの場 所 については、 本 章 で 後 述 する「カーネル・スケルトン・ドライバ」セクションを 参 照 して 下さい。<strong>Linux</strong>の 下 でDMA I/O 操 作 をするユーザー・レベル・ドライバを 書 くことは 現 実 的 ではありません。ユーザー・レベルからDMA 操 作 を 禁 止 するいくつかの 問 題 ( 例 えば、ユーザー 空 間 バッファの 物理 アドレスを 決 定 する 方 法 が 現 在 のところサポートされていない)が 存 在 します。カーネルレベル・デバイス・ドライバはI/O 操 作 にDMAを 利 用 するデバイスのために 使 用 する 必 要 があります。ユーザー 空 間 I/O(UIO)は、 複 数 のI/Oボードに 対 してユーザー・レベル・デバイス・ドライバを 記述 するために 使 用 することが 可 能 です。UIOは、(ユーザー 空 間 に 記 述 されるドライバの 主 要 部邪 分で)ユーザー 空 間 アプリケーションに 使 用 される 一 般 的 なツールやライブラリを 利 用 する 小 規 模なデバイス 単 位 のカーネル・モジュールが 必 要 です。14-15ページの「ユーザー 空 間 I/Oドライバ(UIO)」を 参 照 して 下 さい。ユーザー・レベル・デバイス・ドライバの 開 発 14PCIリソースへのアクセスリソースへのアクセス14後 述 のセクションで、ユーザー・レベル・デバイス・ドライバの 記 述 に 影 響 を 及 ぼす<strong>RedHawk</strong> <strong>Linux</strong>オペレーティング・システムの 詳 細 について 説 明 します。ブート 処 理 中 、PCIバス 上 のデバイスは 自 動 的 に 構 成 され、 割 り 込 みが 割 り 当 てられて、デバイス・レジスタがメモリ・マップドI/O 操 作 を 通 してアクセス 可 能 なメモリ 領 域 にレジスタがマッピングされます。これらのメモリ 領 域 はベース・アドレス・レジスタ(BAR: Base Address Register)として 知 られています。デバイスは 最 大 6 個 のBARを 持 つことが 可 能 です。BARの 内 容 はデバイスによって 異 なります。この 情 報 についてはデバイスのマニュアルを 参 考 にしてください。14-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>PCI BARインターフェースインターフェース14<strong>RedHawk</strong> <strong>Linux</strong>は、PCIデバイスのレジスタをマッピングするために 必 要 となるコードを 単 純 化 する/proc/busにあるPCIリソース・ファイル・システムをサポートします。このファイル・システムは、プログラムのアドレス 空 間 へマッピング 可 能 なメモリ 領 域 を 表 すBARファイルを 提 供 し、デバイスに 関 わる 物 理 アドレスを 知 る 必 要 なしにデバイスへのアクセスを 提 供 します。PCI BARファイル・システムは、デバイスのPCI 構 成 空 間 の 読 み 書 きに 使 用 可 能 な config-space ファイルもまた 提 供 します。config-space ファイルの 先 頭 64バイトはPCIの 仕 様 により 定 義 されています。残 りの192バイトはデバイス・ベンダー 固 有 となります。各 PCIハードウェア・デバイスはベンダーIDとデバイスIDが 関 連連 付 けられています。これらは 時間 経 過遃 またはシステム 間 で 変 化 しない 固 定 値 です。ブート 時 にPCIデバイスの 動 的 構 成 のため、一 旦 システムがブートするとドメイン、バス、スロット、 機 能 番 号 は 固 定 されたままですが、 各システムの 同 じPCIバス・スロットに 差 し 込 まれているように 見 えるボードでも 基 礎 をなすハードウェアに 応 じてシステム 間 で 異 なる 可 能 性 があります。/proc/bus/pciとBARファイル・システム 内 のパスは、カーネルによって 割 り 当 てられたドメイン、バス、スロット、 機 能 番 号 から 生 成され、ホスト・システムの 物 理 ハードウェア・レイアウトに 影 響 を 受 けます。 例 えば、 物 理 的 に異 なるスロットにボードを 差 し 込 む、システムへデバイスを 追 加 する、またはシステムBIOSの 変更 のような 変 更 は、 特 定 のデバイスに 割 り 当 てられたバスおよび/またはスロット 番 号 を 変 更 することが 可 能 となります。後 述 するPCI BARスキャン・インターフェースは、 特 定 デバイスに 関 連連 するBARファイルを 見 つけるための 方 法 を 提 供 します。ドライバはBARファイルへのアクセスを 得 るために 適遚 切 なデバイスのスロット・アドレスを 突 き 止 める 必 要 があるため、これらのインターフェースがなければ、これらBARファイル・パスのハードウェア 依 存 性 質 はユーザー・レベル・デバイス・ドライバのプログラミングの 仕 事 を 若 干 不 便 にします。BARファイル・システム 用 ライブラリ・インターフェース、 固 定 ベンダーIDとデバイスIDの 値 を使 用 して、PCIデバイスに 関 連連 する 現 在 の 他 の 値 を 獲 得 することが 可 能 です。これらはデバイスへのBARファイル・ディレクトリのパスの 他 にそのディレクトリ 内 の 各 BARファイルに 関 する 情報 も 含 みます。これは 各 デバイスに 関 連連 するベンダーID、デバイスID、クラスID、サブクラスID、( 割 り 当 てられていれば)IRQ 番 号 、ドメイン、バス、スロット、 機 能 番 号 を 返 します。このサポートは、カーネル 構 成 GUIの「Bus options」 項 目 にあるPROC_PCI_BARMAPカーネル・パラメータを 通 して 全 ての<strong>RedHawk</strong>プレビルト・カーネルでデフォルトで 有 効 となっています。次 のセクションでPCI BARインターフェースを 説 明 します。ライブラリのスキャン 機 能 は 反 復 します。もしシステムが 求 めるデバイス・タイプのインスタンスを 複 数 持 っている 場 合 、これらのライブラリ 機 能 は 複 数 回 呼 び 出 される 必 要 があります。ある関 数 はシステム 内 の 一 致 するデバイス 全 ての 数 を 返 します。その 他 の 関 数 は 検 索 基 準 に 一 致 するデバイスに 関 する 情 報 を 反 復 的 に 返 します。デバイス 情 報 は/usr/include/pcibar.hで 定 義 されるbar_context 型 に 返 されます。この 構 造造 体 はbar_scan_openの 呼 び 出 しで 作 成 されます。 複 数スキャンは、 各 々が 持 っているユニークなbar_contextを 同 時 にアクティブにすることが 可 能です。インターフェースを 以 下 に 簡 単 に 説 明 します:bar_scan_openbar_scan_nextbar_device_countPCIデバイスの 新 しいスキャンを 開 始 します次 に 一 致 するPCIデバイスを 取 得 しますアクティブ・スキャンに 残 る 一 致 するデバイスの 数 を 返 します14-2


デバイス・ドライバbar_scan_rewindbar_scan_closefree_pci_devicebar_mmapbar_munmapスキャンを 再 開 しますアクティブ・スキャンを 閉 じて 関 連連 するメモリを 解 放 します見 つけたデバイスに 関 する 割 り 当 てられたメモリ 全 てを 解 放 します適遚 切 なページに 整 列 したBARファイルをmmapしますbar_mmapでマッピングしたBARファイルをmunmapしますbar_scan_open(3) 14これらのインターフェースを 使 用 するため、アプリケーションにlibccur_rtライブラリをリンクする 必 要 があることに 注 意 してください。gcc [options] file -lccur_rt ...これらの 機 能 の 使 用 を 解 説 する 例 は、/usr/share/doc/ccur/examples/pci_barscan.cに 提 供 されます。この 機 能 は、PCIデバイスの 検 索 のために 初 期 コンテキストを 作 成 するために 使 用 します。 返 されたbar_contextは、 反 復 子 (イテレータ)インターフェースの 状 況 データを 指 定 する/usr/include/pcibar.hに 定 義 された 不 透 明 なポインタ 型 です。この 値 はその 後 のbar_scan_next,bar_device_count, bar_scan_rewind, bar_scan_closeの 呼 び 出 しに 提 供 される 必 要 があります。概 要#include #include bar_context bar_scan_open(int vendor_id, int device_id);引 数 は 以 下 のように 定 義 されます:vendor_iddevice_id/usr/include/linux/pci_ids.hに 定 義 されたベンダーIDの 値 または 特 殊 な 値ANY_VENDOR。ANY_VENDORはホストシステム 上 の 全 てのデバイスに 対 する全 てのvendor_id の 値 と 適遚 合 します。/usr/include/linux/pci_ids.hに 定 義 されたデバイスIDの 値 または 特 殊 な 値ANY_DEVICE。ANY_DEVICEはホストシステム 上 の 全 てのデバイスに 対 する 全てのdevice_id の 値 と 適遚 合 します。エラー 状 態 についてはmanページを 参 照 して 下 さい。bar_scan_next(3) 14この 機 能 は、 検 出 した 次 に 一 致 するPCIデバイスのpci_device 構 造造 体 オブジェクトへのポインターを 返 します。概 要#include #include struct pci_device * bar_scan_next(bar_context ctx);引 数 は 以 下 のように 定 義 されます:14-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>ctxbar_scan_openより 返 されるアクティブなbar_context。bar_device_count(3) 14これ 以 上 利 用 可 能 なデバイスが 一 致 しない 時 、この 機 能 はNIL_PCI_DEVICEを 返 し、errno にゼロを 設 定 します。エラー 状 態 についてはmanページを 参 照 して 下 さい。この 機 能 は、アクティブ・スキャンの 中 に 残 っている 未 処 理 デバイスの 数 を 返 します。bar_scan_openまたはbar_scan_rewindの 呼 び 出 しの 直 後 に 呼 び 出 した 時 、これは 指 定 したvendor_id とdevice_id に 対 して 一 致 するデバイスの 総 計 となります。この 値 はbar_scan_nextの呼 び 出 しごとに1ずつへ 減 少 します。概 要#include #include int bar_device_count(bar_context ctx);引 数 は 以 下 のように 定 義 されます:ctxbar_scan_openより 返 されるアクティブなbar_context。bar_scan_rewind(3) 14成 功 すると、この 機 能 はその 後 のbar_scan_nextの 呼 び 出 しによって 返 される 報 告 されないデバイスの 数 を 負 ではない 数 で 返 します。エラー 状 態 についてはmanページを 参 照 して 下 さい。この 機 能 は、 最 初 のbar_scan_openの 呼 び 出 し 後 に 直 ぐの 状 況 へ 指 定 されたbar_contextをリセットします。概 要#include #include void bar_scan_rewind(bar_context ctx);引 数 は 以 下 のように 定 義 されます:ctxbar_scan_openより 返 されるアクティブなbar_context。もし 値 がNIL_BAR_CONTEXTまたは 有 効 なbar_contextオブジェクトを 指 定 しない 場合 、この 呼 び 出 しは 効 果 がありません。bar_scan_close(3) 14この 機 能 は、 指 定 したbar_contextに 関 連連 する 割 り 当 てられた 全 てのメモリを 解 放 します。NIL_BAR_CONTEXTの 値 はbar_contextオブジェクトに 割 り 当 てられ、この 呼 び 出 しの 後 はもう 使 用 することはできません。概 要#include #include void bar_scan_close(bar_context ctx);14-4


デバイス・ドライバ引 数 は 以 下 のように 定 義 されます:ctxbar_scan_openより 返 されるアクティブなbar_context。free_pci_device(3) 14この 機 能 は、 指 定 したpci_device 構 造造 体 オブジェクトに 関 連連 する 割 り 当 てられた 全 てのメモリを 解 放 します。概 要#include #include void free_pci_device(struct pci_device * dev);引 数 は 以 下 のように 定 義 されます:devbar_scan_next.から 獲 得 した 有 効 なpci_device 構 造造 体bar_mmap(3) 14この 機 能 は、 指 定 したBARファイルをメモリへマッピングするために 使 用 することが 可 能 です。これはmmapされた 領 域 の 先 頭 ではなくmmapされたBARデータの 開 始 位 置 に 小 さなBARファイルを 整 列 するmmap(2)のラッパーです。この 機 能 を 使 いマッピングされたファイルをアンマップするためにはbar_munmap(3)を 使 用 してください。概 要#include #include void * bar_mmap(char * barfilepath, void * start, size_t length, int prot, intflags, int fd, off_t offset);引 数 は 以 下 のように 定 義 されます:barfilepathmmapするBARファイルのパス他 のパラメータの 説 明 についてはmmap(2)を 参 照 して 下 さい。bar_munmap(3) 14この 機 能 は、bar_mmap(3)を 使 いマッピングされたファイルをアンマップするために 使 用 する 必要 があります。概 要#include #include int bar_munmap(void * start, size_t length);パラメータの 説 明 についてはmunmap(2)を 参 照 して 下 さい。14-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>カーネル・スケルトン・ドライバ 14デバイス・ドライバで 処 理 される 必 要 のある 割 り 込 みをデバイスが 出 すとき、<strong>Linux</strong>ではユーザー・レベル・ルーチンを 割 り 込 みに 結 合 する 方 法 がないため、 完 全 にユーザー・レベルでデバイス・ドライバを 構 築 することは 出 来 ません。しかしながら、ユーザー・レベル・ドライバを 実 行中 のユーザー・レベル・アプリケーションへデバイスの 割 り 込 みとシグナルの 発 行 を 処 理 する 簡易 カーネル・デバイス・ドライバを 構 築 することは 可 能 です。シグナルは 実 行 プログラムへ 非 同期 で 配郤 信 されるため、およびシグナルはコードがクリティカル・セクション 中 はブロックすることが 可 能 であるため、シグナルはユーザー・レベル 割 り 込 みのように 振 舞 います。後 述 のスケルトン・カーネルレベル・ドライバの 例 は、デバイス 割 り 込 みの 発 生 とシグナルをトリガにする 割 り 込 みサービス・ルーチン 用 のコードへシグナルを 結 合 する 方 法 を 示 します。このスケルトン・ドライバの 関 する 全 てのコードは、<strong>RedHawk</strong>がインストールされたシステムの/usr/share/doc/ccur/examples/driverディレクトリで 見 つけることが 可 能 です。 割 り 込 み 処 理 とユーザー・レベル・プロセスへのシグナル 送 信 を 行 う 簡 易 カーネルレベル・ドライバを 記 述 するためのテンプレートとしてサンプル・ドライバ(sample_mod)を 使 用 することが 可 能 です。サンプル・ドライバの 機 能 の 理 解 14サンプル・ドライバは、 割 り 込 みを 生 成 するハードウェア・デバイスとしてリアルタイム・クロック(rtc)0を 使 用 します。rtc0は、ConcurrentのReal-Time Clock and Interrupt Module (RCIM) 上 のリアルタイム・クロックの1つです。このクロックは、 所 定 の 分 解 能 で0までカウントダウンし、その後 初 めからやり 直 します。カウントが0に 到 遉 する 度 に 割 り 込 みが 生 成 されます。リアルタイム・クロック0 用 の 設 定 の 一 部邪 は、ドライバがデバイス・レジスタにアクセスする 可 能 性 があるため、それらのレジスタがメモリ 空 間 へマッピングされるモジュールの「 初 期 化 」ルーチン 内 で 実 行 されます。モジュールの「 初 期 化 」ルーチンとして 示 すコードの 最 後 の 部邪 分 は、 割 り 込 みベクタに割 り 込 みルーチンを 結 合 するコードです。********************************************************************************int sample_mod_init_module(void){...// find rcim board (look for RCIM II, RCIM I, and finally RCIM I old rev)dev = pci_find_device(PCI_VENDOR_ID_CONCURRENT, PCI_DEVICE_ID_RCIM_II,dev);if (dev == NULL) { //try another iddev = pci_find_device(PCI_VENDOR_ID_CONCURRENT_OLD, PCI_DEVICE_ID_RCIM, dev);}if (dev == NULL) { //try another iddev = pci_find_device(PCI_VENDOR_ID_CONCURRENT_OLD, PCI_DEVICE_ID_RCIM_OLD, dev);}if (dev == NULL) { //no rcim board, just clean up and exitunregister_chrdev(major_num,"sample_mod");return -ENODEV;}...if ((bd_regs = ioremap_nocache(plx_mem_base, plx_mem_size)) == NULL)return -ENOMEM;...if ((bd_rcim_regs = ioremap_nocache(rcim_mem_base, rcim_mem_size)) == NULL)...return -ENOMEM;sample_mod_irq = dev->irq;res = request_irq(sample_mod_irq, rcim_intr, SA_SHIRQ, "sample_mod", &rtc_info);14-6


デバイス・ドライバrtc0デバイスの 完 全 な 初 期 化 は、モジュールの“open” メソッドで 実 行 されます。この 例 では、デバイスは 割 り 込 みがデバイスにより 生 成 されるように 自 動 的 に 設 定 されます。デバイスがオープンされる 時 、rtc0に 関 連連 する 割 り 込 みは 有 効 となり、そのデバイスは1μ 秒 の 分 解 能 により10000から0へカウントするようにプログラムされ、クロックのカウントを 開 始 します。カウントが0に遉 する 時 に 割 り 込 みを 生 成 します。*****************************************************************************int rcim_rtc_open(struct inode *inode, struct file *filep){u_int32_t val;if (rtc_info.nopens > 0) {printk(KERN_ERR “You can only open the device once.¥n”);return -ENXIO;}rtc_info.nopens++;if (!rtc_info.flag)return -ENXIO;writel(0, &bd_rcim_regs->request);writel(ALL_INT_MASK, &bd_rcim_regs->clear);writel(RCIM_REG_RTC0, &bd_rcim_regs->arm);writel(RCIM_REG_RTC0, &bd_rcim_regs->enable);writel(RTC_TESTVAL, &bd_rcim_regs->rtc0_timer);//rtc data regval = RCIM_RTC_1MICRO | RCIM_RTC_START|RCIM_RTC_REPEAT;writel(val, &bd_rcim_regs->rtc0_control);return 0;}******************************************************************************ユーザー・レベル・ドライバは、カーネルレベル・ドライバが 割 り 込 みを 受 信 した 時 に 送 信 されるべきシグナルを 指 定 する 必 要 があります。ユーザー・レベル・ドライバは、カーネルレベル・ドライバのioctlメソッドにより 処 理 されるioctl() 呼 び 出 しを 行 います。ユーザー・レベル・ドライバがこのioctl() 機 能 を 呼 び 出 すと、ユーザー・レベル・プロセスが 指 定 したシグナルのためのシグナル・ハンドラを 既 に 構 成 したカーネルレベル・ドライバに 知 らせ、ユーザー・レベル・ドライバは 直 ぐにシグナルを 受 信 できるようになります。呼 び 出 し 元 のユーザー 空 間 プロセスは、モジュールから 受 信 したいシグナルの 番 号 を 指 定 します。ドライバは“current” 構 造造 体 を 使 用 することにより 要 求 されたシグナル 番 号 に 関 連連 するプロセスIDを 記 憶 します。「シグナルID/プロセスID」のペアは、モジュールのrtc_info 構 造造 体 の 中 に 格納 され、その 後 、 後 述 する“notification” メカニズムにより 使 用 されます。**************************************************************************int rcim_rtc_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,unsigned long arg){if (!rtc_info.flag)return (-ENXIO);switch (cmd){// Attach signal to the specified rtc interruptcase RCIM_ATTACH_SIGNAL:rtc_info.signal_num = (int)arg;rtc_info.signal_pid = current->tgid;break;default:return (-EINVAL);}return (0);}****************************************************************************14-7


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>実 際 の 通 知 はモジュールの 割 り 込 みハンドラ 内 で 実 施 されます。 割 り 込 みをrtc0から 受 信 した 時 、この 割 り 込 みサービス・ルーチンはそれを 要 求 したプロセスへシグナルを 送 信 するかどうかを 判断 します。もしrtc_info 構 造造 体 内 に「シグナルID/プロセスID」のペアが 登 録 されている 場 合 、指 定 されたシグナルはkill_proc() 関 数 を 使 い 対 応 するプロセスへ 送 信 されます。**********************************************************************************int rcim_intr(int irq, void *dev_id, struct pt_regs *regs){u_int32_t isr;isr = readl(&bd_rcim_regs->request);writel(0, &bd_rcim_regs->request);writel(ALL_INT_MASK, &bd_rcim_regs->clear);/* Use isr to determine whether the interrupt was generated by rtc 0 only if“rcim” module is not built into the kernel. If “rcim” is active, itsinterrupt handler would have cleared “request” register by the time weget here. */// if (isr & RCIM_REG_RTC0) {// Send signal to user process if requestedif (rtc_info.signal_num && rtc_info.signal_pid &&(kill_proc(rtc_info.signal_pid, rtc_info.signal_num, 1) == -ESRCH)){rtc_info.signal_pid = 0;}// }return IRQ_HANDLED;}**********************************************************************************デバイスがクローズされた 時 、rtc0はシャット・ダウンされます。カウント 値 は0へリセットされ、クロックは 停 止 されます。さらに 割 り 込 みを 受 信 した 場 合 にシグナルがこれ 以 上 送 信 されないように 割 り 込 み/シグナルの 結 合 はクリアされます。*********************************************************************************int rcim_rtc_close(struct inode *inode,struct file *filep){if (!rtc_info.flag)return (-ENXIO);rtc_info.nopens--;if(rtc_info.nopens == 0) {writel(~RCIM_RTC_START, &bd_rcim_regs->rtc0_control);writel(0, &bd_rcim_regs->rtc0_timer);rtc_info.signal_num = 0;rtc_info.signal_pid = 0;}return 0;}*********************************************************************************14-8


デバイス・ドライバドライバのテスト 14サンプル・カーネル・モジュールをテストする 最 良 の 方 法 は、RCIMドライバなしのカーネルを構 築 し、サンプル・ドライバをロードすることです。しかしながら、このモジュールはカーネルに 既 に 組 み 込 まれたRCIMドライバの 有 無 に 関 わらず 動 くように 設 計 されています。RCIMカーネル・モジュールとサンプル・カーネル・モジュールは 同 じ 割 り 込 みラインを 共 有 します。 割 り 込 みが 発 生 した 時 、RCIMの 割 り 込 みハンドラが 最 初 に 起 動 し、RCIM 上 のハードウェア 割 り 込 みレジスタはクリアされます。その 後 、サンプル・モジュールの 割 り 込 みハンドラが 呼び 出 されます。もし 両 方 のモジュールがロードされた 場 合 、もう1つのハンドラはクリアされた 割 り 込 みレジスタを 見 つけ、もし「 割 り 込 みソース」のチェックが 実 行 されるとハンドラは 割 り 込 みがrtc0とは 異なるデバイスから 来 たと 思 い 込 みます。RCIMとサンプル・モジュールの 両 方 がロードされる 時にこの 障 害 を 克 服 するため、サンプル・モジュールの 割 り 込 みハンドラの 以 下 の 行 をコメントアウトしました:// if (isr & RCIM_REG_RTC0) { .次 のコードは、RCIMスケルトン・ドライバの 割 り 込 み 発 生 でいつでもこのルーチンが 呼 び 出 されるようにどのような 方 法 でユーザー・レベル・ドライバをルーチンと 結 合 するかをデモする 簡易 ユーザー・レベル・プログラムです。このルーチン“interrupt_handler” は、RCIMのrtc0の 割 り 込み 発 生 時 に 呼 び 出 されるルーチンです。このプログラムはプログラムが 実 行 されている 端 末 で「Ctrl-C」の 入 力 することにより 終 了 します。このサンプル・コードは/usr/share/doc/ccur/examples/driver/usersampleでも 入 手 できることに 注 意 してください。サンプル・モジュールをロードして 正 常 にユーザー・サンプル・プログラムを 実 行 するには、RCIMドライバを 使 用 する 全 てのアプリケーションを 停 止 する 必 要 があります。以 下 がusersampleプログラムです。14-9


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>#include #include #include #include #include "sample_mod.h"static const char *devname = "/dev/sample_mod";static int nr_interrupts = 0;static int quit = 0;void interrupt_handler (int signum){nr_interrupts++;if ((nr_interrupts % 100) == 0) {printf (".");fflush(stdout);}if ((nr_interrupts % 1000) == 0)printf (" %d interrupts¥n", nr_interrupts);}void ctrl_c_handler (int signum){quit++;}int main(){int fd;struct sigaction intr_sig = { .sa_handler = interrupt_handler };struct sigaction ctrl_c_sig = { .sa_handler = ctrl_c_handler };sigaction (SIGUSR1, &intr_sig, NULL);sigaction (SIGINT, &ctrl_c_sig, NULL);if ((fd = open (devname, O_RDWR)) == -1 ) {perror ("open");exit(1);}if (ioctl (fd, RCIM_ATTACH_SIGNAL, SIGUSR1) == -1) {perror ("ioctl");exit(1);}printf ("waiting for signals...¥n");while (! quit)pause();}printf ("¥nhandled %d interrupts¥n", nr_interrupts);close(fd);exit(0);14-10


デバイス・ドライバカーネル・レベル・ドライバの 開 発 14後 に 続 くセクションで、カーネル・レベル・ドライバの 記 述 とテストに 影 響 する<strong>RedHawk</strong> <strong>Linux</strong>オペレーティング・システムの 詳 細 について 説 明 します。ドライバ・モジュールの 構 築 14既 存 の<strong>RedHawk</strong>カーネルまたはカスタム・カーネルのどちらかで 使 用 するドライバ・モジュールの 構 築 に 関 する 説 明 は、11 章 の「カーネルの 構 成 および 構 築 」で 提 供 されます。カーネルの 仮 想 アドレス 空 間 14リアルタイム 性 能 の 問 題 14割 り 込 みルーチン 14カーネル・サポート・ルーチンvmalloc()とioremap()の 動 的 マッピングが 引 き 当 てたカーネル 仮想 アドレス 空 間 の 量 が、デバイスの 要 求 に 対 応 するには 十 分 ではない 時 にいくつかのケースが 存在 します。32bitカーネルののデフォルト 値 128MBは、ioremapされることになるとても 大 きなオンボード・メモリを 持 つI/Oボードを 除 く 全 てのシステムに 対 しては 十 分 です。 一 例 は、128MBメモリが 搭 載 されるiHawkシステムにインストールされたVMICのリフレクティブ・メモリ・ボードです。128MBの 予 約 カーネル 仮 想 アドレス 空 間 が 十 分 ではない 時 、この 値 はブート 時 に 指 定 されるカーネル・ブート・パラメータ(vmalloc=)を 使 うことにより 増 やすことが 可 能 となります。このオプションに 関 する 詳 細 な 情 報 は、 付 録 -I「ブート・コマンド・ライン・パラメータ」を 参 照 して 下 さい。カーネルレベル・デバイス・ドライバはカーネル・モードで 実 行 され、カーネル 自 身 の 拡 張 です。従 ってデバイス・ドライバは、リアルタイム 性 能 に 影 響 を 与 える 可 能 性 のあるカーネル・コードと 同 様 にシステムのリアルタイム 性 能 に 影 響 を 及 ぼす 能 力 を 持 っています。 後 に 続 くセクションで、デバイス・ドライバとリアルタイムに 関 連連 するいくつかの 問 題 のハイレベルな 概 要 を 提 供 します。<strong>Linux</strong>で 利 用 可 能 な 多 くのオープン・ソース・デバイス・ドライバが 存 在 する 一 方 、それらのドライバは、 特 にリアルタイム・システムに 対 する 適遚 合 性 に 関 しては 広 範 囲 にわたる 品 質 が 存 在 することに 注 意 する 必 要 があります。割 り 込 みルーチンは 高 優 先 度 タスクを 実 行 するためにプリエンプトできないため、 割 り 込 みルーチンの 継 続 時 間 はリアルタイム・システムではとても 重 要 です。 非 常 に 長 い 割 り 込 みルーチンは割 り 込 みが 割 り 当 てられているCPU 上 で 実 行 しているプロセス・ディスパッチ・レイテンシーに直 接 影 響 を 与 えます。 用 語 「プロセス・ディスパッチ・レイテンシー」は、 割 り 込 みにより 示 される 外 部邪 イベントの 発 生 から、 外 部邪 イベントを 待 っているプロセスがユーザー・モードで 最 初 の命 令 を 実 行 するまでの 経 過遃 時 間 を 意 味 します。 割 り 込 みがプロセス・ディスパッチ・レイテンシーに 影 響 を 与 える 方 法 の 詳 細 については、「リアルタイム 性 能 」 章 を 参 照 して 下 さい。14-11


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>もしリアルタイム 製 品 環 境 でデバイス・ドライバを 使 用 している 場 合 は、 割 り 込 みレベルで 実 行される 仕 事 量 を 最 小 限 に 抑 える 必 要 があります。<strong>RedHawk</strong> <strong>Linux</strong>は、 割 り 込 みレベルで 実 行 される 必 要 のない 処 理 を 遅逼 らせるためのいくつかの 異 なるメカニズムをサポートしています。これらのメカニズムは、プログラム・レベルでカーネル・デーモンのコンテキストで 実 行 される 処 理 をトリガーすることを 割 り 込 みルーチンに 認 めます。これらのカーネル・デーモンの 優 先 度 は 変 更可 能 であるため、 延 期 される 割 り 込 み 処 理 よりも 高 い 優 先 度 レベルで 高 優 先 度 リアルタイム・プロセスを 実 行 することが 可 能 です。これはリアルタイム・プロセスが、 通 常 割 り 込 みレベルで 実行 される 可 能 性 のあるいくつかの 活 動 よりも 高 い 優 先 度 になることを 許 可 します。このメカニズムを 使 用 することで、リアルタイム・タスクの 実 行 は 延 期 された 割 り 込 み 動 作 により 遅逼 延 することはありません。 割 り 込 みの 遅逼 延 に 関 する 詳 細 については「 割 り 込 み 機 能 の 遅逼 延 (ボトム・ハーフ)」セクションを 参 照 して 下 さい。通 常 、デバイスの 割 り 込 みルーチンは、 以 下 のタイプのタスクを 実 行 するためにデバイスと 相 互作 用 することが 可 能 です。• 割 り 込 みに 応 答• その 後 ユーザーへ 転 送 するためデバイスから 受 信 したデータを 保 存• 前 の 操 作 の 完 了 を 待 っているデバイス 操 作 を 開 始デバイスの 割 り 込 みルーチンは 以 下 のタイプのタスクを 実 行 してはいけません。• ある 内 部邪 バッファから 他 へデータをコピー• デバイスへバッファを 割 り 当 てまたは 補 充• デバイスに 使 用 されているほかのリソースを 補 充これらのタイプのタスクは、 遅逼 延 割 り 込 みメカニズムの1つを 介 してプログラム・レベルで 実 行 する 必 要 があります。 例 えば、デバイスのためのバッファをプログラム・レベルで 割 り 当 てて、ドライバへの 内 部邪 フリー・リスト 上 に 保 持 されるようにデバイス・ドライバを 設 計 することが 可 能です。プロセスが 読 み 書 き 操 作 を 実 行 する 時 、 利 用 可 能 なバッファの 数 が 入 ってくる 割 り 込 みトラフィックに 対 して 十 分 であるかどうかを 判 断 するためにドライバはフリー・リストをチェックします。 割 り 込 みルーチンは、 実 行 時 間 の 面 ではとても 高 くつくカーネル・バッファ・ 割 り 当 てルーチンの 呼 び 出 しをこのようにして 回 避遪 することが 可 能 です。デバイスがリソースを 使 い 果 たして 割 り 込 みレベルでこれを 通 知 するだけである 場 合 、 新 しいリソースは 割 り 込 みレベルではなく 遅逼 延 割 り 込 みルーチンの 一 部邪 として 割 り 当 てられる 必 要 があります。割 り 込 み 機 能 の 遅逼 延 (ボトム・ハーフボトム・ハーフ) 14<strong>Linux</strong>は 機 能 の 実 行 を 遅逼 らせることが 可 能 ないくつかのメソッドをサポートしています。 直 接 機 能を 呼 び 出 す 代 わり、その 後 に 機 能 が 呼 び 出 されるように「トリガ」が 設 定 されます。ボトム・ハーフと 呼 ばれるこれらのメカニズムは、 割 り 込 みレベルで 行 われた 処 理 を 遅逼 延 するために<strong>Linux</strong>下 の 割 り 込 みルーチンによって 使 用 されます。 割 り 込 みレベルからこの 処 理 を 削 除 することにより、システムは 上 述 されているようにより 良 い 割 り 込 み 応 答 時 間 を 実 現 することが 可 能 となります。割 り 込 みを 遅逼 延 するためにソフトIRQ、タスクレット、ワーク・キューの3つの 遥 択 が 存 在 します。タスクレットはソフトIRQ 上 に 構 築 されており、 従 ってそれらの 動 作 はよく 似 ています。ワーク・キューは 異 なった 動 作 でカーネル・スレッド 上 に 構 築 されます。ボトム・ハーフを 使 用 する 上 での 判 断 は 重 要 です。 表 14-1は、 以 降 のセクションで 詳 細 に 説 明 されているタイプの 要 約 です。14-12


デバイス・ドライバ表 14-1 ボトム・ハーフのタイプSoftirqs and Tasklets 14ボトム・ハーフ・タイプソフトIRQタスクレットワーク・キューコンテキスト割 り 込 み割 り 込 みプロセスシリアル 化なし同 じタスクレットに 対 してなし(プロセス・コンテキストとしてスケジュール)割 り 込 み 処 理 を 遅逼 延 するための2つのメカニズムは、 遅逼 延 されるコードが 再 入 可 能 である 必 要 があるかどうかについては 異 なる 要 件 があります。これらの 遅逼 延 機 能 のタイプはソフトIRQとタスクレットです。ソフトIRQの 単 一 インスタンスは 同 時 に 複 数 のCPU 上 で 実 行 可 能 であるため、「ソフトIRQ」は 完 全 に 再 入 可 能 である 必 要 があります。「タスクレット」はソフトIRQの 特 殊 なタイプとして 実 装 されます。この 遊 いは 特 定 のタスクレット 機 能 は 常 にそれ 自 身 に 対 してシリアライズ( 順 番 に 並 べられる)されるということです。 言 い 換 えると、2つのCPUは 同 時 に 同 じタスクレットを 決 して 実 行 しません。タスクレット 内 のコードはそれ 自 身 に 対 して 再 入 可 能 である 必 要 がないため、この 特 性 はデバイス・ドライバにおいてよりシンプルなコーディング・スタイルを 可 能にします。標 準 <strong>Linux</strong>において、ソフトIRQとタスクレットは 通 常 、 割 り 込 みからプログラム・レベルへの 割り 込 みハンドラ 移 行 の 直 後 に 割 り 込 みコンテキストから 実 行 されます。 時 折 、 標 準 <strong>Linux</strong>はカーネル・デーモンにソフトIRQとタスクレットを 譲 ります。 両 方 のメソッドは 割 り 込 みを 有 効 にして実 行 することをソフトIRQとタスクレットに 許 可 しますが、これらは 通 常 割 り 込 みコンテキストから 実 行 されるため、ソフトIRQとタスクレットはsleepできません。<strong>RedHawk</strong>は、ソフトIRQとタスクレットがカーネル・デーモンのコンテキスト 内 で 実 行 されることを 保 証 するオプション(デフォルトでON)により 機 能 強 化 されました。これらのカーネル・デーモンの 優 先 度 とスケジューリングのポリシーはカーネル 構 成 パラメータを 介 して 設 定 することが可 能 です。これは、 高 優 先 度 リアルタイム・タスクが 遅逼 延 された 割 り 込 み 機 能 の 動 作 をプリエンプトすることが 可 能 になるように 構 成 することをシステムに 許 可 します。ソフトIRQとタスクレットはksoftirqdデーモンにより 両 方 実 行 されます。これは 論 理 CPU 毎 に1つのksoftirqdデーモンが 存 在 します。ソフトIRQまたはタスクレットはこの 実 行 をトリガーにしたCPU 上 で 実 行 されます。 従 って、もしハード 割 り 込 みが 特 定 のCPUへのアフィニティ・セットを 持 っている 場 合 、 対 応 するソフトIRQまたはタスクレットはそのCPU 上 でも 実 行 されます。ksoftirqdの 優 先 度 は、カーネル 構 成 GUIの「General Setup」 項 目 にあるSOFTIRQ_PRIとSOFTIRQ_PREEMPT_BLOCKカーネル・チューニング・パラメータにより 決 定 されます。SOFTIRQ_PRIに 正 の 数 が 設 定 される 時 、その 数 はksoftirqdが 実 行 される 優 先 度 になります。 既定 値 ではこのチューニング・パラメータはゼロに 設 定 され、SOFTIRQ_PREEMPT_BLOCKの 設 定はデーモンの 優 先 度 に 影 響 します。「Y」に 設 定 すると、 最 高 リアルタイム 優 先 度 よりも1つ 小 さい 優 先 度 でSCHED_FIFOスケジューリング・ポリシーとしてksoftirqdデーモンが 実 行 されます。「N」に 設 定 すると、ksoftirqdデーモンは 優 先 度 ゼロで 実 行 されます。Work Queues 14「ワーク・キュー」はもう1つの 遅逼 延 実 行 メカニズムです。ソフトIRQとタスクレットとは 異 なり、標 準 <strong>Linux</strong>は 常 にカーネル・デーモンのプロセス・コンテキスト 内 でワーク・キューが 処 理 される結 果 、ワーク・キュー 内 のコードはsleepが 許 可 されています。ワーク・キューを 処 理 するカーネル・デーモンはワーカー・スレッドと 呼 ばれます。ワーカー・スレッドは 常 に 単 一 CPUへバインドされた 各 スレッドとCPU 毎 に 一 組 のスレッドとして 作 成 されます。ワーク・キュー 上 の 仕 事 はCPU 毎 に 保 持 され、そのCPU 上 のワーカー・スレッドとして 処理 されます。14-13


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>Understanding Priorities 14マルチスレッディングの 問 題 14カーネルはデフォルトでドライバを 使 用 する 可 能 性 のあるワーク・キューを 提 供 します。デフォルトでワーク・キューを 処 理 するワーカー・スレッドはevents/cpu と 呼 ばれ、cpu はスレッドがバインドされているCPUです。任 意 にドライバはプライベート・ワーク・キューとワーカー・スレッドを 作 成 する 可 能 性 があります。これはキューイングされた 仕 事 がプロセッサ 負 荷 が 高 いまたはパフォーマンスが 重 要 である 場 合 、ドライバに 有 利 となります。これはデフォルト・ワーカー・スレッドの 負 荷 も 軽 減 し、デフォルト・ワーク・キューの 他 の 仕 事 がなくなるのを 防 ぎます。ワーカー・スレッドは、ワーク・キュー 上 に 仕 事 がセットされた 時 にCPU 上 で 実 行 します。 従 って、ハード 割 り 込 みが 特 定 CPUへのアフィニティ・セットを 持 ち、 割 り 込 みハンドラが 仕 事 をキューイングした 場 合 、 対 応 するワーカー・スレッドもそのCPU 上 で 実 行 されます。ワーカー・スレッドは 常 にナイス 値 -10で 作 成 されますが、その 優 先 度 はrun(1)コマンドで 変 更 することが 可 能です。リアルタイム・プロセスが 遅逼 延 割 り 込 みデーモンよりも 高 い 優 先 度 で 実 行 することが 可 能 なシステムを 構 成 する 時 、それらのリアルタイム・プロセスがデーモンより 提 供 されるサービスに 依 存するかどうかを 理 解 することが 重 要 です。もし 高 優 先 度 リアルタイム・タスクが 遅逼 延 割 り 込 みデーモンよりも 高 いレベルでCPUにバインドされた 場 合 、CPU 実 行 時 間 を 受 信 しないようにデーモンを 空 にすることが 可 能 です。もしリアルタイム・プロセスも 遅逼 延 割 り 込 みデーモンに 依 存 する場 合 、デッドロックが 生 じる 可 能 性 があります。<strong>RedHawk</strong> <strong>Linux</strong>は 単 独 のシステムで 複 数 CPUをサポートするために 構 築 されています。これは、全 てのカーネル・コードとデバイス・ドライバがそれらのデータ 構 造造 体 を1つ 以 上 のCPUで 同 時 に変 更 されることから 保 護 するために 記 述 されている 必 要 があることを 意 味 します。データ 構 造造 体への 全 ての 変 更 がシリアル 化 されるようにマルチ・スレッド・デバイス・ドライバの 処 理 はそれらのデータへのアクセスの 保 護 を 必 要 とします。 一 般 的 に<strong>Linux</strong>ではこれらの 種 類 のデータ 構 造造 体アクセスを 保 護 するためにスピンロックを 使 用 することにより 実 現 されます。スピンロックをロックすることは、プリエンプションおよび/または 割 り 込 みが 無 効 になる 原 因 となります。どちらのケースでも、これらの 機 能 が 無 効 であるCPU 上 で 実 行 中 のプロセスにとってプロセス・ディスパッチ・レイテンシーの 最 悪 のケースは、どれくらいそれが 無 効 であるかによって 直 接 影 響 を 受 けます。それは、プリエンプションおよび/または 割 り 込 みが 無 効 である 時 間 に影 響 するスピンロックが 保 持 される 時 間 を 最 小 化 するためにデバイス・ドライバを 記 述 する 時 に重 要 となります。スピンロックをロックすることは 暗 黙 のうちにプリエンプションまたは 割 り 込みが(スピンロック・インターフェースの 使 用 に 応 じて) 無 効 になる 原 因 となることを 覚 えてください。このトピックに 関 する 詳 細 については「リアルタイム 性 能 」 章 を 参 照 して 下 さい。ビッグ・カーネル・ロック(BKL)とioctl 14ビッグ・カーネル・ロック(Big Kernel Lock : BKL)は、カーネル・ソース・コードの 一 部邪 が 細 粒 度マルチ・スレッド 化 されていない 時 に 使 用 される<strong>Linux</strong>カーネルのスピンロックです。BKLの 活 用の 多 くは 機 械 的 に<strong>Linux</strong>カーネルをマルチ・スレッド 化 することにより 削 除 される 一 方 、BKLは<strong>Linux</strong>カーネルの 中 で 依 然 として 最 も 競 合 性 の 高 い、 最 も 長 く 保 持 されるロックです。デフォルトで、<strong>Linux</strong>カーネルはデバイス・ドライバに 関 わるioctl(2) 機 能 を 呼 び 出 す 前 にBKLをロックします。もしデバイス・ドライバをマルチ・スレッド 化 した 場 合 、ioctlを 呼 び 出 す 前 にBKLをロックする 必 要 はありません。<strong>RedHawk</strong> <strong>Linux</strong>は、デバイス・ドライバがioctlを 呼 び 出 す 前 にBKLをロックしないように 指 示 することを 許 可 しています。デバイスがリアルタイム 機 能 をサポートするために 使 用 される 時 、またはアプリケーションがシールドCPU 上 でデバイスのioctlルーチンの 呼 び 出 しを 行 う 時 、14-14


デバイス・ドライバBKLがロックされないようにデバイス・ドライバを 修 正 することはとても 重 要 です。さもなければ、プロセスは 同 じCPUへ 割 り 当 てられるプログラムや 割 り 込 みへのジッターの 原 因 となり 長 期にわたりBKLスピンロック 上 でスピンが 停 止 する 可 能 性 があります。デバイスのioctlルーチンへのエントリでBKLがロックされないように 指 定 するためのメカニズムは、デバイスのioctlメソッドとしてよりもむしろデバイスのunlocked_ioctlメソッドとしてドライバのioctl 機 能 を 登 録 することです。 以 下 はどのようにしてRCIMデバイスにこのフラグを 設定 するかの 例 です:static struct file_operations rcim_fops = {owner:THIS_MODULE,open:rcim_master_open,release:rcim_master_release,unlocked_ioctl: rcim_master_ioctl,mmap:rcim_master_mmap,};この 変 更 を 行 った 後 、デバイス・ドライバを 再 構 築 する 必 要 があります。 静 的 ドライバに 関 しては、これはカーネル 全 体 を 再 構 築 することを 意 味 します。 動 的 にロード 可 能 なモジュールに 関 しては、そのモジュールだけを 再 構 築 する 必 要 があります。 詳 細 については「カーネルの 構 成 および 構 築 」 章 を 参 照 して 下 さい。ユーザー 空 間 I/Oドライバドライバ(UIO) 14UIOはユーザー・レベル・ドライバを 記 述 するために 標 準 化 されたメソッドです。これはやはり小 さなドライバ 単 位 のカーネル・モジュールを 必 要 としますが、ドライバの 主 要 部邪 分 は 使 い 慣 れたツールやライブラリを 使 用 してユーザー 空 間 で 記 述 します。UIOを 使 用 すると、 標 準 的 なPCIカードの 取 り 込 みや 任 意 の 目 的 のために 簡 単 なユーザー 空 間 ドライバを 作 ることが 可 能 となります。これらのドライバは 実 装 やテストが 容 易 でありカーネルのバージョン 変 更 から 分 離 されています。そのドライバのバグはカーネルをクラッシュすることはなく、ドライバのアップデートはカーネルの 再 コンパイルなしに 行 うことが 可 能 です。現 在 、UIOドライバはキャラクタ・デバイス・ドライバだけに 使 用 することが 可 能 でユーザー 空間 からDMA 操 作 を 提 供 するために 使 用 することは 出 来 ません。小 さなドライバ 単 位 のカーネル・モジュールは 次 が 必 要 となります:• ボードのデバイスIDとベンダーIDが 一 致• 低 レベルでの 初 期 化 を 実 行• 割 り 込 みの 応 答一 旦 所 有 ハードウェア 用 に 動 作 するカーネル・モジュールを 所 有 してしまえば、ユーザー・アプリケーションを 記 述 するために 通 常 使 用 されるツールやライブラリを 使 用 してユーザー 空 間 ドライバを 記 述 することが 可 能 となります。lsuio(1)ツールはUIOデバイスとその 属 性 をリストアップするために 使 用 することが 可 能 です。各 UIOデバイスはデバイスファイル/dev/uio0, /dev/uio1などを 介 してアクセスします。 変 数 の 読み 書 きをするために 使 用 されるドライバの 属 性 は、/sys/class/uio/uioXディレクトリの 下 にあります。メモリ 領 域 はmmap(1)を 介 してサクセスされます。UIOデバイス・ドライバを 記 述 するための 完 全 な 説 明 書 は/usr/share/doc/ccur/examples/driver/uio/uio-howto.pdfで 見 ることが 可 能 です。14-15


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>性 能 の 解 析 14ConcurrentのRCIMボードとPMC-16AIOボード 両 方 のためのUIOカーネルとユーザー・ドライバの例 は、/usr/share/doc/ccur/examples/driver/uioで 提 供 されています。 両 方 ともドライバがどのような 機 能 を 実 行 するかを 説 明 するコメントを 含 みます。<strong>RedHawk</strong>は、カーネル 構 成 GUIの「Userspace I/O」 項 目 にあるUIOカーネル・チューニング・パラメータを 通 してプレビルトカーネルの 中 でデフォルトでUIOサポートが 有 効 となっています。Concurrentが 提 供 するグラフィカル 解 析 ツールのNightTrace RTは、アプリケーションやカーネル内 の 重 要 なイベントに 関 する 情 報 をグラフィカルに 表 示 することが 可 能 で、そしてアプリケーションの 動 作 でパターンや 例 外 を 特 定 するために 使 用 することが 可 能 です。 変 化 する 状 況 下 でコードを 対 話 的 に 分 析 するための 能 力 は、デバイス・ドライバのリアルタイム 性 能 をチューニングするために 非 常 に 有 益 です。ユーザー・レベル・コードのトレース・ポイントの 提 供 、トレース・データのキャプチャー、 結果 表 示 の 処 理 は「NightTrace RT User’s <strong>Guide</strong> ( 文 書 番 号 :0890398) 」の 中 で 全 て 説 明 されています。ユーザー/カーネルのトレース・イベントは、 解 析 するために 記 録 および 表 示 することが 可 能 です。カーネル・トレースは、トレース・カーネルおよびデバッグ・カーネルの 中 に 含 まれている 事 前に 定 義 されたカーネル・トレース・イベントを 利 用 します。ユーザー 定 義 イベントは 事 前 に 定 義されたCUSTOMトレース・イベントを 使 用 して 記 録 する、または 動 的 に 作 成 することが 可 能 です。全 ては 解 析 のためにNightTrace RTにより 表 示 されます。カーネルのトレース・イベントに 関 する詳 細 については 付 録 Dを 参 照 して 下 さい。14-16


15Chapter 15PCI-to-VMEサポート本 章 では、<strong>RedHawk</strong> <strong>Linux</strong>がサポートするPCI-to-VMEバス・ブリッジについて 説 明 します。概 要 15PCI-to-VMEバス・アダプターは、PCIベースのiHawkシステムとVMEバス・システムを 接 続 するために 使 用 することが 可 能 です。これは、あたかもiHawkのPCIバックプレーンに 直 接 装 着 されたかのように 全 VMEメモリ 空 間 への 透 過遃 的 なアクセス、VMEカードへの 割 り 込 みレベルでの 制 御 や応 答 を 可 能 にします。<strong>RedHawk</strong> <strong>Linux</strong>は、SBSテクノロジー 社 のPCI-to-VMEバス・アダプター Model 618-3およびModel620-3のサポートを 含 みます。このアダプターを 使 用 することで、メモリが2つのシステム 間 で 共有 されます。メモリ・マッピングとダイレクト・メモリ・アクセス(Direct Memory Access : DMA)の2つのメソッドが 利 用 されています。メモリ・マッピングはどちらのシステムからの 双 方 向 ランダム・アクセス・バス・マスタリングをサポートします。これはVMEバスRAM、デュアルポート・メモリ、VMEバスI/OへのプログラムI/Oアクセスを 可 能 にします。 各 システム 上 のバス・マスターは、それぞれのアドレス 空 間 内 のウィンドウから 他 のシステムのメモリにアクセスすることが 可 能 です。マッピング・レジスタは、PCIデバイスが 最 大 32MBのVMEバスのアドレス 空 間 へのアクセス、VMEバス・デバイスが 最 大 16MBのPCI 空 間 へのアクセスを 可 能 にします。コントローラ・モードDMAとスレーブ・モード・DMAの2つのDMA 技 術 がサポートされています。コントローラ・モードDMAは、あるシステムのメモリから 直 接 他 のシステムのメモリへの 高速 データ 転 送 を 提 供 します。データ 転 送 はどちらのプロセッサでも 最 大 35MB/ 秒 および 最 大16MB/ 転 送 の 速 度 により 両 方 向 で 開 始 することが 可 能 です。自 身 のDMAコントローラを 持 つVMEバス・デバイスは、コントローラ・モードDMAの 代 わりにスレーブ・モードDMAを 使 用 することが 可 能 です。これはVMEバス・デバイスが15MB/ 秒 を 越 えるデータ 転 送 速 度 で 直 接 PCIメモリへデータ 転 送 することを 可 能 にします。アダプターは、PCIアダプター・カード、VMEバス・アダプター・カード、 光 ファイバー・ケーブルの3つのパーツで 構 成 されます。PCIアダプター・カードはブート 時 に 自 分 自 身 で 構 成 します。A32メモリとI/Oアクセスに 対 応 および 生 成 し、D32, D16, D8のデータ 幅 をサポートします。VMEバス・アダプター・カードはジャンパーを 介 して 構 成 されます。VMEバス・アダプター・カードはA32, A24, A16アクセスに 対 応 および 生 成 し、D32, D16, D8のデータ 幅 をサポートします。アダプターをサポートするソフトウェアは、<strong>RedHawk</strong> <strong>Linux</strong> 下 で 実 行 および 最 適遚 化 のために 改 良されたSBS <strong>Linux</strong>モデル 1003 PCIアダプター・サポート・ソフトウェアVer.2.2を 含 みます。このソフトウェアはデュアル・ポートおよび/またはアプリケーションからリモート・メモリ 空 間 をアクセスすることが 可 能 なデバイス・ドライバ、アダプターおよびシステム 構 成 と 共 にアプリケーション・プログラマーに 役 立 つプログラム 例 を 含 みます。15-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>文 書 15本 章 では<strong>RedHawk</strong> 下 で 本 サポートを 構 成 および 使 用 するために 必 要 な 情 報 を 提 供 します。本 章 の 範 囲 を 超 える 情 報 については、<strong>RedHawk</strong> <strong>Linux</strong>の 文 書 に 含 まれている 以 下 の 文 書 を 参 照 して 下 さい:• SBS Technologies Model 618-3, 618-9U & 620-3 Adapters Hardware Manual (sbs_hardware.pdf)• SBS Technologies 946 Solaris, 965 IRIX 6.5, 983 Windows NT/2000, 993 VxWorks & 1003 <strong>Linux</strong>Support Software Manual (sbs_software.pdf)ハードウェアのインストール 15開 梱 15アダプターは、PCIアダプター・カード、VMEバス・アダプター・カード、 光 ファイバー・ケーブルの3つのパーツで 構 成 されます。それらをインストールするための 手 順 を 以 下 のとおりです。通 常 、ハードウェアの 取 り 付 けと 構 成 はConcurrent 社 により 行 われます。この 情 報 は、PCI-to-VMEブリッジが 製 造造 後 のシステムへ 追 加 されるような 状 況 のために 提 供 されます。輸 送 箱 から 装 置 を 開 梱 するとき、 内 容 明 細 書 を 参 照 し 全 てのアイテムがあることを 確 認 して 下 さい。 梱 包 材 料 は 装 置 の 保 管 および 再 出 荷 のために 残 しておいて 下 さい。NOTEもし 輸 送 箱 が 受 領 時 に 破 損 している 場 合 、 開 梱 および 装 置 の 検 品 中 は 遀送 業 者 が 立 ち 会 うよう 要 請 して 下 さい。システムにカードを 取 り 付 けようとする 前 に 以 下 を 読 んでください:CAUTION静 電 気 の 放 電 が 回 路 に 損 害 を 与 える 可 能 性 があるため、 集 積 回 路 面 に 触れることは 避遪 けて 下 さい。プリント 基 板 を 取 り 付 けおよび 取 り 外 す 時 は 静 電 気 防 止 のリスト・ストラップと 導 電 フォーム・パッドを 使 用 することを 強 く 推 奨 します。15-2


PCI-to-VMEサポートアダプター・カードの 設 定 15PCIアダプター・カード 上 に 設 定 するためのジャンパーはありません。VMEアダプター・カードのジャンパーの 設 定 は、VMEアダプター・カードを 取 り 付 ける 前 、またはVMEアダプターカードのジャンパーにより 制 御 されているVMEバス 属 性 の 現 在 の 設 定 を 変 更する 必 要 になった 時 に 行 う 必 要 があります。VMEバス・アダプター・カードの 構 成 に 関 する 情 報 については、「SBSテクノロジー・ハードウェア・マニュアル」の10 章 を 参 照 して 下 さい。 以 下 の 追 加 情 報 は 役 に 立 つかもしれません:• このVMEアダプター・カードがスロット1でシステム・コントローラとして、または 他 のVMEスロットで 非 システム・コントローラとして 使 用 されているのかどうかに 基 づき、システムのジャンパーは 適遚 切 に 設 定 される 必 要 があります。•VMEバス 上 のデバイスにVMEスレーブ・ウィンドウを 通 してiHawkシステムのメモリへアクセスさせるbt_bind()バッファ・サポートもしくはローカル・メモリ・デバイス・サポート(BT_DEV_LM)を 使 用 するために、リモートREM-RAM HIおよびLOジャンパーはVMEバス 上のVMEバス・ベース・アドレスとVMEスレーブ・ウィンドウ 出 力 の 範 囲 を 知 らせるために設 定 する 必 要 があります。ベース・アドレスは16MB 境 界 に 置 く 必 要 があり、そしてこの 領 域 のサイズはSBSハードウェア( 例 えば、0xC0000000から0xC1000000の 範 囲 のA32アドレスを 設 定 するためジャンパーを 以下 の 設 定 に 構 成 する 必 要 があります)でサポートされている 領 域 の 総 量 を 利 用 するために 一般 的 には16MB(を 超 えないサイズ)に 設 定 される 必 要 があります。A32アドレス 範 囲 を 設 定 するため、REM-RAMの 下 部邪 のジャンパーは 次 のように 設 定 する 必要 があります:A32ジャンパー:INA24ジャンパー:OUT開 始 アドレス0xC0000000を 指 定 するため、LOアドレスREMRAMジャンパーの 列 は 次 のように 設 定 する 必 要 があります:31, 30ジャンパー:OUT他 全 てのLOジャンパー:IN (16-29)終 了 アドレス0xC1000000を 指 定 するため、HIアドレスREMRAMジャンパーの 列 は 次 のように 設 定 する 必 要 があります:31, 30, 24ジャンパー:OUT他 全 てのHIジャンパー:IN (29-25, 23-16)15-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>PCIアダプター・カードのインストール15お 手 持 ちのiHawkシステムにPCIアダプターを 取 り 付 けるために 以 下 の 手 順 を 使 用 して 下 さい:1. iHawkシステムがパワー・ダウンされていることを 確 認 して 下 さい。2. バス・マスターをサポートする 筐 体 内 の 空 いているPCIカード・スロットを 確 認 します。3. 筐 体 背 面 のケーブル 出 口 を 覆 う 金 属 板 を 取 り 外 します。4. コネクタにPCIアダプター・カードを 差 し 込 みます。5. アダプター・カードを 取 り 付 けねじで 所 定 の 位 置 に 固 定 します。6. カバーを 元 の 位 置 に 戻 します。VMEバス・アダプター・カーバス・アダプター・カードのインストール15NOTEVMEバス・バックプレーンはデイジー・チェーン、バス・グラント、 未使 用 カード 一 周 辺 の 割 り 込 みACK 信 号 を 接 続 するためのジャンパーを 持っています。これらのジャンパーはアダプター・カードが 差 し 込 まれるスロットから 取 り 外 されていることを 確 認 して 下 さい。1. VMEバス 筐 体 がパワー・ダウンされていることを 確 認 して 下 さい。2. VMEバス・アダプター・カードがシステム・コントローラかどうかを 決 定 します。もしVMEバス・アダプター・カードがシステム・コントローラの 場 合 、スロット1へ 差 し 込 む 必 要 があります。もしアダプター・カードがシステム・コントローラではない 場 合 、そのアダプター 用 にVMEバス・カード・ケージで 未 使 用 の6Uスロットを 決 めて 下 さい。3. 遥 択 したスロットのコネクタへカードを 差 し 込 みます。アダプター・ケーブルの 接 続 15NOTE光 ファイバー・ケーブルの 端 はきれいな 状 態 にしておいて 下 さい。 塵 や埃 のような 小 さな 汚 染 物 質 を 取 り 除 くためにアルコール・ベースの 光 ファイバ・ワイプを 使 用 して 下 さい。光 ファイバー・ケーブルはガラスで 作 られていますので、 半 径 2インチ 以下 のループに 潰 すまたは 曲 げた 場 合 はそれらは 破 損 する 可 能 性 があります。1. iHawkコンピュータ・システムとVMEバス 筐 体 がパワーOFFであることを 確 認 して 下 さい。2. 光 ファイバー・トランシーバのゴム 製 ブーツ、 同 様 に 光 ファイバー・ケーブルのそれも 取 り外 します。ケーブルが 使 用 されていない 時 はそれらのブーツを 確 実 に 元 に 戻 して 下 さい。15-4


PCI-to-VMEサポート3. 光 ファイバー・ケーブルの 一 端 をPCIアダプター・カードのトランシーバへ 接 続 します。4. 光 ファイバー・ケーブルのもう 片 方 をVMEバス・アダプター・カードのトランシーバへ 接続 します。5. PCIとVMEバス・システムの 両 方 の 電 源 を 入 れて 下 さい。6. 両 アダプター・カードのREADYのLEDが 点 灯 していることを 確 認 して 下 さい。アダプターを 操 作 するためにON である 必 要 があります。ソフトウェアのインストール 15ソフトウェアは<strong>RedHawk</strong> <strong>Linux</strong>と 一 緒 に 納 品 されるオプションのプロダクトCDに 収 納 されています。これはinstall-sbsvmeインストール・スクリプトを 使 いインストールします。ソフトウェアをインストールするため、 以 下 の 手 順 を 実 行 します:1. <strong>RedHawk</strong>バージョン2.1 以 降 が 動 作 しているiHawkシステム 上 に、ルートでログインし、シングル・ユーザー・モードへシステムをダウンして 下 さい:a. デスクトップ 上 で 右 クリックし、「New Terminal」を 遥 択 します。b. システム・プロンプトで「init 1」と 入 力 します。2. “<strong>RedHawk</strong> <strong>Linux</strong> PCI-to-VME Bridge Software Library” というラベルのディスクを 見 つけ、CD-ROMドライブへ 挿 入 します。3. CDROMデバイスをマウントするため、 以 下 のコマンドを 実 行 します:NOTE: 以 下 の 例 では/media/cdromが 使 用 されています。お 手 持 ちのシステムに 取 り 付 けられたドライブの 型 式 に 応 じて、 実 際 のマウント・ポイントは 異 なる 可 能 性 があります。 正しいマウント・ポイントについては/etc/fstabを 確 認 して 下 さい。mount /media/cdrom4. インストールするため、 以 下 のコマンドを 実 行 して 下 さい:cd /media/cdrom./install-sbsvmeインストール・スクリプトが 完 了 するまで 画 面 上 の 指 示 に 従 ってください。5. インストールが 完 了 したら、 以 下 のコマンドを 実 行 して 下 さい:cd /umount /media/cdromeject6. CD-ROMドライブからディスクを 取 り 出 し、 保 管 して 下 さい。シングル・ユーザー・モードを 抜 けます(Ctrl-D)。15-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>構 成 15btpモジュールモジュール15後 述 のセクションで<strong>RedHawk</strong> <strong>Linux</strong> 下 のモジュール 構 成 およびシステム 初 期 化 時 に 確 立 される 可能 性 のある 他 の 属 性 について 説 明 します。事 前 に 定 義 された<strong>RedHawk</strong>カーネルは、デフォルトのモジュールとして 構 成 されたSBSテクノロジーのPCI-to-VMEバス・ブリッジを 持 っています。もし 望 むのであれば、カーネル 構 成 GUI 上 の「Device Drivers -> SBS VMEbus-to-PCI Support」 項 目 においてSBSVMEオプションを 通 してこれを 無 効 にすることが 可 能 です。このモジュールは“btp”と 呼 ばれています。デバイス・ファイルおよびモジュール・パラメータ 仕 様 15/dev/btp*デバイス・ファイルは、/etc/init.d/sbsvmeを 介 して 初 期 化 時 に 作 成 されます。これらのファイルの 属 性 は、/etc/sysconfig/sbsvmeの 中 で 定 義 されています。 更 に、 以 下 のモジュール・パラメータの 仕 様 はこのファイルで 作 ることが 可 能 です。 既 定 値 ではパラメータはありません。btp_major=numicbr_q_size=sizeメジャー・デバイス 番 号 (num)を 指 定 します。デフォルトは、カーネルが 遥 択 することが 可 能 な0(ゼロ)となります。もしゼロ 以 外 のデバイス 番 号 を 提 供 する 場 合 、それは 既 に 使 用 中 であってはいけません。/proc/devicesファイルは、どのデバイスが 現 在 使 用 されているかを判 断 するために 調 べることが 可 能 です。割 り 込 みキューに 割 り 当 てられるICBRエントリの 数 (size)を 指 定 します。 一 旦 設 定 すると、この 値 はbtpドライバのアンロードおよびリロードなしに 変 更 することは 出 来 ません。 既 定 値 は 割 り 込 みキュー 空 間から1KBです。lm_size=size1, size2, ...システムに 存 在 する 各 SBS PCI-to-VMEコントローラ(unit)に 対 しローカル・メモリ(BT_DEV_LM)・サイズの 配郤 列 をバイトで 指 定 します。もしこの 値 に0(ゼロ)が 設 定 された 場 合 、ローカル・メモリはそれを 指定 したユニットだけ 無 効 にされます。 既 定 値 はローカル・メモリから64KBで 最 大 値 が4MBとなります。 詳 細 については 本 章 の「ローカル・メモリ」セクションを 参 照 して 下 さい。trace=flag_bitsデバイス・ドライバのトレース・レベルを 指 定 します。これはどのトレース・メッセージをbtpドライバが 表 示 するかを 制 御 するために 使用 されます。 使 用 可 能 なビットは/usr/include/btp/btngpci.hにあるBT_TRC_xxxの 値 です。トレースは 性 能 に 影 響 を 及 ぼすため、この 機能 はbtpドライバの 問 題 をデバッグするためだけに 使 用 すべきです。既 定 値 はトレース・メッセージなしの0(ゼロ)です。以 下 はbtpモジュール・パラメータ 仕 様 の 例 です:BTP_MOD_PARAMS=’bt_major=200 trace=0xff lm_size=0’BTP_MOD_PARAMS=’icbr_q_size=0x1000 lm_size=0x8000,0x4000’15-6


PCI-to-VMEサポートVMEバス・マッピング15PCI-to-VMEバス・マッピングの 自 動 的 な 作 成 および 削 除 のサポートは/etc/init.d/sbsvme 初 期 化スクリプトに 含 まれています。マッピングが/etc/sysconfig/sbsvme-mappingsに 定 義 されている 場 合 、“/etc/init.d/sbsvme start” の 処 理 中 に 作 成 され、“stop” の 処 理 中 に 削 除 されます。/etc/sysconfig/sbsvme-mappingsファイルはVMEバス・マッピング 作 成 のためのヘルプ 情 報 とコマンド 出 力 テンプレートを 含 みます。 必 要 であれば、テンプレートの 例 はカスタマイズされたVMEバス・マッピングを 作 成 するために 使 用 することが 可 能 です。sbsvme-mappingsファイル内 のコメントおよび 本 章 で 後 述 する「/procファイル・システム・インターフェース」セクションで 説 明 されている/proc/driver/btp/unit/vme-mappingsファイルに 書 き 込 まれている 値 により、マッピングは 作 成 されます。システム 初 期 化 中 にPCI-to-VMEバス・マッピングを 作 成 するためにsbsvme-mappingsファイルを 使 用 することで、VMEバス 空 間 へバインドするグローバル・ビジブル 共 有 メモリ 領 域 を 作 成 するshmconfig(1)を 呼 び 出 すために/etc/rc.d/rc.localスクリプトへ 追 加 の 行 をセットすることが 可能 です。これを 説 明 するサンプル・スクリプトが 提 供 されています。 詳 細 については「アプリケーション 例 」セクションを 参 照 して 下 さい。ユーザー・インターフェース 15標 準 サポートソフトウェアへのいくつかの 修 正 が<strong>RedHawk</strong> <strong>Linux</strong> 用 に 行 われました。インストールの 変 更 に 加 え、 以 下 が 追 加 されました。• 複 数 の 様 々なサイズのバッファのバインドをサポート。 複 数 のユーザー・レベル・ドライバを 持 つシステムで、この 機 能 は 各 ドライバが 複 数 のデバイス 間 で 共 通 のバインド・バッファを 共 有 する 代 わりにそれぞれのバインド・バッファを 割 り 当 てることを 可 能 にします。この機 能 は 複 数 の 大 きなバインド・バッファ(ハードウェアでサポートされているVMEバス・スレーブ・ウィンドウ 空 間 から 合 計 16MBの 領 域 )を 割 り 当 てることにより 利 用 できることも 意味 します。 詳 細 については「バインド・バッファの 実 装 」セクションを 参 照 して 下 さい。プログラム 例 は、VMEバス 空 間 へ 複 数 のバッファの 割 り 当 ておよびバインドする 手 順 が 追 加 されています(「アプリケーション 例 」セクションを 参 照 して 下 さい)。• 特 定 のプロセスと 結 びついていないVMEバス 空 間 マッピングの 作 成 と 削 除 、および 共 有 メモリのバインドを 許 可 するためにそのマッピングのPCIバス・アドレス 開 始 位 置 の 取 得 をサポート。これは 次 の2つのいずれかで 遉 成 することが 可 能 です:- bt_hw_map_vme/bt_hw_unmap_vmeライブラリ 関 数 の 使 用- to the /proc/driver/btpファイル・システムへの 書 き 込 み詳 細 については「VMEバス 空 間 へのマッピングおよびバインド」セクションを 参 照 して 下 さい。プログラム 例 は、 両 方 の 方 法 を 使 いVMEバス・マッピングの 作 成 、 表 示 、 削 除 の 手 順 を示 しています(「アプリケーション 例 」セクションを 参 照 して 下 さい)。15-7


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>API 機 能 15表 15-1はlibbtpライブラリに 含 まれているAPI 関 数 を 記 載 しています。 修 正 されたもしくは 追 加 された 関 数 は 後 に 続 くセクションで 言 及 および 説 明 されています。 残 りの 関 数 は<strong>RedHawk</strong> <strong>Linux</strong>の文 書 に 含 まれているSBSテクノロジー・ソフトウェアのマニュアルに 記 載 されています。表 15-1 PCI-to-VMEライブラリ 関 数関 数概 要bt_str2dev文 字 列 から 論 理 デバイスへ 変 換bt_gen_nameデバイス 名 を 生 成bp_openアクセス 用 に 論 理 デバイスをオープンbt_close論 理 デバイスをクローズbt_chkerrユニット 上 のエラーをチェックbt_clrerrユニット 上 のエラーをクリアbt_perrorエラー・メッセージをstderrに 出 力bt_strerrorエラー・メッセージの 文 字 列 を 作 成bt_init Initializeユニットの 初 期 化bt_read論 理 デバイスからデータの 読 み 取 りbt_write論 理 デバイスへデータの 書 き 込 みbt_get_infoデバイスの 構 成 設 定 を 取 得 ( 以 下 のNote の 1を を 参 照 )bt_set_infoデバイスの 構 成 設 定 を 設 定 ( 以 下 のNote の 1を を 参 照 )bt_icbr_install割 り 込 みコール・バック・ルーチンをインストールbt_icbr_remove割 り 込 みコール・バック・ルーチンを 削 除bt_lockユニットのロックbt_unlock以 前 ロックしたユニットをアンロックbt_mmap論 理 デバイスへメモリ・マッピングしたポインタを 作 成bt_unmmapメモリ・マッピングした 場 所 をアンマップbt_dev2str論 理 デバイス・タイプを 文 字 列 へ 変 換bt_ctrlドライバI/O 制 御 関 数 を 直 接 呼 出 しbt_bindアプリケーション 提 供 バッファをバインド( 以 下 のNote の 1を を 参 照 )bt_unbindバインドしたバッファをアンバインド( 以 下 のNote の 1を を 参 照 )bt_reg2strレジスタを 文 字 列 へ 変 換bt_casアトミック 処 理 の 比 較 とスワップ( 次 ページに 続 きます)Note:1. 複 数 の 様 々なサイズのバッファはこれらの 関 数 を 通 してサポートされています:「バインド・バッファの 実 装 」セクションを 参 照 して 下 さい。2. このPCI-to-VME のマッピング/バインドのサポートはユニークです: 本 章 の「VMEバス空 間 へのマッピングおよびバインド」セクションを 参 照 して 下 さい。15-8


PCI-to-VMEサポートバインド・バッファの 実 装 15表 15-1 PCI-to-VMEライブラリ 関 数 ( 続 き) き関 数概 要bt_tasアトミック 処 理 のテストおよび 設 定bt_get_ioアダプターのCSRレジスタの 読 み 取 りbt_put_ioアダプターのCSRレジスタの 書 き 込 みbt_or_ioレジスタへ1 回 書 き 込 みbt_resetリモートでVMEバスをリセットbt_send_irq離 れたVMEバスに 割 り 込 みを 送 信bt_statusデバイスのステータスを 返 すbt_hw_map_vme PCI-to-VMEバス・マッピングの 作 成 ( 以 下 のNote の 2を を 参 照 )bt_hw_unmap_vme PCI-to-VMEバス・マッピングを 削 除 ( 以 下 のNote の 2を を 参 照 )Note:1. 複 数 の 様 々なサイズのバッファはこれらの 関 数 を 通 してサポートされています:「バインド・バッファの 実 装 」セクションを 参 照 して 下 さい。2. このPCI-to-VME のマッピング/バインドのサポートはユニークです: 本 章 の「VMEバス空 間 へのマッピングおよびバインド」セクションを 参 照 して 下 さい。<strong>RedHawk</strong> sbsvmeのバインド・バッファのサポートは、VMEバス 空 間 に 同 時 に 複 数 、サイズが 異 なるカーネルのバインド・バッファを 割 り 当 てるため、bt_mmap()およびbt_bind()を 許 可 します。このセクションでは、SBSテクノロジー・ソフトウェア・マニュアルのバインド・バッファに 関 する 資 料 とはサポートがどのように 異 なるかを 含 め、このバインド・バッファのサポートに 関 する情 報 を 提 供 します。SBSの 資 料 と<strong>RedHawk</strong>バインド・バッファの 実 装 との 間 で 唯 一 ユーザー・インターフェースが 異なるのは、 後 述 されているbt_set_info() BT_INFO_KFREE_BUF 呼 び 出 しにおける‘value’ パラメータの 使 い 方 であることに 注 意 して 下 さい。 他 のユーザー・インターフェース 全 てはSBSテクノロジー・ソフトウェア・マニュアルで 示 すのと 同 じとなります。bt_get_info BT_INFO_KMALLOC_BUF 15概 要bt_error_t bt_get_info(bt_desc_t btd, BT_INFO_KMALLOC_BUF,bt_devdata_t *value_p)複 数 のbt_get_info() BT_INFO_KMALLOC_BUFコマンドの 呼 び 出 しは、それぞれが 返 すバッファのアドレス、value_pパラメータの 位 置 に 格 納 されている 複 数 のカーネル・バッファを 割 り 当 てることが 可 能 となり、VMEバスへそのバッファをマッピングおよびバインドするためにその 後bt_mmap()やbt_bind()の 呼 び 出 しを 使 用 することが 可 能 になります。BT_INFO_KMALLOC_BUF 呼 び 出 しは、 最 後 に 成 功 したbt_set_info() BT_INFO_KMALLOC_SIZ 呼び 出 しで 設 定 した 最 後 の 値 と 等 しいサイズのカーネル・バインド・バッファを 割 り 当 てます。(もしBT_INFO_KMALLOC_BUF 呼 び 出 しがされた 時 にそのような 呼 び 出 しがされなかった 場 合 、64KBのデフォルト・サイズが 使 用 されます。)15-9


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>最 大 BT_KMALLOC_NBUFS (16)のカーネル・バッファは、BT_INFO_KMALLOC_BUFコマンドの呼 び 出 しにより 同 時 に 割 り 当 てることが 可 能 です。もしこれらが 既 に16 個 のバインド・バッファを 割 り 当 てられていた 場 合 、このBT_INFO_KMALLOC_BUF 呼 び 出 しは 失 敗 してBT_EINVALのエラー 値 を 返 します。もしbt_set_info() BT_INFO_KMALLOC_SIZ 呼 び 出 しがバインド・バッファのサイズをゼロへ 設 定するために 使 用 される 場 合 、 新 しいバインド・バッファのサイズがbt_set_info()BT_INFO_KMALLOC_SIZ 呼 び 出 しを 介 して 非 ゼロの 値 に 設 定 されるまで、その 後 に 続 くBT_INFO_KMALLOC_BUF 呼 び 出 し 全 てはBT_EINVALのエラー 値 と 共 に 返 されることに 注 意 して 下 さい。もしカーネルが 新 しいカーネル・バインド・バッファ 用 に 十 分 な 空 間 を 割 り 当 てることが 出 来 ない 場 合 、このBT_INFO_KMALLOC_BUF 呼 び 出 しは 失 敗 し、BT_EINVALのエラー 値 を 返 します。bt_set_info BT_INFO_KMALLOC_SIZ 15概 要bt_error_t bt_set_info(bt_desc_t btd, BT_INFO_KMALLOC_SIZ,bt_devdata_t value)bt_set_info() BT_INFO_KMALLOC_SIZコマンドが 新 しいバインド・バッファのサイズを 設 定 するために 使 用 される 場 合 、そのコマンドは 将 来 のbt_get_info() BT_INFO_KMALLOC_BUFコマンドの 呼 び 出 しに 影 響 を 及 ぼすだけです。 異 なるバインド・バッファのサイズで 既 に 割 り 当 てられたどのカーネル・バインド・バッファも 新 しいBT_INFO_KMALLOC_SIZにより 影 響 を 受 けることはありません。このようにして、 異 なるサイズのカーネル・バインド・バッファは1 回 以 上 のbt_get_info()BT_INFO_KMALLOC_BUF 呼 び 出 しを 行 った 後 、 異 なるBT_INFO_KMALLOC_SIZ ’value’パラメータを 使 用 することによって 割 り 当 てることが 可 能 となります。2のべき 乗 の’value’ パラメータでバインド・バッファのサイズを 使 用 することを 推 奨 しますが、必 須 ではありません。カーネル・バインド・バッファ 割 り 当 ては2のべき 乗 に 切 り 上 げるため、2のべき 乗 の’value’ パラメータ 値 の 指 定 および 使 用 は 割 り 当 てられたカーネル・バインド・バッファの 使 用 されていない 領 域 を 排 除 します。カーネル・バインド・バッファのサイズの 初 期 既 定 値は64KBです。通 常 、bt_get_info() BT_INFO_KMALLOC_BUF 呼 び 出 しで 割 り 当 てに 成 功 することが 可 能 なカーネル・バインド・バッファの 最 大 サイズは4MBです。しかしながら、システムの 物 理 メモリ 量 およびシステムメモリの 使 用 状 況 に 依 存 しますので、4MBのカーネル・バインド・バッファを 正 常に 割 り 当 てることが 常 に 可 能 ではない 場 合 があります。この 場 合 、 複 数 のより 小 さなサイズのバインド・バッファを 割 り 当 てること、あるいは、システム・メモリを 他 に 使 用 してメモリ・リソースを 使 い 果 たす 前 に4MBのカーネル・バインド・バッファを 割 り 当 てることが 可 能 です。bt_set_info BT_INFO_KFREE_BUF 15概 要bt_error_t bt_set_info(bt_desc_t btd, BT_INFO_KFREE_BUF, bt_devdata_tvalue)bt_set_info() BT_INFO_KFREE_BUFコマンドのインターフェースは、SBSテクノロジー・マニュアルに 記 述 されていることと<strong>RedHawk</strong>の 下 ではわずかに 異 なります。15-10


PCI-to-VMEサポート具 体 的 には、’value’ パラメータはSBSの 実 装 では 使 用 されませんが、<strong>RedHawk</strong>の 実 装 では 以 下 の方 法 でそのパラメータを 使 用 します:’value’ パラメータがゼロの 場 合 :この 呼 び 出 しは、 現 在 ユーザー 空 間 からbt_mmap()されていない 全 ての カーネル・バインド・バッファをアンバインドおよび 解 放 します。もしアンバインドよび 解 放 数 r 事 が 可 能 なバインド・バッファが 見 つからない 場 合 、この 呼 び出 しは 失 敗 し、 呼 び 出 し 元 へBT_EINVALが 返 されます。’value’ パラメータがゼロではない 場 合 :バインド・バッファの 追 加 情 報 15bigphysareaパッチパッチ15btpモジュモジュールのアンロードールのアンロード15この 呼 び 出 しは 特 定 のカーネル・バインド・バッファを1つだけアンバインドおよび 解 放 するためのものです。この 場 合 、 呼 び 出 し 元 の’value’ パラメータは、 以 前 のbt_get_info()BT_INFO_KMALLOC_BUF 呼 び 出 しで’value_p’ パラメータに 返 されたカーネル・バッファのアドレスと 同 じである 必 要 があります。もしこの 呼 び 出 しの’value’ パラメータに 指 定 したバッファのアドレスが 有 効 なカーネル・バインド・バッファと 一 致 しない 場 合 、この 呼 び 出 しは 失 敗 してBT_EINVALのエラー 値 を 返 します。もしこの 呼 び 出 しの’value’ パラメータが 有 効 なカーネル・バインド・バッファと 一 致 していても 現 在 そのバッファがユーザー 空 間 からbt_mmap()されている 場 合 、この 呼 び 出 しは 失 敗 してBT_EFAILの 値 が 返 されます。この 場 合 、この 呼 び 出 しが 成 功 する 前 にそのバッファをまずbt_unmmap()する 必 要 があります。以 降 のセクションではバインド・バッファのサポートが<strong>RedHawk</strong>の 下 で 影 響 を 及 ぼす 更 なる 領 域について 説 明 します。SBSテクノロジー・ソフトウェア・マニュアルに 明 記 されているbigphysareaパッチは、<strong>RedHawk</strong>sbsvme btpデバイス・ドライバでサポートされていないもしくは 必 要 とされていません。 複 数 の大 きなバインド・バッファを 使 用 することによって、VMEバスからiHawkのメモリへアクセスするためにVMEバス・スレーブ・ウィンドウ 空 間 の16MB 全 てをサポートすることが 可 能 です。sbsvme ’btp’ カーネル・モジュールは、 現 在 プロセスのアドレス 空 間 にbt_mmap()されたどのカーネル・バインド・バッファも 存 在 する 間 はアンロードすることが 出 来 ません。カーネル・ドライバ・モジュールがアンロードされる 前 にプロセスはまずbt_unmmap() 呼 び 出 しにてカーネル・バインド・バッファへのマッピングを 削 除 する 必 要 があります。現 在 ユーザー 空 間 からbt_mmap()されたバインド・バッファが 存 在 しない 場 合 、btpカーネル・モジュールは“/etc/init.d/sbsvme stop” コマンドにてアンロードすることが 可 能 で、 現 在 割 り 当 てられているどのカーネル・バインド・バッファも( 現 在 バインドされている 場 合 は)ハードウェアVMEバス・スレーブ・ウィンドウ 空 間 から 暗 黙 のうちにアンロードされ、 将 来 のカーネル・メモリ 割り 当 てのために 解 放 されます。15-11


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>bt_bind rem_addr_pパラメータパラメータ15ローカル・メモリ 15bt_bind() 呼 び 出 しの’rem_addr_p’ パラメータは 呼 び 出 し 元 がカーネル・バインド・バッファをバインドしたい 遠遒 隔 のVMEバス・スレーブ・ウィンドウ 内 のオフセットを 指 定 します。この 値 はオフセットであり、 絶 対 的 なVMEバスの 物 理 アドレスではないことに 注 意 して 下 さい。このオフセット 値 は、SBS VMEアダプター・カード 上 にあるREM-RAM LOのジャンパー 設 定 により 定 義 されたVMEバスアドレスの 基 点 からとなります。実 際 の’rem_addr_p’ オフセット 値 を 指 定 、もしくは’rem_addr_p’ パラメターにBT_BIND_NO_CARE 値 を 使 用 してbtpドライバに 適遚 切 なバインド・アドレス 位 置 を 見 つけさせることのどちらでも 可 能 です。この 値 が 使 われる 場 合 、bt_bind() 呼 び 出 しから 正 常 に 戻 った 時の’rem_addr_p’ メモリ 位 置 はカーネルbtpドライバがバインド・バッファにバインドしたオフセット 値 を 含 みます。例 として、もしREM-RAM LOのジャンパー 設 定 が0xC0000000の 値 に 設 定 されオフセット 値 が0x10000の 場 合 、VMEバスからアクセス 可 能 なこのバッファの 実 際 のバインド・アドレスは0xC0010000となるでしょう。カーネル・バインド・バッファのサポートとは 別 に、btpドライバもまたローカル・メモリのコンセプトをサポートします。バインド・バッファ 機 能 のために 通 常 使 用 されるBT_DEV_A32,BT_DEV_A24, 他 のVMEバス・デバイス・タイプの 変 わりにBT_DEV_LMデバイス・タイプの 使用 を 通 じてこの 機 能 が 利 用 可 能 となります。ローカル・メモリ・バッファは、btpドライバがロードされた 時 にVMEバス・スレーブ・ウィンドウ 領 域 へ 割 り 当 たられバインドされたローカルiHawkメモリから 構 成 されます。このメモリの 割り 当 てとバインドはbtpドライバがロードされている 限 り 実 施 されたままとなります。もしbtpドライバが“/etc/init.d/sbsvme stop” コマンドによりアンロードされた 場 合 、このローカル・メモリ・バッファはVMEバス 空 間 からアンロードされ、 他 のカーネルで 使 用 するために 解 放 されます。ローカル・メモリ・バッファは、VMEアダプター・カード 上 のREM-RAM LOジャンパー 設 定 にて 定 義 されたとおりに 常 にVMEバス・スレーブ・ウィンドウの 底 辺 領 域 にバインドします。 例 えば、もしローカル・メモリのサイズが64KB、REM-RAM LOジャンパー 設 定 が0xC0000000の 値 へ設 定 された 場 合 、ローカル・メモリ・バッファは 物 理 VMEバス・アドレスの0xC0000000から0xC0000FFFまでのVMEバスへバインドされます。ローカル・メモリ・バッファは 常 にVMEバス・リモート・スレーブ・ウィンドウの 底 辺 領 域 を 占有 するため、カーネル・バインド・バッファはローカル・メモリ・サポートが 有 効 の 時 はいつでもこの 領 域 へバインドされるとは 限 らないことに 注 意 して 下 さい。 既 定 値 で、ローカル・メモリ・サポートは、(REM-RAM LOジャンパー 設 定 が16MBをカバーする 範 囲 に 設 定 されていると 仮 定 して)バインド・バッファ 用 に16 MB - 64 KB のVMEバス・スレーブ・ウィンドウ 空 間 を 残 して、64KBのローカル・メモリ・バッファ・サイズで 有 効 となっています。ローカル・メモリ・バッファのサイズは、/etc/sysconfig/sbsvme 構 成 ファイル( 本 章 の「 構 成 」セクションを 参 照 して 下 さい) 内 の’lm_size’ パラメータを 変 更 することにより 増 やすことが 可 能です。サポートされる’lm_size’ の 値 の 最 大 は4MBであることに 注 意 して 下 さい。もしより 大 きな値 が 指 定 された 場 合 、btpドライバのバッファ 割 り 当 ては 成 功 せず、ローカル・メモリ 機 能 はbtpドライバのロード 時 に 無 効 となります。ローカル・メモリ・サポートは、’lm_size’ btpモジュール・パラメータをゼロへ 設 定 することにより 無 効 にすることが 可 能 です。ゼロへ 設 定 した 場 合 、btpドライバはローカル・メモリ・バッファは 割 り 当 てず、VMEバス・スレーブ・ウィンドウ 領 域 全 体 はカーネル・バインド・バッファを 使用 するために 解 放 されます。15-12


PCI-to-VMEサポートローカル・メモリ・サポートは、バインド・バッファ・サポートととてもよく 似 ています:• ローカル・メモリとバインド・バッファの 両 方 が、スレーブ・ウィンドウ 領 域 を 通 してVMEバスからアクセスが 可 能 です。• ローカル・メモリとバインド・バッファの 両 方 のバッファ 領 域 は、bt_read(), bt_write(),bt_mmap() 関 数 を 使 用 する 時 に 適遚 切 なデバイス・タイプを 指 定 することによってアクセスすることが 可 能 となります。ローカル・メモリとバインド・バッファの 各 サポートでの 主 な 遊 いは:• 1つのローカル・メモリ・バッファ 領 域 だけが 存 在 する 可 能 性 があります。このバッファはbtpドライバのロード 時 に 設 定 され、ドライバがアンロードされるまで 割 り 当 ておよびバインドされたままとなります。対 照 的 に 複 数 の 異 なるサイズのバインド・バッファは 動 的 に 割 り 当 ておよびバインド、 動 的にアンバインドおよび 解 放 することが 可 能 です。• ローカル・メモリ・バッファは 常 にVMEバス・スレーブ・ウィンドウ 領 域 の 底 辺 を 占 有 します。対 照 的 にバインド・バッファのためにユーザーがVMEバス 空 間 へバインドさせる 各 バインド・バッファの 位 置 /オフセットのどちらも 指 定 すること、またはカーネルに 動 的 に 使 用 する次 の 空 いている 位 置 /オフセットを 見 つけさせることが 可 能 です。VMEバス 空 間 へのマッピングおよびバインド 15bt_hw_map_vme 15<strong>RedHawk</strong>は 特 定 のプロセスとは 関 係 なく、マッピングを 作 成 したプロセスが 終 了 した 後 もそのまま 残 るVMEバス 空 間 マッピングを 作 成 する 方 法 を 提 供 します。このマッピングは 単 独 で 作 成 および 削 除 することが、bt_hw_map_vmeとbt_hw_unmap_vmeライブラリ 機 能 を 通 して、または/procファイル・システム・インターフェースへ 書 き 込 むことでどちらも 可 能 となります。I/O 空 間 の 領 域 へこのセグメントをバインドするためにshmbind(2)またはshmconfig(1)を 使 い、アクティブVMEバス 空 間 マッピングに 対 応 する 一 意 のPCIバス 開 始 アドレスを 取 得 および 使 用 することが 可 能 となります。この 機 能 は 以 下 のセクションで 説 明 されています。この 関 数 は 新 しいPCI-to-VMEバス・マッピングを 作 成 します。概 要引 数bt_error_t bt_hw_map_vme(bt_desc_t btd, void **phys_addr_p,bt_devaddr_t vme_addr, size_t map_len, bt_swap_t swapping)btd 成 功 したbt_open() 関 数 呼 び 出 しから 返 されたデバイス 記 述 子 。phys_addr_pこのマッピングのためのローカルPCIバス 開 始 /ベース・アドレスが 返されるユーザー 空 間 の 位 置 。15-13


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>vme_addrmap_len開 始 /ベース・ターゲットVMEバスの 物 理 アドレス。このアドレスは4KBの 境 界 線 上 に 揃 えられている 必 要 があります。作 成 されるハードウェア・マッピングのサイズ。この 値 は4KBの 倍 数に 切 り 上 げれられます。戻 り 値swapping ハードウェア・マッピングに 使 用 するバイト・スワッピング 方 式 。/usr/include/btp/btngpci.hヘッダ・ファイルに 含 まれているBT_SWAP_xxx 定 義 を 使 用 することが 可 能 です。成 功 した 場 合 、BT_SUCCESSの 値 が 返 されます。phys_addr_p 位 置 に 返 されたPCIバスのアドレスは、リモートVMEバスアドレスのこの 範 囲 へアクセスするために 使 用 可 能 な 共 有 メモリ 領 域 を作 成 するためshmbind(2)またはshmconfig(1)を 使 用 することが 可 能 です。失 敗 した 場 合 、 失 敗 の 原 因 を 示 す 適遚 切 なbt_error_tの 値 が 返 されます:BT_EDESCBT_EINVALBT_ENXIOBT_ENOMEMBT_ENOMEM無 効 なbtd 記 述 子 が 指 定 された。 記 述 子 はデバイス・タイプBT_DEV_A32, BT_DEV_A24, BT_DEV_A16のbt_open() 呼 び 出 しから返 された 記 述 子 である 必 要 があります。無 効 なvme_addr, map_len, phys_addr_p, スワッピング・パラメータが 指 定 された。sbsvmeハードウェアがオンラインではない、または 正 しく 接 続 されていない。sbsvmeハードウェア・マッピング・レジスタが 必 要 とする 数 を 割 り 当てることが 出 来 なかった。このマッピングの 追 跡 に 使 用 されるカーネルデータ 構 造造 体 用 のメモリを 割 り 当 てることができなかった。bt_hw_unmap_vme 15この 関 数 はbt_hw_map_vme 関 数 で 既 に 作 成 されたまたは/proc/driver/btp/unit/vmemappingsファイルへの 書 き 込 みによるPCI-to-VMEバス・マッピングを 削 除 します。概 要bt_error_t bt_hw_unmap_vme(bt_desc_t btd, void *phys_addr)パラメータbtd 成 功 したbt_open() 関 数 呼 び 出 しから 返 されたデバイス 記 述 子 。phys_addr削 除 するVMEバス・マッピングのPCIバス 開 始 アドレス。15-14


PCI-to-VMEサポート戻 り 値成 功 した 場 合 、BT_SUCCESSの 値 が 返 されます。失 敗 した 場 合 、 失 敗 の 原 因 を 示 す 適遚 切 なbt_error_tの 値 が 返 されます:BT_EDESCBT_ENOT_FOUND無 効 なbtd 記 述 子 が 指 定 された。 記 述 子 はデバイス・タイプBT_DEV_A32, BT_DEV_A24, BT_DEV_A16のbt_open() 呼 び 出 しから返 された 記 述 子 である 必 要 があります。phys_addrパラメータで 指 定 されたマッピングが 存 在 しない。/procファイル・システム・インターフェースファイル・システム・インターフェース15VMEバス・マッピングの 表 示 15sbsvme btpカーネル・モジュールがロードされた 時 、 以 下 の/procファイルが 作 成 されます:/proc/driver/btp/unit/vme-mappingsunit はsbsvme PCIブリッジ・カードのユニット 番 号 です。 最 初 のカードはユニット 番 号 が0となります。 複 数 のブリッジを 持 つシステム 上 では、2 番 目 のカードはユニット 番 号 1となります。既 存 のPCI-to-VMEバス・マッピングはそのファイルの 読 み 取 りにより 見 ることが 可 能 です。マッピングはそのファイルへの 書 き 込 みにより 作 成 および 削 除 が 可 能 となります。これらのテクニックは 以 下 で 説 明 します。cat(1)を 使 ったvme-mappingsファイルの 読 み 取 りは、 現 在 確 立 された 全 てのVMEバス・マッピングを 表 示 します。 以 下 の 出 力 は2つのPCI-to-VMEバス・マッピングを 示 します:$ cat /proc/driver/btp/0/vme-mappingspci=0xf8019000 vme=0x00008000 size=0x0001000 space=A16 admod=0x2dswap=5pci=0xf8011000 vme=0x00fe0000 size=0x0008000 space=A24 admod=0x39swap=0pci=vme=size=space=admod=swap=マッピングが 開 始 されるローカルPCIバス・アドレスを 示 します開 始 VMEバス・アドレスを 示 しますマッピングのサイズ/ 長 さを 示 しますVMEバス・アドレス 空 間 のマッピングのタイプを 示 します/usr/include/btp/btdef.hに 定 義 されるBT_AMOD_xxx で 記 述 されたVMEバス・アドレス・モディファイアを 示 します/usr/include/btp/btngpci.h.に 定 義 されるBT_SWAP_xxx で 記 述 されたビット・スワップ 方 式 を 示 しますVMEバス・マッピングの 作 成 15VMEバス 空 間 へのマッピングはvme-mappingsファイルへの 書 き 込 みにより 作 成 することが 可能 です。このファイルへ 書 き 込 むためにはCAP_SYS_ADMIN 権 限 を 持 っている 必 要 があることに注 意 して 下 さい。マッピングを 作 成 するためには、 以 下 の3つのパラメータをここで 定 めた 順 番 で指 定 する 必 要 があります:vme=マッピングするためにページに 揃 えられた 開 始 VMEバス・アドレスを 指 定 します( 例 : 0xfffff000)15-15


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>size=space=マッピングのサイズ(ページの 倍 数 であること)を 指 定 します。( 例 :0x1000)sbsvmeハードウェアはマッピングが 合 計 で32MBのVMEバス 空 間 に 制 限 されていることに 注 意 して 下 さい。VMEバス・アドレス 空 間 のマッピングのタイプ(A32, A24, A16)を 指 定 します。以 下 のオプション・パラメータは、 上 述 の 必 須 パラメータに 続 いて 任 意 の 順 番 で 与 えることも 可能 です:admod=/usr/include/btp/btdef.hに 定 義 されるBT_AMOD_xxx で 記 述 されたVMEバス・アドレス・モディファイアを 指 定 します。もし 指 定 しない 場 合 、 以 下 のデフォルト 値 が 使 用 されます:BT_AMOD_32 0x0dBT_AMOD_24 0x3dBT_AMOD_16 0x2dswap=/usr/include/btp/btngpci.hに 定 義 されるBT_SWAP_xxx で 記 述 されるビット・スワッピング 方 式 を 指 定 します。もし 指 定 しない 場 合 、デフォルト 値 のBT_SWAP_DEFAULTが 使 用 されます。VMEバス・マッピングの 削 除 15以 下 の 例 は、vmemappingsファイルへの 書 き 込 みによる2つのVMEバス・マッピングの 作 成 を 示します。$ echo “vme=0xe1000000 size=0x10000 space=A32” >/proc/driver/btp/0/vme-mappings$ echo “vme=0xc0000000 size=0x1000 space=A32 swap=7 admod=0x9” >/proc/driver/btp/0/vme-mappingssbsvme btpカーネルドライバが“/etc/init.d/sbsvme stop” (「VMEbus Mappings」を 参 照 して 下 さい)にてアンロードされる 時 、 現 在 の 全 てのVMEバス・マッピングはドライバがアンロードされる 前に 削 除 されることに 注 意 して 下 さい。もしマッピングが 存 在 し、“modprobe -r btp”がドライバをアンロードするために 使 われた 場 合 、アンロードは 全 てのVMEバス・マッピングが 削 除 されるまで失 敗 します。VMEバス 空 間 へのマッピングは、vme-mappingsファイルにマッピングのローカルPCIバス 位 置を 書 き 込 むことにより 策 することが 可 能 です。このファイルへ 書 き 込 むためにはCAP_SYS_ADMIN 権 限 を 持 っている 必 要 があることに 注 意 して 下 さい。PCIバスの 位 置 はbt_hw_map_vme()およびvme-mappingsファイルのcatにより 返 されます。例 :$ cat /proc/driver/btp/0/vme-mappingspci=0xf8019000 vme=0x00008000 size=0x0001000 space=A16 admod=0x2dswap=5pci=0xf8011000 vme=0x00fe0000 size=0x0008000 space=A24 admod=0x39swap=0$ echo “pci=0xf8019000” > /proc/driver/btp/0/vme-mappings$ cat /proc/driver/btp/0/vme-mappingspci=0xf8011000 vme=0x00fe0000 size=0x0008000 space=A24 admod=0x39swap=015-16


PCI-to-VMEサポートアプリケーション 例 15プログラム 例 は、sbsvme btpデバイス・ドライバの 機 能 の 実 演 を 提 供 しその 利 用 を 促 進逭 します。それらは/usr/share/doc/ccur/examples/sbsvmeで 見 つけることが 可 能 です。そのプログラムは次 のために 便 利 なツールです:• デバッギング• バイナリ・データのアップロードおよびダウンロード• プログラム 化 した 割 り 込 みの 受 信 をよび 集 計• ハードウェアのテスト• VMEバス・マッピングの 作 成 および 共 有 メモリ 領 域 へのバインド表 15-2はプログラム 例 を 記 載 しています。アスタリスク(*)は<strong>RedHawk</strong> <strong>Linux</strong>に 加 えられたプログラムを 示 し、 続 くセクションで 説 明 されています。 他 のプログラムはSBSテクノロジー・ソフトウェア・マニュアルで 説 明 されています。表 15-2 PCI-to-VMEプログラム 例名 称概 要bt_bindリモートVMEバスへローカル・バッファをバインドし、ユーザー 入 力 を待 って、バインドしたバッファの 先 頭 256byteを 出 力 します。bt_bind_mult * リモートVMEバスへ 複 数 のローカル・バッファをバインドする 方 法 を 示します。 任 意 でユーザー 入 力 待 機 の 前 にローカル・バッファに 値 を 書 き 込みます。ユーザー 入 力 発 生 後 、 各 ローカル・バッファの 各 ページの 先 頭16byteを 出 力 します。使 用 される 関 数bt_bind()bt_unbind()bt_bind()bt_unbind()bt_bind_multsz * 複 数 の 異 なるサイズのバインド・バッファを 作 成 する 方 法 を 示 します。 bt_bind()bt_unbind()bt_cat'cat' プログラムに 似 ています。リモートVMEバスからの 読 み 取 りを 標 準出 力 (stdout)へ、または 標 準 入 力 (stdin)からリモートVMEバスへのデータ 書bt_read()bt_write()き 込 みを 可 能 にします。bt_datachk 特 定 のパターンを 使 いデバイスからの 読 み 書 きおよびデータまたはステータスのエラーが 発 生 していないことを 検 証 します。bt_read()bt_write()bt_dumpmem リモートVMEバスのデータ256byteを 読 み 取 り 標 準 出 力 へ 出 力 します。 n/abt_getinfo 全 ドライバのパラメータを 取 得 しそれらの 値 を 標 準 出 力 へ 表 示 するスクリプト。bt_hwmap * VMEバス・マッピングを 作 成 します。 bt_hw_map_vme()bt_hwunmap * VMEバス・マッピングを 削 除 します。 bt_hw_unmap_vme()bt_icbr 任 意 の 割 り 込 みタイプの 登 録 および 割 り 込 みを 受 信 します。 bt_icbr_install()bt_icbr_remove()bt_info ドライバのパラメータの 取 得 または 設 定 を 行 います。 bt_get_info()bt_set_info()bt_readmem リモートVMEバスのデータ256byteの 読 み 取 って 標 準 出 力 へ 表 示 します。 bt_read()bt_reset リモートVMEバスをリセットします。 bt_reset()( 次 ページへ 続 く)15-17


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>表 15-2 PCI-to-VMEプログラム 例 ( 続 き)き名 称概 要使 用 される 関 数bt_revsドライバのバージョンおよびハードウェアのファームウェア・バージョン bt_open()情 報 を 標 準 出 力 へ 出 力 します。bt_sendi リモート・バスへ 割 り 込 みを 送 信 します。 bt_send_irq()readdma * CPUに 代 わりカーネル・ドライバで 使 用 されるDMAハードウェアがデー bt_read()タをコピーすることになるこのプログラムがより 大 きいなデータを 読 み取 ることを 除 いては、readmemと 同 じです。shmat * アタッチするために 共 有 メモリ・キー・パラメータを 利 用 し、 共 有 メモリ領 域 から 読 み 取 ります。shmconfig-scriptプログラムで 使 用 されます。shmconfig(1)shmat(2)shmbind * PCI-to-VMEバス・マッピングにマップされた 共 有 メモリ 領 域 を 作 成 しアタッチしてそれを 読 み 書 きします。shmget(2)shmbind(2)shmat(2)shmconfig-script * /procファイル・システムを 介 してPCI-to-VMEバス・マッピングを 作 成 し、 shmconfig(1)VMEバス 領 域 へバインドする 共 有 メモリ 領 域 を 作 成 するスクリプトです。vme-mappings * /procファイル・システムを 介 してPCI-to-VMEバス・マッピングを 作 成 、 n/a表 示 、 削 除 する 方 法 を 示 すスクリプトです。writemem * リモートVMEバスへ256byteのデータを 書 き 込 み、リモートVMEバスから256byteのデータを 読 み 戻 して、そのデータを 標 準 出 力 へ 出 力 します。bt_read()bt_write()writedma * CPUがデータをコピーする 代 わりにカーネル・ドライバでDMAハードウェアが 使 用 されることになり、このプログラムがより 大 きいなデータを 書き 込 むことを 除 いては、writememと 同 じです。この 例 はリモートVMEバスへデータを 書 き 込 むだけで、リモートVMEバスからのデータ 読 み 戻 しはしません。bt_write()bt_bind_mult 15bt_bind_multサンプル・アプリケーションは、 複 数 の 同 じサイズのバッファをリモート・バスへバインドするためにbt_bind() 関 数 を 使 用 します。これはユーザー 入 力 を 待 機 し、バインドされた 各バッファの 各 ページの 最 初 の4ワードを 出 力 します。 任 意 で 待 機 前 にバッファへデータの 書 き 込 みも 行 います使 用 方 法 :bt_bind_mult -[natulws]オプション機 能-n 割 り 当 ておよびバインドするバッファの 数 。 既 定 値 は2。-a バッファをバインドするVMEアドレス。 既 定 値 はBT_BIND_NO_CARE。-t 論 理 デバイス(BT_DEV_MEM, BT_DEV_IO, BT_DEV_DEFAULT 等 )。既 定 値 はBT_DEV_DEFAULT。-u オープンするユニット 番 号 。 既 定 値 は0。-l バインドするバッファの 長 さ。 既 定 値 は1ページ(0x1000)。-w 最 初 にバッファの 各 ページの 先 頭 4ワードにこの 値 を 書 き 込 みます。-s bt_bind()を 呼 び 出 すためにスワップ・ビット 値 を 設 定 します。シンボリック 名 は 認 識 されないことに 注 意 して 下 さい。15-18


PCI-to-VMEサポートbt_bind_multsz 15bt_hwmap 15bt_hwunmap 15bt_bind_multszサンプル・アプリケーションは、 様 々なサイズの 複 数 のバッファをリモート・バスへバインドするためにbt_bind() 関 数 を 使 用 します。これはユーザー 入 力 を 待 機 し、バインドされた 各 バッファの 各 ページの 最 初 の4ワードを 出 力 します。 任 意 で 待 機 前 にバッファへデータの 書 き込 みも 行 います。使 用 方 法 :bt_bind_multsz -[atuws]オプション機 能-a バッファをバインドするVMEアドレス。 既 定 値 はBT_BIND_NO_CARE。-t 論 理 デバイス(BT_DEV_MEM, BT_DEV_IO, BT_DEV_DEFAULT 等 )。既 定 値 はBT_DEV_DEFAULT。-u オープンするユニット 番 号 。 既 定 値 は0。-w 最 初 にバッファの 各 ページの 先 頭 4ワードにこの 値 を 書 き 込 みます。-s bt_bind()を 呼 び 出 すためにスワップ・ビット 値 を 設 定 します。シンボリック 名 は 認 識 されないことに 注 意 して 下 さい。bt_hwmapサンプル・アプリケーションは、VMEバス 空 間 の 領 域 へハードウェア・マッピングを 作成 するためにbt_hw_map_vme 関 数 を 使 用 します。使 用 方 法 :bt_hwmap -a[ltus]オプション機 能-a VMEバスの 物 理 アドレス。この 引 数 は 必 須 です。-l PCIバス 上 にマッピングするVMEバス 領 域 の 長 さ。 既 定 値 は1ページ(0x1000)。-t アクセスする 論 理 デバイス (BT_DEV_A32, BT_DEV_A24, BT_DEV_A16,BT_DEV_IO, BT_DEV_RR)。 既 定 値 はBT_DEV_A32。-u オープンするユニット 番 号 。 既 定 値 は0。-s bt_bind()を 呼 び 出 すためにスワップ・ビット 値 を 設 定 します。シンボリック 名 は 認 識 されないことに 注 意 して 下 さい。既 定 値 はBT_SWAP_DEFAULT。bt_hwmapサンプル・アプリケーションは、VMEバス 空 間 の 領 域 からハードウェア・マッピングを削 除 するためにbt_hw_unmap_vme 関 数 を 使 用 します。使 用 方 法 :bt_hwunmap -p[tu]オプション機 能-p 削 除 するマッピングのローカルPCIバスの 物 理 アドレス。この 引 数 は 必 須です。-t 論 理 デバイス(BT_DEV_A32, BT_DEV_A24, BT_DEV_A16, BT_DEV_IO,BT_DEV_RR) 。 既 定 値 はBT_DEV_A32。-u オープンするユニット 番 号 。 既 定 値 は0。15-19


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>readdma 15shmat 15shmbind 15CPUに 代 わりカーネル・ドライバで 使 用 されるDMAハードウェアがデータをコピーすることになるこのプログラムがより 大 きいなデータを 読 み 取 ることを 除 いては、このサンプル・プログラムはbt_readmemと 同 じです。使 用 方 法 :readdma -[atulo]オプション機 能-a データ 転 送 を 開 始 するアドレス。デフォルト 値 =0x00000000-t アクセスする 論 理 デバイス。 既 定 値 はBT_DEV_A32。-u オープンするユニット 番 号 。 既 定 値 は0。-l 読 み 取 るバイト 数 。ページサイズへ 切 り 捨 てます。 既 定 値 は0x1000。-o 各 ページ 境 界 線 の 先 頭 に 出 力 するバイト 数 。 既 定 値 は16byte。この 値 は409以 下 であること。このサンプル・プログラムはshmconfig-scriptスクリプトにより 呼 び 出 されます。これは 共 有 メモリの'key' 値 を 利 用 してアタッチし、VMEバス 空 間 にバインドされた 共 有 メモリ 領 域 から 読 み 出します。使 用 方 法 :shmat -k shmkey -s size [-o outlen]オプション機 能-k 10 進逭 数 、または'0x' か'0X' で 始 まる16 進逭 数 の 共 有 メモリのキー 値 。-s 共 有 メモリ 領 域 のサイズ(byte)。-o 標 準 出 力 へ 出 力 する 各 共 有 メモリ・ページの 先 頭 からのバイト 数 (16 進逭 数 )。既 定 値 は32byte。このプログラム 例 は、PCI-to-VMEバス・マッピングへ 共 有 メモリ 領 域 をアタッチするためにshmget(2), shmbind(2), shmat(2)を 使 用 します。 共 有 メモリにアタッチされた 領 域 を 使 いVMEバス 空 間 の 読 み 書 きが 可 能 となります。PCI-to-VMEハードウェア・マッピングは 既 に 作 成 されている 必 要 があります。使 用 方 法 :shmbind -p pci_addr -s size [-r | -w value] [-o len]オプション機 能-p VMEマッピングが 置 かれているローカルPCIバス・アドレス(16 進逭 数 )。-s 作 成 する 共 有 メモリ 領 域 のサイズ(byte, 16 進逭 数 )。-r 共 有 メモリ 領 域 からの 読 み 取 り( 既 定 値 )。-w 指 定 された 値 を 使 い、 共 有 メモリ 領 域 へ 書 き 込 み(16 進逭 数 )-o 標 準 出 力 へ 出 力 する 各 共 有 メモリ・ページの 先 頭 からのバイト 数 (16 進逭 数 )。既 定 値 は32byte。15-20


PCI-to-VMEサポートshmconfig-script 15vme-mappings 15writemem 15これはPCI-to-VMEバス・マッピングによる 特 定 のVMEバス 領 域 へバインドされた 共 有 メモリ 領 域を 作 成 するためにshmconfig(1)を 使 用 する 方 法 のサンプル・スクリプトです。このスクリプトは共 有 メモリ 領 域 が 作 成 された 後 にshmatサンプル・プログラムを 呼 び 出 します。これは/proc/driver/btp/unit/vme-mappingsファイルを 使 いPCI-to-VMEバス・マッピングを 作 成 、調 査 、 削 除 する 方 法 を 示 すサンプル・スクリプトです。このサンプル・プログラムは、Bit 3 論 理 デバイスのいずれかに 書 き 込 むためbt_write() Bit 3 MirrorAPI 関 数 を 使 用 します。使 用 方 法 :writemem -[atud]オプション機 能-a データ 転 送 を 始 めるアドレス。デフォルト 値 =0x00000000。-t アクセスする 論 理 デバイス(BT_DEV_RDP, BT_DEV_A32, 等 )。-u オープンするユニット 番 号 。 既 定 値 は0。-d 書 き 込 みを 開 始 するデータの 値 。 規 定 値 は0。全 ての 数 値 はC 言 語 の 基 数 表 記 法 を 使 用 します。例 :アドレス0x00001000で 始 まるBT_DEV_RDPから 最 初 の256byteのデータを 書 き込 みます:./writemem -a 0x00001000writedma 15このサンプル・プログラムは、CPUがデータをコピーする 代 わりにカーネル・ドライバでDMAハードウェアが 使 われることになって、それがより 大 きいなデータを 書 き 込 むことを 除 いては、writememと 同 じです。この 例 はリモートVMEバスへデータを 書 き 込 むだけで、リモートVMEバスからのデータ 読 み 戻 しはしません。使 用 方 法 :writedma -[atuld]オプション機 能-a VMEアドレスの 先 頭 。 既 定 値 =0x00000000.-t アクセスする 論 理 デバイス。 規 定 値 はBT_DEV_A32。-u オープンするユニット 番 号 。 既 定 値 は0。-l 書 き 込 むバイト 数 。ページサイズへ 切 り 下 げます。 規 定 値 は0x1000。-d 書 き 込 みを 開 始 するデータの 値 。 規 定 値 は0。15-21


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>15-22


161413AAメッセージ・キュー・プログラム 例本 付 録 にはPOSIXおよびSystem Vのメッセージ・キュー 機 能 の 使 用 を 説 明 するサンプル・プログラムが 含 まれています。 更 なるサンプル・プログラムは/usr/share/doc/ccur/examplesディレクトリにオンラインで 提 供 されます。POSIXメッセージ・キュー 例 1ここにあるサンプル・プログラムはC 言 語 で 記 述 されています。このプログラムでは、 親 プロセスがPOSIXメッセージ・キューをオープンして、キューが 空 から 空 ではない 状 態 へ 遷 移 した 時 にリアルタイム・シグナルを 介 して 通 知 されるように 登 録 しています。 親 プロセスは 子 プロセスを生 成 し、 子 プロセスが 空 のキューへメッセージを 送 信 するまで 子 プロセスを 待 機 します。 子 プロセスはメッセージを 送 信 し、その 記 述 子 をクローズして 終 了 します。親 プロセスはリアルタイム・シグナルを 受 信 し、シグナル・ハンドラ 内 でsiginfo_t 構 造造 体 を 通して 配郤 信 されるsigev_value (si_value)を 取 得 します。 親 プロセスは 子 プロセスのテスト・メッセージを 受 信 する 前 にsi_code (SI_MESGQ)の 配郤 信 もテストします。 親 プロセスはsi_value( 共 用 体 )の 配郤 信 が 事 前 に 登 録 されたsigev_valueと 合 っていることを 検 証 します。シグナル・ハンドラは、psignalを 使 い 受 信 したリアルタイム・シグナル 値 (SIGRTMAX)も 表 示 します。psignal 関 数 はSIGRTMAXと 明 示 する 方 法 を 知 らないので、unknown signalと 判 定 し、 値 を 出力 して 終 了 します。このプログラムをビルドするには、 以 下 を 指 定 します:gcc mq_notify_rtsig.c -Wall -g -l rt -o mq_notify_rtsig#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MSGSIZE 40#define MAXMSGS 5#define VAL 1234A-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>void handlr(int signo, siginfo_t *info, void *ignored);int val, code;int main(int argc, char **argv){struct sigaction act;struct sigevent notify;struct mq_attr attr;sigset_t set;char *mqname = "/mq_notify_rtsig";char rcv_buf[MSGSIZE];mqd_t mqdes1, mqdes2;pid_t pid, cpid;int status;memset(&attr, 0, sizeof( attr));attr.mq_maxmsg = MAXMSGS;attr.mq_msgsize = MSGSIZE;mq_unlink(mqname);mqdes1 = mq_open(mqname, O_CREAT|O_RDWR, 0600, &attr);sigemptyset(&set);act.sa_flags = SA_SIGINFO;act.sa_mask = set;act.sa_sigaction = handlr;sigaction(SIGRTMAX, &act, 0);notify.sigev_notify = SIGEV_SIGNAL;notify.sigev_signo = SIGRTMAX;notify.sigev_value.sival_int = VAL;mq_notify(mqdes1, &notify);printf("¥nmq_notify_rtsig:¥tTesting notification sigev_value¥n¥n");printf("mq_notify_rtsig:¥tsigev_value=%d¥n",¥notify.sigev_value.sival_int);if( (pid = fork()) < 0) {printf("fork: Error¥n");printf("mq_notify_rtsig: Test FAILED¥n");exit(-1) ;}if(pid == 0) { /* child */cpid = getpid() ;mqdes2 = mq_open(mqname, O_CREAT|O_RDWR, 0600, &attr);printf("child:¥t¥t¥tsending message to empty queue¥n");mq_send(mqdes2, "child-test-message", MSGSIZE, 30);A-2


メッセージ・キュー・プログラム 例mq_close(mqdes2);exit(0);}else { /* parent */waitpid( cpid, &status, 0); /* keep child status from init */printf("parent:¥t¥t¥twaiting for notification¥n");while(code != SI_MESGQ)sleep(1);mq_receive(mqdes1, rcv_buf, MSGSIZE, 0);}printf("parent:¥t¥t¥tqueue transition - received %s¥n",rcv_buf);printf("mq_notify_rtsig:¥tsi_code=%d¥n",code);printf("mq_notify_rtsig:¥tsi_value=%d¥n",val);if(code != -3 || val != VAL) {printf("¥nmq_notify_rtsig:¥tTest FAILED¥n¥n");return(-1);}mq_close(mqdes1);mq_unlink(mqname);printf("¥nmq_notify_rtsig:¥tTest passed¥n¥n");}return(0);void handlr(int signo, siginfo_t *info, void *ignored){psignal(signo, "handlr:¥t¥t¥t");val = info->si_value.sival_int;code = info->si_code;}return;A-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>System Vメッセージ・キュー 例 1ここにあるサンプル・プログラムはC 言 語 で 記 述 されています。このプログラムでは、 親 プロセスは 作 業 の 一 部邪 の 負 荷 を 取 り 去 るために 子 プロセスを 生 成 します。 親 プロセスは 自 身 および 子 プロセスが 使 用 するためにメッセージ・キューも 作 成 します。子 プロセスがその 作 業 を 完 了 すると、メッセージ・キューを 介 して 親 プロセスへ 結 果 を 送 信 し、親 プロセスへシグナルを 送 信 します。 親 プロセスがシグナルを 受 信 すると、メッセージ・キューからメッセージを 読 み 取 ります。#include #include #include #include #include #include #define MSGSIZE 40/* maximum message size */#define MSGTYPE 10/* message type to be sent and received *//* Use a signal value between SIGRTMIN and SIGRTMAX */#define SIGRT1(SIGRTMIN+1)/* The message buffer structure */struct my_msgbuf {long mtype;char mtext[MSGSIZE];};struct my_msgbuf msg_buffer;/* The message queue id */int msqid;/* SA_SIGINFO signal handler */void sighandler(int, siginfo_t *, void *);/* Set after SIGRT1 signal is received */volatile int done = 0;pid_t parent_pid;pid_t child_pid;main(){int retval;sigset_t set;struct sigaction sa;/* Save off the parent PID for the child process to use. */parent_pid = getpid();/* Create a private message queue. */msqid = msgget(IPC_PRIVATE, IPC_CREAT | 0600);if (msqid == -1) {perror(“msgget”);exit(-1);}A-4


メッセージ・キュー・プログラム 例/* Create a child process. */child_pid = fork();if (child_pid == (pid_t)-1) {/* The fork(2) call returned an error. */perror(“fork”);/* Remove the message queue. */(void) msgctl(msqid, IPC_RMID, (struct msqid_ds *)NULL);}exit(-1);if (child_pid == 0) {/* Child process *//* Set the message type. */msg_buffer.mtype = MSGTYPE;/* Perform some work for parent. */sleep(1);/* ... *//* Copy a message into the message buffer structure. */strcpy(msg_buffer.mtext, “Results of work”);/* Send the message to the parent using the message* queue that was inherited at fork(2) time.*/retval = msgsnd(msqid, (const void *)&msg_buffer,strlen(msg_buffer.mtext) + 1, 0);if (retval) {perror(“msgsnd(child)”);/* Remove the message queue. */(void) msgctl(msqid, IPC_RMID, (struct msqid_ds *)NULL);exit(-1);}/* Send the parent a SIGRT signal. */retval = kill(parent_pid, SIGRT1);if (retval) {perror(“kill SIGRT”);}/* Remove the message queue. */(void) msgctl(msqid, IPC_RMID, (struct msqid_ds *)NULL);exit(-1);}exit(0);/* Parent *//* Setup to catch the SIGRT signal. The child process* will send a SIGRT signal to the parent after sending* the parent the message.*/sigemptyset(&set);sa.sa_mask = set;sa.sa_sigaction = sighandler;A-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>sa.sa_flags = SA_SIGINFO;sigaction(SIGRT1, &sa, NULL);/* Do not attempt to receive a message from the child* process until the SIGRT signal arrives. Perform parent* workload while waiting for results.*/while (!done) {/* ... */}/* Remove the message queue.(void) msgctl(msqid, IPC_RMID, (struct msqid_ds *)NULL);*//* All done.*/}exit(0);/** This routine reacts to a SIGRT1 user-selected notification* signal by receiving the child process’ message.*/voidsighandler(int sig, siginfo_t *sip, void *arg){int retval;struct ucontext *ucp = (struct ucontext *)arg;/* Check that the sender of this signal was the child process.*/if (sip->si_pid != child_pid) {/* Ignore SIGRT from other processes.*/printf(“ERROR: signal received from pid %d¥n”, sip->si_pid);}return;/* Read the message that was sent to us.*/retval = msgrcv(msqid, (void*)&msg_buffer,MSGSIZE, MSGTYPE, IPC_NOWAIT);done++;if (retval == -1) {perror("mq_receive (parent)");return;}if (msg_buffer.mtype != MSGTYPE) {printf(“ERROR: unexpected message type %d received.¥n”,msg_buffer.mtype);return;}}printf(“message type %d received: %s¥n”,msg_buffer.mtype, msg_buffer.mtext);A-6


BBリアルタイム 機 能 のためのカーネル・チューニング表 B-1は、<strong>RedHawk</strong> <strong>Linux</strong>の 独 自 機 能 および<strong>RedHawk</strong>がサポートするカーネル 構 成 設 定 の 一 覧 です。これらはリアルタイム 業 務 を 支 援 するConcurrentにより 開 発 された 機 能 およびオープン・ソース・パッチから 組 み 込 まれた 機 能 を 含 んでいます。各 機 能 において、カーネル 構 成 GUIオプションとチューニング・パラメータ 名 は 必 要 に 応 じて 設定 を 表 示 および 変 更 の 手 助 けをするために 提 供 されます。 更 に、 各 <strong>RedHawk</strong> <strong>Linux</strong>プレビルト・カーネルの 各 機 能 のデフォルト 設 定 が 用 意 されています。カーネルの 構 成 および 構 築 に 関 する 詳細 な 情 報 については、11 章 を 参 照 して 下 さい。個 々の 機 能 に 関 する 情 報 は 様 々な 場 所 で 入 手 できます。 表 B-1では、 以 下 の 参 考 文 献 が 提 供 されています:• 本 <strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong> に 含 まれている 情 報 が 提 供 されるページ 番 号• 他 の 適遚 切 なConcurrentの 文 書 の 名 称 および 文 書 番 号情 報 が 取 得 可 能 な 他 の 情 報 源 は 次 のとおり:• 情 報 はパラメータ 遥 択 時 に 表 示 するカーネル 構 成 GUIの 別 のヘルプ・ウィンドウで 提 供 されます• カーネル・ソース・ツリーのDocumentationディレクトリ 内 にあるテキスト・ファイル• インターネット 上 の<strong>Linux</strong>ドキュメンテーション・サイトB-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>表 B-1 リアルタイム 機 能 用 カーネル・チューニング・・チューニング・パラメータ機 能カーネル 構 成既 定 値 */ページ/チューニング・パラメータ 名GUIオプションプレビルトカーネル参 考 文 献シールドCPUCPUシールディング 有 効 SHIELD Y / all page 2-1CPU 停 止 有 効 CPU_IDLING Y / all page 2-28RCUプロセシング General Setup RCU_ALTERNATIVE Y / all page 7-4CPU 毎 にデーモンのロックDAEMON_CPU_LOCK Y / all n/a再 スケジューリング 変 数 General Setup RESCHED_VAR Y / all page 5-3時 間 計 測ティックレス・システム 有 効 NO_HZ Y / allProcessor Typeシステム 起 動 時 のティックレスand Features NO_HZ_ENABLED Y / all有 効 / 無 効page I-1高 分 解 能プロセス・アカウンティングGeneral Setup HRACCT Y / all page 7-2TSC 信 頼 性Processor TypeREQUIRE_TSCY / all i386and Features REQUIRE_RELIABLE_TSC Y / allpage 7-2RCIM User’sシステムのクロックソースとしてRCIM_CLOCKSOURCEY / all<strong>Guide</strong>RCIM 有 効(0898007)Device DriversRCIM PPSサポート RCIM_PPS Y / allPPS APIサポート PPSAPI Y / all RCIM User’sシリアル 上 のPPS APIPPSAPI_SERIALY / all<strong>Guide</strong>PPS 用 NTPサポートProcessor Type(0898007)NTP_PPSY / alland FeaturesRCIMサポートDevice Drivers RCIM Y / allRCIM User’s<strong>Guide</strong>(0898007)POSIXメッセージ・キューGeneral Setup POSIX_MQUEUE Y / all page 3-2Post/WaitサポートGeneral Setup POST_WAIT Y / all page 5-37exec 間 でケーパビリティ 継 承 General Setup INHERIT_CAPS_ACROSS_EXEC Y / all page 13-5* Y = 設 定 , N = 非 設 定 , M =カーネル・モジュールがロードされた 時 に 有 効B-2


リアルタイム 機 能 のためのカーネル・チューニング機 能プロセス・スケジューリング<strong>RedHawk</strong> 製 品 オプションFrequency-basedScheduler (FBS)Performance Monitor(PM)表 B-1 リアルタイム 機 能 用 カーネル・チューニング・・チューニング・パラメータ( 続 き) きカーネル 構 成GUIオプションProcessor Typeチューニング・パラメータ 名SCHED_SMT既 定 値 */プレビルトカーネルY / alland Features SCHED_SMT_IDLE N / allFrequency-BasedSchedulingFrequency-BasedSchedulingFBSCHEDFBSCHED_PMY / allY / allページ/参 考 文 献page 2-34FBS User’s<strong>Guide</strong>(0898005)FBS User’s<strong>Guide</strong>(0898005)SNARE Audit General Setup AUDIT N / all <strong>RedHawk</strong>-FAQSBS VMEbus-to-PCI Device Drivers SBSVME M / all page 15-1/proc ファイルシステム/proc/ccur PROC_CCUR_DIR Y / all n/aPseudo/proc/pid/affinity PROC_PID_AFFINITY Y / all n/aFile Systems/proc/pid/resmemPROC_PID_RESMEM Y / all n/aPCI BAR Access Bus options PROC_PCI_BARMAP Y / all page 14-1メモリ・マッピングプロセス 空 間 のmmap/usermapサポート別 プロセスのアドレス 空 間 へアクセスするファイル・パーミッション別 プロセスのアドレス 空 間への 書 き 込 み 有 効Interrupt ProcessingPseudo FileSystemsPROCMEM_MMAPPROCMEM_ANYONEPROCMEM_WRITEY / allY / allY / allソフトIRQデーモンの 優 先 度 SOFTIRQ_PRI 0 / allソフトIRQプリエンプションのブロックGeneral SetupSOFTIRQ_PREEMPT_BLOCKY / allRCIM IRQ 拡 張 有 効 Device Drivers RCIM_IRQ_EXTENSIONS Y / all* Y = 設 定 , N = 非 設 定 , M =カーネル・モジュールがロードされた 時 に 有 効page 9-1page 14-12RCIM User’s<strong>Guide</strong>(0898007)B-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>表 B-1 リアルタイム 機 能 用 カーネル・チューニング・・チューニング・パラメータ( 続 き) き機 能カーネル 構 成既 定 値 */ページ/チューニング・パラメータ 名GUIオプションプレビルトカーネル参 考 文 献read(1), write(1) の ためPseudoの 全 4GBアドレス 範 囲File SystemsUNSIGNED_OFFSETS Y / all n/ashmbind 呼 び 出 し 有 効 Kernel Tracing SHMBIND Y / all page 3-16プロセッサ 間 割 り 込 み 削 減ブート 時 にvmallocページのプリロードGeneral Setup VMALLOC_PGTABLE_PRELOAD Y / generic page G-5グラフィック・ページのプリアロケーションDevice Drivers PREALLOC_GRAPHICS_PAGES 10240 / all page G-3ソフトロックアップの 検 出 Kernel Hacking DETECT_SOFTLOCKUP N / all page 2-34ロック 中 断 処 理General SetupLOCK_BREAK_THROTTLE Y / all n/aLOCK_BREAK_THROTTLE_LIMIT 30 / all n/aXFSファイルシステムXFS 有 効 XFS_FS Y / allリアルタイム・サブボリューム File Systemspage 8-1XFS_RTY / allサポートカーネル・プリエンプションProcessor Typeand FeaturesPREEMPT Y / all page 1-6ptrace 拡 張 General Setup PTRACE_EXT Y / all page 1-6NUMAY / allK8_NUMAY / allx86_64 onlyX86_64_ACPI_NUMAY / allx86_64 onlyPAGE_REPLICATIONY / allProcessor Type PAGE_REPLICATION_DYNAMIC Y / allNUMAサポートpage 10-1and FeaturesY / allMEMSHIELD_ZONE_NORMALx86 onlyMEMSHIELD_ZONELIST_ORDER Y / allCONFIG_KTEXT_REPLICATIONY / allx86_64 onlyCONFIG_KMOD_REPLICATIONY / allx86_64 only* Y = 設 定 , N = 非 設 定 , M =カーネル・モジュールがロードされた 時 に 有 効B-4


リアルタイム 機 能 のためのカーネル・チューニング表 B-1 リアルタイム 機 能 用 カーネル・チューニング・・チューニング・パラメータ( 続 き) き機 能カーネル 構 成既 定 値 */ページ/チューニング・パラメータ 名GUIオプションプレビルトカーネル参 考 文 献システム・ダンプkdumpクラッシュ・ダンプKEXECY / all有 効Processor Typeデバッグ・シンボル 生 成 DEBUG_INFO Y / allpage 12-1and Featuresカーネル・クラッシュ・ダンプ有 効CRASH_DUMPY / kdump onlyカーネル・デバッグKDBサポート KDB Y / debug onlyKDBサポート KDB_OFF N / debug onlyConcurrentサポートの組 み 込 みKernel HackingKDB_MODULESY / debug only page 12-8KDB 破 壊 的 エラーKDB_CONTINUE_CATASTROPHIの 処 理C0 / debug onlyカーネル・トレーシングY / trace, debugカーネル・トレーシング 有 効TRACEpage D-1N / genericKernel TracingタイムスタンプのソースとしてY / debug, traceTRACE_USE_RCIMn/aRCIMを 利 用N / genericnVIDIAグラフィクスのRelease NotesDevice Drivers NVIDIA M / allサポート(0898003)ハイパースレッディングProcessor Typeand FeaturesX86_HT Y / all page 2-28UIOサポートUserspace I/O UIO Y / all page 14-15* Y = 設 定 , N = 非 設 定 , M =カーネル・モジュールがロードカーネル・モジュールがロードされた 時 に 有 効B-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>B-6


CCケーパビリティ本 付 録 では、<strong>RedHawk</strong> <strong>Linux</strong>に 含 まれるケーパビリティと 各 ケーパビリティが 提 供 するパーミッションを 掲 載 します。概 要 3ケーパビリティ 3ケーパビリティは、スーパーユーザーに 関 連連 する 伝 統 的 な 権 限 が 個 別 に 有 効 および 無 効 にすることが 可 能 な 別 個 のユニットに 分 けられた<strong>Linux</strong>の 方 式 です。 無 節 操 なユーザーは、<strong>Linux</strong>が 提 供 するセキュリティ・メカニズムを 無 効 にするためのケーパビリティが 提 供 されたパーミッションの一 部邪 を 使 用 することが 可 能 であるため、この 機 能 は 十 分 に 注 意 して 使 用 する 必 要 があります。ケーパビリティは/usr/include/linux/capability.hで 定 義 されています。ケーパビリティを<strong>Linux</strong>で 機 能 させる 方 法 に 関 する 詳 細 な 情 報 については、capabilities(7)のmanページを 参 照 して 下 さい。ケーパビリティを 利 用 した 認 証 スキームを 提 供 するPAM 機 能 に 関 する情 報 については、13 章 を 参 照 して 下 さい。本 セクションでは、<strong>RedHawk</strong> <strong>Linux</strong>の 下 で 定 義 される 各 ケーパビリティより 提 供 されるパーミッションについて 説 明 します。 標 準 <strong>Linux</strong>からの 機 能 だけでなく<strong>RedHawk</strong> <strong>Linux</strong> 独 自 の 機 能 もこの 説明 に 含 まれています。CAP_CHOWN本 ケーパビリティは、 有 効 なユーザーID、グループID、 追 加 グループIDの1つがファイルのUID/GID 属 性 と 一 致 しない 時 、ユーザーまたはグループのファイル 所 有 権 の 変 更 の 制 限 を 無 効 にします。CAP_DAC_OVERRIDE不 変 または 追 加 専 用 (chattr(1)を 参 照 して 下 さい)としてマークされたファイルによって 強 要 されたファイル・アクセス 制 限 を 除 き、アクセス 制 御 リスト(Access Control List: ACL)のサポートがファイルシステム 用 にカーネルに 構 成 されている 場 合 に、このケーパビリティは、どのようなファイルも 所 有 者 /グループ/その 他 ユーザー、 読 み 込 み/ 書 き出 し/ 実 行 のファイルシステム・パーミッション 属 性 とACL 制 限 を 標準 的 に 強 要 される 随 意 アクセス 制 御 (Discretionary Access Control:DAC)を 無 効 にします。( 詳 細 はacl(5)を 参 照 して 下 さい)読 み 込 みと 書 き 出 しのアクセスDAC 制 限 はこのケーパビリティによって 常 に 無 効 となる 可 能 性 があります。DAC 制 限 の 実 行 は、 少 なくとも1つの 所 有 者 /グループ/その 他 ユーザー、 実 行 ビットが 設 定 されている 限 りケーパビリティによって 無 効 となる 可 能 性 があります。本 ケーパビリティは、fbsintrpt(3)およびfbsresume(3)コマンドを 使用 している 時 にパーミッション・アクセス 制 限 もまた 無 効 とします。C-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>CAP_DAC_READ_SEARCH本 ケーパビリティはACLのサポートがファイルシステム 用 にカーネルに 構 成 されている 場 合 に、このケーパビリティは、どのようなファイルも 所 有 者 /グループ/その 他 ユーザー、 読 み 込 み/ 実 行 のファイルシステム・パーミッション 属 性 とACL 制 限 を 標 準 的 に 強 要 されるDACを 無 効 にします。( 詳 細 はacl(5)を 参 照 して 下 さい)本 ケーパビリティは 常 にファイルおよびディレクトリの 読 み 取 りアクセス、ディレクトリの 検 索 ( 実 行 )アクセスを 許 可 します。本 ケーパビリティは、fbsintrpt(3)およびfbsresume(3)コマンドを 使用 している 時 にパーミッション・アクセス 制 限 もまた 無 効 とします。CAP_FOWNER本 ケーパビリティは:- ファイル 所 有 者 IDがユーザーIDと 等 しくなければならないファイル 属 性 の 変 更 に 関 する 全 てのDAC 制 限 を 無 効 にします。- fbs 作 成 者 ユーザーIDおよびユーザーIDが 呼 び 出 し 元 の 有 効 なユーザーIDと 一 致 しない 時 にfbsctl(2)コマンドのFBS_RMIDおよびFBS_SETを 許 可 します。本 ケーパビリティはDAC 制 限 を 無 視 しません。CAP_FSETIDCAP_IPC_LOCK本 ケーパビリティは、ファイルのS_ISGIDビットを 設 定 している 場 合に 有 効 なグループID(または 追 加 グループのいずれか)がファイルのグループIDと 一 致 しなければならない 制 限 を 無 視 します。本 ケーパビリティは、mlock(2)およびmlockall(2)システム・サービス・コールを 通 してメモリのロックを 許 可 します。これはshmctl(2)コマンドのSHM_LOCKおよびSHM_UNLOCKを 通して 共 有 メモリ 領 域 のロック、アンロックもまた 許 可 します。CAP_IPC_OWNERCAP_KILL本 ケーパビリティはIPC 共 有 メモリ 領 域 、メッセージ・キュー、セマフォ 配郤 列 に 関 連連 するIPCパーミッション・セットを 無 効 にします。IPCパーミッションはファイルに 関 連連 する 読 み 込 み/ 書 き 出 し、 所 有 者 、グループ、その 他 ユーザーのパーミッションと 同 じフォーマットと 意味 を 持 っています。 実 行 のパーミッションは 使 用 されないことに 注 意して 下 さい。ipcs(1)コマンドは 現 在 のIPCリソースの 所 有 者 とパーミッションを 見 るために 使 用 することが 可 能 です。本 ケーパビリティは、シグナルを 送 信 するプロセスの 実 際 のまたは 有効 なユーザーIDはシグナルを 受 信 するプロセスの 実 際 のまたは 有 効なユーザーIDと 一 致 する 必 要 があるという 制 限 を 無 視 します。本 ケーパビリティは、ttyの 所 有 者 になるため、またはCAP_SYS_TTY_CONFIGケーパビリティを 所 有 するために 呼 び 出 し元 プロセスに 要 求 するKDSIGACCEPT ioctl(2) 呼 び 出 しの 制 限 もまた無 視 します。CAP_LEASE本 ケーパビリティは、プロセスのユーザーIDがファイル・システムのユーザーID 値 と 一 致 しない 場 合 であっても、fcntl(2)のF_SETLEASEコマンドによりファイルの 資 産 をユーザーに 取 得 させます。C-2


ケーパビリティCAP_LINUX_IMMUTABLE本 ケーパビリティは、ファイル 属 性 S_IMMUTABLEとS_APPENDの 変更 を 可 能 にします。これらのファイル 属 性 に 関 する 詳 細 な 情 報 については、chattr(1)のmanページを 参 照 して 下 さい。CAP_MKNODCAP_NET_ADMIN本 ケーパビリティは、mknod(1)/mknod(2)の 特 権 の 側 面 を 利 用 することを 許 可 します。これはXFS_IOC_FSSETDM_BY_HANDLE xfsファイルシステム ioctl(2)コマンドの 使 用 もまた 許 可 します。本 ケーパビリティは、 以 下 のネットワーク 管 理 作 業 を 許 可 します:- ソケット 上 のデバッグおよび 優 先 度 オプションの 設 定- IPファイヤウォール、マスカレード、アカウンティングの 管 理- インターフェース 構 成- マルチキャスト- ネットワーク・デバイス・レジスタの 読 み 書 き- トンネリングの 追 加 / 削 除- ルーティング・テーブルの 変 更- TOS (Type Of Service)の 設 定- ATM 制 御 ソケットのアクティベイションCAP_NET_BIND_SERVICE本 ケーパビリティは、1024 未 満 のTCP/UDPおよびストリーム 制 御 転 送プロトコル(Stream Control Transmission Protocol: SCTP)ソケット、32未 満 のATM VCLへのバインドを 許 可 します。本 ケーパビリティは、RPCクライアント・トランスポート 作 成 時 に 使用 するため 予 約 済 みポートももたらします。CAP_NET_BROADCASTCAP_NET_RAWCAP_SETGID本 ケーパビリティは 現 在 使 われていません。本 ケーパビリティは、SOCK_RAWおよびSOCK_PACKETソケットの作 成 、setsockopt(2)のSO_BINDTODEVICEソケット・オプションの使 用 を 許 可 します。本 ケーパビリティは、setregid(2), setgid(2), setresgid(2),setfsgid(2), setgroups(2)システム・サービス 用 に 非 ルートプロセスのグループID 値 に 設 定 された 制 限 を 無 視 します。本 ケーパビリティは、 現 在 のプロセスの 現 在 の/ 有 効 な/ 保 存 されたグループIDと 一 致 しないグループID 値 を 含 むソケット・レベル 証 明 書 制御 メッセージの 送 信 をプロセスに 許 可 します。( 更 に、 証 明 書 制 御 メッセージのプロセスIDはプロセスのスレッド・グループIDと 一 致 する、またはプロセスはCAP_SYS_ADMINケーパビリティを 持 っている 必要 があり、 証 明 書 制 御 メッセージのユーザーIDはプロセスの 保 存 された/ 有 効 な/ 現 在 のユーザーIDと 一 致 、またはCAP_SETUIDケーパビリティを 持 っている 必 要 があります。)CAP_SETPCAP本 ケーパビリティは、プロセスの 認 められたセットの 任 意 のケーパビリティを 任 意 のプロセスID(PID)へ 転 送 すること、プロセスの 認 められたセットの 任 意 のケーパビリティを 任 意 のPIDから 削 除 することをプロセスに 許 可 します。C-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>CAP_SETUID本 ケーパビリティは、スーパーユーザーのユーザーIDを 含 む 任 意 のユーザーIDに 現 在 のユーザーIDを 設 定 することを 許 可 します。 本 ケーパビリティを 許 可 している 時 は 細 心 の 注 意 を 払 う 必 要 があります。本 ケーパビリティは、 現 在 のプロセスの 現 在 の/ 有 効 な/ 保 存 されたユーザーIDと 一 致 しないユーザーID 値 を 含 むソケット・レベル 証 明 書 制御 メッセージの 送 信 をプロセスに 許 可 します。( 更 に、 証 明 書 制 御 メッセージのプロセスIDはプロセスのスレッド・グループIDと 一 致 する、またはプロセスはCAP_SYS_ADMINケーパビリティを 持 っている 必要 があり、 証 明 書 制 御 メッセージのグループIDはプロセスの 保 存 された/ 有 効 な/ 現 在 のグループIDと 一 致 、またはCAP_SETGIDケーパビリティを 持 っている 必 要 があります。)本 ケーパビリティは、ptraceを 実 行 されているプロセスが 実 行 する“setuid/setgid” のユーザーIDまたはグループIDを 継 承 しないプロセスによってptraceを 実 行 されているプロセスの 制 限 を 無 視 します。CAP_SYS_ADMIN本 ケーパビリティは、 以 下 のシステム 管 理 作 業 を 提 供 します:- bdflush(2)の 使 用 の 許 可- オープンするファイルの 制 限 を 無 視- ディスク 割 当 量 の 調 査 および 構 成 を 許 可- XFSファイルシステム 下 でユーザー 単 位 またはグループ 単 位 でディスクの 使 用 状 況 の 検 査 および 構 成 を 許 可 (XFS_QUOTAが 有 効 の場 合 )- umount()とmount()を 許 可- fork(2)/clone(2) 呼 び 出 し 中 にプロセスの 名 前 空 間 のコピーを 許 可- プロセスの 有 効 なユーザーIDと 一 致 するユーザーIDまたは 所 有 者ユーザーIDを 持 っていないメッセージ・キュー、セマフォ、 共 有メモリ 領 域 のためのmsgctl(2), semctl(2), shmctl(2) のIPC_SETと IPC_RMIDを 許 可- 共 有 メモリ 領 域 のユーザーIDまたは 所 有 者 ユーザーIDがプロセスの 有 効 なユーザーIDと 一 致 しない 共 有 メモリ 領 域 のためのshmctl(2) SHM_PHYSBINDを 許 可- 非 ルート・ユーザーがCAP_SYS_RESOURCEケーパビリティを 持っていない 場 合 にfork(2)/clone(2) 呼 び 出 ししているプロセス 毎 にプロセスの 最 大 数 に 関 する 制 限 を 無 視- 起 こされるプロセスが 呼 び 出 し 元 プロセスの 有 効 なユーザーIDまたはユーザーID 値 と 同 じユーザーIDまたは 保 存 ユーザーIDを 持 っていない 場 合 にpw_post(2), pw_postv(2), server_wake1(2),server_wakevec(2) 呼 び 出 しにより 起 こすのを 許 可- RCIM_WRITE_EEPROMとRCIM_TESTIRQ ioctl(2) RCIMドライバ・コマンドの 利 用 を 許 可- システム・ダンプioctl(2)コマンドの 利 用 、およびsysctl(2)のkernel.dump.device 変 数 の 設 定 を 許 可- シリアル・ポートの 構 成 を 許 可- sethostname(2)およびsetdomainname(2) 呼 び 出 しの 許 可- swapon(8)およびswapoff(8) 呼 び 出 しの 利 用 を 許 可C-4


ケーパビリティ- HP SA 5xxxおよび6xxxコントローラ 用 ディスク・アレイ・ドライバのRAWボリュームをゼロでのオープンおよびCCISS_SETINTINFOとCCISS_SETNODENAME ioctl(2)コマンドを許 可- Mylex DAC960 PCI RAIDコントローラ・ドライバのioctl(2)コマンドを 許 可- Compaq SMART2コントローラ・ディスク・アレイ・ドライバのRAWボリュームをゼロでのオープンを 許 可- フロッピーをルートのみioctl(2)コマンド(0x80ビットを 設 定 )の 利用 、およびFDSETPRMとFDDEFPRMのジオメトリ・コマンドも 許可- 次 のブロック・デバイスでのioctl(2)コマンドの 利 用 を 許 可 :BLKPG(パーティションの 追 加 / 削 除 )、BLKRRPART(パーティションの 再 読 み 取 り)、BLKRASET(ブロック・デバイスに 先 読 みを 設定 ) 、BLKFRASET(ファイルシステムの 先 読 みを 設 定 )、BLKBSZSET( 論 理 ブロック・サイズを 設 定 )、BLKFLSBUF(バッファ・キャッシュをフラッシュ)、BLKROSET(デバイスを 読 み 取 り 専用 に 設 定 )- ループバック・ファイルシステムで 暗 号 キーの 設 定 を 許 可- ネットワーク・ブロック・デバイスでioctl(2)コマンドを 許 可- MTRR(Memory Type Range Registers)の 変 更 を 許 可- カーネルのAPMが 有 効 の 場 合 に 電 源 管 理 にioctl(2)コマンドの 使用 を 許 可- 特 定 のBIOS 設 定 用 に 一 部邪 のioctl(2)コマンドの 使 用 を 許 可- VM86_REQUEST_IRQ vm86(2)サポートの 使 用 を 許 可- CDROMRESET, CDROM_LOCKDOOR, CDROM_DEBUG ioctl(2)CDROMコマンドの 使 用 を 許 可- sbpcd CDROMドライバのDDIOCSDBG DDIデバッグ ioctl(2)を 許可- 読 み 取 り 専 用 DRM(Direct Rendering Manager) ioctl(2)コマンド、DRM mmap(2) DMAメモリ・コマンドの 使 用 を 許 可- Specialix RIOスマート・シリアル・カード・ドライバで 読 み 取 り専 用 ioctl(2)コマンドの 使 用 を 許 可- I2Cシリアル・バスでVAIO EEProm センサー・チップの 先 頭 16byteの 読 み 取 りを 許 可- /proc/ide/iden/configファイルへの 書 き 込 み、IDEドライブ 設 定 の変 更 、 以 下 のioctl(2) IDEコマンドを 許 可 :HDIO_DRIVE_TASKFILE (RAWタスクファイルの 実 行 ),HDIO_SET_NICE (ナイス・フラグの 設 定 ), HDIO_DRIVE_RESET(デバイス・リセットの 実 行 ), HDIO_GET_BUSSTATE (ハードウェア・インターフェースのバス 状 態 を 取 得 ), HDIO_SET_BUSSTATE(ハードウェア・インターフェースのバス 状 態 を 設 定 )- SNDRV_CTL_IOCTL_POWERサウンドioctl(2)コマンドの 使 用 を許 可- Live!やSound Blaster 512のような 様 々なPCIベースのサウンド・カード 用 の 様 々なルート 専 用 ioctl(2)コマンドの 使 用 を 許 可- 試 験 的 なネットーワークSIOCGIFDIVERTとSIOCSIFDIVERTフレーム・ダイバーioctl(2)タコマンドの 使 用 を 許 可- 証 明 書 のユーザーIDが 現 在 のプロセスの 有 効 な/ 保 存 された/ 現 在のユーザーID 値 と 一 致 しない 場 合 、SCM_CREDENTIALSソケット・レベル 制 御 メッセージの 送 信 を 許 可C-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>- mdデバイス(Multiple Devices-RAIDやLVM)の 管 理 を 許 可- デジタル・ビデオ 放 送 インターフェースの 追 加 と 削 除 を 許 可- CAP_SYS_RAWIOケーパビリティが 有 効 ではない 場 合 、Philipssaa7134-based TV card video4linuxデバイス・ドライバ 用 のVIDIOC_S_FBUF ioctl(2)コマンドを 許 可- CAP_SYS_RAWIOケーパビリティが 有 効 ではない 場 合 、bttvとZoranビデオ・デバイス・ドライバのVIDIOCSFBUFおよびVIDIOC_S_FBUF ioct(2)コマンドの 使 用 を 許 可- CAP_SYS_RAWIOケーパビリティが 有 効 ではない 場 合 、planbビデオ・デバイス・ドライバのVIDIOCSFBUF ioctl(2)コマンドの 使用 を 許 可- stradis 4:2:2 MPEGデコーダ・ドライバのVIDIOCSFBUF ioctl(2)コマンドの 使 用 を 許 可- インテリジェント 入 力 / 出 力 (I2O) ioctl(2)コマンドの 使 用 を 許 可- ISDN CAPIサポート・ドライバの 製 造造 会 社 コマンドを 許 可- PCIバス 空 間 を 最 大 245byte( 非 標 準 化 された 領 域 )の 読 み 取 り、pciconfig_read(2)およびpciconfig_write(2)システム・サービス・コールの 使 用 を 許 可- ルート 専 用 PCMCIA ioctl(2)コマンドの 使 用 を 許 可- aacraid Adaptec RAIDドライバのFSACTL_SEND_RAW_SRBioctl(2)コマンドの 使 用 を 許 可- QLogic ISP2x00 NVRAMの 読 み 書 きを 許 可- MegaRAID ioctl(2)コマンドへのアクセスを 許 可- MTSETDRVBUFFER SCSIデープ・ドライバioctl(2)コマンドの 使 用を 許 可- カーネルのSCSI_DEBUGが 有 効 である 場 合 (CAP_SYS_RAWIOケーパビリティが 必 要 )、/proc SCSIデバッグ・ファイルへの 書 き 込みアクセスを 許 可- SCSI_IOCTL_SEND_COMMAND ioctl(2)コマンドを 介 して 任 意 のSCSIコマンドの 送 信 を 許 可 (CAP_SYS_RAWIOケーパビリティが必 要 )- SCSIスキャッター・ギャザーSG_SCSI_RESET ioctl(2)コマンド、/proc/sg/allow_dioおよび/proc/sg/def_reserved_size write(2)の 使 用 を 許 可 (CAP_SYS_ADMINケーパビリティが 必 要 )- Quicknet Technologies Telephonyカード・ドライバ 用 のIXJCTL_TESTRAMとIXJCTL_HZ ioct(2)コマンドの 使 用 を 許 可- 一 部邪 のautofsルート 専 用 ioctlを 許 可- ファイルシステム・オブジェクトの 拡 張 属 性 の 取 得 および 設 定を 許 可 (getfattr(1), setfattr(1))- NCP(NetWare Core Protocol)ファイルシステム 用 のルート 専 用 コマンドを 許 可- 新 しいsmbファイルシステム 接 続 の 設 定 を 許 可C-6


ケーパビリティ- UDFファイルシステムのUDF_RELOCATE_BLOCKS ioctl(2)コマンドを 許 可 ( 一 部邪 のCD-ROMおよびDVDで 使 用 )- ランダム・デバイスの 管 理 を 許 可- ブロック・デバイスへRAWキャラクタ・デバイス(/dev/raw/rawn)のバインディングを 許 可- カーネルのsyslogの 設 定 を 許 可 (printk 動 作 )- カーネルのSBSVMEが 有 効 の 場 合 にPCI-to-VMEバス・マッピングの 作 成 および 削 除 するために/proc/driver/btp/unit#/vmemappingsファイルへの 書 き 込 みを 許可- プリアロケート・グラフィック・メモリ・プールのサイズを 修 正するために/proc/driver/graphics-memoryへの 書 き 込 みを 許 可CAP_SYS_BOOTCAP_SYS_CHROOT本 ケーパビリティは、reboot(2)システム・サービス・コールの 使 用を 許 可 します。本 ケーパビリティは、chroot(2)システム・サービス・コールの 使 用を 許 可 します。CAP_SYS_MODULE 本 ケーパビリティは、sys_delete_module(2), init_module(2),rmmod(8), insmod(8)を 使 いカーネル・モジュールの 挿 入 、 削 除 を 許可 します。本 ケーパビリティはカーネル・ケーパビリティに 結 合 している 設 定 値cap_bset(sysctl(2) kernel.cap-boundパラメータを 介 してアクセス 可 能な 値 )の 修 正 もまた 許 可 します。CAP_SYS_NICECAP_SYS_PACCTCAP_SYS_PTRACECAP_SYS_RAWIO本 ケーパビリティは、 以 下 を 許 可 します:- 同 じユーザーIDを 持 つプロセスのスケジューリング 優 先 度 を 上 昇- 異 なるユーザーIDを 持 つほかのプロセスの 優 先 度 を 設 定- 同 じユーザーIDを 持 つプロセスに 対 しSCHED_FIFOおよびSCHED_RRスケジューリング・ポリシーを 設 定- 異 なるユーザーIDを 持 つプロセスのスケジューリング・ポリシーを 変 更- sched_setaffinity(2)または/proc/pid/affinityファイルを 介 して 異なるユーザーIDを 持 つプロセスに 対 してCPUアフィニティを 変 更- fbsconfigure(3)の 使 用 を 許 可本 ケーパビリティは、acct(2)システム・サービス・コールを 通 してプロセス・アカウンティングの 構 成 を 許 可 します。本 ケーパビリティは、プロセスが 他 のプロセスにptrace(2)を 実 行 することを 許 可 します。CAP_SETUID 設 定 に 関 係 なく、 本 ケーパビリティは、setuid 実 行 ファイルにptrace(2)を 実 行 することもまた 許 可 します。本 ケーパビリティは、 以 下 のRAW I/O 動 作 を 許 可 します:- shmctl(2) SHM_PHYSBINDコマンド- resched_cntl(2) RESCHED_SET_VARIABLEコマンド- PCIバス 空 間 のmmap(2)およびPCI BAR(Base Address Registers)へのアクセスC-7


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>- /dev/portおよび/proc/kcoreのopen(2)- ioperm(2)およびiopl(2)システム・サービス・コールの 利 用- ファイルシステムioctl(2) FIBMAPコマンド- カーネルのMICROCODEが 有 効 の 場 合 、/dev/cpu/microcodeファイルのopen(2)- HP SA 5xxx and 6xxxコントローラioctl(2)コマンド 用 の 次 のディスク・アレイ・ドライバ:CCISS_PASSTHRU, CCISS_BIG_PASSTHRU, CCISS_DEREGDISK,CCISS_REGNEWD- Compaq SMART2コントローラ 用 のディスク・アレイ・ドライバのopen(2)、およびIDAPASSTHRU ioctl(2)コマンド- IDEコントローラの 構 成 、および 次 のIDE ioctl(2)コマンド:HDIO_DRIVE_TASKFILE, HDIO_DRIVE_CMD,HDIO_DRIVE_TASK, HDIO_SCAN_HWIF,HDIO_UNREGISTER_HWIF- ファイバ・チャネル・ホスト・バス・アダプタCPQFCTS_SCSI_PASSTHRU ioctl(2)コマンド- カーネルのSCSI_ DEBUGが 有 効 の 場 合 、/proc SCSIデバッグ・ファイルへの 書 き 込 みアクセス(CAP_SYS_ADMINも 必 要 )- SCSI_IOCTL_SEND_COMMAND ioctl(2)コマンドを 介 して 任 意 のSCSIコマンドの 送 信 (CAP_SYS_ADMINも 必 要 )- SCSIスキャッター・ギャザーSG_SCSI_RESET ioctl(2)コマンド、/proc/sg/allow_dio, /proc/sg/def_reserved_size write(2)の 使 用(CAP_SYS_ADMINケーパビリティも 必 要 )- ATMSIGD_CTRL ioctl(2)コマンド- CAP_SYS_ADMINケーパビリティが 有 効 ではない 場 合 、bttvおよびZoranビデオ・デバイス・ドライバのVIDIOCSFBUFおよびVIDIOC_S_FBUF ioctl(2)コマンドの 使 用- CAP_SYS_ADMINケーパビリティが 有 効 ではない 場 合 、planbビデオ・デバイス・ドライバのVIDIOCSFBUF ioctl(2)コマンドの 使 用- Baycom EPP 無 線 およびHDLCパケット 無 線 ネットワーク・デバイス・ドライバのHDLCDRVCTL_SETMODEMPARおよびHDLCDRVCTL_CALIBRATE ioctl(2)コマンドの 使 用- AX.25デバイス・ドライバ 用 Z8530 based HDLCカードのSIOCSCCCFG, SIOCSCCINI, SIOCSCCSMEM, SIOCSCCCALioctl(2) コマンド- AM 無 線 モデム・デバイス・ドライバのSIOCYAMSCFG ioctl(2)コマンド- SRPおよびCOSA 同 期 シリアル・カード・デバイス・ドライバ 用 のCOSAIOSTRT, COSAIODOWNLD, COSAIORMEM,COSAIOBMSET ioctl(2)コマンド- SiSフレーム・バッファ・デバイス・ドライバ 用 のFBIO_ALLOCおよびFBIO_FREE ioctl(2)コマンド- CAP_SYS_ADMINが 無 効 である 場 合 、Philips saa7134-based TV cardvideo4linuxデバイス・ドライバ 用 のVIDIOC_S_FBUF ioctl(2)コマンドC-8


ケーパビリティCAP_SYS_RESOURCE本 ケーパビリティは、ユーザーに 以 下 を 許 可 します:- ディスク 割 り 当 て 制 限 を 無 視- msgctl(2) IPC_SETコマンドでIPCメッセージ・キューのサイズ 制限 を 無 視- 非 ルート・ユーザーがCAP_SYS_ADMIN ケーパビリティを 持 っていない 場 合 、fork(2)/clone(2) 呼 び 出 ししているプロセス 毎 にプロセスの 数 を 無 視- setrlimit(2)システム・サービスでユーザーのリソース 制 限 を 増 加- リアルタイム・クロック(rtc)の 周 期 的 IRQレートを 設 定 、または64Hzを 超 える 周 期 に 周 期 的 IRQ 割 り 込 みの 有 効 化- コンソール・ターミナルのオープン/ 割 り 当 て 数 の 制 限 を 無 視- コンソール・キーボードのキーマップ 数 の 制 限 を 無 視- ufs/ext2/ext3ファイルシステム 上 で 追 加 で 空 間 を 割 り 当 てる 場 合 、予 約 済 み 空 間 量 の 制 限 を 無 視Note: リソースのチェックを 無 視 する 場 合 にext2ファイルシステムはファイル・システムのユーザーIDを 受 け 取 り、setfsuid(2)の使 用 を 無 視 することも 許 可- ext3ファイルシステムにおいて、データ・ジャーナリング・モードを 変 更CAP_SYS_TIME本 ケーパビリティは、 以 下 を 許 可 します:- clock_settime(2), stime(2), settimeofday(2), adjtimex(2)を 介 して 時 間 の 設 定 または 修 正- /dev/rtcリアルタイム・クロック・デバイスに 対 してRTC_SET_TIMEおよびRTC_EPOCH_SET ioctl(2)コマンドの 使 用CAP_SYS_TTY_CONFIG本 ケーパビリティは、 以 下 を 許 可 します:- vhangup(2)システム・サービスの 使 用- 全 てのコンソール・ターミナルおよびキーボードのioctl(2)コマンドの 使 用 (ユーザーがコンソール・ターミナルの 所 有 者 でない 場 合のケースを 含 む)ユーザーがコンソール・ターミナルの 所 有 者 であってもKDKBDREP, KDSETKEYCODE, VT_LOCKSWITCH,VT_UNLOCKSWITCHコンソール・ターミナルおよびキーボードioctl(2)コマンドは 本 ケーパビリティを 必 要 とすることに 注 意 して下 さい。C-9


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>C-10


DDカーネル・トレース・イベント本 付 録 では、<strong>RedHawk</strong>トレースおよびデバッグ・カーネルに 含 まれている 定 義 済 みカーネル・トレース・イベントの 他 にカーネル・モジュールへカスタム・イベントを 定 義 および 記 録 する 方 法も 一 覧 表 にしています。ユーザー・レベル・コードへトレース・ポイントの 提 供 、トレース・データのキャプチャ、 結 果の 表 示 の 各 方 法 に 関 する 解 説 一 式 については、NightTrace RT User’s <strong>Guide</strong> ( 文 書 番 号 :0890398)を参 照 して 下 さい。定 義 済 みカーネル・トレース・イベント 4表 D-1は<strong>RedHawk</strong>トレースおよびデバッグ・カーネル 内 に 定 義 済 みカーネル・トレース・イベントの 一 覧 を 提 供 します。表 D-1 定 義 済 みカーネル・トレース・イベントトレース・イベントのタイプシステム・コールFBSトレース・イベント 名 称SYSCALL_ENTRYSYSCALL_EXITSYSCALL32_ENTRYSYSCALL32_EXITSYSCALL64_ENTRYSYSCALL64_EXITFBS_SYSCALLFBS_OVERRUN概 要システム・コールが 開 始 された。(i386システムのみ)システム・コールが 終 了 した。(i386システムのみ)2-bitシステム・コールが 開 始 された。(x86_64システムのみ)32-bitシステム・コールが 終 了 した。(x86_64システムのみ)64-bitシステム・コールが 開 始 された。(x86_64システムのみ)64-bitシステム・コールが 終 了 した。(x86_64システムのみ)FBSシステム・コールが 実 行 された。見 込 まれるタイプは 以 下 のとおり:0 - fbsop1 - fbsctl2 - fbsget3 - pmctl4 - pmop5 - fbswait6 - fbstrig7 - fbsavail8 - fbsdirFBSでスケジュールされたプロセスがオーバーランを 生 じたD-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>表 D-1 定 義 済 みカーネル・トレース・イベント( 続 き)きトレース・イベントのタイプトラップ割 り 込 みプロセス 管 理ファイル・システムトレース・イベント 名 称TRAP_ENTRYTRAP_EXITIRQ_ENTRYIRQ_EXITSMP_CALL_FUNCTIONREQUEST_IRQSOFT_IRQ_ENTRYSOFT_IRQ_EXITSCHEDCHANGEPROCESSPROCESS_NAMESIGNALFILE_SYSTEM概 要トラップが 開 始 された。トラップが 終 了 した。IRQハンドラが 開 始 された。IRQが 終 了 した関 数 呼 び 出 しがプロセッサ 間 割 り 込 みを 介 して 行 われた。動 的 IRQ 割 り 当 てが 行 われた。ソフトIRQハンドラが 起 動 された。見 込 まれるタイプは 以 下 のとおり:1 - conventional bottom-half2 - real softirq3 - tasklet action4 - tasklet hi-actionソフトIRQハンドラが 終 了 した。スケジューラはコンテキスト・スイッチを 行った。プロセス 管 理 機 能 が 実 行 された。見 込 まれるタイプは 以 下 のとおり:1 - kernel thread created2 - fork or clone3 - exit4 - wait6 - wakeupfork, clone, execより 前 にプロセスIDにプロセス 名 を 結 び 付 ける。シグナルがタスクに 送 信 された。見 込 まれるタイプは 以 下 のとおり:1 - signal ignored2 - signal dropped3 - signal queued4 - signal deliveredファイル・システム 機 能 が 実 行 された。見 込 まれるタイプは 以 下 のとおり:1 - wait for data buffer started2 - wait for data buffer finished3 - exec4 - open5 - close6 - read7 - write8 - seek9 - ioctl10 - select11 - pollD-2


カーネル・トレース・イベント表 D-1 定 義 済 みカーネル・トレース・イベント( 続 き)きトレース・イベントのタイプトレース・イベント 名 称概 要タイマー TIMER タイマー 機 能 が 実 行 された。見 込 まれるタイプは 以 下 のとおり:1 - timer expired2 - set_itimer() system call3 - schedule_timeout() kernel routineワーク・キュー WORKQUEUE_THREAD ワーク・キュー・スレッドが 作 成 された。WORKQUEUE_WORK ワーク・キュー・ハンドラーが 実 行 された。メモリ 管 理 MEMORYメモリ 管 理 機 能 が 実 行 された。見 込 まれるタイプは 以 下 のとおり:1 - page allocation2 - page freeing3 - pages swapped in4 - pages swapped out5 - wait for page started6 - wait for page finishedGRAPHICS_PGALLOC 追 加 のグラフィック・バインド・ページが 動的 に 割 り 当 てられた。ソケット SOCKET ソケット 機 能 が 実 行 された。見 込 まれるタイプは 以 下 のとおり:1 - generic socket system call2 - socket created3 - data sent on socket4 - data read from socketIPC IPC System V IPC 機 能 が 実 行 された。見 込 まれるタイプは 以 下 のとおり:1 - generic System V IPC call2 - message queue created3 - semaphore created4 - shared memory segment createdネットワーキングNETWORKネットワーク 機 能 が 実 行 された。見 込 まれるタイプは 以 下 のとおり:1 - packet received2 - packet transmittedカスタム・イベントCUSTOMこれはユーザー 定 義 イベントです。Note: このイベントのロギングおよび 他 のカスタム・カーネル・トレース・イベントの 動的 な 作 成 に 関 する 詳 細 な 情 報 は、 後 述 する「ユーザー 定 義 カーネル・トレース・イベント」セクションを 参 照 して 下 さい。D-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>表 D-1 定 義 済 みカーネル・トレース・イベント( 続 き)きトレース・イベントのタイプカーネル・トレース 管 理トレース・イベント 名 称BUFFER_STARTBUFFER_ENDPAUSERESUMEEVENT_MASKEVENT_CREATEDEVENT_DESTROYED概 要本 イベントはトレース・バッファの 開 始 をマークします。本 イベントはトレース・バッファの 終 了 をマークします。トレースが 一 時 停 止 された。トレースが 再 開 された。トレース・イベント・マスクが 変 更 された。新 しいトレース・イベントが 動 的 に 作 成 された。動 的 に 作 成 されたトレース・イベントが 破 棄された。ユーザー 定 義 カーネル・トレース・イベント 4どのようなユーザー 定 義 目 的 のためにも 使 用 することが 可 能 である 定 義 済 み“カスタム”カーネル・トレース・イベントが 存 在 します。この「カスタム」カーネル・トレース・イベントを 使 用するための 解 説 は、 次 のセクションで 説 明 されています。 他 のユーザー 定 義 イベントは、 後 述 する「 動 的 カーネル・トレース」セクションで 説 明 されている 呼 出 を 動 的 に 使 い 作 成 することが 可能 です。定 義 済 みCUSTOMトレース・イベントみ4TRACE_CUSTOMは 定 義 済 みCUSTOMトレース・イベントを 記 録 するために 使 用 することが 可 能です。 呼 び 出 し 元 は、 複 数 のCUSTOMイベントの 使 用 を 区 別 するために 整 数 の 識 別 子 (sub_id)を提 供 します。 呼 び 出 し 元 は、イベントで 記 録 されるデータの 任 意 のどのような 文 字 列 もまた 提 供します。概 要#include void TRACE_CUSTOM (int sub_id, const void* ptr, int size);引 数 は 以 下 のように 定 義 されます:sub_idptrsizeユーザー 提 供 IDイベントで 記 録 される 任 意 のデータへのポインタデータのサイズ動 的 カーネル・トレース 4上 述 の 定 義 済 みCUSTOMカーネル・トレース・イベントに 加 えて、ユーザー 定 義 カーネル・トレース・イベントは 動 的 に 作 成 することが 可 能 です。 全 てが 解 析 用 NightTrace RTを 介 して 表 示 されます。D-4


カーネル・トレース・イベントtrace_create_event 4動 的 カーネル・トレースについては、 以 下 で 説 明 されている 呼 び 出 しが 使 われます:• trace_create_event – 使 用 されていないトレース・イベントIDを 割 り 当 てて、 指 定 された 名前 をそれに 結 び 付 けます。• trace_destroy_event – イベントIDを 破 棄• TRACE_LOG_EVENT – 動 的 なイベントを 記 録 するために 使 用 可 能 な 一 般 的 なトレース・ポイント 機 能本 呼 び 出 しは 使 用 されていないトレース・イベントIDを 割 り 当 てて、 指 定 された 名 前 をそれに 結び 付 けます。概 要#include int trace_create_event (const char* name);引 数 は 以 下 のように 定 義 されます:nameユニークなトレース・イベント 用 のユーザー 定 義 名 。この 名 称 は31 文 字 に 切 り捨 てられます。trace_destroy_event 4イベントIDが 返 されます。この 試 みは、 最 近 使 用 ( 作 成 および 破 棄 )されなかったIDが 返 されます。EVENT_CREATEDトレース・イベントはこの 呼 び 出 しにより 記 録 されます。失 敗 の 場 合 、 以 下 のいずれかが 返 されます:-ENOSPC 全 ての 動 的 なイベントIDが 使 用 されています-EINVAL 指 定 した 名 前 のポインタがNULLまたはNULL 文 字 列 へのポインタ-EEXIST 指 定 した 名 前 がユニークではない-ENOMEM メモリ 割 り 当 てのエラー本 呼 び 出 しはcreate_trace_eventで 割 り 当 てられたトレース・イベントIDを 破 棄 します。概 要#include void trace_destroy_event (int id);引 数 は 以 下 のように 定 義 されます:idcreate_trace_eventで 割 り 当 てられたイベントIDTRACE_LOG_EVENT 4EVENT_DESTROYEDトレース・イベントはこの 呼 び 出 しにより 記 録 されます。これは 新 規 に 作 成 された 動 的 トレース・イベント 用 のトレース・ポイントを 記 録 するために 使 用することが 可 能 です。概 要#include D-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>void TRACE_LOG_EVENT (int id, const void* ptr, int size);引 数 は 以 下 のように 定 義 されます:idptrsizeイベントIDイベントで 記 録 される 任 意 のデータへのポインタデータのサイズD-6


EE32bitコーコードからドから64bitコードへの 移 植本 付 録 ではx86_64アーキテクチャ 上 の64bit 処 理 へ32bitコードを 移 行 するために 必 要 となる 情 報について 提 供 します。序 文 5<strong>RedHawk</strong> <strong>Linux</strong>のバージョン2.X 以 降 は、64bit AMD OpteronおよびEM64Tプロセッサだけでなく32bit Intel Pentium Xeonプロセッサ 上 でも 実 行 することが 可 能 です。<strong>RedHawk</strong> <strong>Linux</strong>のx86_64バージョンは、x86_64プロセッサ 上 でネイティブ・モードで32bitおよび64bitの 両 方 を 実 行 する 完 全 な64bitオペレーティング・システムです。Opteronプロセッサは、EM64T ISA(Instruction Set Architecture)をサポートする 最 近 のIntelプロセッサ( 例 : 全 てのIntel Noconaプロセッサ)と 殆 ど 同 じAMD64 ISAを 利 用 しています。AMD64とEM64Tの 両 方 とも 真 の64bit 実 行 が 可 能 であり、“x86_64” アーキテクチャとして 知 られています。x86_64プロセッサの“long” 実 行 モードは2つのサブモード(“64bit” および “ 互 換 ”)を 持 っています。 既 存 の32bitアプリケーションのバイナリは、<strong>RedHawk</strong> <strong>Linux</strong> 下 で 互 換 モードで 再 コンパイルせずに 実 行 する、もしくはアプリケーションを64bitモードで 実 行 するために 再 コンパイルすることが 可 能 です。32bitアプリケーションは、 性 能 が 低 下 する「エミュレーション・モード」ではなくネイティブに実 行 されます。この 理 由 から、 多 くのアプリケーションは64bitへ 移 植 する 必 要 はありません。NOTEリアルタイム 拡 張 および 機 能 は、64bitオペレーティング・システム(x86_64)の 下 で 動 作 する32bitアプリケーションでは 利 用 できません。リアルタイム 機 能 を 利 用 するためには、32bitアプリケーションを64bitへ 移 行する、もしくは 代 わりに32bitオペレーティング・システムを 起 動 します。x86_64 用 に 最 適遚 化 されたソフトウェアは、 科 学 技 術 計 算 、データベース・アクセス、シミュレーション、CADツール 等 のような 最 も 要 求 の 多 いアプリケーションに 必 要 とされる 大 きなアドレス指 定 可 能 なメモリや64bitアーキテクチャ 上 の 機 能 強 化 を 利 用 することが 可 能 です。もしアプリケーションが64bit 処 理 で 得 られるより 大 きな 仮 想 および 物 理 アドレス 空 間 から 恩 恵 を 受 ける 場 合 、本 セクション 内 の 情 報 は 所 有 されているコードの 移 行 に 役 に 立 つでしょう。既 存 の32bitアプリケーションの64bitへの 移 植 は、 以 降 のセクションで 詳 述 されている 次 の 範 囲 を必 要 とします:• 32bit 用 に 記 述 されたソース・コードは、64bitモードで 実 行 するための 修 正 が 恐 らく 必 要 となります。• 32bit 演 算 用 にコンパイルされたバイナリは、64bitモードで 実 行 する 前 に64bit 用 に 再 コンパイル 必 要 があります。E-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>手 順 5• ビルド 処 理 (Makefile, プロジェクト・ファイル, 他 )は、64bitの 実 行 可 能 ファイルを 構 築 するために 更 新 およびコンパイル 用 オプションを 調 べて 移 植 性 を 追 加 する 必 要 がある 可 能 性 があります。• 唯 一 64bitのデバイス・ドライバだけは、64bitオペレーティング・システムで 使 用 することが可 能 です。 必 要 とするドライバの64bit 版 が 存 在 しない 場 合 、デバイス・ドライバを 組 み 込 むアプリケーションは 正 確 に 動 作 しない 可 能 性 があります。<strong>RedHawk</strong> <strong>Linux</strong>が 供 給 する 全 てのドライバは64bit 互 換 です。更 に、お 手 持 ちのアプリケーションから 最 大 限 性 能 を 得 るためのヒントを 提 供 します。AMD64 Developer Resource Kitは、Opteronプロセッサ 用 のアプリケーションおよびドライバの 移植 または 開 発 を 行 うプログラマのために 全 てが 揃 ったリソースです。AMD64 DRKは、 資 料 、ホワイト・ペーパー、 詳 細 なプレゼンテーション、リファレンス・ガイドを 含 む 技 術 情 報 を 収 納 しています。 本 キットは、www.amd.com のWEBサイトから 入 手 することが 可 能 です。体 系 的 に64bitへ 移 植 するためにお 手 持 ちのコードの 修 正 に 取 り 組 むため、 以 下 のガイド・ラインに 従 ってください。ヘッダ/インクルード・ファイル、リソース・ファイル、Makefileを 含 む 全 てのソース・ファイルは 再 調 査 およびそれに 応 じた 修 正 をする 必 要 があます。これらの 手 順 に 関 する 詳 細 は 以 降 のセクションで 提 供 されます。• AMD64アーキテクチャ 固 有 のコード 用 に#if defined __x86_64__ or __amd64__ を 使用• 組 み 込 み 関 数 またはネイティブ・アセンブリ・サブルーチンを 使 用 するために 全 てのインライン・アセンブリ・コードを 変 換• 必 要 に 応 じて 既 存 のアセンブリ・コードの 呼 び 出 し 規 約 を 修 正• ポインタ 演 算 の 使 用 の 再 調 査 および 結 果 の 確 認• ポインタ、 整 数 、 物 理 アドレスへの 参 照 の 再 調 査 および32bitと64bitアーキテクチャの 遊 いに対 応 するため 可 変 サイズのデータ 型 を 使 用• 64bit 実 行 可 能 ファイルをビルドするためにMakefileの 調 査 および 移 植 性 をチェックするオプションの 追 加E-2


32bitコードから64bitコードへの 移 植コーディング 要 件 5データ 型 のサイズ 532bitと64bitの 移 植 性 の 主 要 な 問 題 は、アドレスのサイズまたはint, long 等 のサイズとの 関 連連 に関 して 推 定 があってはならないということです。表 E-1は、AMD64システム 上 の<strong>RedHawk</strong> <strong>Linux</strong> 下 での 様 々なANSIデータ 型 のサイズを 示 します。表 E-1 データ 型 のサイズANSIデータ 型charshortintlonglong longintptr_t, uintptr_tfloatdoublelong doubleサイズ(Byte)1248884816様 々なデータ 型 のサイズを 取 得 するために「sizeof」 演 算 子 を 使 用 することが 可 能 です。( 例 :もし 変 数 int xがある 場 合 、sizeof(x)によりxのサイズを 取 得 することが 可 能 となります)この使 用 法 は 構 造造 体 もしくは 配郤 列 に 対 しても 働 きます。 例 えば、a_structという 名 前 の 構 造造 体 型 変数 がある 場 合 、どれくらいメモリが 必 要 となるのかを 調 べるためにsizeof(a_struct)を 使 用することが 可 能 です。long 型 5long 型 は64bitとなるため、longとintの 値 間 で 直 接 または 暗 黙 的 な 割 り 当 てまたは 比 較 をすべて 調 査 する 必 要 があります。 有 効 性 を 確 実 にするためlongとintの 間 の 割 り 当 ておよび 比 較 を 認めることをコンパイラに 任 せるすべてのキャストを 調 査 して 下 さい。longのサイズを 解 決 するためにBITS_PER_LONGマクロの 値 を 利 用 して 下 さい。もしintとlongが 異 なるサイズのままでなければならない 場 合 ( 例 : 既 存 の 公 開 API 定 義 のため)、64bit 項 目 の 値 が32bit 項 目 の 最 大 値 を 超 えないことを 確 かめるアサーションを 実 装 し、それが発 生 した 場 合 に 対 処 するための 例 外 条 件 を 生 成 して 下 さい。ポインタ 5ポインタは64bitとなるため、ポインタとintの 値 間 で 直 接 または 暗 黙 的 な 割 り 当 てまたは 比 較 もまたすべて 調 査 する 必 要 があります。ポインタとintの 間 の 割 り 当 ておよび 比 較 を 認 めることをコンパイラに 任 せるすべてのキャストを 削 除 して 下 さい。(ポインタのサイズと 等 しい) 可 変 サイズ 型 へ 型 を 変 更 して 下 さい。 表 E-2は 可 変 サイズのデータ 型 を 示 します。E-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>表 E-2 可 変 サイズのデータ 型ANSIデータ 型intptr_tuintptr_tptrdiff_tsize_tssize_t定 義ポインタを 格 納 するための 符 号 付 き 整 数 型ポインタを 格 納 するための 符 号 なし 整 数 型2つのポインタ 値 の 符 号 付 き 差 分 を 格 納 するための 符 号 付 き 型ポインタが 参 照 可 能 な 最 大 バイト 数 を 示 す 符 号なしの 値ポインタが 参 照 可 能 な 最 大 バイト 数 を 示 す 符 号付 きの 値配郤 列 532bitコードの 下 では、intとlongは 配郤 列 のサイズを 格 納 するために 使 用 することが 可 能 です。64bitの 下 では、 配郤 列 は4GBよりも 長 くすることが 可 能 です。intまたはlongに 代 わって、 移 植 性のためにsize_tデータ 型 を 使 用 してください。これは64bitターゲット 用 に、もしくは32bitで32bitターゲット 用 にコンパイルした 場 合 に64bit 符 号 付 き 整 数 型 となります。sizeof()およびstrlen()の 両 方 からの 戻 り 値 は、どちらもsize_t 型 です。宣 言 5明 示 的 なデータ・サイズ 5表 E-2で 示 されるサイズ 可 変 型 のいずれかを 使 用 するために64bitへ 変 更 する 必 要 のある 変 数 、パラメータ、 関 数 /メソッドが 返 す 型 のどの 宣 言 もまた 修 正 する 必 要 があります。明 示 的 にアドレス・データのサイズが 必 要 である 場 合 、 表 E-3のデータ 型 を 使 用 してください。 本質 的 にデータのサイズを 解 決 するANSIデータ 型 は 存 在 せず、これらの 型 は<strong>Linux</strong> 固 有 となります。表 E-3 固 定 精 度 のデータ 型データ 型int64_tuint64_tint32_tuint32_tint16_tuint16_tint8_tuint8_t64-bit 符 号 付 き 整 数64-bit 符 号 なし 整 数32-bit 符 号 付 き 整 数32-bit 符 号 なし 整 数16-bit 符 号 付 き 整 数16-bit 符 号 なし 整 数8-bit 符 号 付 き 整 数8-bit 符 号 なし 整 数定 義E-4


32bitコードから64bitコードへの 移 植定 数 5定 数 ( 特 に16 進逭 数 または2 進逭 数 の 値 )は、32bit 仕 様 である 確 立 が 高 いです。 例 えば、32bit 定 数 の0x80000000は64bitでは0x0000000080000000になります。それが 使 用 されている 方 法 次 第 で、 結 果は 好 ましくないことになる 可 能 性 があります。この 問 題 を 回 避遪 するために「~」 演 算 子 および 型接 尾 語 を 活 用 して 下 さい。( 例 :0x80000000 定 数 は 代 わりに~0x7fffffffulとしても 良 いでしょう)API 5呼 び 出 し 規 約 5コードは64bitAPIを 使 用 するように 変 更 する 必 要 がある 可 能 性 があります。 一 部邪 のAPIは、 明 示 的な32bitデータ 型 と 競 合 する64bitとしてコンパイラが 解 釈 することになるデータ 型 を 使 用 します。呼 び 出 し 規 約 はプロセッサ・レジスタが 機 能 の 呼 び 出 し 元 と 呼 び 出 し 先 で 使 用 する 方 法 を 明 記 します。これは、Cコードおよびインライン・アセンブリ 記 述 を 同 時 に 使 用 するハンド・コーディングされたアセンブリ・コードを 移 植 する 場 合 に 適遚 用 します。x86_64 向 けの<strong>Linux</strong> 呼 び 出 し 規 約 は表 E-4に 記 載 されています。表 E-4 呼 び 出 し 規 約%rax%rbxレジスタ%rdi, %rsi, %rdx,%rcx, %r8, %r9%rsp$rbp%r10%r11%r12-%r15%xmm0-%xmm1%xmm2-%xmm7%xmm8-%xmm15%mmx0-%mmx7%st0%st1-%st7%fs状 態volatileNon-volatilevolatileNon-volatileNon-volatilevolatilevolatileNon-volatilevolatilevolatilevolatilevolatilevolatilevolatilevolatile用 途可 変 引 数 が 使 用 されているSSEレジスタの 数 に 関 する 情 報 を 渡 す 一 時 的 なレジスタ; 最 初 に 戻 るレジスタ任 意 にベース・ポイントとして 使 用 、 呼 び 出 し 先 が保 護 する 必 要 あり整 数 の 引 数 (1,2,3,4,5,6)を 渡 すために 使 用スタック・ポインタフレーム・ポインタとして 使 用 、 呼 び 出 し 先 が 保 護する 必 要 あり関 数 の 静 的 チェーン・ポインタを 渡 すために 使 用 する 一 時 的 なレジスタ一 時 的 なレジスタ呼 び 出 し 先 が 保 護 する 必 要 あり浮 動 小 数 点 引 数 を 渡 すおよび 返 すために 使 用浮 動 小 数 点 引 数 を 渡 すために 使 用一 時 的 なレジスタ一 時 的 なレジスタlong double 引 数 を 返 すために 使 用 する 一 時 的 なレジスタ一 時 的 なレジスタシステムがスレッド 固 有 のデータ・レジスタとして使 用 するために 予 約E-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>条 件 付 コンパイル 532bitと64bit 実 行 用 の 条 件 付 コードを 提 供 する 必 要 がある 場 合 、 表 E-5のマクロを 使 用 することが可 能 です。表 E-5 条 件 付 コンパイル 用 マクロマクロ__amd64___i386定 義コンパイラはAMD64 用 のコードを 生 成 しますコンパイラはx86 用 のコードを 生 成 しますその 他 5その 他 の 様 々な 問 題 は 符 号 拡 張 、メモリ 割 り 当 てサイズ、 桁 送 り、 配郤 列 オフセットから 生 じる 可能 性 があります。 整 数 オーバーフローのセマンティクスに 関 する 条 件 を 構 成 する 全 てのコードについては 特 に 注 意 して 下 さい。コンパイル 5テスト/デバッグ5既 存 のMakefileは、 少 しの 修 正 もしくは 修 正 なしでx86_64プロセッサ 上 でネイティブ64bitの 実 行ファイルを 構 築 するはずです。以 下 のgccスイッチは 移 植 性 の 問 題 を 見 つけるために 使 用 することが 可 能 です。 詳 細 はgcc(1)のmanページを 参 照 して 下 さい。-Werror -Wall -W -Wstrict-prototypes -Wmissing-prototypes-Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings-Wswitch -Wshadow -Wcast-align -Wuninitialized -ansi-pedantic -Wbad-function-cast -Wchar-subscripts -Winline-Wnested-externs -Wredundant-decl64bitコードに 対 して 標 準 的 な<strong>RedHawk</strong> <strong>Linux</strong>のテストおよびデバッグ 手 法 に 従 ってください。E-6


32bitコードから64bitコードへの 移 植性 能 問 題 5本 章 の 情 報 は、お 手 持 ちの64bitアプリケーションから 最 高 のパフォーマンスを 得 る 方 法 を 説 明 します。メモリのアライメントおよび 構 造造 体 のパディング 5アライメントの 問 題 は 例 外 は 発 生 しませんが、 性 能 の 衝 突 を 引 き 起 こす 可 能 性 があります。アライメントの 不 整 はいくつかのクロック・サイクルを 犠 牲 にして 実 行 時 に 処 理 されます。 不 十 分 に整 列 したオペランドの 性 能 の 副 作 用 は 大 きくなる 可 能 性 があります。構 造造 体 の 中 のデータは、 結 果 として 空 間 を 無 駄 にするため 非 効 率 となる 可 能 性 のある 境 界 線 に 自然 と 並 べられます。 自 然 な 整 列 とは2byteオブジェクトは2byteの 境 界 線 上 、4byteのオブジェクトは4byteの 境 界 線 上 に 格 納 されることを 意 味 します。例 えば、 以 下 の 構 造造 体 の 定 義 は64bitコードを 生 成 するときに24byteを 消 費 します:typedef struct _s {int x;int *p;int z;} s, *ps;ポインタpは、xメンバーの 後 に 追 加 するために4byteのパディングを 引 き 起 こして8byte 境 界 線上 に 整 列 されます。 更 に、 構 造造 体 を8byteの 境 界 線 に 合 わせようと 穴 埋 めするためにzメンバーの 後 に4byteのパディングが 追 加 されます。最 も 効 果 的 な 構 造造 体 のパッキングは、 構 造造 体 内 で 最 大 から 最 小 へメンバーをパッキングすることにより 実 現 されます。 以 下 の 宣 言 はより 効 果 的 です。これはたったの16byteで、どのようなパディングも 必 要 としません:typedef struct _s }int *p;int x;int z;} s;潜 在 的 なパディングのために、 構 造造 体 内 のフィールドの 一 定 のオフセットを 見 つける 最 も 安 全 な方 法 は、stddef.hに 定 義 されているoffsetof()マクロを 使 用 することです。E-7


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>E-8


FFシールドシールドCPU 上 のカーネル・レベル・デーモン<strong>Linux</strong>カーネルは、システム 機 能 を 実 行 するため 多 くのカーネル・デーモンを 使 用 します。これらのデーモンの 一 部邪 はシステムのCPU 毎 に 複 製 されます。プロセスからのCPUシールディングはこれらの 一 部邪 の「CPU 毎 」デーモンを 除 去 しません。以 下 のデーモンはプロセスをシールドしたCPU 上 で 深 刻 なジッターの 問 題 を 引 き 起 こす 可 能 性 があります。 幸 い、これらのデーモンは 慎 重 にシステムを 構 成 および 使 用 することにより 回 避遪 することが 可 能 です。kmodule cpumigration/cpuこれらのデーモンはカーネル・モジュールがアンロードされる 度 に 作成 および 実 行 されます。リアルタイム・アプリケーションがシステム上 で 実 行 している 間 はカーネル・モジュールがアンロードされないことを 強 く 推 奨 します。これらは 特 定 のCPUからタスクを 移 動 するために 責 任 を 負 うタスク移 動 デーモンです。プロセス・シールドしたCPUで 動 作 しているプロセスがそのCPUからの 移 動 を 強 いられる 状 況 において、これらのデーモンはプロセス・シールドしたCPU 上 で 動 作 します。 以 下 のいずれかのインターフェースが 使 用 される 時 、 強 制 的 な 移 動 が 発 生 する 可 能 性があります:/proc/pid/affinitysched_setaffinity(2)/proc/shield/procscpucntl(2)delete_module(2)バックグラウンド・プロセスのジッターが 容 認 される 可 能 性 がある 場合 のみ、シールドCPU 上 で 実 行 中 のアプリケーションはこれらのインターフェースを 使 用 する 必 要 があります。強 制 的 な 移 動 は、CPU_FREQおよびNUMAのカーネル 構 成 オプションにより 有 効 にすることが 可 能 な 様 々なカーネル 機 能 によっても 行 われます。これらのオプションは 全 ての<strong>RedHawk</strong> <strong>Linux</strong>カーネル 構 成 でデフォルトで 無 効 にされています。kswapdnodeこれらは、メモリが 残 り 少 なくなった 時 にページを 回 収 するためにスワップ・ページをスワップ・デバイスへ 追 い 出 すページ・スワップ・アウト・デーモンです。NUMA 構 成 オプションが 有 効 でカーネルが 構 築 される 時 、 各 々がシングルCPUへ 割 り 付 けられたこれらのデーモンのいくつかが 存 在 する可 能 性 があります。CPUがプロセス・シールドされたまたは(cpu(1)を 使 い)ダウンされた 時 、デーモンはシールドされていないアクティブなCPUへ 移 動 します。CPUがもはやシールドされていないまたはダウンされていない 場 合 、デーモンは 元 へ 戻 されます。NUMAが 無 効 の 時 、これらは 特 定 のCPUに 割 り 付 けられていない1つのシステム 全 体 のデーモンとなるため、kswapdはプロセスからシールドされたCPUでは 実 行 されず、 非 シールドCPU 上 の 問 題 となります。NUMAはプレビルト<strong>RedHawk</strong> x86_64カーネルのみデフォルトで 有 効になっています。F-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>kapmdこれは 電 源 管 理 要 求 を 処 理 する 拡 張 型 電 源 管 理 (APM: AdvancedPower Management)デーモンです。これは 常 にCPU0へ 割 り 付 けられます。APMはカーネル・ブート・パラメータ “apm=off” で 無 効 にする、またはAPMカーネル 構 成 オプションを 無 効 にすることで 完 全 に 排 除することが 可 能 です。APMは 全 ての<strong>RedHawk</strong> <strong>Linux</strong>カーネル 構 成 でデフォルトで 無 効 となっています。 何 故 ならこのデーモンはCPU 毎 デーモンではないため、プロセスからシールドされたCPUでは 実 行 されず、その 結 果 、 非 シールドCPU 上 でのみ 問 題 となります。以 下 のデーモンはプロセス・シールドされたCPU 上 で 実 行 する 可 能 性 があります。しかし、これらはそのCPUへ 割 り 付 けられたプロセスまたは 割 り 込 みのために 必 要 な 機 能 を 実 行 するため、これらのデーモンはシールドされたCPUへ 割 り 付 けられたプロセスまたは 割 り 込 みにより 開 始 される 処 置 の 結 果 として 作 動 されるだけであるため、デターミニズムに 対 する 影 響 という 点 ではこれらのデーモンは 問 題 は 少 ないと 考 えられます。ksoftirqd/cpuこれらは 特 定 CPU 用 にソフトIRQルーチンを 実 行 するソフトIRQデーモンです。デバイス・ドライバ 割 り 込 みハンドラが 直 接 またはタスクレットを 介 して 間 接 的 にソフトIRQを 使 用 する 場 合 、これらのデーモンのいずれかがプロセス・シールドされたCPU 上 で 実 行 されます。ソフトIRQはローカル・タイマー、SCSI、ネットワークの 割 り 込 みハンドラにより 直 接 使 用 されます。タスクレットは 多 くのデバイス・ドライバにより 使 用 されます。ksoftirqdの 優 先 度 は、カーネル 構 成 GUIの「General Setup」にあるSOFTIRQ_PRIカーネル・チューニング・パラメータにより 決 定 されます。SOFTIRQ_PRIに 正 の 数 が 設 定 される 時 、この 数 はksoftirqdが実 行 される 優 先 度 です。 規 定 値 でこのチューニング・パラメータはゼロが 設 定 され、SOFTIRQ_PREEMPT_BLOCKの 設 定 はデーモンの 優 先度 に 影 響 を 及 ぼします。Yを 設 定 した 時 、ksoftirqdデーモンは 最 も 高いリアルタイム 優 先 度 よりも1 小 さい 優 先 度 でSCHED_FIFOスケジューリング・ポリシーとして 実 行 されます。Nを 設 定 した 時 、ksoftirqdデーモンは 優 先 度 ゼロで 実 行 されます。events/cpuaio/cpureiserfs/cpuxfsdatad/cpuxfslogd/cpuこれらは 特 定 CPU 上 のプロセスにより 開 始 される 様 々なカーネルサービスのために 仕 事 を 実 行 するデフォルトのワーク・キュー・スレッドです。これらは 同 じCPUへ 割 り 付 けられたデバイス・ドライバ 割 り込 みルーチンにより 保 留 された 仕 事 を 実 行 することも 可 能 です。これらのデーモンは-10のナイス 値 で 実 行 します。これらは 特 定 CPU 上 のプロセスにより 完 全 な 非 同 期 I/O 要 求 がio_submit(2)システムコールで 起 こされるワーク・キュー・スレッドです。これらのデーモンは-10のナイス 値 で 実 行 します。これらはレイザー・ファイル・システムで 使 用 されるワーク・キュー・スレッドです。これらのデーモンは-10のナイス 値 で 実 行 します。これはIRIXジャーナリング・ファイル・システム(XFS)で 使 用 されるワーク・キュー・スレッドです。これらのデーモンは-10のナイス 値で 実 行 します。F-2


シールドCPU 上 のカーネル・レベル・デーモンcio/cpukblockd/cpuwanpipe_wq/cpuこれらは 様 々なデバイス・ドライバに 使 用 されるワーク・キュー・スレッドです。これらのスレッドは 特 定 CPU 上 のプロセスによって 開 始される 様 々なカーネル・サービスのために 仕 事 を 実 行 します。これらは 同 じCPUへ 割 り 付 けられたデバイス・ドライバ 割 り 込 みルーチンにより 保 留 された 仕 事 を 実 行 することも 可 能 です。これらのデーモンは-10のナイス 値 で 実 行 します。どのサード・パーティのドライバでも、シールドCPUへ 割 り 付 けられたプロセスもしくは 割 り 込みハンドラにより 始 動 されるプライベート・ワーク・キューおよびワーク・キュー・スレッドを作 成 することが 可 能 であることにも 注 意 して 下 さい。これらのデーモンは 常 にname/cpu と 命 名 され-10のナイス 値 で 実 行 します。F-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>F-4


GGシールドシールドCPU 上 のプロセッサ 間 割 り 込 み本 付 録 では、シールドCPU 上 でのプロセッサ 間 割 り 込 みの 影 響 および 最 高 のパフォーマンスのためにこれらの 割 り 込 みの 軽 減 、 排 除 する 方 法 について 説 明 します。概 要 71つ 以 上 のシールドCPUで 構 成 される<strong>RedHawk</strong>プラットフォームにおいて、 他 のCPUの 特 定 の 動 作はシールドCPUへ 割 り 込 みが 送 信 される 要 因 となる 可 能 性 があります。これらのプロセッサ 間 割り 込 みは、 例 えば、それぞれのデータ・キャッシュのフラッシュまたはそれぞれのトランスレーション・ルックアサイド・バッファ・キャッシュ(TLB: Translation Look-aside Buffer)のフラッシュのような 一 部邪 のCPU 毎 の 特 定 タスクを 処 理 することを 他 のCPUに 強 制 するための 方 法 として 使 用されます。プロセッサ 間 割 り 込 みは 潜 在 的 にシールドCPUに 対 する 顕 著 なジッターを 引 き 起 こす 可 能 性 があるため、これらの 割 り 込 みが 発 生 する 原 因 となる 動 作 、そしてこれらの 割 り 込 みの 一 部邪 を 排 除 するためにお 手 持 ちのシステムを 構 成 する 方 法 を 理 解 することに 役 立 ちます。メモリ・タイプ・レンジ・レジスタ(MTRR) 割 り 込 み7みIntel P6ファミリー・プロセッサー(Pentium Pro, Pentium II 以 降 ) 上 のMTRR(Memory Type RangeRegister)は、メモリ 領 域 へのプロセッサ・アクセスを 制 御 するために 使 用 することが 可 能 です。これはPCIまたはAGPバス 上 にビデオ(VGA)カードがある 場 合 に 最 も 役 に 立 ちます。Write-combiningを 有 効 にするとPCI/AGPバス 上 で 破 棄 する 前 により 大 きなデータ 転 送 へ 結 合 するためにバス 書 き 込 み 転 送 を 許 可 します。これは 画 像 書 き 込 み 動 作 の 性 能 を2.5 倍 以 上 向 上 することが 可 能 です。<strong>RedHawk</strong>カーネルに 含 まれているNVIDIAデバイス・ドライバは、ページ 属 性 テーブル(PAT: PageAttribute Table)レジスタがシステム 上 のプロセッサにサポートされている 場 合 、MTTRレジスタの代 わりにCPUのPATレジスタを 利 用 します。システムのプロセッサがPATサポートを 含 まない 場合 のみNVIDIAドライバはMTRRレジスタの 使 用 へフォールバックします。 従 って 殆 どのシステムでは、プロセッサ 間 割 り 込 みに 関 連連 するMTRRについて 後 述 するこの 問 題 は 適遚 用 されません。MTRRは 有 益 な 性 能 の 恩 恵 を 提 供 する 一 方 、 新 しいMTRR 領 域 が 構 成 もしくは 削 除 されるときはいつでも、それに 応 じて 各 々のCPUはCPU 毎 のMTRRレジスタを 変 更 させるためにプロセッサ 間割 り 込 みが 他 のCPU 全 てに 送 信 されます。この 特 定 の 割 り 込 みを 処 理 するために 掛 かる 時 間 は 非常 に 長 くなる 可 能 性 があり、システムの 全 CPUはそれぞれのMTRRレジスタを 修 正 する 前 に 最 初に 同 期 /ハンドシェイクする 必 要 があるため、それぞれの 割 り 込 みルーチンを 終 了 する 前 にさらにもう 一 度 ハンドシェイクを 行 う 必 要 があります。G-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>プロセッサ 間 割 り 込 みのこの 分 野 は、1 割 り 込 みにつき 最 大 3ミリ 秒 に 遉 してしまうデターミニズムに 深 刻 な 影 響 を 及 ぼす 可 能 性 があります。システム 起 動 後 にXサーバーが 最 初 に 開 始 される 時 、MTRR 領 域 が 構 成 され、このMTRRプロセッサ 間 割 り 込 みの1つがシステムの 他 のCPU 全 てに 送 信 されます。 同 様 にXサーバーが 終 了 する 時 、このMTRR 領 域 は 削 除 され、システムのほかのプロセッサ 全 てはさらに 他 のMTRR 割 り 込 みを 受信 します。以 下 の3つの 方 法 は、シールドCPU 上 でタイム・クリティカル・アプリケーション 実 行 中 にプロセッサ 間 割 り 込 みに 関 連連 するMTRRを 排 除 するために 利 用 することが 可 能 です:1. MTRRカーネル 構 成 オプションが 無 効 となるようにカーネルを 再 構 成 して 下 さい。カーネル 構 成 GUIを 使 用 する 場 合 、このオプションは「Processor Type and Features」セクションにあり、“MTRR (Memory Type Range Register) support” と 呼 ばれています。この機 能 をサポートするカーネルは 存 在 しないため、これはMTRRプロセッサ 間 割 り 込 みを取 り 除 きます。このオプションはグラフィックI/O 動 作 に 対 し 深 刻 な 性 能 の 不 利 益 となる 可 能 性 があることに 注 意 して 下 さい。2. シールドCPU 上 でタイム・クリティカルなアプリケーションを 実 行 する 前 にXサーバーを 開 始 し、タイム・クリティカルなアプリケーションが 完 了 するまでXサーバーを 実 行し 続 けてください。MTRR 割 り 込 みは 発 生 し 続 けますが、タイム・クリティカルな 動 作中 ではありません。3. プロセッサ 間 割 り 込 みが 発 生 しないようにMTRR 領 域 を 事 前 に 構 成 することが 可 能 です。Xサーバーが 使 用 するMTRRを 事 前 に 構 成 するため 以 下 の 手 順 を 利 用 して 下 さい:a. システム 起 動 後 (Xサーバーを 開 始 する 前 )、 現 在 のMTRR 設 定 を 調 査 します。ランレベルは1または3のどちらかである 必 要 があります。cat /proc/mtrrreg00: base=0x00000000 ( 0MB), size=1024MB: write-back, count=1reg01: base=0xe8000000 (3712MB), size= 128MB: write-combining,count=1b. Xサーバーが 開 始 された 後 、MTRRレジスタの 設 定 を 再 調 査 します:cat /proc/mtrrreg00: base=0x00000000 ( 0MB), size=1024MB: write-back, count=1reg01: base=0xe8000000 (3712MB), size= 128MB: write-combining,count=2reg02: base=0xf0000000 (3840MB), size= 128MB: write-combining,count=1c. この 例 では、 新 しいXサーバーのエントリは 最 後 のエントリ“reg02” です。もしシステムに 複 数 のグラフィック・カードが 存 在 する、または1つ 以 上 の 新 しいエントリを表 示 する 場 合 、これらの 追 加 エントリは 更 にrc.localスクリプトにも 適遚 用 する 必 要があります。d. XサーバーのMTRRエントリを 確 保 するために/etc/rc.d/rc.localスクリプトへ 行 を追 加 します。この 例 では1つのXサーバーエントリだけを 確 保 します:echo “base=0xf0000000 size=0x8000000 type=write-combining” >/proc/mtrre. システムのハードウェア 構 成 が 変 更 されるたびに、Xサーバーの 起 動 および 使 用 で/etc/rc.d/rc.localのMTRRエントリが 間 遊 っていないことをチェックすることは 良いアイデアです:G-2


シールドCPU 上 のプロセッサ 間 割 り 込 みグラフィクス 割 り 込 み 7cat /proc/mtrrMTRRの 出 力 を 調 査 し、 以 前 のMTRR 設 定 との 遊 いについて 確 認 します。グラフィクス・アプリケーションが 実 行 中 は 複 数 のプロセッサ 間 割 り 込 みが 発 生 します。NVIDIAドライバといったカーネル・グラフィクス・ドライバは、NVIDIAグラフィクス 処 理 ユニット(GPU: Graphics Processing Unit)のデータの 読 み 書 きをするために 様 々なキャッシュ 禁 止 グラフィクス・メモリ・バッファを 割 り 当 ておよび 構 成 します。グラフィクス 実 行 中 にこれらのバッファが 追 加 または 削 除 されるたびに、これらバッファ・キャッシュ・モード 移 行 様 式 のためのこれらのデータやTLBキャッシュをフラッシュするためにプロセッサ 間 割 り 込 みがシステムの 他 の 各 々のCPUへ 送 信 されます。これらのプロセッサ 間 割 り 込 みの 種 類 は、1 割 り 込 みにつき50~250μ 秒 に 遉 してしまう 相 当 深 刻 な 影 響 を 持 っている 可 能 性 があります。キャッシュ 禁 止 カーネル・グラフィクス・バッファの 割 り 当 てと 解 放 が 発 生 するのは 次のとおり:• Xサーバーの 開 始 と 終 了• グラフィクス・アプリケーションの 実 行• Ctrl+Alt+F#キーボード 操 作 による 非 グラフィクスTTYからグラフィクス 画 面 への 切 り 替 えNVIDIA PCIeおよび/またはPCIグラフィクス・カードによるシステムに 関 しては、これらのプロセッサ 間 割 り 込 みの 種 類 は、キャッシュ 禁 止 バッファ・ページのプールがプリアロケート 時 に 排除 または 低 減 される 可 能 性 があります。グラフィクス・バッファ 割 り 当 てが 行 われた 時 に、これらの 要 求 を 満 足 するために 必 要 となるページがプリアロケート・ページ 空 きリストから 取 得 されます。これらのページが 既 にキャッシュ 禁 止 であるため、これらのページが 使 用 された 時 に 更 なるフラッシュ 操 作 をする 必 要 がありません。バッファ 割 り 当 てが 削 除 された 時 、ページはページ空 きリストへ 戻 され、 残 りのキャッシュ 禁 止 が 取 り 除 かれます。 要 求 された 時 にプリアロケート・ページのプールが 空 であるならば、ページは 動 的 に 割 り 当 てられプロセッサ 間 割 り 込 みは 通 常 の方 法 で 発 行 されます。 従 って、 利 用 可 能 なページのプールが 決 して 空 にならないように 十 分 なページをプリアロケートすることが 通 常 は 最 善 です。このサポートを 有 効 にするには、PREALLOC_GRAPHICS_PAGESカーネル・パラメータはプール内 のプリアロケート・ページの 数 を 意 味 する 正 の 値 である 必 要 があります。10240の 値 がすべてのプレビルト<strong>RedHawk</strong> <strong>Linux</strong>カーネルに 設 定 されています。このサポートを 無 効 にするには、プレビルト<strong>RedHawk</strong> <strong>Linux</strong>カーネルを 使 用 しGRUBカーネル・パラメータ “no_pregraph_pgs”を 指 定 、またはカスタム・カーネルを 構 築 しPREALLOC_GRAPHICS_PAGESカーネル・パラメータに 対 しゼロの 値 を 指 定 することが 可 能 です。このサポートは、PREALLOC_GRAPHICS_PAGES パラメータの 値 に 関 係 なくNVIDIA PCI/PCIeグラフィクス・カードが 存 在 しないシステム 上 では 常 に 無 効 となっています。PREALLOC_GRAPHICS_PAGESオプションはカーネル 構 成 GUIの「Device Drivers ->GraphicsSupport」のサブセクションにあります。/proc/driver/graphics-memoryファイルは、グラフィクス・アプリケーションが 実 行 している 間 、実 際 に 使 用 しているグラフィクス・メモリ・ページの 最 大 量 を 監 視 するためにいつでも 調 査 することが 可 能 です。 例 えば:G-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>$ cat /proc/driver/graphics-memoryPre-allocated graphics memory:Total allocated graphics memory:Graphics memory in use:Maximum graphics memory used:10240 pages10240 pages42 pages42 pagesプール 内 のページ 数 を 増 やすまたは 減 らすためにファイルへ 書 き 込 むことが 可 能 です。これはカーネル 構 成 パラメータを 変 更 する 前 に 様 々な 値 でお 手 持 ちのシステムをテストすることを 可 能 にします。 以 下 の 例 はプール 内 のプリアロケート・ページ 数 を5120へ 下 げます。$ echo 5120 > /proc/driver/graphics-memoryユーザーはこのファイルへ 書 き 込 むためにCAP_SYS_ADMINケーパビリティを 持 っている 必 要があります。ファイルへ 書 き 込 むページの 値 は“Graphics memory in use” フィールドの 現 在 値 以 上である 必 要 があることに 注 意 して 下 さい。もし 現 在 割 り 当 てられたページの 数 を 低 くする 必 要 がある 場 合 、Xサーバーを 終 了 します。非 現 実 的 な 大 きな 値 の 指 定 はページ 割 り 当 ての 失 敗 という 結 果 になり、 割 り 当 ては 取 り 消 されます。ファイルへの 書 き 込 み 後 、ページ 割 り 当 てが 成 功 したことを 検 証 するためにファイルを 読 み出 して 下 さい。同 じシステム 上 で、NVIDIAドライバがロードまたはアンロードされた 時 、PATプロセッサ 間 割 り込 みは 各 CPUへ 送 信 されます。 生 じるジッターを 最 小 限 に 抑 えるため、タイム・クリティカル・アプリケーションの 実 行 中 はNVIDIAモジュールのロードまたはアンロードは 避遪 けて 下 さい。タイム・クリティカル・アプリケーションの 実 行 前 、または 以 下 のコマンドでシステム 起 動 中 にNVIDIAドライバをプリロードして 下 さい:$ modprobe nvidiaNVIDIA CUDA 割 り 込 み 7NVIDIA CUDAは、CPU 上 で 必 要 となる 時 間 のほんの 一 部邪 で 多 くの 複 雑 な 計 算 の 問 題 を 解 決 するためにNVIDIA GPU 内 に 存 在 する 並 列 演 算 エンジンを 利 用 した 多 目 的 並 列 演 算 アーキテクチャです。CUDAアプリケーションはNVIDIA GPUのインターフェースにキャッシュ 禁 止 バッファを 利 用 するため、 前 のセクションで 述 べた 同 じプリアロケート・グラフィクス・バッファのサポートもまたCUDAアプリケーションが 実 行 されているシステムのシールドCPU 上 のジッターを 非 常 に 低 減することに 役 立 ちます。CUDAアプリケーションによるプリアロケート・グラフィクス・バッファの 利 用 は、プール 内 のプリアロケート・バッファが 使 用 されていない 限 り 自 動 的 に 生 じます。( 特 別 なCUDAアプリケーションのコーディングまたは 設 定 は 必 要 ありません)G-4


シールドCPU 上 のプロセッサ 間 割 り 込 みユーザー 空 間 でのTLBフラッシュ 割 り 込 み 7シールドCPU 上 で 実 行 するためにバイアスされたプロセスおよび 他 のCPU 上 で 実 行 するプロセスのアドレス 空 間 の 共 有 はユーザー 空 間 TLBフラッシュ・プロセッサ 間 割 り 込 みを 受 信 する 可 能 性があります。 共 有 メモリ 領 域 は 利 用 していますが 同 じCPU 上 のプロセスだけでアドレス 空 間 を 共有 しているプロセスは、どのような 共 有 メモリ 動 作 に 起 因 するプロセッサ 間 割 り 込 みも 気 づくことはありません。Pスレッド・ライブラリを 使 用 するマルチスレッド・アプリケーションとAdaアプリケーションは共 有 メモリ・アプリケーションの 実 例 です(プログラマーは 共 有 メモリを 作 成 するために 明 示 的 に呼 び 出 しを 行 っていません)。これらのプログラムのタイプでは、Pスレッド・ライブラリとAdaの 実 行 時 はユーザーのために 共 有 メモリ 領 域 を 作 成 しています。 従 って、これらのアプリケーションは、 同 じスレッド・グループまたは 同 じAdaプログラムからのスレッドがシステム 内 の 別 のCPU 上 で 実 行 する 時 にこのタイプのプロセッサ 間 割 り 込 みの 影 響 を 受 けやすくなります。ユーザー・アドレスTLBフラッシュ・プロセッサ 間 割 り 込 みは、 同 じアドレス 空 間 を 共 有 している 他 のプロセスが 異 なるCPUで 実 行 している 時 に 発 生 し、そのアドレス 空 間 属 性 の 変 更 の 原 因 となります。ページ・フォルト、ページ・スワップ、mprotect() 呼 び 出 し、 共 有 メモリ 領 域 の 作 成 /削 除 等 を 引 き 起 こすメモリ 参 照 のような 動 作 は、このタイプのプロセッサ 間 割 り 込 みの 原 因 になり 得 るアドレス 空 間 属 性 変 更 の 実 例 となります。この 類 のプロセッサ 間 割 り 込 みは、1 割 り 込 みにつき 最 大 10μ 秒 に 遉 する 小 さな 影 響 を 与 えます。 大 量 のメモリを 共 有 されている 場 合 、 影 響 はもっと 深 刻 となる 可 能 性 があります。これらのタイプのプロセッサ 間 割 り 込 みを 排 除 するために、シールドCPU 上 で 実 行 するタイム・クリティカル・プロセスがそのアプリケーションのタイム・クリティカル 部邪 分 の 間 中 は 共 有 メモリ 領 域 に 影 響 を 与 える 操 作 を 回 避遪 するようなアプリケーションをユーザーは 利 用 および 記 述 することを 推 奨 します。これはメモリのページをロック、mprotect()を 介 したメモリ 保 護 を 変 更 しない、 新 しい 共 有 メモリ 領 域 を 作 成 しない、 既 存 の 共 有 メモリ 領 域 を 削 除 しないことにより 遉 成 することが 可 能 です。G-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>G-6


111HHシリアル・コンソールの 設 定本 章 では<strong>RedHawk</strong> <strong>Linux</strong> 下 でシリアル・コンソールを 構 成 するために 必 要 な 手 順 を 提 供 します。USBキーボードが 付 いているシステム 上 でkdbカーネル・デバッガを 使 用 したい 場 合 はシリアル・コンソールが 必 要 となることに 注 意 して 下 さい。1. 以 下 のカーネル・オプションを 含 めるためにブート・コマンド 行 を 修 正 します:console=tty#,baud#tty#はコンソール 用 に 使 用 するシリアル・ポート、baud#は 使 用 するシリアル 通 信 速 度です。 通 常 は 殆 どが 以 下 のようになります:console=ttyS0,1152002. 以 下 の 行 を 含 めるために/etc/inittabファイルを 変 更 します:S0:2345:respawn:/sbin/agetty 115200 ttyS0 vt100baud#とtty#は 手 順 1のブート・オプションで 指 定 した 値 と 同 じにする 必 要 があります。最 後 のキーワードは 端 末 タイプを 指 定 ( 殆 どの 場 合 vt100、 必 要 に 応 じてカスタマイズ 可能 )します。 詳 細 についてはagetty(8)のmanページを 参 照 して 下 さい。この 行 はファイル 内 のどこにでも 追 加 することが 可 能 ですが、 通 常 は 最 後 に 追 加 します。この 行 の 目 的 はマルチ・ユーザー・モードでシステム 起 動 後 にシリアル・コンソール 上でログインを 取 得 するためです。3. ルート・ログインがシリアル・コンソール 上 で 必 要 な 場 合 、( 一 般 的 には) /etc/securettyファイルを 変 更 または 削 除 する 必 要 があります。 詳 細 についてはsecuretty(5)のmanページを 参 照 して 下 さい。4. 適遚 切 なデータ 端 末 装 置 をシリアル・ポートに 接 続 し、 遥 んだ 通 信 速 度 で 通 信 するように構 成 されていることを 確 認 して 下 さい。 使 用 するデバイスによってはヌル・モデムが 必要 となる 可 能 性 があります。安 価 な<strong>Linux</strong> PCはデータ 端 末 装 置 としては 優 れた 遥 択 であることに 気 付 いて 下 さい。シリアル 通 信 セッションの 作 成 に 関 する 詳 細 な 情 報 はminicom(1)のmanページを 参 照 して 下さい。Windows PCもまた 使 用 することが 可 能 ですが、この 説 明 は 本 資 料 の 範 疇 を 超 えています。シリアル・コンソールのもう1つの 用 途 は、ハングする 可 能 性 のあるシステムを 調 査 するためにリアルタイム・シェルを 構 成 することです。この 手 順 は 問 題 が 発 生 している 全 てのアプリケーションがロードされる 前 に 設 定 されたシリアル・コンソール 上 で 完 了 している 必 要 があります。1. ハングする 可 能 性 のあるシステムのシリアル・コンソールを 設 定 します。 例 えば:• GRUBブート・コマンド 行 にこの 文 字 列 を 追 加 します:console=ttyS0,115200H-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>• /etc/inittabファイルにこの 行 を 追 加 します:S0:2345:respawn:/sbin/agetty 115200 ttyS0 vt100• /etc/securettyファイルに“ttyS0” エントリを 追 加 します。• シリアル・ケーブルを 一 番 低 い 番 号 のシリアル・ポートと 他 の 計 算 機 またはラップトップのシリアルポートに 接 続 します。2. もう 一 方 の 計 算 機 が<strong>Linux</strong>である 場 合 :• シェルを 開 きます。• # minicom –s.• 「Serial Port Setup」を 遥 択 し「Enter」。• デバイスを/dev/ttyS0へ 変 更 します。• 通 信 速 度 を115200へ 変 更 します。• 「Exit」を 遥 択 し「Enter」(「Exit from minicom」ではありません)。• ログイン・プロンプトからルートとしてログインします。もう 一 方 の 計 算 機 がWindowsの 場 合 :• ターミナル・アプリケーションを 起 動 します。• COM1を 使 用 して 接 続 します。Connect using COM 1.• 通 信 速 度 を115200に 設 定 します。• ログイン・プロンプトからルートとしてログインします。3. ルート・ログインから、 以 下 で 示 すRTConsole.shスクリプトを 実 行 します。 引 数 としてどのタスクよりも 高 いリアルタイム 優 先 度 を 与 えます。 例 えば:# ./RTConsole.sh 90この 手 順 はデバッグ 用 に「ハング」している 間 もアクティブなままであるログイン・シェルおよびシステムへのアクセスと 視 認 性 を 提 供 します。 幸 先 良 い 出 足 はどのプロセスがシステムを 支 配郤しているのかを 割 り 出 すためにtop(1)を 実 行 することです。デバッグが 終 了 したらシステムを 再 起 動 する 必 要 があります:# rebootRTConsole.sh#!/bin/bashif [ $UID -ne 0 ]thenecho "Must be root to execute."exitfiif [ $# -eq 0 ]thenecho "Usage: RTConsole "exitfifor i in $(ps -e -o pid,cmd | fgrep /0 | fgrep -v fgrep | awk '{print$1}');dorun -s fifo -P $1 -p $idonerun -s fifo -P $1 -p $PPIDH-2


IIブート・コマンド・ライン・パラメータ表 I-1に<strong>RedHawk</strong>で 独 自 に 動 作 するブート・コマンド・ライン・パラメータを 掲 載 しています。これは<strong>Linux</strong> 下 で 利 用 可 能 な 全 てのブート・コマンド・ライン・パラメータを 含 んでいません。この一 覧 表 に 関 して、カーネル・ソース・ディレクトリ 内 のDocumentation/kernel-parameters.txtを 参 照 またはinfo grubと 入 力 して 下 さい。ブート・パラメータはカーネルに 組 み 込 まれている 機 能 を 定 義 します。ブート・コマンドはカーネル 起 動 時 に 自 動 的 に 包 含 するために/etc/grub.confへ 追 加 すること、またはカーネルが 起 動 するときにブート・コマンド・ラインに 指 定 することが 可 能 です。個 々の 機 能 に 関 する 情 報 は 様 々な 場 所 で 入 手 可 能 です。 表 I-1で 以 下 の 参 考 文 献 が 提 供 されます。• 本 書 <strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong> で 提 供 される 情 報 が 含 まれるページ 番 号• 他 の 適遚 切 なConcurrentの 資 料 の 名 称 および 文 書 番 号以 下 を 含 む 取 得 可 能 な 情 報 のある 他 のソース:• カーネル・ソース・ツリーのDocumentationディレクトリ 下 のファイル• Internet 上 の<strong>Linux</strong>の 資 料 サイトI-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>表 I-1 ブート・コマンド・ライン・パラメータパラメータオプション概 要crashkernel =size@16M クラッシュ・ダンプの 保 存 および 解 析 するために 破 損 したカーネルのコア・イメージを 含む「クラッシュ」カーネルをロードするためのメモリと 非 既 定 の 場 所 を 予 約 。Concurrent関 連連 資 料12-1ページkdbmemmapmmnmi_dumpsize は 予 約 するメモリのサイズ:32M, 64M ( 既 定 値 ), 128M16Mはオフセット・アドレス=on kdbカーネル・デバッガへのエントリを 許 可 。=off kdbへのエントリは 無 効 。=early起 動 処 理 の 初 期 にカーネルをkdbにエントリさせる。=sizeaddress 予 約 するメモリ 領 域 を 定 義 。は、システムRAMが‘@’、予 約 が‘$’、ACPIが “#”=exactmap 正 確 なBIOSマップの 使 用 を 指 定 。=sizeaddress memmapの 別 名 (x86_64のみ)。予 約 するメモリ 領 域 を 定 義 。=exexactmapの 別 名 (x86_64のみ)。正 確 なBIOSマップの 使 用 を 指 定 。デバッガへエントリするためにシステムNMIボタンの 押 下 を 許 可 。nmi_watchdog=0でない 限 り、デバッガを 終 了するとクラッシュ・カーネルをロードしダンプを 取 得 。12-8ページ/kernel-source/Documentation/kdb2-23ページ2-23ページ12-9ページI-2


ブート・コマンド・ライン・パラメータ表 I-1 ブート・コマンド・ライン・パラメータ ( 続 き)きパラメータオプション概 要nmi_watchdog =0 NMIウォッチドッグ 機 能 を 停 止 。<strong>RedHawk</strong>カーネルの 既 定 値 。=1 各 CPUはNMI 固 有 のタイミングで 実 行 。カーネルのAPICサポートが 必 要 。現 在 はこの 設 定 は 動 作 せず「2」へ 変 更 。=2 ブロードキャストを 介 して 全 CPUへ 送 信 する 割 り 込 みを 生 成 する 外 部邪 NMIタイマーを使 用 。i386デバッグ・カーネルの 既 定 値 。=-1 カーネルは1または2を 遥 択 (x86_64のみ)。x86_64デバッグ・カーネルの 既 定 値 。no-hz=yesNO_HZとNO_HZ_ENABLEDがカーネルに 設定 されている 場 合 、NO_HZカーネル・コードを 許 可 。=noNO_HZとNO_HZ_ENABLEDがカーネルに 設定 されている 場 合 、NO_HZカーネル・コードは 無 効 。noirqbalance n/a カーネル・チューニング・パラメータIRQBALANCEがカーネルで 有 効 の 場 合 、IRQバランシングを 停 止 することが 可 能 。規 定 値 は 無 効 (シールドCPU 用 に 推 奨 )。無 効 / 停 止 はCPU 間 の 割 り 込 み 負 荷 のバランスをとるためのIRQアフィニティの 周 期 的 な調 整 を 抑 制 。no_ktext_repli n/a 全 てのカーネル・テキスト・ページ 複 製 のサポートを 無 効 。no_kmod_repli n/a カーネル・モジュール・テキスト・ページ 複製 のサポートを 無 効 にするが、 常 駐 カーネル・テキスト・ページ 複 製 は 有 効 のまま。no_pregraph_pgs n/a プロセッサ 間 割 り 込 みを 抑 えるために 使 用されるプリアロケート・グラフィクス・ページ・サポートの 全 てを 無 効 。Concurrent関 連連 資 料12-9ページ/kernel-source/Documentation/nmi_watchdog.txtB-1ページ2-10ページ10-14ページ10-14ページ10-5ページI-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>表 I-1 ブート・コマンド・ライン・パラメータ ( 続 き)きパラメータオプション概 要numa =off カーネル 内 でカーネル・チューニング・パラメータNUMAが 有 効 となっているx86_64システムのNUMAサポートを 無 効 。全 てのCPUが 属 する 単 一 NUMAノードのシステムを 作 成 。これはカーネルにNUMAサポートが 組 み 込まれていない(ノードなしのフラット・メモリ・システムでNUMAユーザー・インターフェースは 呼 ばれた 時 にエラーを 返 す)のとは異 なる。prefer_highmem n/a (ローカルNUMAノードのHIGHMEM 領 域 ページが 既 に 全 て 割 り 当 てられた 時 、)リモートNUMAノードの「HIGHMEM 領 域 」ページを 遥 択 する 前 のローカルNUMAノードの「 標準 領 域 」ページの 利 用 を 無 効 。rcim =rcimoptions RCIM 用 構 成 オプション( 割 り 込 みの 特 性 、 関連連 性 、タイミング・ソース、RCIMマスターのホスト 名 等 )を 定 義 。rhash_entries =n エントリ 数 を 固 定 するため、IPルート・キャッシュ・テーブルをサイズ 調 整 (ksoftirqdによる 周 期 的 なフラッシュ)。規 定 値 では、サイズは 動 的 で 利 用 可 能 なメモリの 量 に 基 づく。本 エントリは 過遃 度 のksoftirqdの 実 行 を 減 らすために 小 さなサイズを 定 義 して 使 用 。tsc_sync=autoBIOSが 正 しくTSCに 同 期 したかどうかを 確認 。もしされていない 場 合 はTSCと 再 同 期 。既 定 値 。=checkBIOSが 正 しくTSCに 同 期 したかどうかを 確認 。BIOSが 失 敗 した 場 合 、 利 用 可 能 なクロックソースとしてTSCは 無 効 。=force 無 条 件 で 起 動 の 最 後 で 全 てのTSCを 再 同 期 。vmalloc =nn[KMG] nn のサイズを 正 確 に 所 有 するためにvmalloc領 域 を 強 制 します。これは 最 小 サイズを 増 やすために 使 用 することが 可 能 です(32bitカーネルでは128MB)。また、サイズを 小 さくするため、および 直 接 マッピングされたカーネルRAMに 対 しより 多 くの 空 間 を 残 すために使 用 することも 可 能 です。サイズ 単 位 の 指 定 にK, M, G(kilo-byte,mega-byte or giga-byte)を 使 用 することが 可能 。Concurrent関 連連 資 料10-1ページ10-17ページRCIM User’s <strong>Guide</strong>(0898007)2-34ページ7-1ページ14-11ページI-4


ブート・コマンド・ライン・パラメータI-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>I-6


用 語 解 説本 用 語 解 説 は<strong>RedHawk</strong> <strong>Linux</strong>で 使 用 される 用 語 を 定 義 します。 斜 体 の 用 語 もまたここで 定 義 されています。アフィニティ実 行 が 許 可 されたプロセスまたは 割 り 込 みとCPUとの 間 の 関 連連 性 。これはアフィニティ・マスクに 含 まれていないCPU 上 での 実 行 が 禁 止 されます。もし1つ 以 上 のCPUがマフィニティ・マスクに含 まれている 場 合 、カーネルは 負 荷 やそのほか 考 慮 すべき 事 項 に 基 づいてプロセスや 割 り 込 みを自 由 に 移 動 しますが、アフィニティ・マスク 内 の 他 のCPUだけとなります。 既 定 の 状 態 はシステムの 全 てのCPU 上 で 実 行 するアフィニティとなっていますが、 指 定 はmpadvise(3), shield(1),sched_setaffinity(2), /procファイル・システムを 通 して 行 うことが 可 能 です。シールドCPU と一 緒 にアフィニティを 使 用 することでアプリケーション・コードのより 優 れたデターミニズムを提 供 することが 可 能 となります。AGPPC 上 のメイン・メモリへのアクセスが 普 通 のPCIバスよりも 高 速 になる 低 コスト3Dグラフィクス・カードを 提 供 するIntelのバス 仕 様 。非 同 期 セーフライブラリ・ルーチンをシグナル・ハンドラ 内 から 安 全 に 呼 び 出 すことが 可 能 な 場 合 。いくつかの 非 同 期 セーフなコードを 実 行 しているスレッドがシグナルに 割 り 込 まれた 場 合 にデッドロック(deadlock)することはありません。これはロックを 取 得 する 前 にシグナルをブロックすることで 遉成 されます。アトミック一 連連 の 操 作 全 てが 同 時 に 実 行 され、それらが 同 時 に 全 て 実 行 することが 可 能 な 場 合 のみ。認 証ブロッキング・メッセージ 操 作ブロッキング・セマフォ 操 作ブレークポイントセキュリティ 目 的 のためにユーザー 名 、パスワード、プロセス、コンピュータ・システムの 身 元の 照 合 。PAM は<strong>RedHawk</strong> <strong>Linux</strong> 上 での 認 証 方 法 を 提 供 します。メッセージの 送 信 または 受 信 の 試 みが 失 敗 した 場 合 に 実 行 を 停 止 。セマフォ 値 のテスト 中 に 実 行 を 停 止 。実 行 が 停 止 されプロセッサの 制 御 がデバッガへ 切 り 替 わるプログラム 内 の 位 置 。Glossary-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>ビジー・ウェイトケーパビリティ条 件 同 期コンテキスト・スイッチクリティカル・セクションデッドロック割 り 込 みハンドリング 遅逼 延デターミニズムハードウェアでサポートされるテスト&セット 操 作 を 使 用 しているロックを 取 得 する 相 互 排 他の 方 法 。プロセスが 現 在 ロックされた 状 態 のビジー・ウェイト・ロックを 取 得 しようとする 場 合 、ロックしているプロセスは、 現 在 ロックを 保 持 するプロセスがクリアされテスト&セット 操 作 が成 功 するまでテスト&セット 操 作 をリトライし 続 けます。 別 名 スピン・ロック。スーパーユーザーに 関 連連 する 伝 統 的 な 特 権 を 単 独 で 有 効 および 無 効 にすることが 可 能 な 別 個 の単 位 に 分 割 。 現 在 の 全 ての 有 効 な<strong>Linux</strong>ケーパビリティ 一 式 は/usr/include/linux/capability.hで 入手 する 事 が 可 能 で 付 録 Cに 詳 述 されています。PAM を 通 して、ルートだけが 通 常 認 められる 特 権を 必 要 とするアプリケーションを 非 ルート・ユーザーが 実 行 する 設 定 にすることが 可 能 です。アプリケーションが 定 義 する 条 件 を 満 足 するまでプロセスの 進逭 行 を 遅逼 らせるためにスリープ/ウェイクアップ/タイマーのメカニズムを 利 用 。<strong>RedHawk</strong> <strong>Linux</strong>では、postwait(2)およびserver_block(2)/server_wake(2)システムコールはこの 目 的 のために 提 供 されます。マルチタスク・オペレーティング・システムが 実 行 中 のあるプロセスを 止 めて 他 を 実 行 した 時 。ソフトウェアの 正 しい 動 作 を 保 証 するために 順 序 正 しくかつ 中 断 なしで 実 行 されなければならない 一 連連 の 命 令 。2つ 以 上 のプロセスが 両 方 ともあるリソースを 他 方 が 解 放 するのを 待 っているためにそれらのプロセスが 進逭 行 することが 出 来 ない 複 数 の 状 況 すべて。割 り 込 みルーチンが 割 り 込 みレベルでされたであろう 処 理 を 遅逼 延 する 方 法 。<strong>RedHawk</strong> <strong>Linux</strong>はカーネル・デーモンのコンテキスト 内 で 実 行 されるソフトIRQ、タスクレット、ワーク・キューをサポートします。 高 優 先 度 リアルタイム・タスクが 遅逼 延 された 割 り 込 み 機 能 の 動 作 をプリエンプトすることが 可 能 となるようにこれらのデーモンの 優 先 度 とスケジューリング・ポリシーを 構 成することが 可 能 です。一 定 の 時 間 内 に 特 定 のコード・パス( 順 に 実 行 される 一 連連 の 命 令 )を 実 行 するためのコンピュータ・システムの 能 力 。あるインスタンスから 他 へコード・パスが 変 化 する 実 行 時 間 の 範 囲 はシステムのデターミニズムの 度 合 いを 表 します。デターミニズムはユーザー・アプリケーションのタイム・クリティカルな 部邪 分 を 実 行 するために 必 要 な 時 間 とカーネルでシステム・コードを 実 行 するために 必 要 な 時 間 の 両 方 に 適遚 用 されます。Glossary-2


用 語 解 説デターミニスティック・システムデバイス・ドライバダイレクトI/O裁 量 アクセス 制 御実 行 時 間FBS固 定 優 先 度 スケジューリング・ポリシーフレバーデターミニズムに 影 響 を 与 える 要 因 を 制 御 することが 可 能 なシステム。デターミニズムを 最 大 限発 揮 するための<strong>RedHawk</strong> <strong>Linux</strong> 下 で 利 用 可 能 なテクニックは、シールドCPU、 固 定 優 先 度 スケジューリング・ポリシー、 割 り 込 みハンドリング 遅逼 延 、 負 荷 バランシング、ハイパースレッディング 制 御 ユニットを 含 みます。オペレーティング・システムが 利 用 を 許 可 するコンピュータ・ハードウェアの 部邪 品 や 周 辺 機 器 と直 接 通 信 するソフトウェア。デバイス・モジュールまたはドライバとも 呼 ばれます。カーネルのデータ・バッファリングを 回 避遪 するバッファのないI/O 形 式 。ダイレクトI/Oでは、ファイル・システムはディスクとユーザー 提 供 バッファ 間 で 直 接 データを 転 送 します。ユーザーの 裁 量 で 与 えられた 証 明 書 の 有 効 性 を 確 認 するユーザー 名 、パスワード、ファイル・アクセス・パーミッションに 基 づくメカニズム。これは 例 えばIPアドレスといったユーザーが 管 理できないアイテムに 準 ずる 強 制 的 な 制 御 とは 異 なります。タスクを 完 了 するために 要 する 時 間 。<strong>RedHawk</strong> <strong>Linux</strong>で 高 分 解 能 プロセス・アカウンティング 機能 を 利 用 すると、 各 プロセスの 実 行 時 間 測 定 は、 高 分 解 能 タイム・スタンプ・カウンター(TSC)で 測 定 されたシステム 時 間 、ユーザー 時 間 、システムが 割 り 込 まれた 時 間 、ユーザーが 割 り 込 まれた 時 間 に 分 類 されますFrequency-Based Scheduler (FBS) を 参 照 して 下 さい。プロセス 単 位 を 基 本 に 静 的 な 優 先 度 をユーザーが 設 定 可 能 なスケジューリング・ポリシー。スケジューラーは 固 定 優 先 度 スケジューリング・ポリシーの1つを 使 用 するプロセスの 優 先 度 を 決 して変 更 しません。 例 え 他 のプロセスが 実 行 可 能 であっても、 最 高 固 定 優 先 度 プロセスが 実 行 可 能 であれば 直 ぐにCPUを 取 得 します。SCHED_FIFOとSCHED_RRの2つの 固 定 優 先 度 スケジューリング・ポリシーが 存 在 します。個 々の 実 体 の 差 。<strong>RedHawk</strong> <strong>Linux</strong>はプレビルト・カーネルのフレバーが3 種 類 あり、 各 々 異 なる 特徴 と 構 成 を 含 んでいます。カスタマイズされたカーネルは 遊 ったフレバーを 構 成 することになります。フレバーの 指 定 はMakefileの 最 上 位 に 定 義 され、カーネルが 構 築 されるときにカーネル 名称 に 接 尾 語 として 追 加 されます。( 例 : - trace)Glossary-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>Frequency-Based Scheduler (FBS)GRUBハイパースレッディングinfoページプロセス 間 通 信プロセス 間 同 期Real-Time Clock and Interrupt Module (RCIM)、 外 部邪 割 込 みソース、サイクルの 完 了 により 提 供 される 高 分 解 能 クロックを 含 む 様 々なタイミング・ソースに 基 づき 指 定 の 周 期 でプロセスを 開 始 するために 使 用 されるタスク 同 期 メカニズム。プロセスは 優 先 度 ベースのスケジューラを 使 用 してスケジュールされます。パフォーマンス・モニタ(PM)と 組 み 合 わせて 使 用 する 場 合 、 特 定 アプリケーション 用 に 様 々なタスクへプロセッサを 割 り 当 てる 最 良 の 方 法 を 決 定 するためにFBSを 使 用 することが 可 能 です。NightSimツールはFrequency-Based Schedulerおよびパフォーマンス・モニタ 用 のグラフィカル・インターフェースです。GRand Unified Bootloader。 複 数 のオペレーティング・システム(およびそれらの 改 良 )をロードおよび 管 理 する 小 さなソフトウェア・ユーティリティ。GRUBは<strong>RedHawk</strong> <strong>Linux</strong>で 使 われるデフォルトのブートローダーです。1つの 物 理 プロセッサでソフトウェア・アプリケーションの 複 数 のスレッドを 同 時 に 実 行 することを 可 能 にするIntel Pentium Xeonプロセッサの 機 能 。1つのプロセッサ 実 行 リソース 一 式 を 共 有 しつつ 各 プロセッサは2つのアーキテクチャを 所 有 しています。 各 々のアーキテクチャは1つの 論 理CPUが 結 果 としてシステムの 論 理 CPUが2 倍 になったとみなすことが 可 能 です。ハイパースレッディングが 有 効 である 単 一 プロセッサ・システムは2つの 論 理 CPUを 持 ち、 割 り 込 みやバックグラウンド・プロセスからいずれかのCPUをシールドすることが 可 能 になります。ハイパースレッディングは 全 ての<strong>RedHawk</strong> <strong>Linux</strong> i386プレビルト・カーネルではデフォルトで 有 効 になっています。infoページはコマンドまたはファイルに 関 する 詳 細 な 情 報 を 提 供 します。manページは 簡 潔 かつinfoページよりも 情 報 を 少 なく 提 供 する 傾 向 があります。infoページは 操 作 可 能 なメニュー・システムにより 対 話 型 となっています。infoページはinfo(1)コマンドを 使 いアクセスします。^あるプロセスが 他 のプロセスと 通 信 することを 可 能 にする 機 能 。プロセスは 同 一 計 算 機 上 またはネットワークを 介 して 接 続 されている 異 なる 計 算 機 上 で 実 行 することが 可 能 です。IPCはあるアプリケーションが 他 のアプリケーションを 制 御 すること、 相 互 に 干 渉 することなくいくつかのアプリケーションに 対 し 同 じデータを 共 有 することを 可 能 にします。IPC 方 式 にはパイプ、メッセージ・キュー、セマフォ、 共 有 メモリ、ソケットが 含 まれます。協 同 プロセスが 同 じ 一 連連 のリソースへのアクセスを 調 整 することを 可 能 にするメカニズム。<strong>RedHawk</strong> <strong>Linux</strong>は 再 スケジューリング 変 数 、ビジーウェイト、スリーピーウェイト 相 互 排 他 メカニズム、 条 件 同 期 ツールを 含 む 様 々なプロセス 間 同 期 ツールを 提 供 します。Glossary-4


用 語 解 説ジッタージャーナリング・ファイル・システムカーネルカーネル 構 成 GUI負 荷 バランシングmanページメモリ・オブジェクト周 期 的 な 動 作 の 到 遉 または 発 進逭 した 時 間 の 変 化 の 大 きさ。コード・セグメントの 実 行 または 割 り込 みの 応 答 のどちらかで 計 測 された 時 間 のワースト・ケースが 標 準 的 な 状 況 よりもはっきりと 異なる 場 合 、アプリケーションの 性 能 はジッターに 直 面 していると 言 います。ジッターは 標 準 的 に正 しい 周 期 内 に 動 作 が 全 て 留 まる 限 り 問 題 の 原 因 にはなりませんが、リアルタイム・タスクはジッターを 出 来 る 限 り 最 小 限 に 抑 えることを 概 ね 必 要 とします。ファイルシステム 内 の 最 終 的 な 場 所 へ 書 き 込 む 前 にディスク 処 理 がジャーナルまたはログと 呼 ばれるディスクの 領 域 へ 順 次 書 き 込 まれるファイルシステム。もしジャーナル・エントリが 働 く 前にクラッシュが 発 生 した 場 合 、 元 のデータはディスク 上 にまだ 存 在 し 新 しい 変 更 のみが 失 われます。システムの 再 起 動 時 、ジャーナル・エントリが 再 生 され 中 断 された 更 新 が 大 幅 に 簡 素 化 された 修 復 時 間 で 完 了 します。<strong>RedHawk</strong> <strong>Linux</strong>のジャーナリング・ファイル・システムはext3, xfs,reiserfsを 含 みます。より 多 くの 高 度 な 機 能 が 頼 る 基 本 的 な 機 能 を 実 行 するオペレーティング・システムの 重 要 な 部邪 分 。<strong>Linux</strong>はLinus Torvaldsおよび 開 発 者 中 心 のグループにより 開 発 されたカーネルを 基 にしています。Concurrentはデターミニスティックなリアルタイム 処 理 のために 拡 張 機 能 を 提 供 するRHELより配郤 布 される<strong>Linux</strong>カーネルを 修 正 しました。<strong>RedHawk</strong> <strong>Linux</strong>はジェネリック、デバッグ、トレースの3 種 類 のフレバーのプレビルト・カーネルを 提 供 します。これらは/bootディレクトリの 中 にvmlinuz--<strong>RedHawk</strong>-- というファイル 名 で 存 在 します。カーネルを 構 成 するために 遥 択 させるグラフィカル・インターフェース。Redhawk<strong>Linux</strong>では、ccur-configスクリプトを 実 行 することで 遥 択 することが 可 能 なGUIを 表 示 します。CPU 全 体 の 負 荷 のバランスをとるためにいくつかのCPUからプロセスを 移 動 します。コマンドまたはファイルを 説 明 する 要 約 および 簡 潔 なオンライン・ドキュメント。manページはシェル・プロンプトでman、 続 いてスペース、その 後 読 みたい 項 目 を 入 力 することにより 表 示 されます。<strong>RedHawk</strong> <strong>Linux</strong>のmanページはRHELディストリビューションより 提 供 されるmanページおよびConcurrentで 開 発 された 機 能 を 解 説 するmanページを 含 んでいます。対 応 するメモリを 共 有 することを 可 能 にするために1つ 以 上 のプロセスのアドレス 空 間 へマッピング 可 能 な 名 前 つきストレージ 領 域 。メモリ・オブジェクトは 全 てのファイル・システム・オブジェクト( 例 えば、ターミナルやネットワーク・デバイス)ではなく、POSIX 共 有 メモリ・オブジェクト、レギュラー・ファイル、いくつかのデバイスを 含 んでいます。プロセスは、カーネルとアプリケーション 間 でのデータ・コピーを 除 き、オブジェクト 上 のアドレス 空 間 の 一 部邪 をマッピングすることによって 直 接 メモリ・オブジェクト 内 のデータにアクセスすることが 可 能 です。Glossary-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>メッセージ・キューモジュールミューテックス相 互 排 他NightProbeNightSimNightStar RTツールNightTrace1つ 以 上 の 読 み 取 りプロセスによって 読 まれるメッセージを1つ 以 上 のプロセスが 書 く 事 が 可 能 なプロセス 間 通 信 (IPC)のメカニズム。<strong>RedHawk</strong> <strong>Linux</strong>はPOSIXとSystem Vのメッセージ・キュー 機 能をサポートしています。システム・レベルの 機 能 を 実 行 するルーチンの 集 まり。モジュールは 必 要 に 応 じて 実 行 中 のカーネルからロードおよびアンロードされる 可 能 性 があります。変 更 の 同 時 発 生 から 共 有 データ 構 造造 体 を 保 護 するためおよびクリティカル・セクションを 実 装 するために 便 利 な 相 互 排 他 デバイス。ミューテックスはアンロック(どのスレッドにも 所 有 されていない)とロック(1つのスレッドに 所 有 されている)の2つの 起 こりうる 状 態 があります。 他 のスレッドに 既 にロックされているミューテックスをロックしようとするスレッドは、 所 有 しているスレッドが 最 初 のミューテックスをアンロックするまで 停 止 します。一 連連 の 共 同 プロセスの1つだけが 共 有 リソースへのアクセスをシリアライズすることにより 同 時にクリティカル・セクションで 実 行 することが 可 能 となることを 保 証 するメカニズム。3つのメカニズムのタイプ(ビジーウェイトを 必 要 とするもの、スリーピーウェイトを 必 要 とするもの、この2つの 組 み 合 わせ)は 一 般 的 に 相 互 排 他 を 提 供 するために 使 用 されます。1つ 以 上 の 実 行 プログラム 内 のプログラムデータのリアルタイムのレコーディング、 表 示 、 変 更 を可 能 にするConcurrentが 開 発 したグラフィカル・ユーザー・インターフェース(GUI)。これはシミュレーション、データ 収 集 、システム 制 御 を 含 むアプリケーションの 開 発 中 や 動 作 中 に 使 用 することが 可 能 です。Frequency-Based Scheduler (FBS)およびパフォーマンス・モニタ(PM)のためのグラフィカル・ユーザー・インターフェース(GUI)。リアルタイム・アプリケーションの 実 行 時 の 動 作 をスケジューリング、モニタリング、 解 析 するためにグラフィカル・インターフェースを 備 えるConcurrentが 提 供 する 開 発 ツールの 集 まり。このツール 群 はNightSim 周 期 スケジューラ、NightProbeデータ・モニタ、NightTraceイベント・アナライザ、NightTuneチューナー、NightViewデバッガを 含 んでいます。マルチプロセスおよびマルチプロセッサのユーザー・アプリケーションやオペレーティング・システムの 動 作 の 動 的 な 挙 動 を 解 析 するためにConcurrentが 開 発 したグラフィカル・ツール。NightTrace RTツール 群 は 対 話 型 デバッグ、 性 能 分 析 ツール、トレース・データ 収 集 デーモン、アプリケーション・プログラミング・インターフェース(API)から 構 成 されます。Glossary-6


用 語 解 説NightTuneCPU 使 用 状 況 、コンテキスト・スイッチ、 割 り 込 み、 仮 想 メモリ 使 用 状 況 、ネットワーク 活 動 、プロセス 属 性 、CPUシールディングを 含 むシステムとアプリケーション 性 能 の 解 析 のためにConcurrentが 開 発 したグラフィカル・ツール。NightTuneはポップアップ・ダイアログまたはドラッグ&ドロップを 使 用 して 優 先 度 、スケジューリング・ポリシー、プロセス 単 体 またはグループのCPUアフィニティを 変 更 することが 可 能 です。CPUのシールディングやハイパースレッド 属 性および 個 々の 割 り 込 みのCPU 割 り 当 てもまた 設 定 することが 可 能 です。NightView非 ブロック・メッセージ 操 作非 ブロック・セマフォ 操 作NUMAPAMPCIパフォーマンス・モニタ (PM)C, C++, Fortranで 書 かれたリアルタイム・アプリケーションのためにConcurrentが 設 計 した 多 目 的グラフィカル・ソース・レベル・デバッグおよびモニタリング・ツール。NightView RTは 最 小 限の 干 渉 でローカル・システムまたは 異 なるターゲットのマルチプロセッサ 上 で 動 作 しているリアルタイム・プロセスの 監 視 、デバッグ、パッチを 当 てることが 可 能 です。メッセージの 送 信 または 受 信 の 試 みに 失 敗 した 場 合 に 実 行 を 停 止 しません。セマフォ 値 のテスト 中 は 実 行 を 停 止 しません。Non-Uniform Memory Architecture。 異 なるメモリのクラスへのアクセス 時 間 が 著 しく 異 なる 一 部邪 のマルチプロセッサで 使 用 されているメモリ・アーキテクチャ。プロセッサは 非 ローカル・メモリ(ローカルから 他 のプロセッサまたはプロセッサ 間 で 共 有 されたメモリ)よりもより 高 速 にそれぞれのローカル・メモリへアクセスすることが 可 能 です。Pluggable Authentication Module。この 機 能 のために 個 々のプログラムを 別 々に 再 コンパイルすることなくシステム 管 理 者 がアクセスおよび 認 証 ポリシーを 設 定 することが 可 能 な 方 法 。この 仕 組みの 下 では、ルートだけが 通 常 許 可 されている 特 権 が 必 要 となるアプリケーションの 実 行 を 非 ルート・ユーザーに 設 定 することが 可 能 となります。Peripheral Component Interface。ビデオカード、サウンド・カード、ネットワーク・インターフェース・カード、モデムのようなプロセッサと 周 辺 機 器 デバイス 間 の 高 速 データ・パスを 提 供 する周 辺 機 器 バス。PCIは「プラグ&プレイ」 機 能 、33MHzと66MHzでの 動 作 、32bitと64bitのデータ・パスを 提 供 します。Frequency-Based Scheduler 上 でスケジュールされたプロセスのCPU 使 用 状 況 の 監 視 を 可 能 にする機 能 。 取 得 した 値 は 負 荷 バランスや 処 理 の 効 率 を 向 上 するためにプロセッサ 間 でどのようにプロセスを 再 配郤 置 するのかを 判 断 するために 役 立 ちます。NightSimはパフォーマンス・モニタのためのグラフィカル・インターフェースです。Glossary-7


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>Pluggable Authentication Module (PAM)POSIXプリエンプション優 先 度 継 承優 先 度 反 転特 権プロセスPAMを 参 照 して 下 さい。プロセス・ディスパッチ・レイテンシーRCIMユーザー 空 間 用 の 規 格 と 共 にUNIXに 類 似 したカーネル・インターフェースのためのセマンティクスとインターフェースの 仕 様 を 定 める 規 格 。 全 てのPOSIXに 合 致 しているオペレーティング・システムにサポートされている 必 要 のあるコアPOSIX 定 義 、および 特 定 の 機 能 ( 例 :POSIXメッセージ・キュー)のためのいくつかのオプション 規 格 が 存 在 します。CPU 上 で 実 行 されたプロセスがより 高 い 優 先 度 のプロセスに 置 き 換 えられる 場 合 。<strong>RedHawk</strong>に 含まれるカーネル・プリエンプションは 例 えカーネル 空 間 で 動 作 していても 低 優 先 度 プロセスがプリエンプトされることが 可 能 であり、 結 果 としてシステム 応 答 が 向 上 されます。プロセス・プリエンプションは 再 スケジューリング 変 数 の 利 用 を 通 して 制 御 されます。優 先 度 反 転 を 回 避遪 するために 必 要 に 応 じてあるプロセスの 優 先 度 を 他 へ 直 ぐに 伝 えるメカニズム。高 優 先 度 プロセスが 低 優 先 度 プロセスの 実 行 のために 強 制 的 に 待 たされる 場 合 。ユーザーまたはプロセスがデリケートな 操 作 やシステムの 制 限 事 項 を 無 視 することが 可 能 となるメカニズム。スーパーユーザーは 全 ての(ルートの) 特 権 を 所 有 しています。ケーパビリティを 通して、 個 々のユーザーおよびプロセスに 対 して 特 権 を 有 効 または 無 効 にすることが 可 能 です。実 行 されているプログラムの 実 体 。 各 プロセスはユニークなPID(カーネルのプロセス・テーブル内 にあるそのプロセスのエントリ)を 持 っています。割 り 込 みにより 知 らされる 外 部邪 イベントの 発 生 から 外 部邪 イベントを 待 っているプロセスがユーザー・モードで 最 初 の 命 令 を 実 行 するまでに 経 過遃 した 時 間 。Real-Time Clock and Interrupt Module。 複 数 のアプリケーションで 完 全 にデターミニスティックなイベント 同 期 をするためにConcurrentが 設 計 した 多 機 能 PCIカード。RCIMは 同 期 クロック、 複 数のプログラム 可 能 なリアルタイム・クロック、 複 数 の 入 出 力 外 部邪 割 込 みラインを 含 んでいます。割 り 込 みはRCIMのチェーン 接 続 を 利 用 して 相 互 接 続 したシステム 間 で 共 有 ( 分 配郤 )することが 可能 です。Glossary-8


用 語 解 説リアルタイム再 スケジューリング 変 数ロウバスト・ミューテックスRPMセマフォ共 有 メモリシールドCPUシールドCPUモデル実 在 のイベントに 応 答 し、 所 定 の 期 限 内 にイベントを 処 理 することを 必 要 とされる 処 理 手 続 きを完 了 すること。 実 在 のイベントへの 応 答 が 必 要 となる 計 算 は 期 限 前 に 完 了 する 必 要 があり、さもなければ 結 果 が 間 遊 っているとみなされます。 指 定 された 時 間 の 制 約 の 範 囲 内 で 特 定 の 機 能 を 保証 することが 可 能 であるため、<strong>RedHawk</strong> <strong>Linux</strong>は 真 のリアルタイム・オペレーティング・システムとなります。再 スケジュール 用 に 単 一 プロセスの 脆 弱 性 を 制 御 する( 原 則 アプリケーションがプロセスごとに割 り 当 てる)データ 構 造造 体 。アプリケーションのスレッドの1つがミューテックスを 保 持 している 間 に 死 んだ 場 合 、 回 復 する 機会 をアプリケーションへ 与 えるミューテックス。RPMパッケージ・マネージャ。コンピュータ・ソフトウェア・パッケージのインストール、アンインストール、 検 証 、 問 合 せ、 更 新 に 使 用 されるツール、データベース、ライブラリの 管 理 ツール。 全 ての 情 報 についてはrpm(8)のmanページを 参 照 して 下 さい。1つ 以 上 のプロセスがテスト&セットすることが 可 能 であるメモリ 位 置 の 値 。 既 にロックされているセマフォをロックしようとするプロセスがロックされるまたはスリープ 状 態 となるため、セマフォはスリーピーウェイト 相 互 排 他 形 式 となります。<strong>RedHawk</strong> <strong>Linux</strong>は 最 速 性 能 を 得 るための 単純 なインターフェースを 提 供 するPOSIXカウンティング・セマフォ、 多 くの 追 加 機 能 ( 例 えば、セマフォ 上 にいくつの 待 機 者 がいるのかを 調 べる 機 能 、セマフォ 一 式 を 操 作 する 機 能 )を 提 供 するSystem Vセマフォを 提 供 します。1つ 以 上 のプロセスの 仮 想 アドレス・マップを 通 してアクセス 可 能 なメモリ。 共 有 メモリを 使 い、プロセスが 通 常 のオペレーティング・システムのサービスを 使 い 読 み 書 きするよりもより 速 くデータをやりとりすることが 可 能 です。<strong>RedHawk</strong> <strong>Linux</strong>はSystem VおよびPOSIXから 派 生 する 規 格 化された 共 有 メモリ・インターフェースを 含 んでいます。割 り 込 みやシステム・デーモンに 関 連連 する 予 測 できない 処 理 から 保 護 されている 高 優 先 度 タスクの 実 行 を 担 うCPU。<strong>RedHawk</strong> <strong>Linux</strong>システムの 各 CPUはバックグラウンド・プロセス、 割 り 込 み、ローカル・タイマー 割 り 込 みから 個 々にシールドすることが 可 能 です。特 定 の 重 要 なリアルタイム 機 能 に 品 質 の 高 いサービスを 保 証 する 方 法 でタスクおよび 割 り 込 みがCPUへ 割 り 当 てられるモデル。 殆 どの 割 り 込 みと 低 優 先 度 タスクは 他 のCPUへバインドする 一 方 、特 に 高 優 先 度 タスクは1つ 以 上 のシールドCPUへバインドします。 高 優 先 度 タスクの 実 行 を 担 うCPUは、 割 り 込 みやシステムコールを 介 してカーネルに 入 っている 他 の 低 優 先 度 プロセスの 動 作に 関 連連 する 予 測 不 可 能 な 処 理 からシールドします。Glossary-9


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>シールド・プロセッサスリーピーウェイトSMPソフトIRQスピン・ロックSystem VタスクレットTLBシールドCPUを 参 照 して 下 さい。現 在 ロックされた 状 態 のロックを 取 得 しようとする 場 合 にプロセスをスリープ 状 態 にするセマフォのような 相 互 排 他 の 方 法 。対 称 型 マルチプロセッシング。 多 くの 場 合 は 同 じメモリを 共 有 し 入 出 力 デバイスへのアクセスに対 処 可 能 である1つのオペレーティング・システムに 管 理 された2つ 以 上 のプロセッサを 使 用 する演 算 の 方 法 。アプリケーション・プログラムはシステムのいずれかまたは 全 てのプロセッサ 上 で実 行 することが 可 能 です。機 能 の 実 行 が 次 の 利 用 可 能 な「セーフ・ポイント」まで 遅逼 らせることが 可 能 となる 方 法 。 機 能 を呼 び 出 す 代 わりに 次 のセーフ・ポイントで 呼 び 出 される 原 因 となる「トリガ」が 使 用 されます。セーフ・ポイントはカーネルがハードウェアまたはソフトウェア 割 り 込 みを 扱 っておらず 割 り 込みのブロックが 実 行 されていない 全 ての 時 間 です。リソースのための 相 互 排 他 を 保 証 するビジー・ウェイトの 方 法 。スピン・ロックを 待 ち 続 けているタスクはスピン・ロックが 利 用 可 能 になるまでビジー・ループの 状 態 のままとなります。<strong>Linux</strong>やSystem Vシステムを 含 む 多 くのUNIKライクなシステムにサポートされるプロセス 間 通 信(IPC)オブジェクトのための 規 格 。System V IPCオブジェクトは、System V メッセージ・キュー、セマフォ・セット、 共 有 メモリ 領 域 の3 種 類 があります。ユーザー 空 間 に 復 帰 またはハードウェア 割 り 込 みの 後 にソフトウェア 割 り 込 みを 受 信 した 時 に 実行 しているソフトウェア 割 り 込 みルーチン。タスクレットは 同 時 に 複 数 のCPU 上 で 実 行 されませんが、 動 的 に 割 り 当 てることが 可 能 です。Translation Look-aside Buffer。 各 仮 想 アドレス・ページ 番 号 に 関 連連 する 物 理 アドレス・ページ 番 号を 記 録 する 仮 想 メモリ・システムで 使 用 されるテーブル。 仮 想 アドレスに 基 づくキャッシュのタグと 一 体 となってTLBは 使 用 されます。キャッシュ・アクセスおよび 仮 想 アドレスから 物 理 アドレスへの 変 換 が 平 行 して 進逭 むことが 可 能 となるように 仮 想 アドレスはTLBとキャッシュへ 同 時 に渡 されます。Glossary-10


用 語 解 説トレース・イベントデバッグおよび 性 能 解 析 用 のNightTraceツールで 調 査 が 可 能 なアプリケーションのソース・コード 内 またはカーネル 内 の 重 要 なポイント(トレース・ポイント)について 記 録 された 情 報 。ワーク・キューソフトIRQやタスクレット 以 外 の 遅逼 延 実 行 の 方 法 ですが、それらの 様 式 とは 異 なり、<strong>Linux</strong>はカーネル・デーモンのプロセス・コンテキスト 内 でワーク・キューを 処 理 するためにスリープが 可 能です。Glossary-11


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>Glossary-12


Indexパス/bootディレクトリ 11-1/dev/mqueue 3-2/etc/pam.d 13-2/etc/rc.sysinit 2-17/etc/security/capability.conf 13-2, 13-3/etc/sysconfig/kdump 12-3/etc/sysconfig/sbsvme 15-6/etc/sysconfig/sbsvme-mappings 15-7/procファイル・システム 1-6/proc/bus/pci 3-28, 14-1/proc/ccur B-3/proc/driver/btp 15-7, 15-15, 15-16/proc/driver/graphics-memory G-4/proc/interrupts 2-18/proc/irq/n/smp_affinity 2-10, 2-19/proc/mtrr G-2/proc/pid/affinity B-3/proc/pid/mem 9-1–9-4/proc/pid/resmem B-3/proc/shield/irqs 2-14, 2-18/proc/shield/ltmrs 2-14, 7-4/proc/shield/procs 2-14/proc/sysvipc/shm 3-15, 3-28/proc/vmcore 12-2/usr/lib/libccur_rt 9-3, 14-3/usr/lib64/libnuma.so 10-11数 値32bit 1-1, 11-264bitコード 移 行 E-1カーネル 1-1, 11-2, E-1Aアフィニティ 2-10, 2-14–2-19, 4-6, 4-13代 替 glibc 5-27AMD Opteronプロセッサ E-1非 同 期 I/O 1-10AUDIT B-3認 証 13-1Bbar_device_count 14-4bar_mmap 14-5bar_munmap 14-5bar_scan_close 14-4bar_scan_next 14-3bar_scan_open 14-3bar_scan_rewind 14-4ベース・アドレス・レジスタ(BAR) 3-26, 14-1, B-3bashコマンド 7-4ビッグ・カーネル・ロック(BKL) 14-14, B-5I/O 空 間 への 共 有 メモリのバインド 3-22, 3-23, 3-25プロセスのブロック 5-37–5-41ブート・コマンド・ライン・パラメータ I-1ボトム・ハーフ 14-12btpモジュール 15-6カーネルの 構 築 11-4ビジー・ウェイト 相 互 排 他 5-2, 5-7–5-12Cキャッシュ・スラッシング 2-22ケーパビリティ 13-3, B-2, C-1ccur-config 11-2ccur-g++ 5-27ccur-gcc 5-27CD/DVD 焼 付 け 2-34clock_getres 6-5clock_gettime 6-5clock_nanosleep 6-11, 6-12clock_settime 6-4クロックPOSIX 1-11, 6-1, 6-2, 6-4–6-5RCIM 1-5, 6-1, 7-1システムtime-of-day 6-4, 7-1TSC 7-1クロックソース 7-1条 件 同 期 5-1, 5-37カーネルの 構 成 11-2, B-1コンソール、シリアルの 設 定 H-1Index-1


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>カウンティング・セマフォ 1-10, 5-2, 5-12–5-21CPUアカウンティング 1-7, 2-11, 7-2, B-2アフィニティ 2-10, 2-14–2-19, 4-6, 4-13アイドリング 2-29–2-31, B-2負 荷 バランシング 7-3論 理 / 物 理 2-29再 スケジューリング 7-4シールディング(シールドCPUを 参 照 )cpuコマンド 2-18, 2-29–2-31CPU_IDLING B-2クラッシュ・ダンプ 12-1, B-5クラッシュ・ユーティリティ 12-5CRASH_DUMP 12-3, B-5クラッシュカーネル I-2プロセッサ 間 割 り 込 み B-4, G-1Dデーモン 制 御 14-13, 14-14, F-1DAEMON_CPU_LOCK B-2データ 管 理 API(DMAPI) 8-2データの 共 有 1-10デバッグ・カーネル 1-3, 11-2DEBUG_INFO 12-3, B-5デバッガ 1-6, 1-8, 12-8, B-5遅逼 延 割 り 込 み 機 能 14-12DETECT_SOFTLOCKUP 2-35, B-4デターミニズム 2-2, 2-20, 2-34デバイス・ドライバ 2-9, 11-5, 14-1ダイレクトI/O 8-1ディスクI/O 8-1DMAPI 8-2ドキュメント vダンプ 12-1, B-5DVD/CD 焼 付 け 2-34EEM64Tプロセッサ E-1例カーネルへのモジュール 追 加 11-6認 証 13-3, 13-4ビジー・ウェイト 相 互 排 他 5-9条 件 同 期 5-42initのCPUアフィニティ 2-17CPUのシールディング 2-13, 2-17, 2-31–2-34クラッシュ・ダンプ 12-6, 12-7デバイス・ドライバ 14-6, 14-9カーネル 構 成 と 構 築 11-5メッセージング 3-7, 3-9, 3-10, A-1NUMA 10-16PCI BARスキャン 14-3PCI-to-VME 15-17POSIXメッセージ・キュー A-1再 スケジューリング 制 御 5-7物 理 メモリの 予 約 2-23, 2-25runコマンド 4-15セマフォ 5-34, 5-36プロセス 優 先 度 の 設 定 4-4共 有 メモリ 3-19, 3-21, 3-23シールドCPU 2-13, 2-17, 2-31–2-34System Vメッセージ・キュー A-4FFBSCHED B-3FBSCHED_PM B-3FIFOスケジューリング 4-1, 4-3ファイル・システム 8-1浮 動 小 数 点 演 算 2-33free_pci_device 14-5Frequency-Based Scheduler (FBS) 1-1, 1-5, B-3fstat 3-12ftok 3-27ftruncate 3-12–3-14Gget_mempolicy 10-11glibc 5-27用 語 解 説 Glossary-1グラフィクス割 り 込 み G-3サポート 10-5, B-5Hhaldaemon 2-34高 分 解 能 プロセス・アカウンティング 1-7, 2-11, 7-2, B-2HRACCT 7-2, B-2ハイパースレッディング 1-8, 2-28–2-34, B-5HyperTransport 2-27I/OI非 同 期 1-10ダイレクト 8-3ディスク 8-1同 期 1-10Index-2


IndexクアッドOpteronのスループット 2-27ユーザー 空 間 (UIO) 14-15, B-5iHawkシステム 1-1, 11-2INHERIT_CAPS_ACROSS_EXEC 13-5, B-2init 2-15–2-17プロセス 間 通 信 (System V IPCを 参 照 )プロセス 間 同 期 5-1割 り 込 み/procインターフェース 2-18, 2-19プロセッサ 間 B-4, G-1機 能 遅逼 延 2-21, 14-12無 効 化 2-10–2-14, 7-2, 7-4無 効 の 効 果 2-4受 信 の 効 果 2-5–2-7グラフィクス G-3ローカル・タイマー(ローカル・タイマーを 参 照 )MTRR G-1NMI 12-8, I-3NVIDIA CUDA G-4RCIM 1-5応 答 時 間 の 向 上 1-7デバイス・ドライバのルーチン 14-11シールドCPU 2-10–2-14, 2-31ソフトIRQ 4-5, 14-12, B-3タスクレット 4-5, 14-12TLBフラッシュ G-5ワーク・キュー 14-12, 14-13インターバル・タイマー 7-3ioremap 14-11IPルート・キャッシュ・テーブル 2-35, I-4IPC(System V IPCを 参 照 )IRQ 2-10, 2-12, 2-14, 2-19, I-3Jジャーナリング・ファイル・システム 1-9, 8-1KK8_NUMA B-4KDB B-5kdb 1-8, 10-13, 12-8, I-2KDB_CONTINUE_CATASTROPHIC B-5KDB_MODULES B-5KDB_OFF B-5kdump 12-1, 12-2カーネルモジュール 追 加 の 例 11-6ブート 1-3構 築 11-1構 成 11-1, B-1クラッシュ・ダンプ 12-2, B-5デーモン 制 御 14-13, 14-14, F-1デバッグ 1-3, 11-2デバッガ 1-6, 1-8, 12-8, B-5デバッギング 12-1フレバー 1-3, 11-1, 11-2ジェネリック/ 最 適遚 化 1-3, 11-2プリエンプション 1-6, B-4予 約 空 間 14-11トレース 1-3, 11-2トレース・イベント 14-16, D-1トレーシング 1-6, B-5チューニング・パラメータ 11-1, 11-3, B-1アップデート 1-4仮 想 アドレス 空 間 の 予 約 14-11, B-4KEXEC 12-3, B-5kexec 12-2ksoftirqd 2-35, 14-13, B-3, I-4LLARGE_MMAP_SPACE B-3ライブラリ 3-3, 5-2, 5-14, 5-27, 10-11負 荷 バランシング 7-3ローカル・タイマー無 効 化 2-11–2-14, 7-4機 能 性 7-1LOCK_BREAK_THROTTLE B-4LOCK_BREAK_THROTTLE_LIMIT B-4低 レイテンシー 1-7少 ないメモリ 2-34Mメールボックス 5-42mbind 10-11memmap 2-23, I-2メモリ・アクセス(NUMA) 2-27, 10-1メモリ・ロック 4-6, 5-2メモリ・マッピング 1-10, 9-1, B-3メモリ・ポリシー(NUMA) 10-2メモリ 常 駐 プロセス 1-9メモリ・シールディング(NUMA) 10-3少 ないメモリ 2-34物 理 メモリの 予 約 2-23MEMSHIELD_ZONE_NORMAL 10-18MEMSHIELD_ZONELIST_ORDER 10-19, B-4メッセージ・キュー 機 構POSIX 3-2System V 3-4, 3-5メッセージング 3-1, A-1, B-2mlock 1-9, 2-20, 4-6mlockall 1-9, 2-20, 4-6Index-3


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>mmap 1-8, 9-1, 9-4, 14-5, B-3mpadvise 2-15mq_close 3-2mq_getattr 3-2mq_notify 3-2mq_open 3-2mq_receive 3-2mq_send 3-2mq_setattr 3-2mq_unlink 3-2mqueue 3-2msgctl 3-3, 3-6, 3-9msgget 3-3, 3-5, 3-7msgop 3-6msgrcv 3-10msgsnd 3-10munlock 1-9, 2-20, 4-6munlockall 1-9, 2-20, 4-6ミューテックス 5-2, 5-27属 性 オブジェクト 5-23コンパイル 5-27nopreemptスピン 5-10優 先 度 継 承 5-23pthread 5-21, 5-23ロウバスト( 堅 牢 性 ) 5-22スピン 5-7状 態 5-23相 互 排 他 5-1, 5-14Nnanosleep 2-11, 6-11, 7-4NightProbe 1-2, 1-6NightSim 1-2, 1-5NightStar RTツール 1-1, 1-2, 11-2NightTrace 1-2, 1-3, 1-6, 11-2, 14-16, D-1NightTune 1-2NightView 1-2, 1-6NMI 割 り 込 み 12-8, I-3nmi_dump 12-8, I-2nmi_watchdog 12-8, I-3NO_HZ B-2, I-3NO_HZ_ENABLED B-2, I-3no_pregraph_pgs 10-7, I-3noatime 2-35noirqbalance I-3non-uniform memory access (NUMA) 2-27, 10-1nopreempt_spin_init 5-11nopreempt_spin_init_thread 5-11nopreempt_spin_islock 5-11nopreempt_spin_lock 5-11nopreempt_spin_mutex 5-10nopreempt_spin_trylock 5-11nopreempt_spin_unlock 5-11NTP_PPS B-2NUMA 2-27, 10-1, B-4NUMA 10-18, B-4numa I-3numapgsユーティリティ 10-12NVIDIA B-5NVIDIAグラフィクスのサポート B-5, G-3Oワンショット・タイマー 6-2Opteronプロセッサ E-1クアッドI/Oスループット 2-27最 適遚 化 されたカーネル 1-3, 11-2PPAGE_REPLICATION 10-18, B-4PAGE_REPLICATION_DYNAMIC 10-18, B-4ページング 1-9PAM 1-7, 13-1, B-2pam_capability 13-2PCIリソース・アクセス 14-1, B-3PCI-to-VMEのサポートバッファのバインド 15-9構 成 15-6, B-3資 料 15-2例 15-17インストール 15-2, 15-5概 要 15-1ユーザー・インターフェース 15-7VMEbusマッピング 15-7, 15-13性 能 問 題キャッシュ・スラッシング 2-22プロセッサ 間 割 り 込 み G-1割 り 込 みの 遅逼 延 2-21, 14-12デバイス・ドライバ 14-11ダイレクトI/O 8-4ローカル・タイマーの 無 効 7-2ハイパースレッディング 2-30クアッドOpteron 上 のI/Oスループット 2-27カーネル・デーモン F-1カーネル・トレース 14-16メモリ 内 ページのロック 2-20, 4-6ネガティブな 影 響 2-34NUMAプログラミング 2-27, 10-16最 適遚 化 されたカーネル 1-3, 11-2優 先 度 スケジューリング 2-21, 4-4, 4-5物 理 メモリの 予 約 2-23シールドCPU 2-9–2-11, 4-6, F-1, G-1Index-4


IndexソフトIRQ 4-5, 14-13, F-1タスクレット 4-5, 14-13, F-1プロセスの 起 床 2-21, 5-37–5-41ワーク・キュー F-1パフォーマンス・モニタ 1-1, 1-7, B-3周 期 タイマー 6-2物 理 メモリの 予 約 2-22Pluggable Authentication Modules (PAM) 1-7, 13-1, B-2POSIXの 適遚 合 1-2POSIX 機 能非 同 期 I/O 1-10クロック・ルーチン 6-4–6-5クロック 1-11, 6-1, 6-2カウンティング・セマフォ 1-10, 5-2, 5-12–5-21メモリのロック 1-9, 2-20, 4-6メモリ・マッピング 1-10メッセージ・キュー 3-2, A-1, B-2pthreadミューテックス 5-21リアルタイム 拡 張 1-9リアルタイム・シグナル 1-11スケジューリング・ポリシー 4-1, 4-3セマフォ 1-10, 5-2, 5-12–5-21共 有 メモリ 1-10, 3-12–3-15スリープ・ルーチン 6-11, 6-12タイマー 1-11, 2-11, 6-2, 6-6–6-10, 7-4POSIXルーチンclock_getres 6-5clock_gettime 6-5clock_settime 6-4mlock 1-9, 2-20, 4-6mlockall 1-9, 2-20, 4-6mq_close 3-2mq_getattr 3-2mq_notify 3-2mq_open 3-2mq_receive 3-2mq_send 3-2mq_setattr 3-2mq_unlink 3-2munlock 1-9, 2-20, 4-6munlockall 1-9, 2-20, 4-6pthread_mutex_consistent_np 5-24pthread_mutex_destroy 5-21pthread_mutex_getunlock_np 5-24pthread_mutex_init 5-21pthread_mutex_lock 5-21pthread_mutex_setconsistency_np 5-24pthread_mutex_setunlock_np 5-25pthread_mutex_trylock 5-21pthread_mutex_unlock 5-21pthread_mutexattr_destroy 5-21pthread_mutexattr_getfast_np 5-25pthread_mutexattr_init 5-21pthread_mutexattr_gettype 5-21pthread_mutexattr_setfast_np 5-26pthread_mutexattr_setprotocol 5-27pthread_mutexattr_setrobust_np 5-27pthread_mutexattr_settype 5-21pthread_mutexattr_setunlock_np 5-27sched_get_priority_max 4-11, 4-12sched_get_priority_min 4-11sched_getparam 4-10sched_getscheduler 4-8sched_rr_get_interval 4-12sched_setparam 4-9sched_setscheduler 4-7sched_yield 4-10sem_destroy 5-15sem_getvalue 5-21sem_init 5-12, 5-14sem_open 5-16sem_post 5-20sem_timedwait 5-19sem_trywait 5-20sem_unlink 5-18sem_wait 5-19shm_open 3-12, 3-13shm_unlink 3-12, 3-15sigqueue 1-11sigtimedwait 1-11sigwaitinfo 1-11timer_create 6-6timer_delete 6-8timer_getoverrun 6-10timer_gettime 6-9timer_settime 6-8POSIX_MQUEUE B-2POST_WAIT B-2post/wait 5-37, B-2PPSAPI B-2PPSAPI_SERIAL B-2PREALLOC_GRAPHICS_PAGES B-4プリアロケート・グラフィクス・ページ 10-5PREEMPT B-4プリエンプション 1-5, 1-6, 2-8, 5-3, B-4prefer_highmem I-4優 先 度カーネル・デーモン 14-13, 14-14プロセス 4-1, 4-2優 先 度 継 承 1-7, 5-23優 先 度 反 転 1-7PROC_CCUR_DIR B-3PROC_PCI_BARMAP B-3PROC_PID_AFFINITY B-3PROC_PID_RESMEM B-3プロセスCPUへの 割 付 け 2-14–2-17Index-5


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>ブロック 5-37–5-41協 同 5-37ディスパッチ・レイテンシー 2-2, 2-3実 行 時 間 クォンタム 4-4–4-5, 4-8, 4-12, 4-13, 7-3メモリ 常 駐 1-9優 先 度 4-1, 4-2スケジューリング 4-1, 7-3同 期 1-10, 5-1起 床 2-21, 5-37–5-41プロセス・スケジューラ 4-2PROCMEM_ANYONE 9-4, B-3PROCMEM_MMAP 9-4, B-3PROCMEM_WRITE B-3プロファイリング 7-3クアッドOpteron 上 のプログラムドI/O 2-28psコマンド 4-3, 7-2pthread_mutex_consistent_np 5-24pthread_mutex_destroy 5-21pthread_mutex_getunlock_np 5-24pthread_mutex_init 5-21pthread_mutex_lock 5-21pthread_mutex_setconsistency_np 5-24pthread_mutex_setunlock_np 5-25pthread_mutex_trylock 5-21pthread_mutex_unlock 5-21pthread_mutexattr_destroy 5-21pthread_mutexattr_getfast_np 5-25pthread_mutexattr_gettype 5-21pthread_mutexattr_init 5-21pthread_mutexattr_setfast_np 5-26pthread_mutexattr_setprotocol 5-27pthread_mutexattr_setrobust_np 5-27pthread_mutexattr_settype 5-21pthread_mutexattr_setunlock_np 5-27ptrace 1-6, B-4PTRACE_EXT B-4関 連連 資 料 vRrcim I-4RCIM_CLOCKSOURCE B-2RCIM_IRQ_EXTENSIONS B-3RCIM_PPS B-2RCU 7-4, B-2RCU_ALTERNATIVE 7-4, B-2リード・コピー・アップデート(RCU) 7-4, B-2Real-Time Clock and Interrupt Module (RCIM) 1-5,6-1, B-2, B-3, I-4リアルタイム・クロック・タイマー 6-2リアルタイム 機 能 1-4リアルタイム・プロセス・スケジューリング 4-1リアルタイム・スケジューラ 1-7リアルタイム・シグナル 1-11RHELディストリビューション 1-1<strong>RedHawk</strong> <strong>Linux</strong>ケーパビリティ C-1資 料 一 式 vカーネル・パラメータ 11-1, 11-3, B-1カーネル 1-3, 11-1, 11-2POSIXの 適遚 合 1-2リアルタイム 機 能 1-4スケジューラ 4-2更 新 1-4関 連連 する 資 料 vREQUIRE_RELIABLE_TSC B-2REQUIRE_TSC B-2resched_cntl 5-4resched_lock 5-5resched_nlocks 5-6resched_unlock 5-6RESCHED_VAR B-2再 スケジューリング 制 御 5-3–5-7, 7-4再 スケジューリング 変 数 5-3, B-2物 理 メモリの 予 約 2-23rhash_entries 2-35, I-4ロウバスト・ミューテックス 5-22ロール・ベース・アクセス 制 御 1-7, 13-2ラウンドロビン・スケジューリング 4-1, 4-4RTCタイマー 6-2runコマンド 2-15–2-17, 4-2, 4-13, 10-7SSBSテクノロジー 15-1SBSVME 15-6, B-3SCHED_FIFO 4-1, 4-3sched_get_priority_max 4-11, 4-12sched_get_priority_min 4-11sched_getparam 4-10sched_getscheduler 4-8SCHED_OTHER 4-1, 4-4SCHED_RR 4-1, 4-4sched_rr_get_interval 4-12sched_setaffinity 2-15sched_setparam 2-21, 4-9sched_setscheduler 2-21, 4-7SCHED_SMT B-3SCHED_SMT_IDLE 2-35, B-3sched_yield 4-10リアルタイム・スケジューラ 1-7ポリシーのスケジューリング 4-1, 4-3優 先 度 のスケジューリング 4-2sem_destroy 5-15sem_getvalue 5-21Index-6


Indexsem_init 5-12, 5-14sem_open 5-16sem_post 5-20sem_timedwait 5-19sem_trywait 5-20sem_unlink 5-18sem_wait 5-19セマフォデータ 構 造造 体 5-29POSIXカウンティング 5-2, 5-12–5-21System V 5-2, 5-28–5-37semctl 5-28, 5-34semget 5-28, 5-30, 5-31semop 5-28, 5-29, 5-36シリアル・コンソール 構 成 H-1server_block 5-39server_wake1 5-40server_wakevec 5-41set_mempolicy 10-11shコマンド 7-4共 有 メモリ 1-10NUMA 10-9概 要 3-1POSIX 3-12–3-15System V 3-15–3-28共 有 リソース 5-1SHIELD B-2shieldコマンド 2-12–2-14, 2-17, 7-4シールドCPUプロセッサ 間 割 り 込 み G-1例 2-13, 2-17, 2-31–2-34, 10-16インターフェース 2-12カーネル・デーモン F-1カーネル・パラメータ B-2NUMAインターフェース 10-3概 要 1-4, 2-1性 能 2-9–2-11, 4-6ユニプロセッサ 2-34shm_open 3-12, 3-13shm_unlink 3-12, 3-15shmat 3-16, 3-23, 15-20SHMBIND B-4shmbind 3-22, 15-13, 15-20shmconfig 3-16, 3-25, 10-9, 15-13, 15-21shmctl 3-16, 3-21shmdefine 3-16, 3-25shmdt 3-16, 3-23shmget 3-15, 3-19, 3-22, 3-27sigqueue 1-11sigtimedwait 1-11sigwaitinfo 1-11スリープ・ルーチン 5-37, 6-11, 6-12スリープ/ウェイクアップ/タイマーのメカニズム 5-37スリーピーウェイト 相 互 排 他 5-2SOFTIRQ_PREEMPT_BLOCK B-3SOFTIRQ_PRI 14-13, B-3ソフトIRQ 4-5, 14-12, 14-13, B-3, F-2スピン・ロックBKL 14-14ビジーウェイト 相 互 排 他 1-8, 5-1, 5-2, 5-7–5-12条 件 同 期 5-42マルチスレッド・デバイス・ドライバ 14-14nopreempt 5-10プリエンプション 1-5, 1-7spin_init 5-8spin_islock 5-9spin_lock 5-8spin_mutex 5-7spin_trylock 5-9spin_unlock 5-9ssh 13-5straceコマンド 7-4スワップ 1-9同 期 I/O 1-10構 文 記 法 ivシステム・プロファイリング 7-3システム・セキュリティ 13-1システム・アップデート 1-4System V IPCメッセージ・キュー 3-1, 3-3–3-11, A-4セマフォ 5-2, 5-28–5-37共 有 メモリ 3-1, 3-15–3-28System.mapファイル 11-4Tタスクレット 4-5, 14-13スレッド・ライブラリ 5-14ティックレス・カーネル B-2, I-3タイム・スタンプ・カウンタ(TSC) 7-1時 間 構 造造 体 6-3time-of-dayクロック 6-4, 7-1timer_create 6-6timer_delete 6-8timer_getoverrun 6-10timer_gettime 6-9timer_settime 6-8タイマーローカル 2-14, 7-1, 7-4POSIX 1-11, 2-11, 6-2, 6-6–6-10, 7-4RCIM RTC 6-2システム 7-1タイムシェアリング・スケジューリング 4-1, 4-4topコマンド 4-3, 7-2TRACE B-5カーネル・トレース・イベント 14-16, D-1トレース・カーネル 1-3, 11-2Index-7


<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>トレース・ポイント 1-6, 14-16TSC 7-1UUIO 14-15, B-5ユニプロセッサ 2-34UNSIGNED_OFFSETS B-4システム 更 新 1-4ユーザー 認 証 13-1ユーザー・レベル・スピン・ロック 1-8usermap 1-8, 9-3, 9-4, B-3V仮 想 アドレス 空 間 の 予 約 14-11vmalloc 14-11, I-4VMALLOC_PGTABLE_PRELOAD B-4VMALLOC_RESERVE 14-11vmcore 12-2, 12-5VME-to-PCIのサポート(PCI-to-VMEのサポートを 参 照 )vmlinux 12-2, 12-5Wプロセスの 起 床 2-21, 5-37–5-41ワーク・キュー 14-12, 14-13XX86_64_ACPI_NUMA B-4X86_HT 2-30, B-5xfs 1-9, 8-1, B-4XFS_DMAPI 8-2XFS_FS B-4XFS_RT B-4Index-8

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!