2008-07-30

memo3

----- OS Report No.1 -----


問題1 オペレーティングシステムがアプリケーションプログラムに対して提供するインターフェースの重要性を2つ述べよ。

一つ目の重要性は、プログラマがハードウェアのことをあまり意識しなくてもプログラミングできるようにすることである。これにより、プログラマがプログラミングするための手間を大幅に削減することが出来る。
二つ目の重要性は、アプリケーションソフトの互換性を保障することである。具体的には、命令体系が同じであるようなマイクロプロセッサやOSを搭載したコ ンピュータ同士では、アプリケーションソフトを改変しなくては同じ動作をさせることである。具体的な具現化の方法としては、C言語の#defineを利用 して、OS毎に実行するソースコードを変更させることで具現化できる。これにより、プログラマが、プログラムを移植する際に被る手間を削減することが出来る。



問題2 各自が聞いたことがあるOSの名前を4つ述べ、その特徴を説明せよ。

OSASK:OSの実行効率向上を追求したOS。実行効率を上げるため、低級言語を用いてプログラムされているところも比較的多い。
Ubunto:Wubi というインストーラを使うことで、UbuntoのファイルシステムをWindowsと同じものにすることが出来、パーティション等の作業を行わなくても、 簡単にWindowsとUbuntoのデュアルブートを実現できるようになるOS。インストールやアンインストールもWindows側から行うことが出来 る。
Knoppix:CDやDVDから起動することが出来る。また、ハードウェアを自動で認識してくれるので、例えば、Knoppixから他OSで生成したファイルにアクセスすることができる。
Windows:OS市場で最も高いシェア率を持つOS。新旧の互換性に優れている。
Macintosh:ハードウェア設計とOS開発を同時に手がけていて、ハードとソフトとの統一感に優れている。



問題3 もし、OSが使用できなかった場合、ユーザプログラマが記述する必要があるプログラムはどのように変わってくるのか200字程度で説明せよ。

OSが使用できない場合は、OSが提供するAPIを使用することができないので、CPUの提供する機能以外は使用することができない。具体的には、外部 ハードウェアを扱うことができなくなり、マウス操作を感知する関数や、キーボードからの入力を感知する関数、また、画面に文字を出力する関数などが使えな くなる。加えて、OSの提供するABIも使えなくなるため、例え命令体系が似ているマイクロプロセッサであったとしても、プログラムを移植することができなくなる。



問題4 C言語を実行する場合にスタックはどのように使用されるのか?特に、Cの関数を呼び出すときにスタックがどのように使用されるかに関して説明せよ。

スタックは、現在レジスタに格納されている値を、FIFOなどの方式を用いて一時的に非難させるために用いられる。具体的な使用例を挙げると、C言語のプ ログラムを実行して、関数を呼ぶ処理が行われるとき、その関数が呼ばれる直前のレジスタをスタックに非難させ、関数を実行し終えた後に、スタックに入って いる非難させた値をレジスタに戻してあげることになる。こうすることで、どのような関数を呼び出したとしても、使う予定のレジスタが書き換えられるというような危険性がなくなる。



問題5 キャッシュメモリと命令パイプラインに関してそれぞれ100字程度で説明せよ。

キャッ シュメモリ:記憶装置の一つで、メインメモリとレジスタとのアクセス速度の格差を緩和させるためのメモリである。レジスタほどCPUに近くはないがメイン メモリほど離れているわけではない。このため、アクセス速度は、レジスタ>キャッシュ>メインメモリとなり、記憶容量はメインメモリ> キャッシュ>レジスタという順になっている。

命令パイプライン:CPUの処理速度を高速化する方法で、LOAD命令やSTORE命令に必要なphaseを固定長にすることで、CPUが行う様々な命令を並列的に処理することができる。現在、ほとんどのCPUがこの方法を用いて命令を実行している。



問題6 コンテキストスイッチとプロセススケジューリングに関してそれぞれ100字程度で説明せよ。

コ ンテキストスイッチ:CPUの状態を保存・復元させて、複数のプロセスを1つのCPUに割り当てること。マルチタスクOSのように、複数のプロセスが存在 するときには、複数のプロセスを同時進行しているかのように見せる必要がある。しかしながら、CPUは限られた数しかないため、1つのCPUで各プロセス を同時に扱うことができない。このため、CPUの状態を保存・復元させ、各プロセスを少しずつ処理していくことで、ユーザに対してあたかも複数のプロセス を同時進行しているかのように見せることができる。

プロセススケジューリング:CPUに効率よくプロセスを割り当てること。どのようなと きにコンテキストスイッチを使い、次にどのプロセスをCPUに割り当てるのかによって、システム全体にスループットや、リアルタイム性に変化が生じる。具 体的にいえば、ネットからの膨大な量のパケットを高速に処理しなくてはいけない場合、パケットの取りこぼしを避けるため、CPUに他のプロセスを割り当て ることが困難になる。



問題7 プログラムを実行する上で、プログラムカウンタとスタックポインタの役割を100字程度で説明せよ。

プログラムカウンタ:CPU内部にあるレジスタの一つで、次に実行する命令のアドレスが入っている。1つの命令が終わると、固定された値を現在のプログラムカウンタに加算する。このとき、プログラムカウンタの指すアドレスが次に実行する命令のアドレスとなる。

スタックポインタ:CPU内部にあるレジスタの一つで、スタックポインタに格納されている値は、今扱っているスタックのトップの場所を指している。例えば、 プログラムから違うプログラムを呼び出すとき、プログラムカウンタの値をスタックポインタに詰め込むことで、呼び出されたプログラムから元いた番地に戻ることが出来る。



問題8 プログラムを実行するときに、どのようにメモリ空間が利用されるかを100字程度で説明せよ。図を使用してもかまわない。

プログラムを実行するとき、メモリ空間からそのプログラムの実行に必要なメモリ容量を確保する必要がある。このとき、メモリ空間上でフラグメンテーションが 起こっていた場合は、「連続して空いているメモリ空間≧確保したいメモリ容量」の場所をメモリ空間の中から探し出す。条件にあう場所を発見したら、その場所を使ってプログラムの実行を行う。



問題9 ユーザ空間とカーネル空間の2つのメモリ空間が存在する理由を100字程度で説明せよ。

カーネル空間とユーザ空間を分けることで、ユーザ空間を使ってカーネル空間の内容を書き換えられないようにすることが出来る。これにより、悪意をもってカーネルを破壊しようとするプログラムから、カーネル空間におかれている内容を守ることが出来る。



問題10 10年後のコンピュータがどうなっていると思われるか各自の意見を述べよ。また、そのコンピュータは20年後のコンピュータとはどう違うと予測するか?

ムーアの法則から、10年後にはマシンのスペックが少なくとも約7倍向上することが予想される。加えて、様々なモノに組み込み系の技術が使われ、色々なモノが電子化されていくと考えている。
20年後には、電流ではなく光を使ったCPUが使われ、CPUの処理速度は今よりも格段に向上すると考える。加えて、様々なモノに組み込まれるOSが規格化され、組み込み系ソフトの入っているモノ同士の通信が容易になると思う。


---------C言語の復習とOS概要---------

システムコール = OSを呼び出すための関数
普通は、OSのデータ構造にはアクセスできない。

システムコールを介してのみ、アクセス可能。

Index
・カーネルの中身
・C言語の復習
-header, structについて

C言語とは
OSを作るのに適切な言語。
低水準programming

assembly言語はCPU毎にソースコードが違う
→移植するときは全部変更しなくてはいけない。

C言語の場合、大抵使いまわせる。
→移植するときの楽。

C言語には予約語が一杯ある。
→JAVAに似ているが、CLASSの概念はない。

C言語は分割しても一括してもどちらでも大丈夫。
→どの関数をどのファイルに置くかを考える必要がある。

Structure
-宣言部
-main関数
-そのほかの関数

C言語を使うときは、型のbyte数を把握する必要がある。
JAVAの"NEW"に近いallocateをするためには、
sizeof(型)をやって自分でbyte数を確保する必要がある。

・auto(自動変数)
関数内部の変数とか。
関数から出たら、解放する。

・static(静的変数)
呼び出すかどうかに関わらず、いつでも存在する。

EX:staticで大きい配列はダメ

・Register(レジスタ変数)
register上に置くので、早くなるかもしれない。
現在は、compilerが勝手にやってくれるので、
使っても無視されることがしばしばある。

・exterm(外部参照変数)
プログラムの外に変数を書く。
グローバル変数 = static変数

main()内はauto変数
関数内の変数をstaticにすると、以前使ったときの
結果が残っている。

int foo(void)
int main()
引数の数は自分で数える。

GNU gccは良いが、他のコンパイラには
引数をカウントしないものもある。
→clashしてdownする可能性がある。

・prototype宣言
int foo(int);
compilerがcheckしてくれる。

Ex:型のミス
void foo(void);
int x = foo;

---------------------------------

・C言語のsequence

C sourve(*.c)
↓ 
↓ preprocessor

preprocessor後のsource(*.i)

↓ C compiler

Object file
↓ linker
↓←←←←←←library

実行ファイル


・header
#include "queue.h"

preprocessorがlibraryの中にある"queue.h"を
ソースファイル内に展開する。

・マクロ展開
#define MAX 10
MAXを10に置き換える

#define putchar(x) fputc(x, stdout)
xは引数としてマクロ展開する。

用途:何行も使うものをまとめるときに使う。
「何故methodにしないのか」
methodの呼び出しのために、サイクルカウント値を消費してしまい、
動作が遅くなるから。

OSでは、致命的。C言語では重要な部分。
→overflowはなるべく少なくする。

・他の記号
#include"hoge.h"
#if DEBUG == TRUE
print("value = %d\n", val);

→hoge.hが
#define DEBUG TRUEならば
print文がマクロ展開される。

→#include"hoge.h"の文があるかどうかで
実行の有無がわかる。

debugに便利!

・gcc -DTEST ~~~
オプションの-DTESTがあれば
#ifdef TEST以下の文が展開
そうでなければ
#else以下の文が展開される。

用途:
#ifdef LINUX #else WINDOWS
Linux用とwindows用にわけてマクロ展開させることが可能。

・#incledeファイルの場所
→/usr/include/
or
/usr/include/sys/
and
/usr/include/linux/

・include fileのpathを指定したいとき
gcc -I/usr/local/hoge.h


・ifdef~else~endif
#ifdef MAIN
/* MAIN が #define してあったらここの部分がコンパイルされる。#define されていなかったらここの部分は無視される */
#else
/* MAIN が #define されていなかったらここの部分がコンパイルされる。#define してあったらここの部分は無視される */
#endif


・Compilerとlink
実行ファイルの中身
hm -g a.out | grep't'
00001c64 T __darmin_~~~
00001d44 T _main
0000166c T start 
プログラムが実行させるときは、まず最初にstartを探す!
startの位置をprogram counterに設定する。

※start -> _mainまでに
色々と初期化している。
mainかんすを呼ぶためにlibraryの中で、
色々と初期化されている。

・動的リンク
必要になったときにlibraryを呼ぶ
複数のプログラムから同じlibraryを使う場合、
共有ライブラリにする

*.so (shared object)

・コンパイラの最適化
program -> binaryにする場合
defaultで -O2 optionが入る。
→-O3以上にしても、あまり結果は変わらない。

・library
-lnew 自分が定義したもの?

-L/usr/local/mylibs
↑このdirectoryの中から優先的に探しだしてlinkする。

・libraryを作る場合
gcc -c newlib.c
ar rcs libnew.a newlib.o
で"new"ライブラリにnewlibを追加
nm/usr/lib/libc

・静的リンク
全部取り込む
→programが大きくなりやすい!注意!

・構造体
データ構造のみを定義。

struct tag名{
type member1;
type member2;
};

struct log{
char time[10];
long ch0;
long ch1;
};
↑この場合
1 structure = 10B+4B+4B = 18B

struct log logger1, logger2;
typedef struct{
~~
~~
~~
}LOG;

LOG logger1;
LOG logger2;
→structを宣言しないで済む。
typedefが主流。

・Pointer
※2000番地に10が入っているものとする。
int a;
int *p;
p=2000;
p=&a;

int *p;
int c = *p;
→integer型のpointerに10が入る。

func(&val);

→OSがCで書かれている理由の一つ
→pointer

予断:javaの場合classはcall-by-referenceになる

☆文字列の最後は必ず'0'が入っている。
"abcd"

'a'+'b'+'c'+'d'+'0'

while(*str) str++;
→文字列を読み終わったら0が入る
→偽になる→while文終了

予断:NULL = 0


・配列とポインタ
&array[0] と arrayは同じ意味
++arrayとすると
array[1]から読み込まれる。

データ構造の文だけincrementされるから。
→箱のサイズは気にしなくてもよい。


・character型の場合
char str[] ⇔ char *str
同じ

一般的に、*pには乗算や除算は使わない
structureをコピーするかpointerで指定するかで、
作業効率が大幅に変わってくる。

struct hm_time{
int hour;
int minute;
};

アクセスするには2つの方法がある。
①time.hour or time.minute

②void addtime(struct hm_time *t1, struct hm_time *t2){
t1->hour += t2->hour; ←メンバーアクセスと呼ぶ
t1->minute += t2->minute;
}

・command line
javaとはちょっと違う。
main(int argc, char argc[]){~~~

argc = コマンド(1)+引数の数
argv[] = コマンド及び引数へのポインタ

・pointerの危険性
異常終了or迷子のポインタ
エラーのとき
int *p;
int c = *p;
malloc <- 動的に領域を割り当てる。 malloc(10) = 10byte確保する ↑うまく確保できない場合は0を返すので if文を使ってエラー処理することも可能! ☆確保したものはfree()で解放すること! 解放し忘れると、メモリがドンドン減ってくる!

-----------------------
memo@file system, device driver etc.
 2008/06/17


ファイル名
ファイルを識別するためのString名からID名へ変換する
例:/a/b/c→101020



ファイル内のポインタ
論理アドレスから物理アドレスへの変換
↑上記の二つをどうやって実現するのか?


ファイルシステム概要
ファイルの詰め込み方にはいろんな方法がある

例:
Case 1. 頭からファイルを詰め込んでいく方法
→deflagmentationが起こるのであまり使われない。

Case 2. 固定長のブロックに分けてファイルを詰め込んでいく方法、各ブロックは次のブロックを指すポインタを持っている
→しかしsequencialにしかアクセスできない!

Case 3. 自分のファイルがどこに保存されているかを格納しているところがあり、それを参照して、ファイルの格納場所を知る(←これをディレクトリという。)
→これが最も一般的なやり方
cf.ページテーブル

directoryをどうやってストレージデバイスにおいていくか、が実現上大きな問題にある。よって、それぞれのファイルとdirectoryをどうやって実現していくか、をこれから説明する。



・Unix file system
API概要(OSが実現するAPI)
fd = open((file,mode)
read/write(fd, buf, size)
…とか色々



ファイルシステム全体の概要
全体の構造:
スーパーブロック→inode list→ファイルブロック(固定長に分けたブロックのこと)

- 各用語の意味
i-node table: i-nodeを表形式にまとめたもの?
i-node: 各ファイルごとに一対一対応するデータ構造。
スーパーブロック: ファイル全体を管理するデータ構造
i-node list: 全体の数とかを管理する

ファイルへのアクセスはメモリへのアクセスと比べると時間がかかる。
一度オープンしたファイルに関しては一旦メモリ上にコピーされる。
ファイルデータ構造というのは、readすると順番にブロックが呼び出されていく。どこから呼び出されていくかはOSが知っている。

プロセスデータ構造:プロセスごとに存在し、ファイルデータ構造にある内容をファイルディスクリプタ内の情報に変換する?つまり、ファイルディスクリプタの番号はプロセスごとに閉じている。

ストレージは非常に大きい。よって、メモリ上に持っていくことは出来ない。
しかし、一部のファイルに関してはメモリにコピーしていることがある。
ストレージデバイスで、良く使う部分のみがメモリ上にコピーされる。


i-nodeとブロックの関係
i-node内部構造
内部構造は固定長で、
"所有者、アクセス権、アクセスタイム、変更時間、10個のエントリ、3個のエントリ"
が含まれている。ファイルシステムは何年も使われて、安全が保障されてから人に使われる。
よって、開発から実用まで10年ぐらいのスパンがある。

10個のエントリ:それぞれが独立に10個のブロックを指している。
3個のエントリ:それぞれが独立に3個の間接ブロック(=中身はエントリ)を指していて、そのブロックはそれぞれまた別なブロックを指している。

一つのブロックには256個のエントリが入る。よって、
 10K + 256*1K + 256*256*1K + 256*256*256*1K
よって、ファイルのサイズが大きくなればなるほど深い層までもぐりこまなければならないのでperformanceは低下する。

i-nodeの数だけファイルが作られるので、ファイルの上限はi-nodeの数に制限される。



・Unix filesystem(4)
ファイルデータ構造は、複数のプロセスから共有されることがある。

例:プロセスAがオープンしたファイルデータ構造はプロセスBからも共有される

forkしたときに、現在オープンしたファイルディスクリプタは共有される。
オフセット:現在書き込みしているところの次はどこに書き込むのか、という情報が格納されている。
(ちなみに、Windowsでは、fork関数は使えない)


スーパーブロック
スーパーブロックはファイルシステム全体を管理するデータ構造。
一番最初に読み込まれる。

スーパーブロックを読み込むことで分かること:
- ブロックサイズをどうするか?4K?1K?
- どのブロックが現在使われているか?
- 新しくブロックを割り当てる場合、空いているところをビットマップから判断し、割り当てる。
- 名前をどうやってi-nodeに変換するか?
- i-nodeが分かったとき、その後どうやってファイルにアクセスするか。



read/writeとファイルシステムの関係
ファイルをオープンすると、今アクセスしようとしているi-nodeを認識する。
それをi-node tableのコピーする。

ファイルデータ構造にallocationして、プロセスデータ構造からファイルデータ構造に書き込む。
よって、処理の手順は以下のようになる
1. ファイルデータ構造のoffsetを見て、次に読み込む場所を認識。
2. i-nodeテーブルを見て、i-nodeの何バイト目を見るかを決める。
3. [10Kより小さかった場合] ブロックを発見。
[10Kより大きかった場合] 間接ブロックを辿っていく。


rooter i-node
[例] i-node:3,5,7,19,17と書いてあるとする。

頭は"/"から始まる
"/" "usr"=3
. =自分
..=親のディレクトリ

"vmunix" = 10
→ファイルを直接アクセスしている。
ファイルのブロックが順番にアクセスされる。

usr = 3
usrと認識すると i-node 3を見る。
3は"."を指しているので、親のディレクトリに行く。

例:/usr/readmeをopenする
ディスクからi-node tableの必要なブロックを全部呼び出す。
readmeを探し、7が見つかったので、
i-node 7の指すファイルを全部呼び出して、
前から順々にアクセスしていく。

よって、
ファイル名から、
i-nodeの指すファイルを探して、
ファイルをopenする。



・ハードディスクが複数合った場合はどうするのか?
ディレクトリ+ブロックが入っている。
あるハードディスクのあるディレクトリを、他のハードディスクをマウントするようにする。
mount table
mntはディスクテーブルにある。
mntを見つけたら、ディスクBをアクセスし始める。
mnt=mount

ディレクトリ自体は一つのtree構造であることには変わらない。



物理的なディスクの構造
ハードディスク上にファイルシステムを作る場合を考える。
ディスクは複数ある。
ディスクは同心円の円がたくさん入っていて、そこにデータがたくさん入っている。
その輪の中にデータを入れていく。
それぞれの輪の部分をトラックという。
トラックを固定長に分割した部分をセクタという。
各ディスクのことをシリンダという。

シリンダ->トラック->セクタ

アームで読み込む。アームは前後に動く。
ディスクが回っていて、アームと接触した部分を読み込む。
よって、読み込むまでの時間は、アームのところに読み込みたいセクタまでディスクを回してあげて、完了するまでの時間。
読み込み時間アームの前後に動く時間 + セクタを指定した位置に持っていくまでの時間

よって、ハードディスクの読み込みは比較的遅い


・バッファキャッシュ
キャッシングとプリフェッチ。
prefetch:次に読み込むものが分かっている場合は、事前にフェッチしておくこと。
ファイル全体をメモリにコピーしていくことが多い。

使用例:ファイルは頭から順番にアクセスしていくことが多いことを利用する。
具体例:Unixは次のブロックを指していたら、その次のブロックがアクセスされる場合が多いので、事前にメモリ上に呼び出しておく。
→CPUの処理効率が向上する。

タイムスタンプ:いつアクセスされていたか。
キャッシュの管理アルゴリズムは、タイムスタンプをつけてLRUで管理している。



ディスクの書き出し
通常、バッファキャッシュで変更する時間間隔は30秒から1分に1回。
これにより、同じバッファブロックに対して何度も何度も書き出すことを制限することが出来る。

30秒に一回変更されているブロックをディスクに書き出す。
ディレクトリやスーパーブロック, i-nodeの変更はすぐにディスクに書き出す。
→システムがファイルへ書き出す前にクラッシュしたとき、ファイルシステム全体が壊れる可能性がある。
→ファイルのデータ構造をいじくるときは、常にファイルシステムの一貫性を保てるようにする。



ディスクスケジューリング
FIFOスケジューリングは行ったり来たりする。
メカニカルに動く。
アームの動く速度は遅いので、アームの動く量を最小にしたい。
→C-SCANというアルゴリズムがある。

C-SCAN:
1. いくつかのタスクを溜めておいて、ソートする。
2. ディスクへ書き出す時間になったら、頭から尾に向かって順番にアクセスしていく。
3. その後、アームを頭の位置に戻す。

他のもディスクスケジューリングアルゴリズムがある。
今は、もうちょっと頭のいいアルゴリズムも存在する。

☆ハードディスクのアクセスには物理メモリと違って、
トラックがどこにあるかによってアクセス時間が大幅に違う

自分のアクセスしたいデータがトラックのどこにあるのかを認識して、
最小限のアームの動きでアクセスする必要がある。



分散ファイルシステム
リモートにあるマシンに対して同じプログラムを使いたいときは
アクセス透過性位置透過性を考える必要がある。

アクセス透過性:リモートファイルもローカルファイルも同一のAPIを用いてアクセス可能
位置透過性:ファイル名にマシン名が含まれていない。
→どこのマシンにあるかを気にせずアクセスできる!



NFS
network file systemの略称。しかしnetwork file systemとは滅多に言わない。

☆プログラマーから見て、あたかも普通にディレクトリをアクセスできるかのようにすることが大切!
→OSは、ネットワーク上の複雑な処理をユーザから隠蔽することが大事!



I/Oの種類
各I/Oの関係↓
プログラム⇔デバイスドライバ⇔デバイス


デバイスの種類はたくさんある!
デバイスドライバが出来るだけ隠蔽してあげることが大切。



・バスの種類
PCI
ISA
SCSI
…たくさん!



・デバイスドライバ
デバイス独自のプロトコルの使用にあわせて作り、出来るだけ簡略化し、隠蔽する。

デバイスドライバ:各デバイスのアクセスプロトコル(デバイスの制御手順)を実装する。

デバイスドライバはデバイスを自動的に発見し、どのようにアクセスするかを自動的に決定する。
cf:USBの挿入
USBを差し込む→OSが認識→if文分岐
1. [デバイスドライバがない場合] デバイスドライバをインストールする。
2. [デバイスドライバがある場合] USBを読み込む

昔は数百行だったが、今は数千行必要になる。
デバイスドライバを作る人はこれから増えるかもしれない。

☆重要なこと
デバイスとデバイスドライバのやり取りをどうするかを決めること。



・デバイスアクセスの方法
I/Oイベントの通知
- error通知、利用可能データ通知、状態通知
- ポーリング:CPUからデバイスに対して使用可能か調べる?
- 割り込み



・データの転送
デバイスとCPUのデータ転送方法を決定する。
- read/write
- programmable I/O
- DMA(Direct Memory Access): ある程度の長さのデータを一括して転送する



・I/O port
- メモリ空間と異なるI/O空間
- 各デバイスはI/O空間上にポートを割り当てられる
- ポートをアクセスすることによりデバイスとメモリ間のデータ転送が行われる
- I/Oポートをアクセスするための特注名命令が必要
→x86の場合、in, out命令



・Memory mapped I/O
- デバイスの一部をメモリとしてみることが出来る。
- メモリアクセスとして実現されるが、アクセスコストが異なる。



ポーリング CPUからデバイスに対して以下のことを確認する。
- データの入力が可能となる
- データの出力が可能となる
- 処理の終了
あるデータの書き出すが起きているときには、それが終わるまでは次の書き出しを禁止する。
ポーリングを使って、"毎回毎回処理が終わったかどうか"を聞く。

例:
while(flagPort != READY); // データの書き出しが終わるまでwhile文でループし続ける
mem = dataPort; // データの書き出しが終わったらデータをメモリ領域に移す

dataPort:どっかのレジスタ

注意:イベントの発生などをポーリングで待つことはCPUの無駄遣い
他の処理の合間にポーリングをすることが可能だが、システム全体の構造がクリアではなくなる

よって、ポーリングを使用するときは、結果が分かるまでの時間が短い場合のみ
例: 20μsならよいが、20nsでは無駄。



割り込み interrupt
割り込みの流れ
1. (通常の場合) CPU→要求(I/O port, memory)→デバイス
2. (割り込みの場合) CPU← 割り込み  ←デバイス
↑ポーリングによるCPUの無駄遣いを防ぐことが出来る

割り込み:
デバイスからCPUに対して何かを呼び出したいとき、
今実行しているプログラムを中断して割り込んだデバイスの処理をさせるときに使う。



・ 割り込みハンドラ
以下のような処理が割り込み処理に当たる
- 新しく入力された
- エラー処理
- デバイスからの通知処理

番号ごとに違う番号を登録する

例:割り込みベクタ↓
IRQ0 = clock handler
IRQ1 = disk handler
IRQ2 = network handler
IRQ3 = trap handler: page fault, system call, bus error etc.

各デバイスはIRQの何番を用いるか知っている。

場合によっては、割り込みベクタを複数のデバイスで共有することが出来る。
→割り込み処理でもらってきた値を評価して、どのデバイスの割り込みかを認識する。
これにより、IRQの数以上のデバイスを管理することが出来る。


多重割り込み
割り込みが、同時系列に、複数個存在している状態のこと。

Q: 割り込み処理が実行されたときに、違う割り込みが来た場合はどうするのか?
A: 割り込みには優先度が付いている。優先度を見て割り込み処理の順序を判断。

例:(←優先度低)level2, level3, level4,...,level7(優先度高→)
levelの値が高い方が優先して処理する。

デバイスによっては、あまり長い時間放置されると破綻するものもある。
例:network driverは連続的にパケットが送信されるので、データが来たときにすぐ処理しなければならない。

・時間制約によって勝手に割り込んでくる処理がある。
割り込みの数が多いと、今実行されているプログラムは実行できなくなる。
☆未だに解決できていない課題
時間を測定する関数を使った場合、割り込み処理によって正確な値が測定できない。
割り込みハンドラを実行後レジスタを回復する必要がある。
例:
handler(){
save_register();
process_interrupt();
restore_register();
}

割り込みは割り込みようのスタックを用いる。
これにより、スタックがオーバーフローすることを避けている。



割り込みのオーバーヘッド
割り込み処理のコストは結構大きい。ポーリングより大きいので、ポーリングを使った方が良いときも多い。

例:
web serverはデータが来る毎に割り込みが発生する。
昔は10MB/bpsだったので、そんなにCPUが早くなくても取りこぼさない。
今は10GB/bpsなので、パケット量が圧倒的に増えて、割り込みが毎回発生する。
最悪の場合、web serverが実行できずに割り込み処理しか実行されない。
→原因:割り込みハンドラの呼ばれる頻度が高い。
結果:10GB/bpsぐらいだと、CPUは有意義な計算を行うことが出来ない。 対処例割り込みハンドラの呼ばれる頻度が高くなったら、ポーリングに切り替える。


割り込みの禁止 システムコールの処理と割り込みハンドラ間の排他制御
cf.複数のスレッドを実行するときは排他制御する必要がある。

例:readやwriteがデータ構造をいじっているときは割り込みを禁止する。

例:
syscall()
{
割り込み禁止
排他リソースのアクセス
割り込み可能
}
注意:割り込みを禁止している時間はなるべく短くするように心がける。
→割り込み禁止期間が長いと、マウスが動かなかったり、画面が表示されなかったりと、UIに悪影響を及ぼすから。

・Direct Memory Access
各デバイスはメモリから直接データをやり取りする。
bufPort: buffer size
sizePort:送るべきデータのサイズ
cmdPort: WRITEスタート

CPUとは関係なく実行される



サイクルスティーリングとは?
メモリとCPUを繋ぐバスがある
DMAデバイスはバスを使う。
バスは共有されている。同時には使えない。
DMAが動いているときはパイプラインが使えない
結果:DMAはCPU上で動いているプログラムのパフォーマンスを低下させる可能性を持っている。
かつ、CPUとは無関係に動いているので、どのくらい低下するのか予想するのが難しい。


デバイスからDMAを使ってデータを物理メモリの呼び出されたとき、キャッシュの中をクリアする必要がある。
DMAをたくさん使うとパフォーマンスが低下する。



物理空間仮想空間
デバイスが、MMUを解さずメモリをアクセスする場合に、デバイスにバッファのアドレスを教えるときは物理メモリアドレスを教える必要がある。


CPUから見えるアドレスとデバイスから見えるアドレスは違うので、マッピングする必要がある。



TLB管理 経緯:ページテーブルによる仮想アドレスと物理アドレスの変換のオーバーヘッドを減少するため、TLBが導入された。
☆割り込みを考えるとTLBもパフォーマンスを低下させる可能性を持っている。

TLBはコンテキストスイッチが起こるたびにクリアする必要がある。
ページテーブルの変更はTLBに影響を及ぼさない。

以下の場合において、TLBをクリアする必要がある
- I/Oデバイスが新しくマップかアンマップされたとき
- 新しい仮想エリアが新しくマップかアンマップされたとき
- プロセスのコンテキストスイッチが発生したとき



・ユーザから見たI/Oインターフェース
/dev/device0 10 1
↑このファイルをオープンするとメジャー番号(10)とマイナー番号(1)に変換する。
よって、オープンするときは、

fd = open("/dev/device", mode);
close(fd);
read/write(fd, buf, size);
ioctl(fd, cmd, arg);
何でもかんでもI/Oコマンドを定義していくと移植性が低下するので、
I/Oコマンドの定義は最小限にした方が好ましい。



/proc
特別なデバイス。各プロセスの色んな情報を取り出すことが出来る。

例:
"文字列" 意味
"/proc/1/fd/3" プロセス1のfd3の情報を取る。
"/proc/1/mem" プロセス1のメモリ
"/proc/pci"   PCIに関する情報
"/proc/modules" カーネル内にロードされたモジュールの情報



非同期I/O readシステムコールはデータが来るまで待っている。
signalを使って非同期化する?

例:
{
signal(SIGIO,..&input_handler)..
fcntl(0, F_SETWON,..getpid());
oflag = fcntl(0, F_GETFL);
fcntl(0, f_SETFL, oflag | FASYNC);
}



・付録
PDFの"付録"にデバイスドライバのサンプルソースコードがあるので目を通しておく。

---------ファイルシステムの講義はここまで---------


---------プロセスについての講義-------
2008/06/24

プロセスとは?
・プログラムの実行形
・独立したアドレス空間とPC, SP, レジスタのセット
・現在使用中のNWソケットや読み書き中のファイルなどのI/Oデバイスの利用状況のセット。
・シグナルにより別プロセスにメッセージを送ることが可能

上記中にあるプログラム自体は単純な動作の集合に過ぎない。
単純な動作の集合から、複雑な動作になっている。







・exec族
例: execlでプロセスが変わる。
→execlのあとにプログラムを書いても意味がない。

p = path
execle = 環境変数を指定して呼び出す。



signal

interupt



signal -> required #inlude



sigaction(SICINT, &act, 0);

// just registerd



act.sa_flags = 0;



act.sa_handler = ouch(function);


例:
while(1){
printf("Hello World!\n");
sleep(1);
}
意味:1 printout per sec


脱出方法:
if you press Ctrl+c, the function ouch is called.



----------------------------
(ここらへんから突如日本語入力に不具合 orz)


pipeline: 8 bit
register: 16bit
cache: 32 or 16 it

例: "ls > aaa"
意味:output ls data into aaa

std output change dup2


opposite cat

"cat <> [understand fork and exec]

understand system call getpid, getppid getued, geteuid,...,and so on.

"ps": confirm process information running

UID = indicate who calls process.

each process have unique ID

PID = unique ID of each Process


[Flow of program]
1, "init" is called by OS(root)
-> forced to allocate memory space
almost Linux has this init program
In config file, there are a lot of programs about init.

2, init calls login program (UID = 0)
then user should input ID and password
Ex: yohei has 515 UID

3, seeing inputed ID, shell command is called
this UID is 515

if sshd has bug, root has possibility to be stolen.
※private address has more safety than global IP.


*the programs under init are supporting init program

GID is represented by 16bit integer.


getpid, getppid, getuid, getgid have no parameter.
you can fetch each ID using functions above.


・fork
implement multi process eniviroment.
copy process image when it is called.
file descriptor is also copied.

usage: "pid_t fork(void);"
including sys/types.h and unistd.h is required!

recognize program itself is parent or child

ex
pid_t new_pid;
new_pie = fork(); // stack is already copied,

if(new_pid) == -1){
// error
}else if(new_pid == 0){
// execution as a child process
}else{
// execution as a general process
}

* if fork return -1, it shows error.
* which is occurred earlier depends on then environment.
* this above means debug work is very hard!

copy on right makes cost less

wait call
how do we synchronize child process and parent process?
while shell command is running, is shell sequential?

wait = wait for finishing of whose process.
waitpid = wait for finishing of certain process.

required #include

wait function has 3 parameters.

ex
waitpid(child, &stat_val, 0);
// "child" contains child process ID.
// if child process is not finished yet, wait for finishing child process!
// if you forget to command "&", you get 0 instead of &stat_val, then you hold or system down.
// so, it is difficult to find out where is bug.
// c++ has exception function, but c does not such a exception.
// if using language has the exception function, you should use it!
// if possible, you should not call system call, because it makes bugs lower.
* OS is still a little weak, so you pay careful attention to write arguments!
*


wait: wait for the status of child is available by family
exit: By child, configure status code, and then notice what parent has finished!


-----------------------------------------
kill
kill -kill 1234
you have killed process having PID of 1234
signal; waiting for pressing any of keyboard and something like that.

alarm(5)
signal is occurred per 5 seconds.

act.sa_handler = ding;

clock_t times(struct tms *buf)
examine how much time program spends.

int system(const char *command)
forced to call command.
In homework, you must not use the system command!

putenv, getenv
reconfigure your envinment variables.


inter communication between processes
pipe, socket


pipe
In shell command

ps -Af | grep hoge
you can move result anywhere.

int pipe(int file_descriptor[2]);
[0]; // for reading
[1]; // for writing

return
0: successful
-1; failure


Case1
Parent <----> child

parent --- file_pipes[1] | file_pipes[0] --- child
parent --- file_pipes[0] | file_pipes[1] --- child

some source codes
int file_pipes[2];

if(pipe(file_pipes) == 0){
fork_result = fork()l
...
}

close(file_pipes[1]); = pipe
data_o = read(file_pipes[0], buffer, BUFSIZ); = file_pipes[0] yu child
// reading data put into buffer

you do not have to close pipe, but it has possibility to occur bugs!
so, you should close it ASAP.


let's consider PS -As | grep hoge (== 1 | 0)
grep is fetching data from 2nd parameter to end parameter.
Using dup2,

dup2(1, p[1])
Meaning: fetching pipeline[1]

dup2(0, p[0]);
Meaning: fetching pipeline[0]

kind of "ls > aaa"
cat <>

From System Call
int mkfifo(const char * filename, mode_t mode);

* this pipe is hardly used.

pipe system can be call if only two programs are related to family-child.


・setjump/longjump
#include // required

jump_buf ma;
// required and should be put in global domain!

longjmp(ma, -1);
// return value is -1

Ex:
key = setjmp(ma)
// key == -1




EX:
func(){
longjmp
}

main(){
sigaction
setjmp
printf("prompt = ")
read(ls, -1)
fork
wait
exec
}

"ls > a"
cat <= a ls|grep - , cntl.c fork| | | sigaction exec| dup2 | pipe | setjmp/longjmp wait| | | /bin /usr/bin ex. ls -l // search files from upper to bottom in directory. if you find out it, execute it,


---------ここまでプロセスについての講義--------


---------ソケットについての講義---------
2008/07/01

・本日の話 = ネットワークに関するシステムコール
- ソケット
- Client/Server型システムの形態
- システムコール
- 標準ライブラリ





・ソケット
※PDF参照


クライアント・サーバ型(もっとも基本的な型)
UNIXにはもともとスレッドという概念がない。
スレッド使えるようになったのは5年前の話

プロセスをフォークすることは難しい。
cf: "Copy on Write"
毎回毎回プロセスをフォークするとコストが大きい
→スレッド使ったり別の方式を使ったりする。

・反復サーバ型
サーバがクライアントのリクエストをリプライする。
受け取った順に処理する。
→もし、サーバの待ち時間が長い場合はサーバが無駄に動いてしまう。
→多くのクライアントからのリクエストを処理する時には向いていない。

並行サーバ型
ファイルの流れ↓
クライアント → サーバー → (フォーク)Chile Process → クライアント
→サーバはリクエストを受け付けて、子プロセスを生成するだけですむ
ほとんどのサーバはこの形で作られている。

ただし、スレッドに変えてもそんなにオーバーヘッドが減る分けではない。
実際にはもうちょっと複雑な処理をして、オーバーヘッドを減らしている。


同期通信、非同期通信
- 同期通信
リクエストが帰ってくるまで動かない
ex.失いたくない貴重な情報の時

- 非同期通信
リクエストが帰ってくるかどうかにかかわらず動きつづける。
割り込みのような形でリプライを受け取る。
ex.音楽再生とか


Unicast, Broadcast, Multicast
- unicast
1 on 1通信

- broadcast
ネットワーク上の全マシンに対して送信
e.g. DHCP
「僕はあなたのアドレスを知らないけど、あなたのIPアドレスが欲しい!」

- multicast
特定のグループへの加入者に対する同報


ソケット通信の手順(ストリームソケット)
-Client側
socket  // ソケットの生成
bind   // ソケットへの名前付け
connect
read/write
close


-Server側
socket
bind
listen
accept
read/write
close



UBPの場合
-Client側
socket   // ソケットの生成
bind   //ソケットへの名前付け
sendto  //データ送信
recvdrom //データ受信
close   //ソケットの除去

-Server側
socket
bind
recvfrom
sendto
close   //ソケットの除去


・ソケットの生成
-書式
int socket(int domain, int type, int protocol)
int domein:
使用するドメイン種別

int type:ソケットタイプ
UDPを使いたい場合 SOCK_DGRAM

int protocol: 下位プロトコルの指定
0=default

・ソケットの名前付け:bind
取ってきたファイルディスクリプタに対して名前をつける。
int bind(int socketfd, struct sockaddr(自分のアドレスの定義) *my_addr(データスタラクチャの長さ), sockelen_t addrlen)



バイトオーダーとホストオーダー
BIG-endianとLittle-endianの違い
→各マシンごとに違うフォーマットを使っている場合は、意識して直す必要がある。
→CPUなどのアーキテクチャを使用する必要がある。

簡素化ため、変数変換用の関数が用意されている
- htonl, htons: host->nw
- ntohl, ntohs: nw->host

h to nl
n to hl


ソケットアドレスの構造体
-port
送り側と受け手側で違うポート番号を使う必要があるので、要注意。

bzero((void *)&server, sizeof(server));
server sin_family = AF_INET;


IPアドレスの与え方
- バイナリで与える場合(e.g. 0Xac105504)←バイトオーダーで考える必要がある。

- ドット区切り10進表記で与える場合(e.g. 172.16.85.4)


- hostnameで与える場合
gethostbyname ライブラリ関数を使用(後述)
引数にホスト名が入る。
hostentから、アドレスが返ってくる。
IPaddressを知ることができる。いf

・listen:接続受け入れ準備
接続要求を格納するキュー
→いくつ、接続を格納するキューを確保するか、のために使う。

・connect:接続要求発信
- streamsocket使用時における通信路確立
あとで例題

・accept:接続要求許可
int sockfd:
struct sockaddr:相手のアドレス

この関数が返す引数が使うファイルディスクリプタになる。

・read/write:データ送受信


・ストリームソケットが他の通信手順




・無線デバイスドライバのインストール
Linuxのデバイスドライバをダウンロード→インストール

2008-07-29

memo2

2007年度

問題1
Linuxのプロセス管理とメモリ管理の実装手法について、解答用紙1ページ程度で解説せよ。その際に、具体的にどのようなデータ構造やアルゴリズムを使用しているかが分かるようにせよ。

要参照:
http://homepage3.nifty.com/owl_h0h0/unix/job/UNIX/kernel/process.html
http://homepage3.nifty.com/owl_h0h0/unix/job/UNIX/kernel/memory.html


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

問題2
Linux等のOSにおいて、なぜアプリケーションからカーネル空間のデータ構造をアクセスすることを許さないのか、その理由を説明せよ
カーネル空間とユーザ空間を分けることで、ユーザ空間を使ってカーネル空間の内容を書き換えられないようにすることが出来る。
これにより、悪意をもってカーネルを破壊しようとするプログラムから、カーネル空間におかれている内容を守ることが出来る。



問題3
次のようなCプログラムについて考える。
typedef struct comp{
int val1;
int val2;
} *comp_t, comp_val;


int main(int argc, char *argv[]){
comp_t ret;
ret = first();
second();
printf(“Val1 = %d, Val2 = %d\n”, ret->val1, ret->val2);
}
comp_t first(){
comp_val comp;
comp.val1 = 10;
comp.val2 = 20;
return ∁
}
void second() {
int a = -100;
int b = -200;
}
以上のようなプログラムを実行したが、当初想定した”Val1 = 10, Val2 = 20”という結果が表示されなかった。
以下の設問について答えよ。
(1)このプログラムを実行したとき、12行めのprintfの表示結果がどうなるかを示せ。
→ Val1 = -200, Val2 = -100

************** ※重要※*************
処理系がgccである場合を仮定する。

左端がスタックの底であるリストS=[]を考えると、
first()を呼び出したとき: S=[main(), firstの制御情報, [comp.val2 = 20, comp.val1 = 10] ]
となる。返り値は構造体compの番地になる。 (このとき、構造体compは変数を2個持っているので、変数2個分の長さを持っていることに注意!)

その後、
second()を呼び出したとき: S=[main(), secondの制御情報, a = -100, b = -200]
となる。最後に以前、comp.val1とcomp.val2があった番地を出力しているので、
ret->val1 == b == -200, ret-> val2 == a == -100
となる。
***********************************


(2) (1)の結果が、どのような理由で生じたのかについて説明せよ。
→ first()の返り値がローカル変数のアドレスを指しているため、first()終了後にfirst()内部で使ったローカル変数が解放された。
その後、second()で、その開放された変数の番地が割り当てられたため、(1)のような結果を返す結果となった。

(3) “Val1 = 10, Val2 = 20”という結果が出るためは、どのようにプログラムを変更すればよいのかを示せ。
  また、なぜ、(2)で述べた問題が解消したのかについても説明せよ。
"comt_t comp; → static comp_val comp;"
理由:first()関数内部で呼び出された変数が解放されないため、second()関数内部で再定義されることがなくなったから。

問題4
Linuxにおける標準入力、標準出力、標準エラー出力と、ファイルディスクリプタとの関係を説明せよ。また、shellなどのコマンドインタープリタを実現する際に、パイプやリダイレクションはどのように実現しているのか。特に、標準出入力、標準出力をどのように扱うことで、他のコマンドにデータを渡したり、出力結果をファイルに書き出したり、ファイルから入力データを読み出したりしているのか。具体的には、どのようなシステムコールを用いて上記の仕組みを実現しているのか説明せよ、


→ファイルディスクリプタはデフォルトでは以下のように定義されている。
0 = 標準入力, 1 = 標準出力, 2 = 標準エラー出力, (2以降 = openなどの関数を使ってユーザが定義したファイルディスクリプタ)
パイプやリダイレクション機能はdup()やdup2()の関数を用いて実現されている。
例えば、左リダイレクションであれば、まずはX = dup(STDIN_FILENO)と呼び出し、STDIN_FILENOのバックアップをXに退避させる。
その後、dup2(ユーザ定義のファイルディスクリプタ番号, STDIN_FILENO)とdup2関数を呼び出して標準入力の属性を事前にopenしたファイルディスクリプタに変更する。
これにより、ファイルの内容を標準入力として扱うことが出来る。右リダイレクションの場合も同様の処理を、標準出力に対して行えばよい。
 パイプを実現する場合は、以下の手順をとる。
1. 右リダイレクションの場合と同様に、標準出力の属性を一時ファイルに変更する。
2. コマンド処理により一時ファイルに結果が出力されたら、標準出力の属性を元に戻す。
3. 今度は、標準入力の属性を一時ファイルに変更する。
4. これにより、2回目のコマンドは1回目のコマンドの出力結果を入力データとして扱う。
5. 標準入力の属性を元に戻す。
上記の手順を踏むことで、パイプを実現することが出来る。


問題5
システムコールの標準化とアプリケーションプログラムの移植性との関係について説明せよ。例えば、Linux上のアプリケーションをWindowsに移植するためにはどのようなことを考えるべきか。
Linuxのシステムコールと互換性をもったOS(POSIXやそれに知買い物)に移植する場合と比べて議論せよ。

以下に、Windows⇔Linuxでアプリケーションを移植する際に躓く点を箇条書きで列挙する
引用:http://www.ibm.com/developerworks/jp/linux/library/l-devctrl-migration/
・デバイス・ファイル名とデバイス・パス名を比較する
・表 2. デバイス制御関数の対応
Windows Linux
CreateFile open
CloseHandle close
DeviceIoControl ioctl
ReadFile read
WriteFile write

・マイグレーションの例
表 3. #include ヘッダー・ファイル
Windows Linux
#include #include
#include
#include
#include #include
#include #include
など

-------------------------------------------------------------------------



問1
3つのプロセスA, B, Cが時間0, 5, 10秒に生成されたとする。今、Aの実行時間が10秒、Bの実行時間が15秒, Cの実行時間が15秒であるとする。
また、Aは優先度が最も低く、Bが中間の優先度、Cが最高の優先度とする。以上3つのプロセスについて、優先度順スケジューリングを用いた場合のそれぞれの終了時間を示せ(1)。
 またスケジューリングアルゴリズムとして完全に公平にプロセスをスケジューリングするアルゴリズムを用いた場合の各プロセスの終了時間を示せ。
公平なプロセススケジューリングアルゴリズムとは、実行可能なプロセスに対して公平にCPU資源を割り当てるアルゴリズムである。


(1) ※黄色く塗りつぶされたところが、現在処理中のプロセス
優先度 生成される時間 実行時間 終了時間(秒)
プロセスA 低 0 10 45
プロセスB 中 5 20 40
プロセスC 高 10 15 25

現在の時刻→ 0 5 10 15 20 25 30 35 40 45 50


(2) ※黄色く塗りつぶされたところが、現在処理中のプロセス
優先度 生成される時間 実行時間 終了時間(秒)
プロセスA 低 0 10 17.5
プロセスB 中 5 20 45
プロセスC 高 10 15 42.5

現在の時刻→ 0 5 10 17.5 27.5 37.5 42.5 45
プロセスA 5 7.5 10
プロセスB 2.5 5 10 15 17.5 20
プロセスC 2.5 7.5 12.5 15

問2 ???
20ビットのアドレス空間を持つプロセスを考える。本プロセスのコード部が20KB, データ部が40KB, スタックが60KBとする。コード部とデータ部は連続領域上に配置され、
アドレス空間の先頭から配置される。また、スタックに関してはアドレス空間の最後から配置される。
 仮想記憶システムが1KBページでページングを行っているとする。このとき、ページテーブルエントリのサイズを10Bとしたときのページテーブルのサイズを示せ。
 また、2段の階層型ページテーブルを使用する場合を考える。1段目のページテーブルが64エントリ、1段目、2段目のページテーブルエントリのサイズが10Bとする場合の
ページテーブルのサイズを示せ。



問3
デバイスドライバと割り込み処理の必要性に関して説明せよ。

デバイスドライバ:(教科書から引用)
デバイスドライバを用いることで、OSはデバイスを管理し、入出力を制御することができる。デバイスドライバの存在により、OSは単独でデバイスをサポートせずに、
同一のインターフェースで各周辺機器にアクセスすることが出来る。また、共通のインターフェースは、それを作るプログラマの負担を軽減させ、プログラムの再利用を促進させる働きがある。

割り込み処理:
キーボードからの文字入力やマウスからCPUに送られるデータは、他プロセスが終わるまでそのデータの処理を待ってるとユーザーにとって使いづらいOSとなってしまうため、
割り込み処理を用いて、他プロセスが動いていてもデバイスドライバから送られてくる重要なデータを処理出来るようにする必要がある。
例えば、ネットワークからデータをダウンロードするときは、連続的にパケットが送られてくるため、パケットを処理する割り込み処理が存在しないと、パケットを見逃してしまうことになる。


問4
メモリのバンド幅=100Mbps
I/OシステムのDMAの転送速度=1Gbps
アプリケーションが1Gbpsのネットワークにデータを転送する。
アプリケーションがいったんデータをカーネル空間のメモリにコピーしてから、DMAを用いてネットワークに転送する場合(1)と、
ユーザ空間から直接DMAを用いてデータ転送を行う場合(2)の通信性能の違いについて考察せよ。

(1)の場合では、データをカーネル空間のメモリにコピーする速度が、アプリケーションがネットワークにデータを転送する速度の1/10となるため、
カーネル空間のメモリへのデータのコピーには、ネットワークに転送する時間の10倍の時間が余計にかかり、ボトルネックとなってしまう。
このため、通信性能において(1)と(2)において比較すると、(1)の通信性能は(2)の通信性能の1/11倍となる。


問5
(a) システムコールを使う際に気をつけること:(教科書から引用)
システムコールを使うと、機械語命令のtrapにより割り込み処理を発生させ、ユーザモードでの実行からカーネルモードでの実行に切り替わり、その後再びユーザモードでのでの実行に戻る。
このため、システムコールではオーバーヘッドが大きくなりやすい。よって、システムコールを使用する際は、使用するシステムコールの数を最小限に抑え、1回の呼び出しでできるだけ多くの
作業をさせるように心掛ける。

(b) Linuxのシステムコールで出きることを5つ挙げ、名称とともにそれぞれ30文字程度で説明する。(教科書から引用)
名称 説明
open ファイルまたはデバイスをオープンする。
read オープンされたファイルまたはデバイスからデータを読み取る。
write ファイルまたはデバイスに書き込む。
close ファイルまたはデバイスをクローズする。
ioctl デバイスドライバに制御情報を渡す。
他にも、wait, fork, exec, killなど。


問6
(1)ソケットによるプロセス間通信を行う場合、クライアントとサーバーは、accept, bind, connect, listen, read, socket, writeといったシステムコールにより構成される。
クライアント側とサーバー側におけるこれらのシステムコールの順番を決め、それぞれの役割を説明せよ。そのとき、各システムコールの引数にsockfd等のようなソケット記述子を埋めなさい。
※ gethostbynameやgetservebyname等は省いても良い。エラー処理も省いてよい。

(ストリームソケットの場合) PPTから引用
時系列 Client Server
↓ ソケットの生成:socket(domain, type, protocol) ソケットの生成:socket(domain, type, protocol)
↓ [ソケットへの名前付け:bind(socketfd, my_addr, addrlen)] ソケットへの名前付け:bind(socketfd, my_addr, addrlen)
↓ 接続受け入れ準備:listen(socketfd, backlog)
↓ 接続要求の発信:connect(sockfd, serv_addr, addrlen) ----> 接続要求許可:accept(sockfd, client_addr, addrlen)
↓ データ送受信:read/write(sockfd, buf, nbytes) <---> データ送受信:read/write(sockfd, buf, nbytes)
↓ ソケットの除去:close() ソケットの除去:close()

(2)システムコールselect()はどのような場合に使われるのか。
Int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout)
※教科書P671より引用
selectシステムコールを使うと、同時に複数の低水準ファイルデスクリプタを対象に入力データの到着、または出力の完了を待つことが出来る。
これにより、端末エミュレータプログラムでselectを使えば、なにか処理すべきことが発生するまでの間、プログラムのブロックが可能になる。
同様に、クライアントサーバーシステムでは、オープンされた複数のソケットを対象に要求を待つことによって、1つのサーバーで複数のクライアントを処理できるようになる。


問7
将来のOSはどのように進化していくと考えられるか? 400持程度で自分の考えとその根拠を述べよ。
以下、エッセイの参考にでも。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1112635156?fr=rcmd_chie_detail
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1310902458
http://www.future-planning.net/x/modules/news/article.php?storyid=1724
http://www.emcp.com/intro_pc/reading4.html (英文)


---------------------------------------------------------------------------------


オペレーティングシステム
Report No.1


問題1 オペレーティングシステムがアプリケーションプログラムに対して提供するインターフェースの重要性を2つ述べよ。
一つ目の重要性は、プログラマがハードウェアのことをあまり意識しなくてもプログラミングできるようにすることである。これにより、プログラマがプログラミングするための手間を大幅に削減することが出来る。
 二つ目の重要性は、アプリケーションソフトの互換性を保障することである。具体的には、命令体系が同じであるようなマイクロプロセッサやOSを搭載したコンピュータ同士では、アプリケーションソフトを改変しなくては同じ動作をさせることである。具体的な具現化の方法としては、C言語の#defineを利用して、OS毎に実行するソースコードを変更させることで具現化できる。これにより、プログラマが、プログラムを移植する際に被る手間を削減することが出来る。



問題2 各自が聞いたことがあるOSの名前を4つ述べ、その特徴を説明せよ。
OSASK:OSの実行効率向上を追求したOS。実行効率を上げるため、低級言語を用いてプログラムされているところも比較的多い。
Ubunto:Wubiというインストーラを使うことで、UbuntoのファイルシステムをWindowsと同じものにすることが出来、パーティション等の作業を行わなくても、簡単にWindowsとUbuntoのデュアルブートを実現できるようになるOS。インストールやアンインストールもWindows側から行うことが出来る。
Knoppix:CDやDVDから起動することが出来る。また、ハードウェアを自動で認識してくれるので、例えば、Knoppixから他OSで生成したファイルにアクセスすることができる。
Windows:OS市場で最も高いシェア率を持つOS。新旧の互換性に優れている。
Macintosh:ハードウェア設計とOS開発を同時に手がけていて、ハードとソフトとの統一感に優れている。



問題3 もし、OSが使用できなかった場合、ユーザプログラマが記述する必要があるプログラムはどのように変わってくるのか200字程度で説明せよ。
 OSが使用できない場合は、OSが提供するAPIを使用することができないので、CPUの提供する機能以外は使用することができない。具体的には、外部ハードウェアを扱うことができなくなり、マウス操作を感知する関数や、キーボードからの入力を感知する関数、また、画面に文字を出力する関数などが使えなくなる。加えて、OSの提供するABIも使えなくなるため、例え命令体系が似ているマイクロプロセッサであった
としても、プログラムを移植することができなくなる。



問題4 C言語を実行する場合にスタックはどのように使用されるのか?特に、Cの関数を呼び出すときにスタックがどのように使用されるかに関して説明せよ。
 スタックは、現在レジスタに格納されている値を、FIFOなどの方式を用いて一時的に非難させるために用いられる。具体的な使用例を挙げると、C言語のプログラムを実行して、関数を呼ぶ処理が行われるとき、その関数が呼ばれる直前のレジスタをスタックに非難させ、関数を実行し終えた後に、スタックに入っている非難させた値をレジスタに戻してあげることになる。こうすることで、どのような関数を呼び出したとしても、使う予定のレジスタが書き換えられるというような危険性がなくなる。



問題5 キャッシュメモリと命令パイプラインに関してそれぞれ100字程度で説明せよ。
キャッシュメモリ:記憶装置の一つで、メインメモリとレジスタとのアクセス速度の格差を緩和させるためのメモリである。レジスタほどCPUに近くはないがメインメモリほど離れているわけではない。このため、アクセス速度は、レジスタ>キャッシュ>メインメモリとなり、記憶容量はメインメモリ>キャッシュ>レジスタという順になっている。

命令パイプライン:CPUの処理速度を高速化する方法で、LOAD命令やSTORE命令に必要なphaseを固定長にすることで、CPUが行う様々な命令を並列的に処理することができる。現在、ほとんどのCPUがこの方法を用いて命令を実行している。



問題6 コンテキストスイッチとプロセススケジューリングに関してそれぞれ100字程度で説明せよ。
コンテキストスイッチ:CPUの状態を保存・復元させて、複数のプロセスを1つのCPUに割り当てること。マルチタスクOSのように、複数のプロセスが存在するときには、複数のプロセスを同時進行しているかのように見せる必要がある。しかしながら、CPUは限られた数しかないため、1つのCPUで各プロセスを同時に扱うことができない。このため、CPUの状態を保存・復元させ、各プロセスを少しずつ処理していくことで、ユーザに対してあたかも複数のプロセスを同時進行しているかのように見せることができる。

プロセススケジューリング:CPUに効率よくプロセスを割り当てること。どのようなときにコンテキストスイッチを使い、次にどのプロセスをCPUに割り当てるのかによって、システム全体にスループットや、リアルタイム性に変化が生じる。具体的にいえば、ネットからの膨大な量のパケットを高速に処理しなくてはいけない場合、パケットの取りこぼしを避けるため、CPUに他のプロセスを割り当てることが困難になる。しかしながら、CPUに



問題7 プログラムを実行する上で、プログラムカウンタとスタックポインタの役割を100字程度で説明せよ。
プログラムカウンタ:CPU内部にあるレジスタの一つで、次に実行する命令のアドレスが入っている。1つの命令が終わると、固定された値を現在のプログラムカウンタに加算する。このとき、プログラムカウンタの指すアドレスが次に実行する命令のアドレスとなる。

スタックポインタ:CPU内部にあるレジスタの一つで、スタックポインタに格納されている値は、今扱っているスタックのトップの場所を指している。例えば、プログラムから違うプログラムを呼び出すとき、プログラムカウンタの値をスタックポインタに詰め込むことで、呼び出されたプログラムから元いた番地に戻ることが出来る。



問題8 プログラムを実行するときに、どのようにメモリ空間が利用されるかを100字程度で説明せよ。図を使用してもかまわない。
プログラムを実行するとき、メモリ空間からそのプログラムの実行に必要なメモリ容量を確保する必要がある。このとき、メモリ空間上でフラグメンテーションが起こっていた場合は、「連続して空いているメモリ空間≧確保したいメモリ容量」の場所をメモリ空間の中から探し出す。条件にあう場所を発見したら、その場所を使ってプログラムの実行を行う。



問題9 ユーザ空間とカーネル空間の2つのメモリ空間が存在する理由を100字程度で説明せよ。
カーネル空間とユーザ空間を分けることで、ユーザ空間を使ってカーネル空間の内容を書き換えられないようにすることが出来る。これにより、悪意をもってカーネルを破壊しようとするプログラムから、カーネル空間におかれている内容を守ることが出来る。



問題10 10年後のコンピュータがどうなっていると思われるか各自の意見を述べよ。また、そのコンピュータは20年後のコンピュータとはどう違うと予測するか?
ムーアの法則から、10年後にはマシンのスペックが少なくとも約7倍向上することが予想される。加えて、様々なモノに組み込み系の技術が使われ、色々なモノが電子化されていくと考えている。
20年後には、電流ではなく光を使ったCPUが使われ、CPUの処理速度は今よりも格段に向上すると考える。加えて、様々なモノに組み込まれるOSが規格化され、組み込み系ソフトの入っているモノ同士の通信が容易になると思う。



参考文献:
IT用語辞典 http://e-words.jp/
IT用語辞典バイナリ http://www.sophia-it.com/
babylon http://www.babylon.com/
Yahoo! Japan 知恵袋 ”どうなる予想!20年後のパソコンのスペック&OS…”
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1112635156

memo1

予想テスト問題(2)と(3)

------------過去問から--------------
(1)分析モデルは、ドメイン分析と要求分析で作成したモデルを活用して作成するが、
   モデル間の関係を簡単な事例で説明せよ。
要求モデルでユースケース図を作成、ユースケースの一つ一つにアクティビティ図を作成。
分析モデルでは、アクティビティ図を元に分析レベルでのクラス図・コラボレーション図を作成。
設計モデルでは、分析レベルでのクラス図を元に、設計レベルのクラス図を作るため、ステートチャート図を作ったり、コラボレーション図を元にシーケンス図を作成したりする。

   

 
(2)ロバストネス分析に関して、その目的、入力モデル、手順を説明せよ。
ロバストネス分析とは:ロバスト(頑強)なシステム全体構造を得るオブジェクト指向分析手法
入力モデル:ユースケースモデル、概念モデル
目的:ユースケースの妥当性の検討/洗練、概念モデルの洗練、設計モデルの元を導出
手順: 1. アクタから該当するユースケースのインターフェースとしてバウンダリを作成
2. 該当するユースケースに関与するエンティティを概念モデルから識別、あるいは新規に作成
3. バウンダリとエンティティを繋ぐコントロールの作成


(3)要求工学が必要な理由を一つ挙げ、例を用いて説明しなさい。
>理由:納期の遅れやコスト超過を抑えることができるから
 例えば、顧客からある大きなソフトウェアを作って欲しいと言われたら、ベンダー側は顧客の要求仕様を満たす
ソフトウェアを制作していかなくてはならない。しかし、顧客の要求する仕様は必ずしもその状況に適したソフトウェアで
あるとは限らないし、将来的にスムーズに修正・変更を行えるソフトウェアであるとも限らない。結果、顧客の要求仕様が
制作途中で変わる可能性が高まり、それが納期の遅れやコスト超過に繋がる。このため、要求工学に基づいて"ユーザは
何が目的なのか"という部分を適切に定義する必要がある。

(4)抽象化、カプセル化、情報隠蔽のそれぞれ意味と、3者の間の関係を説明せよ。
抽象化:同じものや、共通点のあるものを同じグループに分けること。 http://www2.ocn.ne.jp/~countabl/ti/abstract1.html
カプセル化:オブジェクトのインターフェイスだけを公開し、そのインターフェイスのみが内部状態の操作を行えるようにしたもの。 http://www.curiocube.com/mikata/oop/p2_ch02_encapsulation.php
情報隠蔽:オブジェクトの持っている属性と操作を外部から隠すこと。 http://634.ayumu-baby.com/oo/concealment.html
3者間の関係:情報隠蔽とは、カプセル化を抽象化したものである。


(5)境界値分析とはどのようなテスト手法であるかについて、例を用いて説明せよ。
 ブラックボックステストの一つで、同じ振る舞いをするであろう範囲を定め、その範囲の端の値をテストデータとして選ぶテスト手法。
例えば、郵便物の重さから郵便料金を計算するプログラムで、郵便物の重さが0g以下の場合にエラーを返し、25g未満の場合に80円、
25g以上50g未満の場合を90円、50g以上の場合を"定形外"と返すプログラムを考える。このプログラムの場合、境界値分析では、
テストデータとして、0g, 1g, 24g, 25g, 49g, 50gを選ぶことになる。


(6)修正保守と適応保守についてそれぞれ説明し、それらの違いについて述べよ。
 修正保守とは誤りが発見された時に修正を行う作用を意味し、適応保守とは利用環境や動作環境に追従するために
変更する作業を意味する。これらの保守の違いは、能動的な保守であるか受動的な保守であるかの違いである。
修正保守では、誤りが発見されるかどうかで修正するかどうかが決まるので受身的な保守であるといえる。一方で、
適応保守では、変化する環境においてもソフトウェアを使用出来るように修正するため、能動的な保守であるといえる。


(7)シーケンス図と活性区間
シーケンス図とは、複数インスタンス間の一連のメッセージの流れを時系列にそって表したダイアクラムである。
活性区間とは、シーケンス図のモデル要素の一つで、活性区間で表されたオブジェクトに制御が移っていることを示す。


(8)ステークホルダー
あるモノに関わる利害関係者のことを指す。ソフトウェア工学においてはソフトウェア要求に関わる登場人物のことで、
主に、ソフトウェアの実際に使うユーザ、ソフトウェアの発注者である顧客、受注者であるソフトウェア開発者のことを指す。


(9)UMLにおけるステレオタイプ
既存のモデル要素を用いて、新しいモデル要素定義するもの。ステレオタイプは、UMLの図中では一般的に
<<ステレオタイプ名>>で示されるが、アイコンのような特殊な図形表示を持つことも出来る。


(10)コンポジション
集約に関する一つの形態で、集約より「全体-部分」の関係が強い。具体的な特徴としては、部分側のライフタイムが
全体側のライフタイムに依存する、関係の変更が出来ない、全体側の多重度は1といった特徴がある。


(11)プログラムスライシング
着目する変数に影響を与える一部のコードのみを、プログラムから抽出する技術のこと。
デバッグ、テスト、再利用、理解支援、リファクタリングなどのソフトウェア開発・保守に利用される有用な手法である。


(12) 良いソフトウェアの要件とは
良いモデルに基づいてシステム開発が行われ、安定した開発工程で制作されたソフトウェア。良いソフトウェアは、要求仕様を
満たすだけでなく、仕様変更があっても容易に修正・変更が出来、またテストも行い易い。

 
(13) UML 1.5 で定義されている9種類の図の中から、3種類を取り上げて、各図の役割を説明せよ
9種類の図:クラス図, オブジェクト図, ユースケース図, シーケンス図, コラボレーション図,
 ステートチャート図, アクティビティ図, コンポーネント図, 配置図

構造図 クラス図: モデルの組み立て部品の集合のこと。クラスと関係によって、クラスの構造とクラス間の関係を表現する
構造図 オブジェクト図: システムのある時点でのスナップショット
振る舞い図 ユースケース図: システムのコンテキストと外部機能の設定
振る舞い図 相互作用図 シーケンス図: 相互作用するオブジェクトの時間順序系列。オブジェクトの集団メッセージ送信の時系列表現。
振る舞い図 相互作用図 コラボレーション図: オブジェクト集団における相互作用の直接表現やオブジェクト集団の接続トポロジーとメッセージ、スレッドの順序などを表現する
振る舞い図 ステートチャート図: 1つのオブジェクトの生成から消滅までの状態遷移。あるクラスに属するオブジェクトの「ライフサイクル表現」を提供する。
振る舞い図 アクティビティ図: 1つのインタラクション全体における手続きの制御フロー。状態図の相対表現としてワークフローに焦点を当てる図
実装図 コンポーネント図: ソフトウェア-ユニット間の依存関係を示すもので、ソフトウェアモジュールの構成やバージョン管理も表現することができる
実装図 配置図: オブジェクトやパッケージ、ファイルなどを実際のプラットフォームやネットワークノード上のどこに配置するのか、
さらにはどのプロセス上で実行するのか、といった物理的な視点でシステム構成を表現する
http://www.atmarkit.co.jp/im/carc/serial/dstylefaq/uml/uml1_2/uml1_2.html

 
(14) なぜ要求工学が必要なのか
理由:納期の遅れやコスト超過を抑えることができるから
 例えば、顧客からある大きなソフトウェアを作って欲しいと言われたら、ベンダー側は顧客の要求仕様を満たす
ソフトウェアを制作していかなくてはならない。しかし、顧客の要求する仕様は必ずしもその状況に適したソフトウェアで
あるとは限らないし、将来的にスムーズに修正・変更を行えるソフトウェアであるとも限らない。結果、顧客の要求仕様が
制作途中で変わる可能性が高まり、それが納期の遅れやコスト超過に繋がる。このため、要求工学に基づいて"ユーザは
何が目的なのか"という部分を適切に定義する必要がある。

 
(15) トップダウンテストとボトムアップテスト
トップダウンテスト:上位モジュールから下位モジュールに向かって、スタブを使いながらテストするやり方。
ボトムアップテスト:下位モジュールから上位モジュールに向かって、スタブとドライバを使いながらテストするやり方。

 
(16) ソフトウェア保守に関してハードウェア保守と比較せよ
ソフトウェア保守:
 開発のすべての段階の知識をもったCustomer Engineerによって、ソフトウェア開発段階で作成されたすべての成果を
維持・管理する作業。具体的な作業内容として、運用段階で検出されたエラーの修正や新機能の追加、既存機能の変更を
行い、納入後の開発ソフトウェアを新しい環境へ適合させていく。

ソフトウェアは経年劣化することがなく、導入後の修正も簡単で、量産・流通にかかるコストも低いので、
経年劣化して、導入後の修正がほぼ不可能で、量産・流通にコストのかかるハードウェアとは要求する内容が大きく異なる。
 具体的には、ハードウェア保守は、機能や性能を維持するように要求されるが、ソフトウェア保守はそれだけでなく、
機能拡張、性能改善、環境適合することも求められる。


-------------------------------------------------------------------------- 
以下、オリジナル問題(予想)
(17)スタブとドライバの違い
スタブ:上位モジュールのテストのために用意された、下位モジュールの役割をシミュレートするテスト用モジュールのこと。。
  テストされる上位モジュールから呼び出されたら、引数などの正当性をチェックし、適当な処理結果をテストモジュールへ返す。
ドライバ:下位モジュールをテストするときに上位モジュールの役割をシミュレートするテスト用モジュールのこと。
 必要な引数をセットし、テストされる下位モジュールを呼び出す。このとき、テストされる下位モジュールの
 処理結果を表示したり、関連するデータの反応をシミュレートしたり、実行のパスを追跡したりする。
http://roots55.tripod.com/4syou.htm


(18)見積り方法について
(18-1)デルファイ法
1見積もり者複数人が見積もりを行い、調整者が調整する。それを数回繰り返し、最終的な見積もりを出す。
非常に正確な結果を出すことができ、どんな規模の製品に対応できる一方で、時間がかかり、共通の偏りが入りやすく、
少数のエキスパートに依存してしまうという欠点もアル。

(18-2)ファジー理論
製品規模の履歴データを規模の範囲に分割→開発予定の製品を以前の製品と比較→規模を決定
 使いやすく、特別なツールや訓練もいらないなどのメリット。数多くのデータが必要、
 プログラムが新しい場合には役立たない、大雑把な規模の値を提供するだけ、
 履歴データより大きかったり小さいと役に立たないなどのデメリット。

(18-3)ファンクションポイント法
アプリケーション中の機能のタイプ毎に数を決定→各機能の複雑さと規模を決定→
ファンクションポイントの合計を計算→ファンクションポイント当りの開発コストについての履歴データを見積もりに使う→
ファンクションポイントに比率をかけて見積もり値を出す。
 最も初期の要求フェイズに使える、プログラミング言語・製品設計・開発形態によらない、
 数多くの履歴データがある、文書が整っているのメリット。
 履歴データがないと見積もりのスキルの改善が難しい、プログラミング言語・製品設計・開発形態の違いを反映しない、
 既存製品に対してファンクションポイントの項目を直接カウントできないのデメリット。


(18-4)ウォータフォールモデル
要求分析、設計、実現、テスト、運用・保守の順番でシステムを開発。順番を守って開発する必要あり。利点として、
・全ての工程が順次に進められる
・全体の見通しがつきやすい
・スケジュールの決定や資源配分が計画通りに行われる
・工程が理解しやすい
・大規模のシステム開発に向いている
欠点として、
開発工程の初期の段階で要求仕様を確定することは現実的に難しい
ユーザインタフェースの要求はシステムが完成した時点で無ければ確立できない

プロトタイプモデル
開発の早い段階でシステムの試作品を作り、ユーザに使ってもらうことでユーザの要求を明確にするモデル。小規模開発向け


(18-5)スパイラルモデル
プロトタイプモデルとウォータフォールモデルの利点を抽出したモデル


(22-23)シーケンス図とコラボレーション図の違いについて
・シーケンス図
複数インスタンス間の一連のメッセージの流れを時系列に沿って表したダイヤグラム。
時間の経過の中で、対象システムがどのように動くのかという動的な振る舞いを表現する。
相互作用図には、シーケンス図、コラボレーション図の2タイプがある。
シーケンス図は、ある機能や振る舞いを表現するのに必要な各オブジェクト間のメッセージのやりとりを時間順に表現する。

・コラボレーション図
コラボレーション図とは相互作用図の一種で、オブジェクト間のメッセージ関係を表す物である。
シーケンス図と同じ情報を持っている。オブジェクト間の協調を、オブジェクト間の接続関係に着目して、
メッセージやデータの流れを表現する。動的。シーケンス図とコラボレーション図の違いは出るかもしれない。
勘だけど。シーケンス図は時間の流れに沿ったメッセージの流れを表現。
コラボレーション図はオブジェクト構造の中での制御フローを表現。


(24)多重度
関連で結ばれた片側のクラスの1つのインスタンスに関連する、もう片側のクラスのインスタンスの数。


(25)集約とコンポジションの違い
全体とその部分に結ばれる関連の特殊な形式。全体は部分の集まりからなる。
コンポジションとは違い、全体の方が消滅しても、部分側は消滅せずに残る。


(26)ステートチャート図
状態遷移図のこと。クラスの状態がイベントによって遷移することを表すダイヤグラム。
各クラスに対して記述する。1つのオブジェクトに着目した、その状態の変化を表す。
外部からの刺激に対する、そのオブジェクトの反応を表す。


(27)ガード条件
イベントを受理して状態を遷移させるために真となっていなくてはいけない論理式のこと。


(28)UMLを使う理由
綺麗な図を書ける・誤った図を書くと注意される・自動的にサイズなどを調整・データを再利用、2次利用しやすいなど


(29)プロセス図
業務活動の流れと、各工程の入力と出力を明らかにする。


(30)ドメイン分析
顧客とのスムーズな対話の実現のために、対象となる世界(ドメイン)の正確な理解を目的として、
業務状況を概念モデル(対象業務の世界を構成する本質的かつ注目する概念と概念間の関係を表すモデル)として表しておく工程。


(31)代替系列
基本系列で例外が発生した場合の処理手順


(32)事前条件と事後条件
事前はユースケース実行前に満たしておく必要がある条件のこと
事後はユースケース実行後に満たさなければならない条件のこと


(33)オブジェクト指向開発における設計モデル
動的側面はシーケンス図とステートチャート図(上参考)。静的側面はクラス図。
システムを実現するためん必要なクラス間の関係を表現


(34)4つの保守(修正・適応・改善・予防)とその意味
修正保守は、誤りを発見した場合にそれを修正する作業である。
適応保守は、利用環境や動作環境の変化に追従するための変更作業である。OSの更新や対象領域・対象組織が変化した場合などに行う。
改善保守は、ソフトウェアのある側面を拡張したり、向上させたりする変更作業のことである。将来の機能拡張や機能変更を容易にしたり、ソフトウェアの管理、分かりやすいソフトウェアにしたりする。
予防保守は、故障を未然に防ぐという観点で、潜在的な誤りを除去しておく作業である。障害が起こってから誤りを修正するのでは無く、未然に障害を防ぐ。改善保守に類似。


(35)6つの保守技法について
(35-1)構成管理
構成管理とは、過去に実施された変更を管理する作業のこと。
バージョン(利用者の要求を満たす特定の構成)とリリース(以前のソフトウェアを修正、あるいは改善したもの)を管理する。

(35-2)影響分析
影響分析とは、保守による変更あるいは追加による影響が及ぶ範囲を把握する作業である。
影響範囲を変更前に解析し、保守に必要な資源や工数を見積もる作業でもある。

(35-3)回帰テスト
回帰テストとは、以前のソフトウェアで動作していた機能が、
新規あるいは修正後のソフトウェアで正常に動作するかどうかの検査、
もしくは未変更部分がもとの通りに正常に動作するかどうかを確認する。

(35-4)ソフトウェア視覚化
ソフトウェア視覚化は、ソフトウェアに関わるさまざまな情報を人間が理解しやすい形式で表現すること。

(35-5)ソフトウェアエンジニアリング
ソフトウェアエンジニアリングとは、既存のソフトウェアを若返らせる作業のこと。

(35-6)プログラム理解
プログラム理解とは、保守作業に必要。
プログラム理解の支援に、コーティング規約(変数や関数の名前付けを工夫、字下げなど)、
制御フロー解析(制御フローを解析することで、プログラムに現れる分岐や繰り返しを明確化にする)、
データフロー解析(プログラム中のデータの定義と参照の関係を解析することで、あるデータがプログラムのどの部分に関与するかが明確になる)、
依存解析(制御フロー解析とデータフロー解析の結果を用いることでプログラム内部に潜在する依存関係を抽出する)、
プログラムスライシング(上参考)、
クリシェ及びイデオム(ある目的を実現するためにプログラマが頻繁に記述するスタイルや記述パターン)がある。


(36)受け入れテストについて
(36-1)機能テスト 要求されている機能を果たしているか
(36-2)過負荷テスト 短時間に、その制限まで負荷をかけたときのシステムを評価
(36-3)容量テスト システムで非常に大きいデータ量を扱う
(36-4)構成テスト 要求で仕様化された、いろいろなソフトウェアやハードウェアの構成を分析する
(36-5)互換性テスト インターフェース機能が要求通りに実行できることを確認
(36-6)回帰テスト 新しいシステムの性能が少なくとも古いものよりは良いことを保証する
(36-7)機密性テスト セキュリティの要求が達成されているか
(36-8)タイミングテスト ユーザに応答する時間や機能を実行する時間に言及している要求を評価する
(36-9)保守テスト 診断用ツールが存在し、それらが正しく機能するかどうか
(36-10)文書化テスト 必要とされる文書を記述したことを保証する
(36-11)ヒューマンファクタテスト ユーザインタフェースを扱っている要求を調査する


(37)動的テストと静的テストの違いについて
動的は実行用の入力データを用意し、プログラムを実行し結果を検証。使われたデータについては結果確実だが、使われていないデータには不明
静的はプログラムを実行せず表現形式からテスト。特定の実行パスに依存しないが、実際にどう使われているか分からない


(38)インターフェースパートと実装パートの違いについて説明しなさい。
インターフェースパートは、コンポーネントが持つ機能性を定義し、コンポーネントの使用方法の仕様を定めた部分。
実装パートは、コンポーネントが持つ機能性に対する実コードを含む部分。コンポーネントのクライアントは実装の詳細を知る必要が無いので分離を行う。


(39)なぜソフトウェアアーキテクチャが重要か説明しなさい。
ソフトウェアアーキテクチャの説明によって、システム開発の関係者全員のコミュニケーションを可能にすることが出来る。
またアーキテクチャは早い段階での設計上の決定を明らかにすることができるから。


(40)デザインパターンとは何か
オブジェクト指向システムにおいて繰り返し発生する問題を対象として、
・設計の観点からの解決策と、その得失を記述
・解決策はクラスとオブジェクトとの組み合わせで表現
・実装上のヒントも与える
・解決策はカスタマイズされ実装される


(41)構造化設計手法とオブジェクト指向設計手法の違いについて説明しなさい。
構造化設計手法は、機能中心のシステム分割でトップダウン方式の階層化。仕様変更時に機能を変化させやすい。インターフェース重視。
オブジェクト指向設計手法は、モノ中心のシステム分割でボトムアップ方式のシステム構築


(42)リファクタリングの意味と、その作業手順について説明しなさい。
・リファクタリングとは
既存ソフトウェアの設計の理解性や変更容易性を向上させることを目的とした上で、
外部から見た挙動(振舞い)を変えずに、ソフトウェアの内部構造を再構成すること。
大きな設計変更を一連の小さな変換により実現。将来のクラスやクラス間の関係を完全には予測不可能で、
保守作業や改良により設計が劣化するので、リファクタリングが必要。

・リファクタリング作業手順
1、コードのどの部分をリファクタリングするかを特定
2、どのリファクタリングを適用するか
3、挙動を保存するための条件を確認
4、リファクタリングを実際に適用
5、リファクタリングの効果を確認


(43)多層アーキテクチャの各層とその役割について説明しなさい
– ユーザインタフェース層: GUIなどによるユーザとの対話
– アプリケーション層: システム全体の流れの制御
– ドメイン層: 永続化するデータ、関係、核となるロジック
– データソース層: データベースなどによるデータの永続化


(44) 単体テストの基本戦略
• 具体的に誤りを見つけるためには以下が不可欠
– 何が合っていて、何が間違っているのかの元となる仕様
– 仕様の満足を具体的に確認するための入力と正しい出力(オ
ラクル=期待出力)から構成されるテストケース
– さらに、正しい出力を予想できる入力以外の入力も網羅したい
• 以下を網羅するようにテストケースを用意する
– オブジェクトの全コンストラクタ・メソッド: 同値クラス・境界値テ
スト+デシジョンテーブルテストなど
– オブジェクトのライフサイクル: 状態遷移テスト
– オブジェクト間の相互作用: デシジョンテーブルテストなど
– オブジェクトのコード全体: ホワイトボックステスト(条件網羅、
分岐網羅など)


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

文書化された要求: 機能要求
• 欲しいシステム: 航空便座席予約システム
• 機能要求1: 航空便を登録する
– 管理者は、システムに、新しい航空便の路線(出発地、到着地)、日程(出発日時、到
着日時)、エコノミークラスの料金と座席数、ビジネスクラスの料金と座席数を入力し、
新規登録できる。
– 管理者は、登録済みの全ての航空便を閲覧できる。各航空便の表示項目は、出発地、
到着地、出発日時、到着日時、エコノミークラスの料金、エコノミークラスの座席数、ビ
到着地 出発日時 到着日時 ノミ クラ の料金 ノミ クラ の座席数 ビ
ジネスクラスの料金、ビジネスクラスの座席数とする。
• 機能要求2: 座席を検索する
– ユーザは、システムに、希望する路線(出発地、到着地)と日程(出発日時、到着日
時)を条件として入力できる。
– ユーザは、入力後、入力された路線と日程の全航空便について、座席の種類ごとに
空いている座席の一覧を閲覧できる。各座席の表示項目は、出発地、到着地、出発
日時、到着日時、座席の種類、値段とする。
• 機能要求3:
機能要求3 座席を予約する
– ユーザは、表示された座席の一覧から、システムに、座席を指定して予約できる。
– システムは、指定された座席を予約し、その予約日時を記録できる。その際に、指定
された座席の空席数を1つ減らす。
– システムが扱う座席には、エコノミークラスとビジネスクラスの2種類があり、それぞれ
値段が異なる。
– システムは、座席の位置を扱わない。
– ユーザは、予約後、予約された座席の料金を閲覧できる。


• ユースケース: 対象とするユースケースの名前
象 す 名前
• アクタ: ユースケースを起動するアクタの名前
• 目的: アクタまたはシステムの所有者にとっての目的
• 事前条件: ユースケースの実行前に、システムが満たしていなけれ
ばならない条件
• 事後条件: 事前条件が満たされた状況においてユースケースを実行
した後の、システムが満たしていなければならない条件
• 基本系列: アクタとシステムの、ステップ単位でのやり取り
• 代替系列: 基本系列中の特定のステップについて、特定の状況下に
おける代替的なやり取り
• 備考: 対象ユースケースに関係する補足事項の記述
• シナリオ: アクタとシステムの、具体的な関わりの様子の記述。ユー
スケースのテストケース(テスト条件)となる。


ユースケース名:本を貸し出す
アクタ:図書館職員
目的:アクタが本を利用者に貸し出して、その事実を記録する。
事前条件:貸し出しの事実が記録されていない。
事前条件 貸 出 事実が 録され な
事後条件:貸し出しの事実が記録され、示されている。
基本系列:
- 1. アクタがシステムにアクセスする。
- 2. システムは利用者と貸し出そうとする本の入力を促す。
- 3. アクタは利用者と本を入力する。
- 4. システムは利用者が貸し出し上限を越えていないことを確認
して,その本が貸し出された事実を記録し、アクタに示す。
代替系列:基本系列4. 利用者が貸し出しの上限を超えている場合は警告する。
代替系列:基本系列4 利用者が貸し出しの上限を超えている場合は警告する
備考: 貸し出しの事実は、「利用者・本・貸し出し日時」とする。
シナリオ:
(1) 図書館職員の山本太郎は、システムにアクセスした。
(2) 山本太郎は、 2005/3/30/10:30に、利用者として田中一郎、本として『ソフト
ウェ ア工学』の貸し出し依頼を受け付けて、それぞれの情報を入力した。
(3) 山本太郎は、貸し出し事実として「田中一郎・ 『ソフトウェア工学』・
2005/3/30/10:30」を確認した。




(45) ユースケース: 航空便を登録する
• アクタ: 管理者
• 目的: 管理者が、新しい航空便を登録する。
• 事前条件: (なし)
• 事後条件: アクタが入力した路線と日程の航空便が登録されている
アクタが入力した路線と日程の航空便が登録されている。
• 基本系列
• – 1. アクタは、システムに、航空便を登録する旨を示す。
– 2. システムは、アクタに、路線、日程、料金、座席数の入力を促す。
– 3. アクタは、システムに、新しい航空便の路線(出発地、到着地)と日程
(出発日時、到着日時)、エコノミークラスの料金と座席数、ビジネスクラ
スの料金と座席数を入力する。
– 4. システムは、入力された新しい航空便を登録する。
– 5. シ
システムは、アクタに、登録済みの全ての航空便を示す。表示項目
ムは クタに 登録済み 全 航空便を す 表 項目
は、出発地、到着地、出発日時、到着日時、エコノミークラスの料金、エ
コノミークラスの座席数、ビジネスクラスの料金、ビジネスクラスの座席
数とする。
・ 代替系列: (なし)
• 備考: (なし)


(46) ユースケース: 座席を検索する
• アクタ: ユーザ
• 目的: ユーザが、希望する路線と日程の全航空便について空き座席を検索する。
• 事前条件: (なし)
• 事後条件: アクタが入力した路線と日程の航空便の空いている座席の一覧が表
アクタが入力した路線と日程の航空便の空いている座席の 覧が表示されている。
・ 基本系列
– 1. アクタは、システムに、航空便を探す旨を示す。
– 2. システムは、アクタに、路線と日程の入力を促す。
– 3. アクタは、システムに、希望する路線(出発地、到着地)と出発日を条件として入力
する。
– 4. システムは、アクタに、入力された路線と日程の全航空便について、座席の種類
ごとに空いている座席の 覧を示す。表示項目は、出発地、到着地、出発日時、到
ごとに空いている座席の一覧を示す 表示項目は 出発地 到着地 出発日時 到
着日時、座席の種類、値段とする。
・ 代替系列
– 基本系列4. システムは、該当する空席のある航空便がない場合は、警告する。
・ 備考
– 座席の種類は、エコノミークラスとビジネスクラスの2つ。
– システムは、座席の位置を扱わない。

(47) ユースケース1「航空便を登録する」のシナリオ
– (1) 管理者の山本花子は、システムに、航空便を登録する旨を
示した。
– (2) 山本花子は、新しい航空便としてJAL001便の情報を入力し
た。JAL001便の情報として、路線: Narita発 Los Angels 着、日
程: 2005/06/01/09:00発2005/06/01/ 15:30着、エコノミークラス
50000円70席、ビジネスクラス120000円30席を入力した。
– (3) 山本花子は、入力後に、登録済みの全ての航空便として
JAL001便の情報を確認した。 JAL001便の情報として、路線:
Narita 発 Los Angeles 着、日程: 2005/06/01/09:00発2005/06/01/
15:30着、エコノミークラス50000円70席、ビジネスクラス120000円
30席を確認した。

(48)ユースケース2「座席を検索する」のシナリオ
– (1) ユーザの田中太郎は、システムに、航空便を探す旨を示した。
– (2) 田中太郎は、希望する路線と出発日を入力した。路線として、
Narita 発 Los Angeles 着を入力した。出発日として、 2005/06/01
を入力した。
– (3) 田中太郎は、入力後に、検索結果として以下の2つの空いて
いる座席を確認した。
• [1] Narita 発、Los Angeles 着、2005/06/01/09:00発、
2005/06/01/15:30着、エコノミークラス、50000円。
• [2] Narita 発、Los Angeles 着、2005/06/01/09:00発、
2005/06/01/15:30着、ビジネスクラス、120000円。

(49) 解答19: ユースケース記述「座席を予約する」
・ ユースケース: 座席を予約する
• アクタ: ユーザ
• 目的: ユーザが、希望する路線と日程の航空便の座席を予約する。
• 事前条件: アクタが希望する路線と日程の航空便の空き座席が示さ
れている。
・ 事後条件: アクタが指定した航空便の座席の空席数が1つ減少して
いる。予約日時が記録されている。予約された座席の料金が示され
ている。
・ 基本系列
– 1. アクタは、システムに、座席を指定する。
– 2. システムは、指定された座席を予約し、予約日時を記録する。その際
に、指定された座席の空席数を1つ減らす。
– 3. システムは、アクタに、予約された座席の料金を示す。
・ 代替系列: (なし)
• 備考: (なし)


(50) 解答20: シナリオ「座席を予約する」
• ユースケース3「座席を予約する」のシナリオ
– (1) ユーザの田中太郎は、以下の2つの空いている座席を確認し
た状況において、座席[1]「Narita 発、Los Angeles 着、
2005/06/01/09:00発、2005/06/01/15:30着、エコノミークラス、
50000円」を指定した。
50000円」を指定した
• [1] Narita 発、Los Angeles 着、2005/06/01/09:00発、
2005/06/01/15:30着、エコノミークラス、50000円。
• [2] Narita 発、Los Angeles 着、2005/06/01/09:00発、
2005/06/01/15:30着、ビジネスクラス、120000円。
– (2) 田中太郎は、指定して予約された座席の料金5000円を確認
した。


ドメイン分析
– 顧客とのスムーズな対話の実現のために、
– 対象とする世界(ドメイン)の正確な理解を目的として、
– 業務状況を概念モデルとして表しておく工程


システム分析の手順
(1) 要求モデル中の各ユースケースの機能(詳細はアクティビティ図を参照)

を実現する様子を表すコラボレーション図をそれぞれ以下のように作成する
– (1-1) コラボレーション図を新規作成する
– (1-2) 必要なクラスのオブジェクトをコラボレーション図に追加する
– (1-3) 対応するユースケースの機能を実現するために必要なオブジェクト間の
メッセージ通信(相互作用)を加える
(2) 全
全コラボレーション図を束ねてクラス図を作成する
ボ を束ね ク を作成する

(3) 各メッセージ通信に対応する操作を各クラスに加える



(1-1) 全体のアーキテクチャ設計
• ソフトウェアアーキテクチャとは
– ソフトウェアシステムの構成要素と、それらの間の関係を示すもの
– ソフトウェアシステム全体がどのように組み立てられるか、あるいは、構
成要素がどのように協調動作するのかを、大局的に理解可能なモデル
• アーキテクチャの効果
– ソフトウェアアーキテクチャの説明は、システム開発の関係者全員のコ
フトウ アア キテクチ の説明は システム開発の関係者全員の
ミュニケーションを可能に
– アーキテクチャは、早い段階での設計上の決定を明らかにする
• アーキテクチャの必要性
– ソフトウェアシステムの大規模化/複雑化に伴い、アーキテクチャを途
中で変更することが困難
– ソフトウェア開発技術ライフサイクルの短縮化に伴い、その時点での最
新 開発技術を用
新の開発技術を用いる必要性
必要性
– 非機能要求(信頼性/性能/拡張性などの向上)の増大





分割統治: 複雑な全体問題を、小さな部分問題の集合に
分割し、個々の部分問題の解を集めて全体問題の解を
得る
• モジュール化: ソフトウェア全体を、一枚岩ではなく、幾つ
かの部品から構成されるように分析・設計する
• 効果
– 問題の切り分け、部分単位の開発
– 問題や影響の局所化



関心の分離
• ソフトウェアシステムにおいて、異なる責務
や無関係な責務は、たとえば、異なるコン
ポーネントに割り付けるなどして、分離され
るべき

2008-07-27

The Last Lecture

期末前なので前半の少ししか聞いてないけど、とてもとてもおもしろそうです。期末後…は色々課題があって難しいかもしれないが、ゆっくりした期間に入ったらじっくり見てみたいと思います。


Youtube(日本語 ver)詳細より引用:
2007年9月18日、ペンシルベニア州ピッツバーグ。ハイテクの街として知られるこの地に本拠を置くカーネギーメロン大学の講堂で、1人の教授が「最後の授業」を行った 。
教授の名前はランディ・パウシュ。46歳。バーチャルリアリティの第一人者と称される人物だ。最後の授業をするにはまだ若すぎるパウシュだが、実はこのとき、彼には長年親しんだ大学に別れを告げざるをえない事情があった。膵臓から肝臓へと転移したガン細胞 。医師から告げられた命の刻限は「あと3カ月から半年」。
こうしてパウシュの最後の授業は始まった。スクリーンに映し出された演題は『子供のころからの夢を本当に実現するために』。それは、学生向けに講義をするふりをしながら、まだ幼い3人のわが子に遺すためのメッセージだった——。
アメリカではネット動画にアップされるやまたたく間に600万ものアクセス数を獲得し たという、心揺さぶられるメッセージ。
(注:米国東部標準時間2008年7月25日(金)にご逝去なさいました。)

HP:http://www.thelastlecture.com/

※動画は上記HPの左側にあるIndexの"WATCH THE LAST LECTURE"から閲覧可能。
英語は結構聞き取りやすいと思います。


youtube(日本語 ver):
http://jp.youtube.com/watch?v=nrFMRuB2lbA

2008-07-24

[Ubuntu]内蔵の無線LANがPRO/Wireless 3945ABGだとネットに繋がらない




今までubuntu 8.04を使ってて、大学や喫茶店の無線LANに繋ぐときは全く問題なかったのに、なぜか我が家のcoregaにだけは繋がらないという謎…。

色々調べた結果、コマンドライン上で"lspci -v | grep Wireless"を入力して、出力された結果に"PRO/Wireless 3945ABG"って書いてあったら、それはパソコンの内蔵無線LANのモジュールのバグなんだとか。

詳しくはコチラ

実際、自分のPCの場合、上記サイトの手順を踏んで再起動したら無線LANに繋がりました。

これでもう、いちいちwindows XPに切り替える面倒が無くなるわ〜。
いやはや、上記wikiサイトには感謝いっぱいです。

2008-07-22

UbuntuのCtrl+Alt+Backspaceの無効化




Ubuntuでは、Ctrl+Alt+Backspaceを押すともれなくLogoutしてくれます。今日はこれを無効化する方法についての話。

---[経緯]---
僕の場合、ワークスペースを移動するショートカットキーをCtrl+Alt+十字キーと設定しているから、ワークスペースを移動しながらタイピングしてると、たま〜に間違えてCtrl+Alt+Backspaceを押してしまいます。作業記録はbufferに残ってるから、保存に関しては特に問題はないんだけど、流石に3回ぐらい同じこと繰り返すとプチストレスです。
というわけで、早速ショートカットキーを変更しようと、"システム->設定->キーボード・ショートカットキー"を起動したが、どうやらCtrl+Alt+Backspaceの設定はここでは出来ないらしい…
------------

む〜、こうなったら検索するのが手っ取り早いな、ってことでUbuntu Forumで検索したら、やっぱし同じこと考える人がいたw。以下、その詳細。


1. GNOME端末で"sudo gedit /etc/X11/xorg.conf"を入力。

2. 開かれたファイルの最後尾に以下の3行を追加して、保存。
Section "Serverflags"
Option "DontZap" "yes"
EndSection

3. GNOME端末で"sudo invoke-rc.d gdm restar"を入力、その後CUIの画面に移行するので、Ctrl+Alt+Backspaceを押してログアウト。


以上。これ以降、Ctrl+Alt+Backspaceは無効になってるはず。


引用元:http://ubuntuforums.org/showthread.php?t=146590


[余談]
引用元のURLを開いたとき、"I'm sure everyone has hit these three buttons before. So annoying!"の一文を見て涙がでるほど共感したww

2008-07-18

SE final preparation

---------------------------------------------------------------------------------------------------
テスト予告:
1. 〜について以下の問いに答えなさい(授業の演習)

座席の設計、要求分析、〜図で描け

(例、航空機予約シナリオのユースケース図を書いたらこうなった、では、航空便を登録するのシナリオ(ユースケース記述)はどうなるか書きなさい)

演習14のような感じ



(1)プロセスからシナリオまたは記述



(2)このユースケース(1)に基づいて概要設計した図を描きなさい(1の書き方によって答えが変わる)



2.次の各設問について答えよ(説明、論述)(5問)

ユースケースにおけるアクターとは何か?←簡単だから出ない?

(200字程度)



3.次の用語の違いについて200字程度で答えよ(5問)



出席20点

テスト50点満点

レポートA 15, B 10, C 5
---------------------------------------------------------------------------------------------------

2008-07-17

my shell program

恐ろしくしょぼいシェルプログラムが出来ました。制作期間3日。無駄に10KB。変数登録機能を作ろうとしたけど、途中で断念。

click here to download my shell program


以下、readmeから引用した仕様

*************** readme file ***************
名称:mysh

コンパイルの仕方:
GNOME端末などからこのフォルダに入り、"make"を実行する。

起動方法:
GNOME端末などからこのフォルダに入り、"make run"を実行する。

mysh内でできること:
『myshでできること』
-> 『"入力文字列仕様"』 『Ex:入力文字列のサンプル』
--- 『備考』

環境変数にパスを追加する
-> "set パス名" Ex: set /bin

環境変数を新規作成する -> "set -n パス名" Ex: set -n /usr/bin --- 既に".path"ファイルが存在する場合は上書きされます。

コマンドの実行
-> "コマンド名 {引数} Ex: ls -l

パス指定のコマンドの実行
-> "/{dir/} コマンド名" Ex: /bin/ls -l

入出力のリダイレクト
-> "コマンド [< 入力ファイル名] [> 出力ファイル名] Ex: ls > new_file
--- 入出力リダイレクトの記号は順不同

パイプコマンド(重複可)
-> "コマンド {| コマンド}" Ex: ls -l | more | grep sh

(応用)パイプ途中経過出力
-> Ex: ls -l > output1 | more > output2 | grep te > output3
--- 使う機会はあまり無いが入力リダイレクトでも同様に可能

コマンド処理の強制終了
-> 処理実行中にCtrl+cを押す Ex: sleep 10000 (ここでCtrl+cを押す)

myshを終了する
-> "exit" Ex: exit


各ファイルの意味:
mysh.h myshをコンパイルするためのヘッダーファイル
mysh.c main関数とcheck関数, exec, fork, dupなどを扱う
mysys.c set_pathや構造体の初期化など行う
myget.c 入力文字列からデータを取得したり、.pathファイルから環境変数を取得するファイル

2008-07-11

pass TOSHIBA summer internship




GoogleやIBMのR&D枠では、自分の未熟さ故にことごとく玉砕されてしまいましたが、TOSHIBAの第一志望のR&D枠には何とか受かりました。TOSHIBAのサマーインターンは、1ヶ月間と少し短い期間ではあるのですが、学業と並行せずにみっちり研究開発に時間を費やすのは初めての機会なので中々楽しめそうです。…と、まぁまだ早稲田-NEC 産学官連携workshopやNRIのSE枠などの選考結果が返ってきてないので、実際にTOSHIBA行くかどうかはその結果を見てから決めようと思うのですが。。。ん〜、でも選択肢が広がるのはうれしい限り。

そして明日は今夏、最もpassしたと思ってるIPA security campの結果発表日。もう、このキャンプのカリキュラム見た瞬間一目惚れしたww。カリキュラムが充実している分、倍率も高そうだし、応募者のレベルもGeek級な奴等ばっかりなんだろうが、だからって負けてらんないわな。あ〜、ジッとしてられないw。まぁとりあえず、課題やるか。そうそう、今週にGRE quantitativeと言語処理系のテストが終わって、さっき確立と統計学のレポートも提出し終えたので、今週末はOSのcommand interpreter制作に精を出せそうだ。うむ、こういう制作系の課題は楽しみながらできるから良いね。

2008-07-03

How to install VPNClient for Linux




ようやくLinuxでVPNClientが使えるようになりました。その際、友達や海外のforumには大変お世話になったので、ちょっとは社会に還元しようかと思います。

というわけで、以下、僕がVPNClientをlinuxでインストールした際の手順を説明します。

------------------------

目的:
LinuxのマシンにCisco VPNclientをインストールし、早稲田大学理工学部内にある無線LAN(waseda)に接続する。

使ったもの:
OS:Ubuntu ver 8.04
ブラウザ:Firefox ver 3.0


・Cisco VPN clientをインストールしてみる。
インストール手順:
1. 適当なworkフォルダを作る。

2. 以下のサイトからvpnclient-linux-x86_64-4.8.01.0640-k9.tar.gzをダウンロードし、workフォルダに入れる。

http://tuxx-home.at/archives/2007/09/24/T15_26_49/

3. 同様に、以下のサイトからvpnclient-linux-2.6.24-final.diffをダウンロードし、workフォルダに入れる。

http://tuxx-home.at/archives/2008/01/25/T09_54_46/

4. GnomeやらTera-termやら適当な端末を呼び出し、端末内で以下のコマンドを1行ずつ入力。
# cd (workフォルダの場所)
# tar -zxf vpnclient-linux-x86_64-4.8.01.0640-k9.tar.gz
# cd vpnclient
# patch < ../vpnclient-linux-2.6.24-final.diff
# ./vpn_install

5. インストールの際、インストール先とかkernelの場所とか聞かれるけど、とりあえずenterでok。

6. インストール完了!

TIPS:
エラーが出た場合は、エラー内容をコピーして、Googleで"ウェブ全体から検索"すれば大抵解決策が載ってる。


・VPN clientを使って、waseda無線LAN@理工学部にアクセスしてみる。(注:学籍番号が必要)

profileの作成:
1. 以下のファイルを作成し、/etc/CiscoSystemsVPNClient/Profilesのディレクトリ内におく。

ファイル名:waseda_ras.pcf

ファイルの内容:
[main]
Description=user profile
Host=vpn.wireless
AuthType=1
GroupName=group
GroupPwd=
EnableISPConnect=0
ISPConnectType=0
ISPConnect=
ISPCommand=
Username=早稲田の学籍番号
SaveUserPassword=0
EnableBackup=0
BackupServer=
EnableNat=1
CertStore=0
CertName=
CertPath=
CertSubjectName=
CertSerialHash=00000000000000000000000000000000
DHGroup=2
ForceKeepAlives=0
enc_GroupPwd=5EA556F632DCB047839C62D6FBDD28C8F7DBE96F6272760AE572220AE7D8DB6D12A884A862625A74952E112709E845E7
UserPassword=
enc_UserPassword=
ISPPhonebook=
NTDomain=
EnableMSLogon=1
MSLogonType=0
TunnelingMode=0
TcpTunnelingPort=10000
SendCertChain=0
PeerTimeout=90
EnableLocalLAN=0


VPNClient起動手順:
1. GNOME端末などを立ち上げ、管理権限を持つ。
(ubuntuの場合)
# sudo -i

2. VPNclientを立ち上げる。具体的には、以下のコマンドを入力する。
# /etc/init.d/vpnclient_init start

3. VPN clientを使ってアクセスする。具体的には、以下のコマンドを入力する。
# vpnclient connect waseda_ras

4. ユーザー名とパスワードを問われるので、自分の学籍番号とパスワードを入力する。

5. Firefoxなどの適当なブラウザを開き、waseda-net portalにアクセス。

6. ちゃんと表示されたら成功!


以上です。


余談:
早稲田では、元々Linuxで無線LANを使うことは未サポートだからなのかもしれないけど、時々webにつなげない場合もあったりなかったり。原因は現在調査中。

2008-07-01

socket programming

2008/07/01



本日の話

・ネットワークに関するシステムコール

-ソケット

-Client/Server型システムの携帯

-システムコール

-標準ライブラリ





・ソケット



・基本型:クライアント・サーバ型
UNIXにはもともとスレッドという概念がない。
スレッド使えるようになったのは5年前の話

プロセスをフォークすることは難しい。
cf:コピーオンライト
→毎回毎回プロセスをフォークするとコストが大きい
→スレッド使ったり別の方式を使ったりする。

・反復サーバ型
サーバがクライアントのリクエストをリプライする。
受け取った順に処理する。
→もし、サーバの待ち時間が長い場合はサーバが無駄に動いてしまう。
→多くのクライアントからのリクエストを処理する時には向いていない。

・並行サーバ型
-ファイルの流れ
クライアント→サーバー→(フォーク)CP→クライアント
→サーバはリクエストを受け付けて、子プロセスを生成するだけで住む
→ほとんどのサーバはこの形で作られている。

ただし、スレッドに変えてもそんなにオーバーヘッドが減る分けではない。
実際にはもうちょっと複雑な処理をして、オーバーヘッドを減らしている。

・同期通信、非同期通信

-同期通信
リクエストが帰ってくるまで動かない
ex.失いたくない貴重な情報の時

-非同期通信
リクエストが帰ってくるかどうかにかかわらず動きつづける。
割り込みのような形でリプライを受け取る。
ex.音楽再生とか


・unicast, broadcast, multicast
-unicast
1 on 1通信

-broadcast
ネットワーク上の全マシンに対して送信
e.g. DHCP
「僕はあなたのアドレスを知らないけど、あなたのIPアドレスが欲しい!」

-multicast
特定のグループへの加入者に対する同報


・ソケット通信の手順(ストリームソケット)
-Client
socket ソケットのせいせい
bind ソケットへの名前付け
connect
read/write
close


-Sever
socket
bind
listen
accept
read/write
close



・UBPの場合
-Client
socket ソケットの生成
bind ソケットへの名前付け
sendto データ送信
recvdrom データ受信
close ソケットの除去

-Server
socket
bind
recvfrom
sendto


・ソケットの生成
-書式
int socket(int domain, int type, int protocol)
int domein:
使用するドメイン種別

int type:ソケットタイプ
UDPを使いたい場合 SOCK_DGRAM

int protocol: 下位プロトコルの指定
0=default

・ソケットの名前付け:bind
取ってきたファイルディスクリプタに対して名前をつける。
int bind(int socketfd, struct sockaddr(自分のアドレスの定義) *my_addr(データスタラクチャの長さ), sockelen_t addrlen)



・バイトオーダーとホストオーダー
BIG-endianとLittle-endianの違い
→各マシンごとに違うフォーマットを使っている場合は、意識して直す必要がある。
→CPUなどのアーキテクチャを使用する必要がある。

このため、変数関数が用意されている
- htonl, htons: host->nw
- ntohl, ntohs: nw->host

h to nl
n to hl


・ソケットアドレスの構造体
-port
送り側と受け手側で違うポート番号を使う必要があるので、要注意。

bzero((void *)&server, sizeof(server));
server sin_family = AF_INET;


・IPアドレスの与え方
- バイナリで与える場合(e.g. 0Xac105504)←バイトオーダーで考える必要がある。

- ドット区切り10進表記で与える場合(e.g. 172.16.85.4)


- hostnameで与える場合
gethostbyname ライブラリ関数を使用(後述)
引数にホスト名が入る。
hostentから、アドレスが返ってくる。
IPaddressを知ることができる。いf

・listen:接続受け入れ準備
接続要求を格納するキュー
→いくつ、接続を格納するキューを確保するか、のために使う。

・connect:接続要求発信
- streamsocket使用時における通信路確立
あとで例題

・accept:接続要求許可
int sockfd:
struct sockaddr:相手のアドレス

この関数が返す引数が使うファイルディスクリプタになる。

・read/write:データ送受信


・ストリームソケットが他の通信手順




・無線デバイスドライバのインストール
Linuxのデバイスドライバをダウンロード→インストール