Zackernel が拓く新しい IoT の世界
Zackernel (ザッカーネル)は,新しい動作原理に基づくカーネルです。極めて小さいので,「ナノ・カーネル」と言ってもいいかもしれません。
もとはといえば,2016年の夏の集中講義で,プログラミング演習でラーメンタイマという Arduino と LED とスイッチを使った簡単な組込みシステムプログラミングの演習を学生に課していたのですが,自分でも「今までやったことがない新しい方式で作ってみよう」と思い立って,Node.js と同じ動作原理で C++ でプログラミングを学生に混じって始めたのです。
プログラミング熱が冷めたところで,出来上がったこのプログラムについて,研究者として,そして起業家として,いろいろ思いを巡らせたのですが,実はけっこう面白い研究題材ができてしまったのではないかと思うようになりました。そこで,10月に入ってからプログラミングを一旦置いておいて,共同研究先を開拓したり,研究予算を申請したり,講演をしたりして精力的に活動していました。
IoT Advent Calendar への寄稿もその活動の一環です。ぜひお話を聞いていただけたら幸いです。
Zackernel の動作原理
Zackernel の原理について説明します。従来のウェブサーバーの代表格である Apache は複数の接続リクエストに応えるためにマルチプロセス方式/マルチスレッド方式を採用しています(下図)。これは接続リクエストがあるたびに,いわば「分身」であるプロセスやスレッドを作るアプローチです。接続があるたびにスレッドやプロセス(分身)を作るので,メモリが大量に必要です。そのため同時接続数が多くなると,メモリを使い切ってしまい,それ以上受け付けられなくなります。
これに対し Zackernel では Node.js で採用された新しい原理であるコールバック方式で複数の接続に応えます(下図)。これは手際のいい料理人が1人で複数のオーダーを処理するやり方に例えられます。あらかじめ接続要求を処理するプログラム(料理の伝票)を処理しやすいように分割して一覧にします。接続要求が来るたびに,1つのスレッド(料理人)がこの一覧を見ながら優先順位を考えて順番に処理(料理)します。コールバック方式では,スレッドは1つで十分で,一覧に必要なメモリを確保すれば良いです。これにより従来方式の10倍以上の同時接続数を実現できる見込みです。
Zackernel の優位性
Zackernelが目指す品質・性能として,次の数値目標を掲げています。
- マルチスレッド方式の10倍以上の同時接続数・メモリ効率 (1タスクあたりの必要メモリがKBオーダーで済むため)
- Node.js の2倍以上の実行効率・メモリ効率 (Javascript とC++の実行効率の差より)
- libevent から明らかに優位な保守性,優位な移植性 (ラムダ式の採用で可読性に優れる)
マルチプロセス方式/マルチスレッド方式では,1つの通信接続あたり数十MB消費すると言われています。それに対し,Zackernel では,1つの通信接続あたりの必要メモリがKBオーダーで済む見込みです。
Node.js では Javascript 言語環境を必要としているため,ネットワーク機器の小型化や効率化に限界があります。Zackernel はC++言語で実現しているため,大幅なネットワーク機器の小型化や効率化が可能となります。
マルチプロセス方式/マルチスレッド方式にせよ,Node.js にせよ,IoT 機器としてのハードウェア要件として Raspberry Pi クラス(消費電力10Wメモリ数MB)のハードウェアが必要となります。Zackernel では,より軽量な Arduino クラス(消費電力 数W メモリ数百KB)で IoT 機器を実用化するのはもちろんのこと,さらにはより小型化・省電力化した RFID クラス(消費電力10数mW メモリ数十KB)での実現を目指しています。
また同様の原理・動作環境の libevent に比べ,C++11 の新しい言語機能であるラムダ式を採用したことで Zackernel ははるかにシンプルで保守性・移植性に優れます。
以上のように,Zackernel は同時接続数/メモリ効率/実行効率/保守性/移植性のすべてにおいて従来方式を超えるべく研究・開発を進めています。
どんなインパクトがあるの?
一つの応用可能性として,IoT が RFID のような消費電力のとても低いワンチップのICとして実現できる可能性が開けます。
RFID というのは,身近なところでは Suica が挙げられます。Suica には電池が内臓されていません。Suica は改札口から発せられる電波を拾って微弱な電流を発生させることで動作します。
RFID として実現するためには,消費電力を極限まで減らす必要があるので,ハードウェアに厳しい制約条件が課せられます。そのため,RFID上で動作するソフトウェアは,少ないハードウェア資源で動作する必要があります。
Zackernel によりネットワーク通信を大幅に少ないハードウェア資源で実現できるので,RFID チップによる IoT 機器が実現できてしまうかもしれません。
課題はないの?
Zackernel には大きな課題があります。それは開発者である私が開発に十分な時間を割けないことです。エンジニアのみなさん,力を貸してください!
どうしたらいいの?
ぜひ開発にご協力ください! 待っています!