トップ «前の日記(2004年04月13日) 最新 次の日記(2004年04月15日)» 編集
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2004年04月14日

レースコンディションについて

去る2004/4/2に東京でlinuxデバイスドライバのセミナーを開催しました。来ていただいた皆様ありがとうございました。セミナーの最後で
interruptible_sleep_on() でプロセスを休眠させる手法はえてして良くない。
wait_event_interruptible() を使うべし。使い方は宿題です。
で締めましたが、『よく分からないよ〜』というメールをいただきましたのでこの場を借りて少し解説します。ちょうど最近の linux-users-ml でも話題になっていた話です。

http://search.luky.org/linux-users.a/msg02066.html

interruptible_sleep_on(&待ち列)はプロセスが休眠する自動詞的な関数です。ぶっちゃけこれを呼ぶと寝てしまうのです。何が良くないかというと

1  hogehoge_read(){   // read ドライバメソッド内部で
2   
3    if(受信データが無いなら){
4      interruptible_sleep_on(&待ち列);
5      // データが無いなら sleep に入って、
6      // データが到着したら割込みルーチンで起こしてもらう予定
7  }
というコードは良くないのです。3行目のif文の判定の直後にデータが到着したら、割り込みルーチンが先に呼ばれ、割込みルーチンでwakeupが実行されて空振りし、その後sleepに入って寝てしまうのです。従ってif文の判定からデータ到着までが1パケット分ズレます。こういう状況を race condition (競合状態)と呼びます。割込みルーチンとプロセス間でデータの競合が起こるなら割り込みを止めてしまえと
1    hogehoge_read(){   // read ドライバメソッド内部で
2   
2.5  cli();    //割込み禁止
3    if(受信データが無いなら){
3.5    sti();  //割込み許可
4      interruptible_sleep_on(&待ち列);
5      // データが無いなら sleep に入って、
6      // データが到着したら割込みルーチンで起こしてもらう予定
7  }
のように書いてもダメです。sti()が実行された途端に保留されていた割込みが実行されるので意味がありません。『interruptible_sleep_on() が割込み禁止で呼んでも良い』という仕様だったら簡単だったんですけけど、愚痴っていても仕方ありません。 そこで interruptible_sleep_on() は使うな。wait_event_interruptible()マクロを使えとなります。
wait_event_interruptible(待ち列,条件式);
こいつはマクロなので関数呼び出しとは少し様子が違います。待ち列には&をつけず、2番目の要素は条件式になります。プログラムはこんな感じ
    err = wait_event_interruptible(待ち列,(もしデータが無いなら));
    if(err)
      return err;
    if(signal_pending(current))
      return -ERESTARTSYS;
もっとたくさんのサンプルが見たい? /usr/src/linux/drivers の下を見れば沢山出てきますよ〜

サルサ

レディヤン春日井のemikoさんのキューバンサルサのレッスンに2時間。5/2のキューバンサルサフェスタまで後2回しか練習できないけど、皆が和気藹々と練習してて切羽詰った義務感も感じないので本番も楽しめそうだ。