0

Linuxカーネルの以下のAPIの違いを理解するのに役立つ人はいますか?

struct workqueue_struct *create_workqueue(const char *name); 
struct workqueue_struct *create_singlethread_workqueue(const char *name);

私はサンプル モジュールを作成しました。それらを を使用して表示しようとするとps -aef、両方ともワークキューが作成されましたが、違いはわかりませんでした。

http://www.makelinux.net/ldd3/chp-7-sect-6を参照し、LDD3 によると:

create_workqueueを使用すると、システム上の各プロセッサ専用のスレッドを持つワークキューが得られます。多くの場合、これらのスレッドはすべてやり過ぎです。単一のワーカー スレッドで十分な場合は、代わりに create_singlethread_workqueue を使用してワークキューを作成します。

しかし、複数のワーカー スレッド (それぞれがプロセッサ用) を確認できませんでした。

4

2 に答える 2

1

LDD3 が作成されてから、ワークキューが変更されました。

これら 2 つの関数は、実際にはマクロです。

#define create_workqueue(name)                                          \
        alloc_workqueue("%s", WQ_MEM_RECLAIM, 1, (name))
#define create_singlethread_workqueue(name)                             \
        alloc_workqueue("%s", WQ_UNBOUND | WQ_MEM_RECLAIM, 1, (name))

alloc_workqueueドキュメントには次のように記載されています。

指定されたパラメーターでワークキューを割り当てます。WQ_* フラグの詳細については、Documentation/workqueue.txtを参照してください。

そのファイルは大きすぎて完全に引用できませんが、次のように書かれています。

alloc_workqueue()wq を割り当てます。元のcreate_*workqueue() 機能は廃止され、削除される予定です。
[...]
wq は実行リソースを管理しなくなりましたが、進行保証、フラッシュ、作業項目属性のドメインとして機能します。

于 2014-09-28T09:06:54.283 に答える