QNX

QNX（キューエヌエックス、またはキューニックスと発音）は商用のリアルタイムUnix系オペレーティングシステムであり、POSIXとPOSIX 1003.1bに対応している。主に組み込みシステム向けに販売されている。元々はカナダの企業QNXソフトウェアシステムズが開発していたが、同社は後にリサーチ・イン・モーション（現ブラックベリー）が取得した。 マイクロカーネルOSとして、QNXではOSのほとんどが「サーバ」と呼ばれる小さなタスクとして動作する。この点は従来からのモノリシックなカーネルを採用したOSと大きく異なる。モノリシックカーネルOSでは機能の大部分はひとつの大きなプログラムに含まれ、例えば不要な機能をOFFにしたい時などにはOS自体を変更（再リンクなど）する必要がある。それに対しQNXではユーザや開発者はサーバを停止させることで簡単に不要な機能をOFFにすることができる。 QNXのシステムは非常に小さく、フロッピーディスク1枚に納まるシステムでGUIが使えウェブがブラウズできるというデモシステムすらある。そして非常に高速であり機能的にも完備されている。 2001年にリリースされた QNX Neutrinoは現在組み込み市場で使われているほとんどのCPUで動作する。例えば、x86ファミリ、MIPS、PowerPC、SH-4、ARM、StrongARM、XScaleなどである。 2007年9月12日、非商用利用のためのライセンスも用意するようになった。 QNXを現在所有しているのはブラックベリーであり、同社のタブレットコンピュータ用モバイルOSのBlackBerry Tablet OSおよびBlackBerry 10はQNXベースである。 1980年、ウォータールー大学の学生だったGordon BellとDan Dodgeは一般計算機科学課程でオペレーティングシステム設計を学び、その中で基本的なリアルタイムカーネルを作成した。彼らは、このようなシステムに需要があると考え、同年 Quantum Software Systems 社を設立した。1982年、最初のQNXを8088マイクロプロセッサ向けにリリースした。 最初にQNXが広く使われたのは組み込みシステムではなく、オンタリオ州の教育システムに採用された Unisys ICON のOSとしてである。当時としては、44KバイトのOSは組み込みシステムには大きすぎたため、もっと大きなシステムで主に使われたのである。このシステムは信頼性が高いと評判が良く、いくつかの工業アプリケーションに採用されるようになっていった。 1980年代末、Quantum社は市場がPOSIXモデルに素早く移行しつつあるのを見て、カーネルの互換性を高めるための書き換えを決定した。そしてリリースされたのが QNX 4 である。このころインターンとして働いていた Patrick Hayden と正社員だった Robin Burgener が新たなコンセプトのウィンドウシステムを開発（アメリカ合衆国特許第 5,745,759号）。それを製品に生かして、組み込み可能なGUIであるPhoton microGUIがOSに加えられた。同時に QNX 用の X Window System も用意された。QNX 4ではPOSIX準拠でUNIXやBSD用ソフトウェアの移植が容易となった。 Quantum Software Systemsは1990年代初期にQNXソフトウェアシステムズと改称してハードディスク企業のクアンタムと混同されないようにした。1990年代末 QNX RTOS の全面的な書き換えを行い、SMP対応し、マイクロカーネルを維持しつつ既存の POSIX API を全てサポートし、新たな POSIX API にもいち早く対応。その結果、2001年に QNX Neutrino RTOS をリリースすることになった。 Neutrino カーネルと同時にQNXソフトウェアシステムズは開発ツールの充実にも熱心に取り組み、Eclipseコンソーシアムの創立メンバーにもなった。2002年、Eclipseワークベンチと関連プラグインをまとめたQNX Momentics Tool Suiteをリリース。 2004年末、同社はハーマン・インターナショナルに売却されることとなった。QNXは既に自動車業界でテレマティクスシステム向けに広く使われていた。ハーマンに買収されると、200以上の車種やモデルの自動車向けに設計を行い、テレマティクスだけでなく情報娯楽用途やナビゲーション用途でも使われるようになっていった。2011年中ごろ時点で、2000万台の自動車でQNX CAR Application Platformが動作している。また、QNX Aviage Multimedia Suite、QNX Aviage Acoustic Processing Suite、QNX HMI Suiteといったミドルウェア製品もいくつかリリースしてきた。 2007年9月、ソースコードの一部を公開することを発表。 2010年4月9日、ハーマン・インターナショナルからリサーチ・イン・モーションへの譲渡に両社が合意したと発表。同日、QNXのソースコードへのアクセスが制限されるようになった。2010年9月、タブレットコンピュータ BlackBerry PlayBook とQNXをベースとするそのOS (BlackBerry Tablet OS) を発表。 シスコシステムズが2004年から2005年ごろに開発したIOS-XR（IOSの超高稼動版）はQNXベースである。また、2006年に登場したIOS Software Modularityも同様である。 QNXカーネルには、CPUスケジューリング、プロセス間通信、割り込み処理、タイマーだけが含まれる。その他はユーザープロセスとして実装され、例えばプロセス生成、メモリ管理を管轄する proc という特殊なプロセスはマイクロカーネルと協調して動作する。これを可能にしているのは、サブルーチン呼び出し型のプロセス間通信と、ブートローダがカーネルだけでなく複数のユーザープログラムや共有ライブラリを含めたイメージをロードできる機能があるからである。カーネル内にはデバイスドライバが存在しない。通信プロトコルスタックはNetBSDのコードをベースとしている。独自開発のドライバ群、古い io-net manager サーバ向けに書かれたドライバ群、NetBSDから移植したドライバ群をサポートしている。 QNXのプロセス間通信は、プロセスからプロセスにメッセージを送り、応答を待つ。メッセージはカーネルが送信側のアドレス空間から受信側プロセスのアドレス空間にコピーする。受信プロセスがメッセージを待っていた場合、同時に受信側プロセスにCPUの制御が渡され、この際にスケジューラを経由しない。従って、メッセージを送信して返事を待つまで、全く無駄な点がない。このようなメッセージパッシングとCPUスケジューリングの密接な結合が鍵となって、QNXのメッセージパッシングが強力となっているのである。UNIXやLinuxの多くのプロセス間通信は、このような強力な機能ではない。LinuxにはQNX風のメッセージング機能を実装した例がある。この点の設計がまずいことが、初期のMachなど多くのマイクロカーネルの性能が期待はずれとなっている原因である[要出典]。 マイクロカーネルアーキテクチャであるため、QNXは分散OSでもある。Dan Dodge と Peter van der Veen の特許 は QNX の分散処理機能に関するものであり、マーケティング上は透過分散処理 (Transpatrent Distributed Processing, TDP) と呼ばれている。 全ての入出力、ファイルシステム操作、ネットワーク操作は、上記の手段を使ってデータのやり取りを行っており、メッセージパッシングの際にコピーされている。性能強化のため、QNXは途中のバージョンから一部プロセスの統合を行い、プロトコルスタックの統合や他の機能ブロックの統合をしている。 メッセージ処理はスレッドの優先度に従って優先順位付けされる。入出力もメッセージ処理を使っているため、優先度の高いスレッドが入出力の結果を受け取るのも優先される傾向がある（リアルタイムシステムなのでそれが基本である）。 ブートローダも重要なシステムの一部である。ユーザープログラムをブートイメージに含めることができ、カーネルの他にデバイスドライバ群や各種ライブラリをブートイメージに含めることが多い。また、ブートイメージをROMに格納することでディスクのない組み込みシステムでも利用可能となっている。 Neutrinoはプロセッサ親和性を考慮した対称型マルチプロセッシングをサポートしており、QNXの用語ではこれを「限定型マルチプロセッシング (BMP, bound multiprocessing)」と呼ぶ。BMPはマルチプロセッサ対応でないアプリケーションを容易にマルチプロセッサのハードウェアに移行でき、キャッシュヒット率も高く維持できる。 Neutrinoは厳密に優先度に基づくプリエンプティブ・スケジューリングを行い、アダプティブ・パーティション・スケジューリング (APS) をサポートしている。APSは、他に多くの高い優先度のパーティション（スレッド群のグループ）があったとしても、全てのパーティションに最小限のCPUを割り当てることを保証する。高負荷であってもリソーススタベーションに陥らず、重要なスレッドが厳密にリアルタイムで動作できるようにしている。 透過分散処理 (TDP, Transparent Distributed Processing) は、QNXのネットワーク分散アーキテクチャの名称である。マイクロカーネルであるため本質的にネットワーク分散が可能であり、TDPとは言ってみればQNXのネットワークスタックに通信プロトコルモジュールをプラグインする仕組みである。qnetと呼ばれるプロトコルモジュールがネットワーク上の複数のマイクロカーネル間をリンクすると、実際にどのノードにあるかを気にせずにOSサービスにアクセスできるようになる。 Foundry27は同社がQNXコミュニティ向けに作ったウェブサイトである。QNX Neutrino開発に関するハブとなっており、開発者が登録でき、ライセンスを選択でき、ソースコードや関連ツールキットを取得できる。2010年4月9日にリサーチ・イン・モーションに取得されると、QNXのソースコード全体が自由に入手できるという状態ではなくなった。 組み込み市場での主な競合OSは、 POSIXリアルタイムOS LynxOS 組み込み（にも使われる）Unix系OS Linux その他リアルタイムOS VxWorks, THEOS, OS-9, SCIOPTA, ITRON その他組み込みOS Windows CE である。 分散処理、MMUの強化を図る場合、メッセージパッシング方式のリアルタイムOSである必要性がある。するとSCIOPTA, OSEなどが同じコンセプトのアーキテクチャである。 [脚注の使い方] ^ Samuel Sidler (2004年3月24日). “QNX4 Demo Disk: An Expounding Look”. OpenQNX. 2009年3月13日閲覧。 ^ QNX CAR Application Platform ^ QNX Press Releases: source code availability ^ “RIM to buy QNX Software”. The Canadian Press. The Globe and Mail. (2010年4月9日). http://www.theglobeandmail.com/news/technology/rim-to-buy-qnx-software/article1528911/ 2010年4月9日閲覧。  ^ wiki4376: UpdatedQNXSourceAccessPolicyFAQ ^ RIM Unveils The BlackBerry PlayBook, official press release, September 27, 2010 ^ QNX Staff (2004年8月17日). “QNX Delivers Extremely Reliable Microkernel for Massively Scalable Routing System”. 2012年3月16日閲覧。 ^ CRS-1 and IOS XR Operational Best Practices ^ Brad Reese- BradReese.Com (2006年9月26日). “Which OS is behind IOS?”. 2012年3月16日閲覧。 ^ Core Networking 6.4: Neutrino’s Next Gen Networking Stack and Foundry27 [1] ^ Foundry27: Project Networking - Driver wiki page ^ SIMPL-Synchronous Interprocess Messaging ^ U.S. Patent 5,745,759 ^ QNX Press Releases: Foundry27 ^ Updated QNX Source Access Policy FAQ: [2] Dan Hildebrand (1992). “An Architectural Overview of QNX”. Proceedings of the Workshop on Micro-kernels and Other Kernel Architectures: 113 - 126. ISBN 1-880446-42-1. http://portal.acm.org/citation.cfm?id=759105&dl=ACM&coll=&CFID=15151515&CFTOKEN=6184618.  Blackberry.Qnx （日本語） Foundry27 （日本語） QNX User Community （英語） Open source applications （英語） GUIdebook > GUIs > QNX QNX used for Canadian Nuclear Power Plants