open("/dev/mydrievr")
複数のプログラムでデバイスドライバを複数回呼び出すとどうなりますか?
各通話のプロセスを作成しますか?
プロセスの代わりにスレッドをインスタンス化できますか?
答え1
ほとんどの場合、カーネル要求は新しいプロセスやスレッドを生成しません。呼び出しスレッドのコンテキストでサービスを提供します。つまり、システムコールはスケジューリングの観点からカーネルに切り替えられません。カーネルは、必要に応じて呼び出される別個のプロセスではありません。あなたの例では、各呼び出しはopen
呼び出しプログラムのコンテキストで処理されます。
一部のデバイスドライバは、プロセスコンテキスト以外のタスクを処理できる必要があります。例えば処理時間が長くなる中断を処理します。このタイプのドライバはジョブキュー。カーネルでは、ジョブキューはスレッドを効果的に使用しますが、外部ではプロセスとして表示されます。 Linuxでは、プロセスとスレッドの区別は、カーネルスレッドの文脈ではあまり意味がありません。それらはすべて同じアドレス空間を共有し、スケジューリングの観点から見ると、プロセスとスレッドはとにかく同じです。
答え2
「デバイスドライバ」のあなたの理解が正しくありません。
パブリックコールの例では、デバイスドライバを呼び出すことなくデバイスを開きます。通常、デバイスドライバとデバイスはプロセスをまったく生成しません。
デバイスファイルは通常物理ハードウェアデバイスに対応し、ユーザープロセスがデバイスにアクセスするハンドルとして機能します。デバイスは、デバイスドライバに実装されたシステムコール(読み取り、書き込み、ioctlなど)をサポートします。デバイスドライバは、それぞれ独自のデバイスファイルを持つ複数のデバイスをサポートできます。関連プロセスはありません。
デバイスドライバの目的の1つは、複数のプロセスとカーネルのデバイスへのアクセスを調整することです。 (カーネルはユーザープロセスなしでデバイスに直接アクセスできますが、ディスクなどのデバイスドライバを介してアクセスできます。)