酒居敬一(sakai.keiichi@kochi-tech.ac.jp) オペレーティングシステムJ/K 2004年11月18日 酒居敬一(sakai.keiichi@kochi-tech.ac.jp) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/OS2004/

Slides:



Advertisements
Similar presentations
プロセスの生成とコマンドの実行 プロセスの生成とコマンドの実行 プロセス生成のシステムコール プロセス生成のシステムコール プロセス生成のプログラム例 プロセス生成のプログラム例 プログラム実行のシステムコール プログラム実行のシステムコール 子プロセスの終了を待つシステムコール 子プロセスの終了を待つシステムコール.
Advertisements

ARTLinuxの特徴 ARTLinux: ハードリアルタイム処理機能を拡張したLinuxカーネル 固定優先度に基づくスケジューリング機能
第2回 プロセス管理 ジョブ、プロセスとは? プロセスの状態遷移 プロセス制御ブロック スケジューリング.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
オペレーティングシステムJ/K 2004年10月7日
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
応用情報処理V 第1回 プログラミングとは何か 2004年9月27日.
オペレーティングシステム (OSの機能と構造)
ソフトウェアを美味しく 解析する方法 Security Ark
App. A アセンブラ、リンカ、 SPIMシミュレータ
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
応用情報処理V 第1回 プログラミングとは何か 2003年9月29日.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
担当:青木義満、篠埜 功 情報工学科 3年生対象 専門科目 システムプログラミング 第8回、第9回 シグナル処理 担当:青木義満、篠埜 功
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
第3回 CPUの管理と例外処理 OSによるハードウェアの管理 CPUの構成、動作 CPUの管理 例外処理、割り込み処理 コンテキストスイッチ
オペレーティングシステム (割り込み処理)
第5回 CPUの役割と仕組み3 割り込み、パイプライン、並列処理
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
10: ファイル入出力 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
Occam言語による マルチプリエンプティブシステムの 実装と検証
コンパイラの解析 (2) GCJのデータ構造 - 1.
型付きアセンブリ言語を用いた安全なカーネル拡張
コンピュータを知る 1E16M009-1 梅津たくみ 1E16M017-8 小沢あきら 1E16M035-0 柴田かいと
セキュリティ(3) 05A2013 大川内 斉.
マルチスレッド処理 マルチプロセス処理について
アルゴリズムとデータ構造1 2006年6月16日
プログラミング演習I 2003年6月25日(第10回) 木村巌.
オペレーティングシステム イントロダクション
Linux Device Driver 輪講 7. 時の流れ
オペレーティングシステムJ/K (システムプログラミング)
オペレーティングシステム 第2回 割り込みとOSの構成
コンパイラ資料 実行時環境.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第6回 システムプログラミング概要 プロセスの生成 担当:青木義満
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
オペレーティングシステムJ/K 2004年11月15日2時限目
先週の復習: CPU が働く仕組み コンピュータの構造 pp 制御装置+演算装置+レジスタ 制御装置がなければ電卓と同様
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
OSが管理している、デフォルトの入出力装置 入力:stdin キーボード 出力:stdout モニタ(コマンドプロンプトの画面)
組込みシステムとは コンピュータ制御システム?
オペレーティングシステム (OSの機能と構造)
オペレーティングシステム (プロセススケジューリング)
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
オペレーティングシステムJ/K 2004年10月4日
アルゴリズムとデータ構造1 2009年6月15日
オペレーティングシステムJ/K (システムプログラミング)
ネットワーク・プログラミング デバイスドライバと環境変数.
オペレーティングシステムJ/K (並行プロセスと並行プログラミング)
高度プログラミング演習 (11).
オペレーティングシステム (プロセススケジューリング)
強制パススルー機構を用いた VMの安全な帯域外リモート管理
ネットワーク・プログラミング 非同期I/Oとスレッド同期制御.
SMP/マルチコアに対応した 型付きアセンブリ言語
ネットワーク・プログラミング TCPサーバ.
モジュール分割.
コンパイラ 2012年10月11日
アルゴリズムとデータ構造 2010年6月17日
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
ネットワーク・プログラミング 1対多のプロセス間通信.
オペレーティングシステム (OSの機能と構造)
ネットワーク・プログラミング パイプライン通信とシグナル.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
情報処理Ⅱ 2005年11月25日(金).
ネットワーク・プログラミング プロセスとファイルシステム管理.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

酒居敬一(sakai.keiichi@kochi-tech.ac.jp) オペレーティングシステムJ/K 2004年11月18日 酒居敬一(sakai.keiichi@kochi-tech.ac.jp) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/OS2004/

LinuxにおけるAPI: システムコール もっとも原始的なもの ソフトウェア割り込み0x80番(int 80h) 引数はレジスタに設定する 戻り値はレジスタに設定される 一般的なもの C言語の関数インターフェース APIとして使いやすい、プログラムを読みやすい libcでint 80hインターフェースに変換 libcはUNIXにおける標準ライブラリの通称

LinuxにおけるAPI: ライブラリ関数 システムコールをより使いやすくしたもの C言語の関数 システムコールと見かけ上は同じ 標準的なものはlibcに含まれている 標準ライブラリという形で、互換性をもたせたもの プログラムの移植性があがる

プログラム例(アセンブラ) バッファを静的に確保 標準入力から読む 標準出力へ書く 終了 segment .bss align=16 class=DATA use32 buf: resb 256 segment .text align=16 class=CODE use32 global _start ; default entry point align 16 _start: mov eax,3 ; read mov ebx,0 ; stdin mov ecx,buf ; address of buffer mov edx,256 ; size of buffer int 0x80 ; system call test eax,eax ; check return status js exit mov edx,eax mov eax,4 ; write mov ebx,1 ; stdout jmp short _start exit: mov eax,1 ; exit mov ebx,0 ; return status end プログラム例(アセンブラ) バッファを静的に確保 標準入力から読む 標準出力へ書く 終了 [sakai@star training]$ vi echo.asm [sakai@star training]$ nasm -f elf echo.asm [sakai@star training]$ ld echo.o -o echo [sakai@star training]$ size echo text data bss dec hex filename 63 0 256 319 13f echo [sakai@star training]$ ./echo askdjhaslkdjh [sakai@star training]$

CPUは 機械語しかわからない… [sakai@star training]$ objdump -d echo echo: ファイル形式 elf32-i386 セクション .text の逆アセンブル: 08048080 <_start>: 8048080: b8 03 00 00 00 mov $0x3,%eax 8048085: bb 00 00 00 00 mov $0x0,%ebx 804808a: b9 c0 90 04 08 mov $0x80490c0,%ecx 804808f: ba 00 01 00 00 mov $0x100,%edx 8048094: cd 80 int $0x80 8048096: 85 c0 test %eax,%eax 8048098: 78 19 js 80480b3 <exit> 804809a: 89 c2 mov %eax,%edx 804809c: b8 04 00 00 00 mov $0x4,%eax 80480a1: bb 01 00 00 00 mov $0x1,%ebx 80480a6: b9 c0 90 04 08 mov $0x80490c0,%ecx 80480ab: cd 80 int $0x80 80480ad: 85 c0 test %eax,%eax 80480af: 78 02 js 80480b3 <exit> 80480b1: eb cd jmp 8048080 <_start> 080480b3 <exit>: 80480b3: b8 01 00 00 00 mov $0x1,%eax 80480b8: bb 00 00 00 00 mov $0x0,%ebx 80480bd: cd 80 int $0x80 [sakai@star training]$ CPUは 機械語しかわからない…

プログラム例(C言語) 記述が単純。 わかりやすい。 よみやすい。 #include <unistd.h> int main(void) { char buf[256]; int cnt; while((cnt = read(0, buf, sizeof buf)) > 0){ write(1, buf, cnt); } return 0; 記述が単純。 わかりやすい。 よみやすい。

システムプログラムの必要性 例: 入出力しながら一定時間ごとに時刻表示 read()/write()するとプロセスは待ち状態になる。 時刻表示をするには? 非同期 read()/write() をする。→ ポーリング 時刻表示にシグナルを使う。→ 割り込み スレッドを複数使用する。→ マルチスレッド処理 1と2にはただし、そのものずばりのライブラリ関数はない。 システムコールを使う。 3にはライブラリがある。 2か3の方法を使うことが多い。使い分ける。

シグナルによる 実装例 1秒ごとに時刻表示 エコーバック処理 これらを同時処理 void timer_handler(int n) { char buf[256]; int cnt; snprintf(buf, sizeof buf, " %d %n", time(NULL), &cnt); write(1, buf, cnt); } int main(void) struct itimerval timer; struct sigaction sa; char buf[256]; sa.sa_handler = timer_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_restorer = NULL; sigaction(SIGALRM, &sa, NULL); timer.it_value = timer.it_interval = (struct timeval){ 1, 0}; setitimer(ITIMER_REAL, & timer, NULL); while(1) { if((cnt = read(0, buf, sizeof buf)) > 0){ シグナルによる 実装例 1秒ごとに時刻表示 エコーバック処理   これらを同時処理

マルチスレッド による実装例 1秒ごとに時刻表示 エコーバック処理 これらを同時処理 #include <unistd.h> #include <pthread.h> void *timer(void *arg) { char buf[256]; int cnt; while(1){ sleep(1); snprintf(buf, sizeof buf, " %d %n", time(NULL), &cnt); write(1, buf, cnt); } int main(void) char buf[256]; pthread_t thr; pthread_create(&thr, NULL, timer, NULL); while((cnt = read(0, buf, sizeof buf)) > 0){ return 0; マルチスレッド による実装例 1秒ごとに時刻表示 エコーバック処理   これらを同時処理

イベントドリブンシステム 入力すべき文字がある 出力が可能である 一定時間が経過した マウスを動かした… などなど… マウスを動かした…   などなど…  これらをイベント(事象)としてとらえ、    イベント発生を受けて動作するシステム イベントドリブンシステム

イベントドリブンシステム 発生したイベントの通知方法 処理を割り付ける方法 (ポーリング) シグナル送信・メッセージ送信 スレッドのwake up 処理を割り付ける方法 (条件分岐) シグナルハンドラ・コールバック関数 マルチスレッド イベントと処理を効率的にバインド(bind)することがミソ

UI(User Interface)のような非同期で不定間隔で処理が必要な場合 イベントドリブンシステムにおける有効性 UI(User Interface)のような非同期で不定間隔で処理が必要な場合 処理が必要な状況→イベント発生 処理はイベントとバインドする OSの仕組みを利用すれば効率的 イベントと処理の組み合わせが自在 イベント発生とイベント処理を分離でき構造がすっきりする。 シグナルやメッセージパッシングを使うとOO的

リアルタイムシステムの構築手法 処理オーバーヘッドの削減 応答時間が一定の範囲内にあることを保証 必要な処理時間の予測を行う 複数の処理要求が発生しても時間内に完了 割り込み処理として記述する(モニタなし) 割り込み処理はスケジューラを呼ぶことにし、ディスパッチャと分離する(モニタとして実装)

リアルタイムモニタとして実装するとき 非プリエンプティブマルチタスク メモリは領域の管理だけ ユーザー空間での割り込み処理 処理時間がわかっている 処理が完了すべき時刻(デッドライン)の要求を満たす メモリは領域の管理だけ タスクは自由に相互に参照可能 ユーザー空間での割り込み処理 シグナル機構に変換しない

スケジューラはイベントの発生ごとに呼ばれる I/Oの待ちによるCPUの空き時間を利用して、 多重にプログラムを走行させる プロセッサへの割り込み→イベント発生 タスクはそれにより順次起動される 再帰的に起動されるタスク そうでないタスク タスクが待ち状態に入る→イベント発生 同期通信機構→タスクからのイベント発生 スケジューラはイベントの発生ごとに呼ばれる I/Oの待ちによるCPUの空き時間を利用して、  多重にプログラムを走行させる

例:モーター制御 ステッピングモータを駆動することで、位置を制御 励磁信号はプロセッサが生成 モーター駆動速度には上限がある ハードリアルタイム処理 モーター駆動速度には上限がある モーターの加減速度には上限がある

フィードフォワード制御とフィードバック制御の併用 制御量は位置、位置のずれ(偏差)をもとに制御 偏差を最小にするようにフィードバック制御を使用 偏差が残ると誤差となるので、PID制御がよく使われる P: Proportional I: Integral D: Differential 位置制御の結果が静定する時間を短縮するため フィードフォワード制御も併用 制限事項とともに、制御の計算量が必要となる

カウンター割り込みを使用 カウント値の更新により励磁間隔を変更 カウント値の更新間隔は励磁間隔以下 カウント値は位置制御部からの指示