mruby/cによるマルチプログラミングの提案
田中 和明
九州工業大学概要• マルチプログラミング• mrubyとmruby/c

自己紹介

自己紹介
• 田中 和明（九州工業大学 情報工学部）• 教育– プログラミング、データ構造とアルゴリズムなどの講義を担当• 研究– 組込みシステム（mruby）– ブロックチェーン技術（をIoTで利用する）– LPWA、光学測量に関する共同研究mrubyの開発• 2010年度～2012年度– 経済産業省 地域イノベーション創出研究開発事業でmrubyを開発（ネットワーク応用通信研究所、福岡CSK、九州工業大学）• 2015年度～– 島根県 しまねソフト研究開発センターとの共同研究でmruby/c を開発• 2016年度– NEDO 次世代スマートデバイス開発プロジェクトでmruby用IDEを開発（九州工業大学、SCSK九州、有明高専）• 2017年度～2018年度– 経済産業省 戦略的基盤技術高度化支援事業（サポイン事業）でmrubyを使った省電力無線モジュールを開発（Braveridge、九州工業大学、SCSK九州、ILC）

マルチプログラミングマルチプログラミング• 複数の機能を実装する↓• プログラムが複雑になる– 異なるタイミングでそれぞれの機能を動かす– 機能ごとに実装を分離したい– セキュリティ– 保守性• マルチプログラミング

例• 赤色LEDを1秒間隔で点滅させる
while true do
output 0,1
sleep_ms 1000
output 0,0
sleep_ms 1000
end

output ： GPIO出力

sleep_ms ： スリープ

例• 赤色LEDを1秒間隔で点滅させる• 緑色LEDを0.1秒間隔で点滅させる• シングルプログラミングの場合は？
• マルチプログラミングの場合は？

シングルプログラミングの例
t = 0
while true do# 緑色LED
if t%2 == 0 thenoutput 7, 0
else
output 7, 1
end

もう少しスマートな方法があるかもしれませんが、、、# 赤色LED＆リセット
if t == 10 thenoutput 0, 1
elsif t >= 20 thent = 0
output 0, 0
end
sleep_ms 100
t += 1end

マルチプログラミングの例• 割り込みを使う？
• スレッドを使う？
• マルチタスク（プロセス）を使う？

• もっと簡単に実装できないか？

mruby/c のマルチプログラミング
while true do
output 0, 1
sleep_ms 1000
output 0, 0
sleep_ms 1000
end

while true do
output 7, 1
sleep_ms 100
output 7, 0
sleep_ms 100
endmrubyとmruby/cmruby• mruby– Rubyを軽量化したもの～Rubyの開発効率を組込みソフト開発へ– Rubyとの互換性を重視～Ruby技術者が組込み開発できる– 消費メモリは 400KB 程度

mrubyの利用事例

ネットワークルータ（IIJ社）

Apacheモジュール（OSS）

ゲーム（スクエアエニックス、SidMeier’s）

ETロボコン（アフレル社、ほか）

GUIライブラリ（ILC社）

mruby/c• mruby/c– mrubyをさらに軽量化した～40KB程度
ワンチップマイコンでの動作を想定する– Rubyとの互換性よりも、小型化を重視
最小限のクラスライブラリ– OSを必要としない

Ruby, mruby, mruby/c
実行時に必要なメモリ実行

Ruby
インタープリタ

Ruby
Source Code

数MB

mruby VM

400KB

mruby/c VM

40KB

ロード
コンパイル

mruby
バイトコードロード

mruby/c のポイント• OSを必要としない↓• OSが提供する機能を持つ– マルチプログラミング
複数プログラムのコンカレント実行– メモリ管理– 排他制御• ユーザプログラムとして実行する

mrubyのバイトコード• コンパイル後に生成される
while true do
output 0,1
sleep_ms 1000
output 0,0
sleep_ms 1000
end

1 000 OP_JMP
2 001 OP_LOADSELF
2 002 OP_LOADI
2 003 OP_LOADI
2 004 OP_SEND
3 005 OP_LOADSELF
3 006 OP_LOADI
3 007 OP_SEND
4 008 OP_LOADSELF
4 009 OP_LOADI
4 010 OP_LOADI
4 011 OP_SEND
5 012 OP_LOADSELF
5 013 OP_LOADI
5 014 OP_SEND
1 015 OP_LOADT
1 016 OP_JMPIF
1 017 OP_LOADNIL
1 018 OP_STOP

015
R1R2R3R1
R1R2R1R1R2R3R1R1R2R1R1R1R101:output 21000:sleep_ms

100:output 21000:sleep_ms001

1mruby VM• VMがバイトコードを実行する
loop doinstruction = Fetch(program)
Execute(instruction)endmruby/c VMのアイディア• 複数のプログラム（複数のバイトコード）を実行する
loop dofor i=1 to N do
current_program = program[i]instruction = Fetch(current_program)
Execute(instruction)end
end実行効率の問題• 実行効率が悪いので、いくつかのバイトコードを実行する
loop dofor i=1 to N do
current_program = program[i]for j=1 to M do
instruction = Fetch(current_program)
Execute(instruction)
end
end
end

実行の公平性• プログラム間で実行時間が公平ではない
loop dofor i=1 to N do
current_program = program[i]start_time = GetCurrentTime()
while GetCurrentTime() < (start_time + TIME_SLICE) do
instruction = Fetch(current_program)
Execute(instruction)
end
end
endmruby/c の実装• タイマー割り込みが使える場合は、割り込みでプログラム切り替える

Result• Execution time
– Calculate 32th Fibonacci number using recursion[s]

Execution time

4.5

4.15

43.5

Single program execution time is 1.74[s].
Execute two programs by concurrent execution.
(Core i5 2.0GHz, 2GB memory, Ubuntu 14.04)
3.72

3.48

3.601

32.5
21.5
10.50
single program

one by one

multi by multiinterruptin資料Resources• mruby
http://mruby.org/
https://github.com/mruby/mruby• mruby/c
http://www.s-itoc.jp/
https://github.com/mrubyc/mrubyc