天天看點

核心poll和select系統調用的圖解(1)-poll系統調用的整體結構圖Zonadictoz

       雖然五年前就學了驅動中poll方法的實作,LDD3的描訴也是比較詳細的,但當時我是初學者,了解的不夠深入,就算學了也很快就還給了LDD3。這次複習驅動的poll方法,順便認真跟蹤了核心poll系統調用的源碼,從整體的poll實作結構上了解了從使用者層傳遞下來的poll系統調用在核心中是的實作。這一下就豁然開朗了,徹底明白了驅動中的poll方法為什麼如此簡單,也明白了驅動中poll的實作在整個poll系統調用中處的位置。 

      poll(輪詢)操作在應用程式中用于同時阻塞在多個檔案上,當其中任何一個檔案有應用程式所等待的事件(可讀、可寫、出錯等)時,poll傳回相應的掩碼通知應用程式,使得應用程式知道應該對哪個檔案做何種操作。按照我的了解,poll的本質可以這樣解釋:休眠等待多個指定檔案中的任何一個發生特定的事件,并将被該檔案喚醒;醒來後輪詢所有相關檔案(通過再次調用所有檔案對應驅動的poll方法),擷取所有被監控檔案的事件資訊傳回給應用程式。

     從這裡就可以看出:

(1)其中等待隊列的使用是必不可少的。實際上調用poll的程序将會休眠在多個等待隊列(一般所有被監控檔案的都有至少一個的等待隊列)上,從其中任何一個隊列上喚醒該程序,都可能使poll函數傳回。

(2)驅動中的poll方法不實作休眠,而是:

i、把目前程序添加到相應的等待隊列中(僅在休眠時執行,喚醒時不會執行此功能)。

ii、傳回檔案目前的狀态掩碼(告知是否有事件發生,休眠和喚醒都會執行)。

      通過對核心源碼、<b>《深入Linux裝置驅動程式核心機制》</b>的學習,我對Poll系統調用和核心驅動的poll方法的關系和結構有了整體且深入的了解,基本搞清了poll系統調用的執行脈絡。對于poll系統調用的核心原理,請大家先看<b>《深入Linux裝置驅動程式核心機制》</b>那本書寫的比較詳細了,我不廢話了。以後我會把我自己覺得需要注意的地方寫出來。這裡我把這個關系和資料結構圖繪制了出來,請大家指正:

核心poll和select系統調用的圖解(1)-poll系統調用的整體結構圖Zonadictoz

對于等待隊列的情況,我用下面一個例子和圖來示意一下:

例如有3個程序:

task-1:使用poll檢測檔案1~3

task-2:使用poll檢測檔案2~3

task-3:使用poll檢測檔案3

則等待隊列的情況如下:

核心poll和select系統調用的圖解(1)-poll系統調用的整體結構圖Zonadictoz

之後,假設task-2由于檔案2或3被喚醒,且task-1/3對此不感興趣(未設定該掩碼),那麼等待隊列的情況如下:

核心poll和select系統調用的圖解(1)-poll系統調用的整體結構圖Zonadictoz

    等待隊列入口項的添加和删除主要是由poll_initwait(&amp;table);和poll_freewait(&amp;table);完成。

<a href="http://zonadictoz.com.ar" target="_blank"></a>

核心poll和select系統調用的圖解(1)-poll系統調用的整體結構圖Zonadictoz

繼續閱讀