参照カウンタ法とガベージコレクタ
前回テスト解説で少し説明をしているけど、参照カウンタ法とガベージコレクタについて解説。
参照カウンタ法
例えばリスト操作で、リストの開放を下記のようなコードで作った場合、 データに共有が発生しているため、「持っているデータを free で全部捨てる」 といったコードを書くと、共有部分は2回捨てられる処理となり、 プログラムが異常動作してしまう。
struct List* union( struct List* l1 , struct List* l2 ) { struct List* ans = l2 ; for( struct List* p = l1 ; p != NULL ; p = p->next ) { // find(A,L) : AがリストLに含まれていればTrue
if ( ! find( p->data , l2 ) )
ans = cons( p->data , ans ) ;
}
return ans ;
}
void free_all_list( struct List* p ) {
if ( p != NULL ) {
free_all_list( p->next ) ;
free( p ) ;
}
}
void main() {
struct List* a = リスト ;
struct List* b = リスト ;
struct List* c = union( a , b ) ;
:
なんらかのしょり ;
:
free_all_list( c ) ; // cの後半はbのはず
free_all_list( b ) ; // free_all_list(c)でbは既に捨てられている
free_all_list( a ) ;
}
こういう共有が発生している場合の対処方法として、参照カウンタ法がある。 共有されるデータには、すべてカウンタを設け、共有が発生する場合には、 カウンタを増やし、freeの際には、カウンタを減らし0の場合だけ 本当に捨てるという処理にすればよい。
struct List { int refc ; // 初期値1、共有されるたびに+1,共有が解除されれば-1 int data ; // refc = 0 で、本当に free() を実行する。 struct List* next ; }
ちなみに、この参照カウンタ法は、unix におけるリンク機能(1つのファイル実体に複数のファイル名をつける場合[ハードリンク])でも使われており、新しくハードリンクを貼れば+1し、 ファイルを消すと-1して、0になれば本当に消す。 ただし、OSの異常停止などで、参照カウンタがおかしくなる場合があるため、unix では、 異常停止からの回復時には fsck で参照カウンタの修正などが行われる。 最近はジャーナリング機能付きファイルシステムが普通なので、fsck 実行は減ったけど….
ガベージコレクタ
上記の参照カウンタは、便利そうに見えるけど、循環リストには対応できない。 こうなってくると、データを本当に捨てるか捨てないかは、プログラマーの判断では極めて難しい。そこで、最近のシステムでは、不要になったデータを捨てる判断は、ガベージコレクタ(ゴミ拾い)に任せるようになってきた。 ガベージコレクタを持った処理系では、free() は存在しない。メモリが不足した場合に、 システムが不要なメモリを回収してくれる。
回収方法としては、古くはマーク&スイープ法が有名。 メモリが不足した時に、全メモリには最初にマークを消しておき、使用中のメモリからたどりながら、実際に使用されているデータには、「使用中マーク」をつけていく。 最後に使用中マークの無いデータを回収する。
しかしながら、この方法はメモリが無くなった時に、処理を全部中断して、時間をかけたメモリ回収(ガベージコレクタ)が起動するため、利用者にしてみるとシステムが突如フリーズしたように 感じる。最近では、このガベージコレクタは、システム処理に並行して実行できるように工夫されている。
最近の新しい言語処理系 Java などはガベージコレクタが搭載されている。 しかし、C,C++ はガベージコレクタが無いので動的メモリを使ったプログラミングでは、 注意深く対応するしかない。
調べてみると、最近のJavaでのGCは、世代別GCという方法が使われているらしい。 若い世代、古い世代、永続的な世代に分け、生存時間順に随時永続側にコピーされていく。 局所変数のデータは、若い世代の場所に置かれ、 関数終了時に不要ならばガンガン消されていく。
校長年頭挨拶
仕事始めの校長年頭挨拶がありました。 今年の目標としては、以下のものが掲げられました。
- 入試倍率の確保
- 様々な意味でのActivityの拡大
- 国際化
昨年より取り組まれていた、高専のイメージ戦略として作られた、 PR用の旗が会議室に飾られていました。校章は相変わらず使われるけど、 用途によってはこちらの旗を見る機会が増えるかも。
年始一発目のupdate
昨日は職場の一斉有給で今日が仕事始め。 といっても、今日はやり残していた自室の大掃除の続きが目的だったり。 ということで、まずは長期休暇明けということで、一発目は管理サーバのアップデート。
サーバに次々とログインし、"aptitude update ; aptitude safe-upgrade"を打ちまくる。 学科のメインサーバだけ、stableとtestingが混在しているので、aptitude が、 "E: このAPTが対応している以上の数の説明が要求されました"なる意味不明な メッセージが表示される。"export LANG=C"にして、日本語localeをはずすと、 正常にアップデートできるんだけど….前回も同じトラブルが発生しているし、ひとまずメモ。
2次元座標の平行移動・拡大・回転
GrWinを使ったグラフィックスの理解の第2ステップとして、座標の平行移動・拡大縮小・回転 について解説を行う。
// 平行移動 // 授業では行列表記も説明したけど、 X = x + x0 ; // blogでmimetexを使って行列はつらい... Y = y + y0 ; // 拡大縮小 X = k * x ; Y = k * y ; // 回転 X = x cosθ - y sinθ ; Y = x sinθ + y cosθ ;
これに加えて、これらの変換を1つの行列で表現するアフィン変換の式も示しておいた。
[ X ] [ a11 a12 a13 ] [ x ] [ Y ] = [ a21 a22 a23 ] × [ y ] [ 1 ] [ a31 a32 a33 ] [ 1 ]
また、このプログラムを書くにあたり、座標を構造体struct XY{ float x,y ; } で扱う場合や、 サイズ2の配列で扱う方法について説明し、変換用関数を作る際に、関数配列渡しや 構造体ポインタ渡しなどの違いを解説する。
グラフィックス2次元演習課題
ここまでの2次元の移動・拡大・回転をしていることが解るプログラムを作成し、 レポートとして作成する。授業後半で3次元グラフィックスの課題を出すことから、 レポートでは、プログラムリストと実行結果と簡単な説明でいい。
表示するための図は、関数グラフでもいいし、座標列を定数で与えた図形でも良い。
セガの社内教育
ゲーム好きが、ムダにゲーム業界就職に興味をもたれても困るので、 Blogで取り上げるのは好きではないが、面白いやり方が色々書いてあるので…
ゲーム開発のセガにて、社員教育の方法が取り上げられている。 面白いのは、厳しい採用試験に通っているとはいえ、デザイナー・クリエータ・プログラマと分業が進み、得意分野を持っているからこそ、知識のレベルはバラバラみたい。
面白いのは、英語教育にも力を入れている点。
『さらに英語の重要性も新入社員に伝えているという。康氏は、ネット上の価値ある情報の多くが英語で書かれていることを挙げつつ、それを読み解き使いこなすためには、学校教育で得られる英語力だけでは不十分だとする。特にプログラマーは問題の自己解決能力が重要であり、最先端の開発に取り組むほど、英語力の有り無しの影響は大きい。』
また、自由な服装が当たり前とも思われる業界だけど、研修中はスーツ・ネクタイが義務だとは。
さらに面白いのは、職場での相互モニタをつかったペア作業だ。 プログラミングでは、ペアプログラミングというのが有名だけど、これのデザイナ版かもしれない。 ペア作業の2人でペア相手の画面がセカンダリモニターで見れるらしい。 常にペア相手の作業風景が見れる常態で窮屈にも見えるけど、 『自分なりのやり方』だけでは、レベルアップが難しいというのが理由。
yahooのspam判定厳しかった?
学生さんより、授業演習レポートをメールで送ったとの連絡の中、 何人かが「送ったのに…」とのお話し。 どれも、yahooアカウントから。以前はyahooからのしつこいspamがあり、 .procmailrc のレシピにて、下記のような設定。 学内spamフィルタで、レーティングされた値を元に、消すようにしているんだけど、 条件が厳しいのかなぁ….
:0 * ^From:.*@yahoo.co.jp * ^X-NAI-Spam-Level: \*\*\*\*\*\*\*\* /dev/null
ひとまず、学生さんは印刷し提出してもらったけど、 トラブル抑制でこのレシピをコメントアウト。
# フリーメール使うにしても、GMail とかの方がお勧めだど。
MovableTypeのバージョンアップ
自宅ページでは、MovableType-OpenSource(MTOS) のバージョンが 4.32-en で、 コメントなどの認証で OpenIDやGoogle,Yahooの認証が使えるようになったので、 学科のMovableTypeも4.23-enよりバージョンアップを行う。 現在、学科サーバはDebian/stableにて運用しているため、testing混在となったが、 思ったより少なめのパッケージで済んだ…
高専機構とマイクロソフト包括協定締結
高専では、来年度からOSのライセンスを高専機構で一括取得という話がすすんでいたが、 下記のような、協力協定が結ばれたようだ。
これにより、Visual Studio などの開発系の Dream Spark が、 学生が自宅で無償でダウンロード利用が可能となるらしい。
教室のお引越し
今年度は校舎の改修と新型インフルエンザで、学校行事は特例ばかり。 しかし、ようやく本館の改修もひと段落で、電子情報棟の実験室を仮設教室にしていた 教室を、本来の教室に戻すお引越しの日。
担任の教室も本館に移動だけど、移動先も他クラスが今日いっぱい使うし、 出て行く教室にも、他実験室に移動していたクラスが戻ってくる。 ということで、原則教室内のものは、すべて持ち帰り。 HRで持ち帰りと伝えていた割りに、机やロッカーに大量に「教科書」などを蓄えている人も多い。 んで、「今日全部持ち帰りはムリ!」という学生さんがチラホラ。 さて、放課後の移動はスムーズに終わるかな….
一気に雪景色
昨夜より福井県の平野部でも、シーズン最初の本格的な雪。 我が家では車の上に、3cm ほどの積雪であった。 学校につくと、早々に学生さんより「雪で電車が遅れてます」との連絡多数。 1限目の授業にも影響が出た様子。 シーズン最初の雪だし、しかたがないか….