SlideShare a Scribd company logo
1
単一言語マシンの
言語
[Multi Thread Tiny BASIC]
はOS
2017/APR/13
たけおか@AXE/たけおかラボ
@takeoka

データベースをカーネル空間内で
動作させる

なんと特許を取れました

「リレーショナルデータベースを
内在するカーネルプログラム、
方法及び装置」
●
かなり広範囲に適用される…

上記と別に、データ+アクセス手続きに
関するOSの特許も出願中

上記のOSは、C言語で書いてます

推論系AIの特許も出願手続き中
●
Lisp+Prologで開発中
最近の俺達のOS
←カラーザウルス(1997年ごろ)
古い独自OS(XTAL) マシン
Micro Kernelで仮想記憶
POSIX I/Fあり
Haskellで書いたモニタもあり
型安全なので、アホなミスによる
セキュリティ・ホールは無い
3
高級言語マシン=単一言語マシン
•
OSスケジューラも、なんでも高級言語からいじるぜ
•
マルチスレッド・プログラミング言語が動けば幸せ
•
ファイル操作
•
ls, rm, mv など、すべてBASIC言語から操作した
•
対話的な言語で、CPU(計算機)と直接対話
•
デバッグ環境も一体化
•
LL, スクリプト系言語はインタープリタ
それなのに、対話的に使わないとは、けしからん
Symbolics(Lispマシン) Alto(Smalltalkマシン)PC-8001Apple ][
オレのダンボット
ESP8266 に Multi Thread BASIC
整数 Tiny BASICだが、マルチ・スレッド
fork(行番号)で、スレッド生成
スレッド間のメッセージ通信もある
telnet で、ESP8266の BASIC に接続 & 対話
WiFi経由
BASIC を拡張
●
servo 番号,角度
●
サーボ番号==9で、一歩、歩く
●
一歩、歩くルーチンは、ATMegaに埋め込み
●
超音波センサで測距
●
&@ 特殊変数で、距離を読みだす
文字列操作はC言語並み
http post 用の文字列は容易に作れる
ESP8266 Arduino環境でBASICをコンパイル
setjmp & longjmp を作るのに苦労した
ATMega328 ESP8266
5
マルチ・スレッド BASIC 命令語

fork(行番号)

式を開始行番号として、threadを生
成する

スレッドのプロセス番号を返す

end

メインスレッド(プロセス番号1)なら
ば、全スレッド停止

子供スレッドならば、そのスレッドのみ
が終了する

sleep 式

式の値で示された単位時間だけ、ス
レッドの実行を停止する

ps
– スレッドのステータスを表示

messnew(式) 関数
●
メッセージ・オブジェクトを作る (式はダミー)

messwait 式1,式2
●
式1の値で示される番号のオブジェクトのメッセージを待つ
●
すでに、そのメッセージを待っているプロセスがあった場合
は、待たずに抜ける
●
式2でタイムアウト時間を指定
●
0番のオブジェクトは、キーボード入力

messread(式1) 関数
●
式1の値で指定されるメッセージ・オブジェクトから読み出し

messsend(式1,式2) 関数
●
式1の値で指定されるメッセージ・オブジェクトへ、式2の値
をメッセージとして送る
●
そのメッセージ・オブジェクトを待っているプロセスがあれ
ば、プロセスは走行可能になる

lastwait(式) 関数
●
式の値で指定されるメッセージ・オブジェクトの待ちから抜
けた要因を返す
●
1: O_RES_RECV メッセージを受信した
●
-2: O_RES_TO タイムアウト
●
-3: O_RES_WAITING 現在も待ちプロセスがある(待ち
は外れていない)
●
-1: Error オブジェクトは未使用
6
マルチ・スレッド BASIC 実現について

オブジェクトを待ちつつ、タイムアウトも待つ

時刻は内部でのカウントが一定を越えたら1tick(単位時間)

タイムアウトは、内部時刻(時計)を1tick増加させるときに、チェック

timeoutQは、タイムアウト時刻順に並んでいるので、現在時刻より以
前の時刻で待っているスレッドは、すべてactiveQへつなぎ直す
obj[n].proc
オブジェクトへのメッセージ待ち
timeoutQ
timeoutQへ
つなぐときは、
タイムアウト時刻順で
ソートする。時刻は内部時刻
100 500100 210 タイムアウト
時刻
内部時刻が300になった時、これより前のスレッ
ドは、すべて待ちから、readyQにつなぎ直す
7
俺のダンボットBASIC(動画)
https://www.youtube.com/watch?v=jKaVaSY80hY
8
おしまい
9
プログラム例
5'ESP8266 Walk and Usense
10 servo 9,0:sleep 350 :' walk 1 step
20 servo10,0 :'Usensor
30 ? &@ :' print Usensor value
512 goto 10
run
100 100 72 72 36 36
44 44 48 48 68 68
84 84 124 124 152 152
168 168 196 196 72 72
88 88 20 20 52 52
168 168^C
10
プログラム例
5 '3threads
10 print fork(256): print fork(512)
20 do:print ”c”:sleep 300:while 1
256 print "b":sleep 100:goto 256
512 print "a":sleep 200:goto 512
M>>r.
2b
3acbbabcbabbacbbabcbabbacbbabcbabbacbba
bcbabbacbbabcbabbacbbabcbabbacbbabcbabb
acbbabcb…
11
インタープリタ

仮想機械

ソフトウェアで実現された機械

Tiny BASICの機械語は、文字列なのでダサい
 可変長の命令セットを持つ、美しくない x86 は、みんな使っている

機械語命令が可変長の文字列であるハードウェアは実在した
 IBM 1401
 http://en.wikipedia.org/wiki/IBM_1401
12
インタープリタ

仮想機械の実行
命令デコード
通常命令
命令フェッチ
通常命令 通常命令 通常命令
ブレーク・チェック
RUN.実行開始
13
マルチスレッドとは
14
マルチ・スレッド

スレッドとは

計算に必要なコンテキストを持ち、CPUが割当たると計算を実
行
 コンテキストとは

PC, StackPointerなどのレジスタ

スタック

マルチ・スレッド

スレッドが並行に走行
 並行とは
同時(並列)であるかも知れないし、時分割かも知れない
概念的な言葉

メモリ空間は、スレッド間で共有
15
マルチ・スレッド BASIC

スレッド・コンテキスト
 PC, StackPointer レジスタ (レジスタは2個のみ)
 スタック: 独立した場所に確保

メモリ空間は、スレッド間で共有
 全変数をスレッド間で共有
16
マルチ・スレッド・インタープリタ
マルチスレッド仮想機械
スケジューリング
命令デコード
命令 fork
スレッド生成
命令 messsend命令 messwait
メッセージを
オブジェクトへ
送信
走行中スレッドを
待ち状態にし、
別なスレッドを
アクティブにする 当該オブジェクトで
待っているスレッドが
あったら
走行可能にする
通常命令
readyQの先頭に
新スレッドを追加
命令フェッチ
RUN.実行開始
17
マルチ・スレッド
Tiny BASIC
18
マルチ・スレッド BASIC 命令語

fork(行番号)

式を開始行番号として、threadを生成する

スレッドのプロセス番号を返す

end

メインスレッド(プロセス番号1)ならば、全スレッド停止

子供スレッドならば、そのスレッドのみが終了する

join ※未実装

スレッドの待ち合わせ

sleep 式

式の値で示された単位時間だけ、スレッドの実行を停止する
19
マルチ・スレッド BASIC 命令語

messnew(式) 関数

メッセージ・オブジェクトを作る (式はダミー)

messwait 式1,式2

式1の値で示される番号のオブジェクトのメッセージを待つ

すでに、そのメッセージを待っているプロセスがあった場合は、待たずに抜
ける

式2でタイムアウト時間を指定

0番のオブジェクトは、キーボード入力

messread(式1) 関数

式1の値で指定されるメッセージ・オブジェクトから読み出し

messsend(式1,式2) 関数

式1の値で指定されるメッセージ・オブジェクトへ、式2の値をメッセージとし
て送る

そのメッセージ・オブジェクトを待っているプロセスがあれば、プロセスは走
行可能になる
20
マルチ・スレッド BASIC 命令語

lastwait(式) 関数

式の値で指定されるメッセージ・オブジェクトの待ちから抜けた
要因を返す
 1: O_RES_RECV メッセージを受信した
 -2: O_RES_TO タイムアウト
 -3: O_RES_WAITING 現在も待ちプロセスがある(待ちは外れて
いない)
 -1: Error オブジェクトは未使用
21
マルチ・スレッド BASIC 命令語

ps

スレッドのステータスを表示

kill 式 ※未実装

式の値で示されるスレッドを、終了させる
22
マルチ・スレッド BASIC 実現について

割り込みを一切使用しない

キーボード割り込みを使用しない

タイマ割り込みを使用しない
 内部時計

ハードウェアが無い場合: ソフトウェアのループ回数で、作る
 当然、ゆらぎがある

RTC ハードウェアがある場合: スケジューリング前に、RTCを読み出す
 正確

時間による、スレッド実行の打ち切りは無い
 しかし、一命令ごとに、スケジューリングされる
23
マルチ・スレッド BASIC 実現について

どうして、割り込みを使用しないか

おもしろい
 割り込みで仕事をやることなんか飽きた

究極の移植性を追求
 どんなハードウェアでも、ただのアプリケーション・ソフトウェアと同様な
移植性

完全に決定的
 外乱(割り込み)による非決定性によるデバッグの困難さを排除(簡
単ということか?)

本当の実時間システムは割り込みを使わないことも多い

最悪時間を決定的に設計

割込みは、予測できない(それが本質)
 割込み処理時間を、盛り込む? 割込み禁止(それでいいのか?)
24
マルチ・スレッド BASIC 実現について

スレッドのスケジューリング

各命令の実行の直前でスケジュール

ready (走行可能)なスレッドがあれば、切り替える

ポリシーは、適当ラウンドロビン
 現状は、少しぶれがある

messwaitで待ちに入ると ready queueから外れる

messsendが発行され、messwaitから出ると

走行可能になって、ready queueへつながる
25
マルチ・スレッド BASIC 実現について

重要な構造体

プロセス構造体
struct process {
int pid;
int stat;
struct process *pre; /* activeQueue, waitQueue */
struct process *next; /* activeQueue, waitQueue */
struct process *toPre; /* time out queue */
struct process *toNext; /* time out queue */
int to; /* time of timeout */
u_char *pc;
int *stack;
int sp;
int lno;
};
#define PROC struct process
26
マルチ・スレッド BASIC 実現について

重要な構造体

オブジェクト構造体
struct object{
int id;
int stat;
PROC *proc; /* waiting process */
int value;
};
#define OBJ struct object
27
マルチ・スレッド BASIC 実現について
内部の重要な 待ち行列(キュー)
readyQ
obj[n].proc
オブジェクトへのメッセージ待ち
timeOutQ
timeOutQへ
つなぐときは、
タイムアウト時刻順で
ソートする。時刻は内部時刻
100 500100 210 タイムアウト
時刻
proc[n]
28
マルチ・スレッド BASIC 実現について

時刻

時刻は内部でのカウントが一定を越えたら1tick(単位時間)
内部時計を進める

タイムアウト

sleepと、messwaitは、timeoutQにつなぐ

内部時計を進めるときに、タイムアウトのチェックを行う
29
マルチ・スレッド BASIC 実現について

オブジェクトを待ちつつ、タイムアウトも待つ

時刻は内部でのカウントが一定を越えたら1tick(単位時間)

タイムアウトは、内部時刻(時計)を1tick増加させるときに、チェック

timeoutQは、タイムアウト時刻順に並んでいるので、現在時刻より以
前の時刻で待っているスレッドは、すべてactiveQへつなぎ直す
obj[n].proc
オブジェクトへのメッセージ待ち
timeoutQ
timeoutQへ
つなぐときは、
タイムアウト時刻順で
ソートする。時刻は内部時刻
100 500100 210 タイムアウト
時刻
内部時刻が300になった時、これより前のスレッ
ドは、すべて待ちから、readyQにつなぎ直す
30
マルチ・スレッド BASIC

サイズ: 21KB弱 (IOルーチン、簡単なデモ含む)

通常Tiny BASICは16KB強程度(IOルーチンなど含む)
 8080(8bit)用にアセンブラで記述すると2KBだったが…

32bit命令はやっぱり大きくなるなぁ…

マルチスレッド部分は適当なコーディング

めちゃくちゃとか、冗長ではないはずだが…

現在は、内部32bitポインタですべて管理

一応、x86(32bit,64bit)で高速に動作する様に書いた

本来は、8bit程度のオフセットで十分なはず
 プロセス、オブジェクトは各々256個まででいいだろ(実メモリ無いし)
31
プログラム例100 ?"start" :crlf
105 j=0
107 m=messnew(0): ? "messnew=":?m:crlf
110 ?fork(300):?fork(400):?fork(500):?fork(600)
120 ?"a":crlf
130 fori=1to500000:n.
150 ? messsend(m,j) : j=j+1
170 goto 120
180 end
300 ?" messwait ":crlf
310 messwait m,100
311 ?" Wakeup=":? lastwait(m):?" "
320 if lastwait(m)<0 ?"timeout ":crlf:goto 390
330 x=messread(m): ?$ x
390 goto 300
400 ?"kkk":crlf
420 messwait 0,-1
430 ?"K "
450 y=messread(0)
460 ?$ y
480 goto 400
500 sleep 100:?"asd"
510 ps
520 goto500
600 sleep 200:?"qwe"
610 ps
620 goto600
32
実行結果M>>r.
start
messnew=1
2 messwait 3kkk
45
a
asd Wakeup=-2pid, stat, PC, LNo, SP pre, next, toPre, toNext,to
0 2 0804C0DE 0 -1 080521CC 080521F8 00000000 00000000 0
1 2 0804F4FF 130 3 00000000 080521A0 00000000 00000000 0
2 2 0804F57C 311 -1 080521A0 00000000 00000000 0805227C 100
3 3 0804F5FB 420 -1 08051D40 080521A0 00000000 00000000 -1
4 1 0804F64B 510 -1 00000000 080521CC 00000000 080521F8 100
5 4 0804F666 600 -1 00000000 08052224 00000000 00000000 200
readyQ=1 0 2 current_time=100 idol_count=499996
toQ= 5:200
obj=0 proc=00000003 stat=2 obj=1 proc=FFFFFFFF stat=1
timeout
messwait
0 Wakeup=1 a
00 messwait
asdqwe Wakeup=-2pid, stat, PC, LNo, SP pre, next, toPre, toNext,to
0 2 0804C0DE 0 -1 0805227C 080521CC 00000000 00000000 0
1 2 0804F4FF 130 3 080521A0 080521F8 00000000 00000000 0
2 2 0804F57C 311 -1 080521CC 00000000 00000000 00000000 200
3 3 0804F5FB 420 -1 08051D40 080521A0 00000000 00000000 -1
4 1 0804F64B 510 -1 00000000 0805227C 00000000 080521F8 200
5 2 0804F673 610 -1 00000000 080521A0 00000000 08052250 200
readyQ=5 0 1 2 current_time=200 idol_count=999978
toQ=
obj=0 proc=00000003 stat=2 obj=1 proc=FFFFFFFF stat=1
pid, stat, PC, LNo, SP pre, next, toPre, toNext,to
0 2 0804C0DE 0 -1 00000000 080521CC 00000000 00000000 0
1 2 0804F4FF 130 3 080521A0 080521F8 00000000 00000000 0
2 2 0804F57C 311 -1 080521CC 08052250 00000000 00000000 200
3 3 0804F5FB 420 -1 08051D40 080521A0 00000000 00000000 -1
4 2 0804F64D 510 -1 080521F8 00000000 00000000 080521F8 200
5 1 0804F673 610 -1 00000000 080521A0 00000000 08052250 200
readyQ=0 1 2 4 current_time=200 idol_count=999978
toQ=
obj=0 proc=00000003 stat=2 obj=1 proc=FFFFFFFF stat=1
timeout
messwait
0 Wakeup=1 a
01 messwait
M>>
33
おしまい

More Related Content

PDF
Lispマシン ドキュメント和訳とか、 ちびLispとか
PDF
Lisp_chibi_machine 190427
PDF
Lispマシン・シミュレータの紹介
PDF
PDF
昔の外付けキャッシュ & コヒーレント・キャッシュ
PDF
Ichigojam ossc-170819
PDF
RISC-Vの可能性
Lispマシン ドキュメント和訳とか、 ちびLispとか
Lisp_chibi_machine 190427
Lispマシン・シミュレータの紹介
昔の外付けキャッシュ & コヒーレント・キャッシュ
Ichigojam ossc-170819
RISC-Vの可能性

What's hot (20)

PDF
ロボット用Open Source Software
PDF
xv6 + mist32 + mruby
PPTX
Verilator勉強会 2021/05/29
PPTX
ロボットシステム学2015年第5回
PDF
Rust で RTOS を考える
PDF
What's Operating System?
PDF
seccamp2012 チューター発表
PDF
ハードウェアを用いてPythonを学ぶ
PDF
PPTX
ロボットシステム学2015年第12回
PDF
20210705 sd#26 kitazaki
PPTX
ロボットシステム学2015年第8回
PDF
Unix32 v 20100508
PDF
止まらないようにしたいのにそのせいで止まる悲しさ
PPTX
N88-BASIC Language
PDF
UNIX/32V
PPTX
ハリボテなx86エミュレータの作り方 - how to make x86 emulator
PDF
NetBSDとは
PPTX
PSoC4 BLEで作る簡単無線センサーユニット
PDF
XRDPで怠惰な日々を送る
ロボット用Open Source Software
xv6 + mist32 + mruby
Verilator勉強会 2021/05/29
ロボットシステム学2015年第5回
Rust で RTOS を考える
What's Operating System?
seccamp2012 チューター発表
ハードウェアを用いてPythonを学ぶ
ロボットシステム学2015年第12回
20210705 sd#26 kitazaki
ロボットシステム学2015年第8回
Unix32 v 20100508
止まらないようにしたいのにそのせいで止まる悲しさ
N88-BASIC Language
UNIX/32V
ハリボテなx86エミュレータの作り方 - how to make x86 emulator
NetBSDとは
PSoC4 BLEで作る簡単無線センサーユニット
XRDPで怠惰な日々を送る
Ad

Similar to Mt basic as-os_on_danbot (20)

PDF
Tremaで試すFirewall
PPTX
できる!KickstartとAnsible!
PDF
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
PPTX
2016年2月4日 空間OSの設計コンセプトと先端IT
PDF
Lagopus Switch Usecases
PPTX
機械学習 / Deep Learning 大全 (6) Library編
PDF
AIの力で障害検知・解析をサポート!Loom(ログ解析ソリューション)のご紹介 - OpenStack最新情報セミナー 2017年7月
PPTX
Dbts2012 unconference wttrw_yazekatsu_publish
PDF
HeapStats: Introduction and Technical Preview
KEY
OSS奨励賞受賞プレゼン 活動紹介
PDF
Gamedevenvstudy1
PPTX
MUGT02 - vamp demo
PDF
Xen Nic
PDF
オペレーティングシステム 第1回-公開用
PPTX
運用構築技術者の為のPSプログラミング第1回
PPTX
The Amazing Toolman - Mastering the tools and propose a hackable "Swiss Army ...
PDF
インフラエンジニアがk8sでアプリを作って見えた今後のインフラ
PDF
2015 0228 OpenStack swift; GMO Internet Services
PDF
Zabbix-jp study #4 20111020 session2
PDF
Lucas apa pacsec_slides_jp-final
Tremaで試すFirewall
できる!KickstartとAnsible!
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
2016年2月4日 空間OSの設計コンセプトと先端IT
Lagopus Switch Usecases
機械学習 / Deep Learning 大全 (6) Library編
AIの力で障害検知・解析をサポート!Loom(ログ解析ソリューション)のご紹介 - OpenStack最新情報セミナー 2017年7月
Dbts2012 unconference wttrw_yazekatsu_publish
HeapStats: Introduction and Technical Preview
OSS奨励賞受賞プレゼン 活動紹介
Gamedevenvstudy1
MUGT02 - vamp demo
Xen Nic
オペレーティングシステム 第1回-公開用
運用構築技術者の為のPSプログラミング第1回
The Amazing Toolman - Mastering the tools and propose a hackable "Swiss Army ...
インフラエンジニアがk8sでアプリを作って見えた今後のインフラ
2015 0228 OpenStack swift; GMO Internet Services
Zabbix-jp study #4 20111020 session2
Lucas apa pacsec_slides_jp-final
Ad

More from たけおか しょうぞう (20)

PDF
the original SoC "ORE_SoC" with "ROS2rapper"
PDF
俺SoC (Laxer Chip, AX1001)の Prolog加速命令.New multiple branch instruction for RIS...
PDF
俺のSoC, AX1001 ができたぞー. AX1001:the SoC for edge Devices and robot modules,
PDF
Using Retro-CPU with low aspirations, No FPGA
PDF
"ros2rapper", Hardware implimentation of ROS2 communication Protocol without ...
PDF
いにしえ的ななにか、カニか? RISC-V picoRV32, e203 改造 オレオレ命令追加した
PDF
SOAR:Smalltalk on RISC
PDF
俺ASICと俺CPU“松竹V(しょうちくぶい)”
PDF
あるRISC-V CPUの 浮動小数点数(異常なし)
PDF
RISC-Vの可能性
PDF
どうして昔の人は八進数でしゃべるのか?
PDF
PDF
Takep lpc1114-190614
PDF
Takep lpc1114-190613
PDF
初歩的な部品の知識
PDF
PDF
無脳スマートスピーカを 越えレレレのレ
PDF
Common Lisp ユーザへのScheme紹介
PDF
RISC-V User level ISA
the original SoC "ORE_SoC" with "ROS2rapper"
俺SoC (Laxer Chip, AX1001)の Prolog加速命令.New multiple branch instruction for RIS...
俺のSoC, AX1001 ができたぞー. AX1001:the SoC for edge Devices and robot modules,
Using Retro-CPU with low aspirations, No FPGA
"ros2rapper", Hardware implimentation of ROS2 communication Protocol without ...
いにしえ的ななにか、カニか? RISC-V picoRV32, e203 改造 オレオレ命令追加した
SOAR:Smalltalk on RISC
俺ASICと俺CPU“松竹V(しょうちくぶい)”
あるRISC-V CPUの 浮動小数点数(異常なし)
RISC-Vの可能性
どうして昔の人は八進数でしゃべるのか?
Takep lpc1114-190614
Takep lpc1114-190613
初歩的な部品の知識
無脳スマートスピーカを 越えレレレのレ
Common Lisp ユーザへのScheme紹介
RISC-V User level ISA

Mt basic as-os_on_danbot