ホーム » 2012 (ページ 2)
年別アーカイブ: 2012
2012年12月16日(第299回)
- 年賀状の話
- 折り畳み傘の話(松島)
- 車の話(大野)
今日から、大野さんがレギュラーとして番組に参加してくれました。
担当:大野(5M)、前田勝(3EI)、松島(1C)、山野(1C)、西(教員)
データベースの設計と実際の設計
データベースの設計は、トップダウン法・ボトムアップ法などを交えながら、 部分従属をとりのぞいた第2正規形、推移従属をとりのぞいた第3正規形にして、 不整合の発生しないデータベースを設計する。
ただし、データベースを運用する場合は、単なる設計だけではなく、 どのように使われるのかを分析する必要がある。
- 例えば、トランザクションの発生する時期や時間がいつ発生するのか?
- トランザクションの処理がどの程度の時間で終えなければいけないのか?
- データベースの属性に対して、型以外にも間違った値が保存しないための 制約はどういったものか?
- 実際にデータベースがどの程度の容量を必要とするのか?
しかし実際には、複数のテーブルを対応づける SELECT * FROM A,B … と いった結合(直積)をとる処理が多発すると、処理速度の低下が目立つように なる場合がある。この場合は、データの状況によっては、多少の不整合の 対応が面倒になるかもしれないが、あえて従属性を残す場合もある。
一方、データベースは並行処理が行われる際に、ロックなどが必要となる。 この際に、レコード単位のロックが行われるデータで、 一部の属性に書き込みが集中し、一方で変化の少なくかつ利用頻度の高い 属性部分が存在すると、処理性能の低下が懸念される。 この場合には、あえてデータベースを分割し、ロックによる性能低下を 分散する場合もある。
PCTFREEとPCTUSED
データベースの使用する容量については、PCTFREE,PCTUSEDという パラメータにも関連する。
データが格納されるページ(B木のノードと一般的に同じ) の中で、テーブルの中にVARCHAR型のような、不定長のデータが含まれる場合、 1レコードのデータが大きくなった場合、本来ならばそれに合わせて後続データの 移動を伴う。これらの移動は、データ処理の効率を下げるため、 1レコード間に ''PCTFREE''で示す隙間をあらかじめ空けておく。 こうすれば、多少のレコードのデータが変化しても、データの移動は行わなくて済む。
一方、ページ内のデータの削除などが発生した場合、ノードの再構成を頻繁に 行うのを避けるため、PCTUSEDに示す値を下回らない間は、ノードの再構成を 実行しない。この値を下回った場合には、ノードへのデータの追加が行われる。
このPCTFREE,PCTUSEDは、CREATE TABLE命令といっしょに、比率を自分で設定しても良い。特に、レコードが固定長であれば、PCTFREEは不要であるし、 データの追加削除の頻度が低い場合、PCTUSEDの値は高めに設定すれば、 データベース全体の容量のなかの(処理効率を上げるための)記憶領域の無駄を 減らすこともできる。
データベースの排他処理
データベースでは、前にも述べたように、ACIDの特性を満たすために、 排他制御(ロック)が必要となる。ロック処理も、テーブルの属性単位・ テーブルのレコード単位・テーブル全体・データベース全体といったように、 様々なロックがとられる。これらのロックの粒度は、規模が大きくなるほど 処理待ちとなるトランザクションが多発し性能が低下することになる。
データベースのシステムでは、これらのロックはうまく制御され、 ロックの影響が少なくなるような工夫がとられる。
ロック処理には、 データの読み出し操作による共有ロック/Readロック (読み出し処理同士は同時に利用してもOK)と、 書き込み操作を伴う占有ロック/Writeロック (書き込みを伴うために、他の処理はすべてNG)がある。
複数のロックがかかる場合の対応は、以下のようなテーブルに沿って 行われる。
アンロックを待たない〇 | ロック前の状態 | |||
---|---|---|---|---|
― | R | W | ||
今からかける ロック |
R | 〇 | 〇 | × |
W | 〇 | × | × |
参照カウンタ法とガベージコレクタ
後期後半の授業の予定としては、メモリ管理手法について説明の手始めとして、 動的メモリ管理の問題を説明する。
まずは、ポインタで共有のある場合の問題について説明する。 例として、リスト構造の和集合とリスト一括廃棄を説明する。
struct List* join( struct List* p1 , struct List* p2 ) { struct List* ans = p1 ; for( ; p2 != NULL ; p2 = p2->next ) if ( !find( p1 , p2->data ) ) ans = cons( p2->data , ans ) ; return ans ; } void list_free( struct List*p ) { struct List* del ; while( p != NULL ) { del = p ; p = p->next ; free( del ) ; } } void main() { struct List* n1 = cons( 1 , cons( 2 , NULL ) ) ; struct List* n2 = cons( 2 , cons( 3 , NULL ) ) ; struct List* n3 = join( n1 , n2 ) ; // 何らかの処理 list_free( n3 ) ; list_free( n2 ) ; list_free( n1 ) ; // n1はすでにn3と共に捨てられている }
上記プログラムでは、処理が終わってすべてのリストを捨てようとするが、 すでに list_free( n3 ) にて、n1 部分が廃棄済みであり、 list_free(n1)を実行すると、プログラムが異常動作となる。
参照カウンタ法
これらの解決方法の1つは、参照カウンタ法である。データを参照する ポインタの数をデータといっしょに保存し、共有が発生するたびに 参照カウンタをカウントアップし、データを廃棄する際には、 カウントダウンを行う。カウンタが0になったら参照しているデータ は無くなるので、本当にデータ廃棄を行う。
struct List { int refc ; // カウンタ int data ; // データ部 struct List* next ; } ; void list_free( strcut List* p ) { // 再帰で全廃棄 if ( p->refc <= 0 ) { // 参照カウンタを減らし list_free( p->next ) ; // 0ならば本当に消す free( p ) ; } }
ただし、参照カウンタ法は、循環リストの場合には、カウントダウンが できず永遠に廃棄できないデータができてしまう。
一方、参照カウンタ法は、unix などのファイルシステムでのリンク にも利用されている。unix ではハードリンクが発生するたびに ファイル実体の参照カウンタをカウントアップし、ファイル削除では カウントダウンと0になった場合に削除を行う。
ガベージコレクタ法
循環リストの扱いの問題から、データの廃棄の判断は極めて困難となる。 これらの対応としてガベージコレクタ法がある。この方式では、 確保した動的メモリの廃棄処理は、プログラムでは明示的に書かない。 このため、廃棄されないゴミデータで埋まることになる。 この場合の対応手段がガベージコレクタである。
ガベージコレクタは、メモリを参照する処理を一旦停止させ、 実際に使用中のメモリすべてをポインタを辿りながら「使用中」の 目印をつける。その後、「使用中」の目印がついていないメモリを 回収する。(マーク&スイープ法)
ただし、昔のガベージコレクタは、メモリを使う処理を一旦停止させ、 全メモリ参照という時間のかかる処理を行うことから、 サービスが一時的に停止することとなる。
最近の新しいプログラム言語(Java,D言語,Perl,PHP)では、 参照カウンタ法とガベージコレクタ法を融合したものが採用されている。 このため、複雑にポインタが絡まないようなデータであれば、 参照カウンタ法により早い段階で回収され、ガベージコレクタの 処理の中断も目立たないようになっている。
12/29(Sat) 停電によるサーバ停止
改修工事に伴う停電にて、 下記の日程にて電子情報工学科のサーバを停止します。
2012/12/29(土) 8:30〜13:00
停電明けの復旧については、多少時間が前後する可能性があります。
曜日の書き間違いおよび停電日時の変更(12/28⇒29)があったので、更新しました。
テスト返却&解説なんだけど
今回のプログラミング応用は、 1問目がビットフィールドを解かってもらうための 2進数計算をテーマの出題。 コンピュータの動作原理を解かってもらうために、 簡単な機械語動作の20行程度のシミュレータっぽい プログラムの結果を示すもの。 計算機構成論では、まだ機械語などの話は習っていないけど、 興味のある学生さんは、このネタだけでアドレッシングやら 機械語・アセンブリ言語・フェッチ/デコード/実行サイクル が分ったようだ。 ついでに、マルチコアやスーパースカラなどの用語も一言解説。
画像データのファイルサイズに関する出題では、 SDメモリなどの転送速度を絡めた問題だったので、 授業では扱っていないSD/SDHC/class10といった用語の解説も行う。
構造体の問題では、今回DHCPサーバが覚えるIPアドレス,MACアドレス, ホスト名,リース時間のテーブルをイメージした構造体をネタに 出題したため、問題の解説の後は、ネットワーク用語の IPアドレス,MACアドレス、DHCPの動作原理とLEASE時間の意味等を 解説する。
ということで、今回のテスト問題の解説では、実際の出題解説時間は 半分で、残りの半分は授業でやっていないネタの解説のオンパレードとなった。 でもテスト問題でじっくり考えたネタだから、しっかり興味を持って 聞いてくれる。
あらためて、授業で習っていなさそうな身近なコンピュータのネタを 出題すると、興味を持つという意味で教育効果は高いといえる。 さあ、次のテスト問題で何をネタにしようかな…
2012年12月9日(第298回)
誠市、ご縁市開催中でした!
- サイエンスクラブ活動紹介
- 雪の話
ゲスト:サイエンスクラブ部長大野さん、久保さん、坂下さん、岩坂さん、山本さん
担当:前田勝(3EI)、松島(1C)、山野(1C)、西(教員)
ご縁市でサイエンスクラブの皆さんが出展していた自作イライラ棒をさせてもらいました!
誰でも作成できるよう、制作マニュアルを部活で作っていました。
これなら、後輩への技術の継承もばっちりですね!
VMwareさんからESXi 5.1 評価版の確認電話
先程、VMware さんより、先日入れた ESXi 5.1 評価版について、 「問題ありませんか、解らないところがあれば…」との 親切な営業誘導チックな、お電話を頂いた。
まあユーザ登録しての評価だから、解らないところがあれば… というのはすごく商売熱心だと思う。んで、
私:知り合いに詳しい人がいたので教えてもらって便利に使っています。 相手:ありがとうございます。では特に解らない所は? 私:もう少し便利に使えればとは思うのですが、 その辺は有料の機能なので、手を出していません....
ごめんなさい、ケチな利用者で…もう少し売り込みトークしてくるかと思ったけど、最後の余計な一言で気まずい雰囲気ながら、"ありがとうございました"で電話が切れた。(^_^;;