第十一回スパルタンプログラミング
何がしたいか?何が問題か?を意識して変なとこでぐだぐだ考えないこと 30分悩んで分からなかったら、早めにヘルプを出す。
やりたいこと
aio_readの完了をシグナルで受ける?
tcp serverでたくさん要求をさばけるものを作る。
どうやったらできるか?
①意図的な処理のブロックをなくし、OSに処理をゆだね高速化する。
仮定:OSが処理をさばく方が賢いという仮定する
②要求受付窓口を増やす?
疑問:窓口を増やしても、OSはシリアルに処理を行うとすると意味が無いのでは?
回答:スレッド化しているとOSが賢く、CPUを使い分けてくれるらしい。
①を行うには、UNP vol1 6章「IOの多重化」
- ブロッキングI/O:論外
- 非ブロッキングI/O:データ待ち中に処理が走るから無駄
- 多重化I/O:select, pollを使う。ブロックするが複数のファイルディスクリプタを同時監視できる。
- シグナル駆動I/O:入力が読み出せる状態になったときにシグナルを送り、それに対するハンドラで動作する。
- 非同期I/O:入力を読んだ後にシグナルを送る。
がある。
方針まとめ
- ブロックする関数は4. と 5.で対応する。
- 窓口はスレッドで増やす。
スレッドについて
ミューテックス, mutex(mutual exclusion locks)
スレッド間の共有変数の同時アクセスさせないために共有変数にmutexを使う。 ただし、プログラムの実行は遅くなる。
共有変数(グローバル)の宣言とmutexの初期化?
unsigned int total_words; pthread_mutex_t counter_lock = PTHREAD_MUTEX_INITIALIZER;
ロックとアンロック
pthread_mutex_lock(&counter_lock); total_words++; pthread_mutex_unlock(&counter_lock);
参考
- 関数にとってのスレッド⇔プログラムにとってのプロセス
- コーディングコラボサービス:Floobits