読者です 読者をやめる 読者になる 読者になる

ポジローぽけっと

昨日より今日、今日より明日を信じて、トライトライ

第十一回スパルタンプログラミング

何がしたいか?何が問題か?を意識して変なとこでぐだぐだ考えないこと 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.で対応する。
  • 窓口はスレッドで増やす。

マイティの計量スレッドのイメージ?

  • 1スレッドで複数コネクション扱えるようにする。 -- スレッドに渡す関数の引数を構造体とし、構造体内でfdsを集団として扱う。

スレッドについて

ミューテックス, 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