ロボットシステム学
第5回
上田隆一
本日の内容
• UNIX, Linux
– なぜロボットに重要なのか
– 歴史的な背景(なんでこんな仕組みなの?)
Oct. 7, 2015 ロボットシステム学 2
オペレーティングシステム
• 前回まではなかったもの
– ハードウェアの複雑さを隠すためのソフトウェア階層
(ハードウェアをいじる人間には邪魔かもしれない)
• 仕事
– 抽象化
• 機械の世界から情報処理の世界へ
– 資源(リソース)管理
• 次々(同時)に来る「計算機(とその周辺機器)を
使いたいという要求」をいかに捌くか
Oct. 7, 2015 ロボットシステム学 3
マイコン/OSの抽象化レベル
• アドレスによる抽象化(マイコン)
– 様々な機器のデータ読み書き口を同じアドレス空間に
配置(メモリマップドI/O)
– ある番地の01を操作すると、ピンから電圧が出たり、
入出力が逆転したり
• ファイルによる抽象化(OS)
– マイコンだとメモリの番地を一つずつ書き換える
操作になるが、ファイルだと一連のデータを
流し込んだり取り出したりできる(ストリーム)
Oct. 7, 2015 ロボットシステム学 4
なんでもファイル
• 機器の操作(例: ラズパイマウスを例に)
– ジャイロ: /dev/ttyACM0
– モータ: /dev/rtmotor0
– 乱数発生器: /dev/random, /dev/urandom
– よくよく考えてみると、機器の操作というのは
データを書いてデータ読むだけで済む
• その他話題
– ネットワークだけはファイル扱いされない
(不可能ではなく、歴史的経緯で)
– Plan 9: ネットワーク関係もファイルに
Oct. 7, 2015 ロボットシステム学 5
本講義で扱うOS
• Linux(Ubuntu, Raspbian)
• LinuxをはじめUNIX系OSの用途は増えている
– ネットワーク(サーバ, ルータ)
– デスクトップ機, ノートPC のOS(Linux, OS X)
– ゲーム機(FreeBSD)
– タブレット機, スマートフォン(Linux, iOS)
– 要は仕事がたくさんある
Oct. 7, 2015 ロボットシステム学 6
OSの歴史
• 昔の話から考えてみましょう
– なぜOSというものがあるのか
– なぜこんな仕組みなのか?
– ロボットとの親和性は?
– 話の流れ
• UNIX 以前
• UNIX
• UNIX の派生物
• Linux
Oct. 7, 2015 ロボットシステム学 7
UNIX以前
• 初期の計算機の使われ方(-1965 年)
– 主に科学計算や集計
– 使用者が計算機の使用時間を割り当てられて、
その時間にプログラムを計算機室に持ち込み、
プラグボードやパンチカードを持ち込む
• 参考
– プラグボード
– プラグボードの使用風景
– パンチカード
Oct. 7, 2015 ロボットシステム学 8
このころのデータの読み書き
• メディア: パンチカード, 紙テープ, 磁気テープ
• 初期の頃のオペレーション(バッチシステム)
– 1. 計算機 A でパンチカードの情報を磁気テープ上の情報に変換
– 2. 磁気テープを計算機 Bにセット
– 3. 計算結果が結果が出力用磁気テープへ
– 4. 磁気テープを取り外し別の計算機 Cでプリントアウト
• 1 台の計算機で1つの計算しかしない
– 割り込みのない(できない)マイコンのようなもの
Oct. 7, 2015 ロボットシステム学 9
この頃のOS
• 現在のOS の要素がちらほらと
– パンチカードのデータをコピーした磁気テープをロードし、
実行結果を別のテープに書き出すソフトウェア
• 似たもの: Arduinoのブートローダ
• この頃の課題
– 一度に一つのプログラム(ジョブ)しか走らせられない
• マイコンみたいなもの
– 計算機は高いので多人数で、遊び時間を少なく使いたい
Oct. 7, 2015 ロボットシステム学 10
マルチプログラミング
• 1964年ごろ実用
• メモリをパーティション分けして複数のジョブを置き、実行
• メモリをジョブがお互いに覗かないようにする(ハードで)
• この頃の計算機(IBM System/360)
Oct. 7, 2015 ロボットシステム学 11
タイムシェアリングへの試み
• 1960年代
• マルチプログラミングをさらに発展
– プログラムを持ち込むバッチ処理から
端末による対話式へ
• 主なプロジェクト
– CTSS(compatible time sharing system)
– MULTICS(multipexed information and computing service)
• この頃の計算機(PDP-1)
Oct. 7, 2015 ロボットシステム学 12
UNIX(Unix)
• MULTICS プロジェクトに参加していたAT&Tベル研の
Ken Thompson らがPDP-7上で開発(1960 年代末)
– 特許ドキュメント管理・作成用
– (単にゲームを動かしたかっただけという説も)
• MULTI(多方向)→UNI(単方向)
– MULTICSの失敗: たくさんの研究組織、研究員で右往左往
– UNIX(注意: 私の独自解釈です)
• ドキュメント管理したい(+ゲームやりたい)という明確な目標
• 3人+αで早く作りたい→シンプルに作りたい
Oct. 7, 2015 ロボットシステム学 13
UNIXが具現化・整理した機能
• 階層型ファイルシステム
– ファイル: 一連の文字列
– ディレクトリ: ファイルを整理するファイル
• プロセス・タイムシェアリング
– 複数の処理を同時に走らせる
– 仮想記憶, プロセススケジューラ
• デバイスファイル
– 機器もファイル
• シェル
– ファイルとプロセスの連携
Oct. 7, 2015 ロボットシステム学 14
オープンソースの走りとしてのUNIX
• 当時AT&T はコンピュータで商売できない(独禁法)
– コードを配布
– 企業、研究機関、教育機関に広まる
• 1984年商売解禁
– ライセンス業を始め、クローズ化
– 「UNIX 戦争」が始まる
• 配布されたUNIX から様々な亜種(UNIX系OS)が誕生
– ソースコードの流用
– 機能の再現
Oct. 7, 2015 ロボットシステム学 15
UNIX系OSの系譜
• UNIX直系: 大雑把に言ってSystem V系とBSD系
– ものによって使用感が異なる
– 我々がよく使うもの(ロボットの世界だとBSD系が多い)
• FreeBSD, NetBSD, OpenBSD, OS X, iOS…
• MINIX, Linux
– UNIXのコードを含まないが動作はUNIX
– MINIX(1987年〜)
• UNIX がクローズ化したためタネンバウムによって教育用に開発
Oct. 7, 2015 ロボットシステム学 16
Linux
• 当時ヘルシンキ大学の大学生だった
リーナス・トーバルズがMINIX 上で開発(1991年)
– 冬季に部屋に引きこもって開発
– メーリングリストで助言、協力を得ながらゼロから開発
• バザール方式
• 広まった理由
– ゼロから開発したことで制約が少ない
– 協力者が多い
– タイミング(PCの普及, Microsoftの影響, ライセンスの問題)
Oct. 7, 2015 ロボットシステム学 17
Linuxとディストリビューション
• Linuxの構成
– Linuxカーネル(OS本体)
– 付属のソフトウェア(コマンド、パッケージシステム、GUI等)
• 付属のソフトウェアをどういう構成にするかで多数の
「ディストリビューション」が派生
– 系統図
Oct. 7, 2015 ロボットシステム学 18
主なディストリビューション
• 三大系統
– Red Hat 系
• RedHat linux から派生しているもの。ビジネス用途でシェア
– slackware 系
• 最古のディストリビューションslackware から派生
– debian 系
• Debian GNU/Linux から派生しているもの
• UbuntuもRaspbianもこの系統
Oct. 7, 2015 ロボットシステム学 19
Linuxでプログラムが走る仕組み
• 「プロセス」を理解しましょう
– マイコンとの違いは?
Oct. 7, 2015 ロボットシステム学 20
プロセス
• プログラム実行の一単位
• 実行中のプログラム+OSが準備した付帯情報
– プロセスID、ユーザ、親プロセス
• 普段はps(1)やtop(1)で調査
– CPUやメモリ使用量、ゴミプロセスがないか調査、等
– 一つのプロセスについて調査したければ
/proc/<プロセス番号>を見る
– プロセス情報もファイルで提供される。なんでもファイル
Oct. 7, 2015 ロボットシステム学 21
カーネルから見たプロセス
• リソースを割り当てる一単位
– メモリの割り当て
• プログラムが自身のプロセス外のメモリを参照しないよう保護
• 仮想アドレス空間
– CPU の利用時間(タイムシェアリング)
• 優先度の高低を考慮
• 端末とのやり取りが多いものほど高頻度
↑ロボットを動かす時に問題となる
Oct. 7, 2015 ロボットシステム学 22
プロセスツリー
• プロセスはプロセスから生まれる
– fork-execと呼ばれる仕組み
• 家系図(プロセスツリー)ができる
– pstree(1)
– initというプロセスからぶら下がる
• プロセスツリーの役割
– 親子間で環境や開いているファイルを引き継ぐ
Oct. 7, 2015 ロボットシステム学 23
プロセスの一生
1. あるプロセスからforkして生まれる
2. 新しいプロセスIDをもらう
3. 親の情報をすべて自分のメモリ空間にコピー
(コピーしない場合もある)
4. (execされた場合)プログラムの部分が入れ替わる
– 例(execを行うシェルスクリプト)
5. プログラム実行
6. 終了。終了ステータスを返す
– 0が正常終了、1が何らかの異常
Oct. 7, 2015 ロボットシステム学 24
プロセスとメモリ
• プロセスは、基本的に他のプロセスが
使っているメモリの中身を見ることができない
– 見ることができたら事故
• 仕組み: 仮想記憶
– 問題: 右のような1列のメモリを
どう複数のプロセスに割り当てる?
Oct. 7, 2015 ロボットシステム学 25
仮想記憶(ページング方式)
• アドレス空間を二種類用意
– 物理アドレス空間(DRAMやその他を直接指す)
– 仮想アドレス空間(プロセスごとに準備)
• アドレス空間を「ページ」に分割
• 仮想のページと物理ページを対応付け
Oct. 7, 2015 ロボットシステム学 26
仮想記憶の導入で可能となること
• lazyな物理メモリ割り当て
– プログラムが割り当てのないページの番地に
アクセスした時に、物理メモリのページを割り当て
– 割り当てのないページの番地にアクセスすることを
「ページフォルト」と言い、これが起こると割り当てが起こ
る
• スワップ
– メモリが不足時にページ上のデータを
ストレージ上のページに追い出せる(スワップアウト)
– 仮想アドレスの先が物理メモリである必要がなくなる
Oct. 7, 2015 ロボットシステム学 27
• キャッシュの管理が簡単に
– プロセスが使用していない物理メモリのページに
読み書きしたファイルのデータを記憶
• キャッシュが有効だとHDDの読み書き
回数を減らすことができる
Oct. 7, 2015 ロボットシステム学 28
プロセス間の通信
• 仮想記憶の仕組みから分かるように、
プロセス内の情報は直接、他から見えない
• データを出し入れする口が必要
– 共有メモリ
• ロボットのように高速・ランダムなやりとりが必要な時に利用
– ファイルシステム
(これが基本。しかしなんでファイルが通信なの?)
– ソケット(前期にやりましたね?)
• ただしこれはPCの外とのやりとり
– シグナル
• データの出し入れというより合図のやりとり
Oct. 7, 2015 ロボットシステム学 29
ファイルの読み書き
• プロセスは開いたファイルを
「ファイル記述子」という数字で管理
Oct. 7, 2015 ロボットシステム学 30
pi@raspberrypi ~ $ cat main.c
#include <stdio.h>
int main(int argc, char const* argv[])
{
FILE *f = fopen("hoge","w");
sleep(100);
return 0;
}
pi@raspberrypi ~ $ gcc main.c
pi@raspberrypi ~ $ ./a.out
pi@raspberrypi ~ $ ps u | grep -F a.out
pi 8405 0.0 0.0 1688 300 pts/0 S+ 05:23 0:00 ./a.out
(略)
pi@raspberrypi ~ $ ls -l /proc/8405/fd
total 0
lrwx------ 1 pi pi 64 Oct 27 05:23 0 -> /dev/pts/0
lrwx------ 1 pi pi 64 Oct 27 05:23 1 -> /dev/pts/0
lrwx------ 1 pi pi 64 Oct 27 05:23 2 -> /dev/pts/0
l-wx------ 1 pi pi 64 Oct 27 05:23 3 -> /home/pi/hoge
ファイルを開いて放置するプログラムを
書いて実行
プロセス番号を調べて/proc/<番号>/fdを見ると
開いたファイルはファイル記述子3で管理されている
ファイル記述子0,1,2
• なにこれ?
– ファイル/dev/pts/0につながっているようだ
• /dev/pts/0
– a.outを実行した画面でttyと打つと表示される
Oct. 7, 2015 ロボットシステム学 31
pi@raspberrypi ~ $ ls -l /proc/8405/fd
total 0
lrwx------ 1 pi pi 64 Oct 27 05:23 0 -> /dev/pts/0
lrwx------ 1 pi pi 64 Oct 27 05:23 1 -> /dev/pts/0
lrwx------ 1 pi pi 64 Oct 27 05:23 2 -> /dev/pts/0
l-wx------ 1 pi pi 64 Oct 27 05:23 3 -> /home/pi/hoge
pi@raspberrypi ~ $ tty
/dev/pts/0
ttyって何?
• これ(テレタイプ社ASR-33)
– teletype(遠隔タイプライター)
• 端末
– タイプライターを通信の線(電話線等)で
計算機に繋いだもの
• キーボードに字を打って字を計算機に送信
• 計算機から字を受けて紙に印字
• 少し時代が進むと紙がディスプレイに(DEC VT100)
– 基本機能は変わってないので引き続きTTYと表記
Oct. 7, 2015 ロボットシステム学 32
現在の端末(端末エミュレータ)
• パソコンの中のソフトウェア
– パソコンのモニタとキーボードを使ってタイプライターや
VT100の役割を果たす
– 通信: TCP/IP、シリアル通信等(通信できればなんでもいい)
Oct. 7, 2015 ロボットシステム学 33
結局どういうことか
Oct. 7, 2015 ロボットシステム学 34
• プログラムと端末エミュレータが
/dev/pts/0というファイルを通じて通信
• この仕組みで複数の端末を相手
端末エミュレータ
OS
プログラム
(シェル)
/dev/pts/0
記述子
0,1,2
プロセスとプロセスの通信
• ファイル記述子とファイル記述子を結びつける
Oct. 7, 2015 ロボットシステム学 35
pi@raspberrypi ~ $ seq 100000000
| grep 12345
12345
112345
123450
123451
123452
...
seqというプログラム(コマンド)と
grepというプログラム(コマンド)を
パイプでつなぐ
pi@raspberrypi ~ $ ps u
USER PID %CPU %MEM VSZ RSS TTY STAT
START TIME COMMAND
pi 8538 101 0.0 3224 328 pts/0 R+ 06:44
0:14 seq 100000000
pi 8539 1.4 0.1 3568 1796 pts/0 S+ 06:44
0:00 grep --color=auto 12345
(略)
プロセス番号を調べて
/procの下を見るとどうなるか?
• seq側の1番とgrep側の0番が「pipe」で接続されている
• ファイル記述子0,1,2: 標準で用意されるデータ受け渡し口
– 0番: 標準入力
– 1番: 標準出力
– 2番: 標準エラー出力
• シェル: ファイル記述子を操るのが大きな仕事の一つ
Oct. 7, 2015 ロボットシステム学 36
(先取り)ROSのUNIX的解釈
• ROSは後からやるので知っている人だけに
• ノード(プロセス)をTCP/IPやUDPで通信させる
– 同じ計算機、違う計算機のノードをシームレスに接続
• ネットワーク周りはファイルに抽象化されていないので
マスタでファイルに見せかけている
– ROSトピック
• 単にUNIXというのはソフトウェアではなく、データの
蓄積、通信方法の「標準的な考え方」になっている
– 分かってない人は筋の悪いものを作ることになります。
Oct. 7, 2015 ロボットシステム学 37
本日のまとめ
• OSの乗った計算機
– マイコンには無い概念
• プロセス
• 仮想記憶
• ファイルシステムとファイルを通じた通信
• UNIXやLinuxはデータを流すように使う
– 使いこなすのは大変だが、これで機械の制御から
ウェブサービスまでの広範囲がカバーされている
– 考え方に親しむことで大きなシステムを作ることができる
Oct. 7, 2015 ロボットシステム学 38
次回
• UNIXが産んだもうひとつの重要なもの:
オープンソースを扱います
• 背景
• ライセンス・著作権
• クラウド
• 組み込み、ロボットとの関係
Oct. 7, 2015 ロボットシステム学 39

ロボットシステム学2015年第5回