Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> 機能実装原理分析の選択

機能実装原理分析の選択

  
 

selectはドライバのサポートを必要とし、ドライバはfopsでポーリング機能を実装します。 selectは、各デバイスファイルに対応するpoll関数によって提供される情報を介して利用可能なリソース(読み取り可能または書き込み可能など)があるかどうかを判断し、そうであれば使用可能なリソースのファイル記述子の数を返します。それが利用可能になると、それは目覚めて実行を続けます。


以下はselectの2プロセス分析です。


1. selectのスリーププロセス


<ブロッキング操作をサポートするデバイスドライバは、通常、上位層(ユーザー層)に必要なBLOCK操作またはNONBLOCK操作をサポートするために、読み取り/書き込み待ち行列などの一連の独自の待ち行列を実装します。アプリケーションがデバイスドライバを介してデバイスにアクセスするとき(デフォルトはBLOCK操作)、デバイスに現在読み書きするデータがない場合は、デバイスドライバに対応する読み書き待ちキューにユーザープロセスが挿入され、一定時間スリープされます。データが読み書き可能になるまで待ってからプロセスを起動します。


selectは、読み書き可能なリソースがないときにユーザープロセスを適切にスリープさせ、読み書き可能なリソースがあるときにウェイクアップするための待機キューメカニズムの賢い使い方です。選択睡眠の詳細なプロセスを見てみましょう。


selectは、監視対象のfd_set内のすべてのファイル記述子に対応するドライバのポーリング機能をループします。ドライバによって提供されるポーリング関数は、最初にselectを呼び出すユーザプロセスをデバイスドライバの対応するリソースの待ち行列(read /write wait queueなど)に挿入し、次にビットマスクを返して現在のリソースのどれが利用可能であるかを伝えます。 selectループがすべてのfd_setsで指定されたファイル記述子に対応するポーリング関数を通過するとき、利用可能なリソースがない(つまり、操作に使用できるファイルがない)場合、selectはリソースが利用可能になるまでプロセスをスリープさせます。ウェイクアップ(またはタイムアウト)は実行を続けます。


コードの実装方法を分析した後。

selectの呼び出しパスは次のとおりです。sys_select - > core_sys_select - > do_select

最も重要な機能はdo_selectです。主な作業はここにあります。最初の2つの機能は主にいくつか行います。仕事の準備をしなさい。 Do_selectは次のように定義されています。

int do_select(int n、fd_set_bits * fds、s64 *タイムアウト)

{ -

poll_table * wait;

int retval、i;


rcu_read_lock();

retval = max_select_fd(n、fds);

rcu_read_unlock ();


if(retval< 0)

return retval;

n = retval;


poll_initwait(& table);

wait =& table.pt;

if(!* timeout)

wait = NULL;

retval = 0; //retvalは、準備された記述子の数を節約するために使用されます。最初は0です。
(;;){

unsigned long * rinp、* routesp、* Rexp、* inp、* outp、* exp;

long __timeout;


set_current_state(TASK_INTERRUPTIBLE); //現在のプロセスの状態をTASK_INTERRUPTIBLEに変更します。 p>

inp = fds-> in; outp = fds-> out; exp = fds-> ex;

rinp = fds-> res_in; routesp = fds- > res_out; rexp = fds-> res_ex;


for(i = 0; i< n; ++ rinp、++ routes、++ rexp){//各記述子を走査します。

unsigned long in、out、ex、all_bそのビット= 1、マスク、j;

符号なしlong res_in = 0、res_out = 0、res_ex = 0;

const struct file_operations * f_op = NULL;

構造体ファイル* file = NULL;


in = * inp ++; out = * outp ++; ex = * exp ++;

all_bits = in

Copyright © Windowsの知識 All Rights Reserved