3

Linuxカーネルドライバーで後で発生するアクションをスケジュールするには、2つのオプションがあります。

  • add_timer
  • queue_delayed_work

私が知っている1つの違い:タイマーexpiresの場合、タイマーが期限切れになるときのjiffies値を指定する必要があります。遅延作業の場合、jiffiesの遅延を指定する必要があります。

タイマーとwork_queueに関する他の質問を読んでいますが、タイマーがプロセスコンテキストの外部で実行されると記載されています。これは遅延作業とは異なりますか?

また、タイマーに問題があることも知っています。計算時にexpires値がオーバーフローする可能性があるため、計算された値は現在のjiffiesよりも小さく、タイマーはすぐに期限切れになります(ここで間違っている場合は修正してください)。遅れた仕事は同じ問題に苦しんでいますか?もしそうなら、どのように

私には、遅延作業を使用する方が簡単なようです(作業は定期的ではないため)。しかし、タイマーを使用することよりも不利な点は何ですか?

編集 私はいくつかのさらなる研究をしました。内部queue_delayed_workで使用しているようです。add_timer

だから私の新しい質問は、タイマーのjiffiesオーバーフローを適切に処理するにはどうすればよいですか?たとえば、timer / delayd_workを10分の遅延に設定するにはどうすればよいですか?

4

3 に答える 3

3

カーネルプログラミングの場合、timer / workのコールバック関数をスリープ状態にする必要がある場合は、delayed_workを使用する必要があります。delay_workはプロセスコンテキストで実行されるため、コールバック関数内でスリープする可能性がある、またはスリープする傾向がある関数を使用できます。カーネルタイマーの場合、スリープまたはスリープしがちな関数は使用できません。結論:コールバック関数がスリープする必要がある場合はワークキューを使用し、そうでない場合はタイマー/タスクレットを使用します。

それが役に立てば幸い :)

于 2015-03-16T04:27:53.610 に答える
2

私の質問で述べたように、内部queue_delayed_workで使用するだけです。add_timerしたがって、使用法も同様です。

于 2013-01-14T13:29:56.573 に答える
2

2番目の質問に答えてください。

今から10分後、カーネルタイマーで使用します。

// 10 minutes * 60 converts to seconds * 1000 converts to microseconds
// msecs_to_jiffies converts the resulting microsecond delay to jiffies
//   which is added to the current time (system variable jiffies)

jiffies + msecs_to_jiffies(10 * 60 *1000)

また、遅延作業をキューに入れるには、10分の遅延部分を使用します。

msecs_to_jiffies(10 * 60 * 1000)

再オーバーフロー-自分でjiffiesを比較する必要がある場合は、time_afterおよびtime_before(およびその他の)マクロを参照してください http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/include/linux/jiffies.h#L93

于 2014-09-25T21:23:56.550 に答える