SylixOS中select原理及使用分析

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

1. select接口簡介

1.1 select接口使用用例

select是操作系統多路I/O復用技術實現的方式之一。

多路I/O復用技術大致使用場景為:構造一張感興趣的文件描述符列表,然后調用多路復用的IO接口,在接口中進行阻塞,直到這些描述符中的一個已準備好進行I/O時,該函數才返回。

select在應用中使用的例子如下段代碼所示。

#include <sys/select.h>
int main (int argc, char **argv)
{  fd_set              fdset;struct timeval 	timeout;timeout.tv_sec  = 10;timeout.tv_usec = 0;int fd = open("/dev/htm2", O_RDWR, 0666);for (;;) {FD_ZERO(&fdset);FD_SET(fd, &fdset);select(fd + 1, &fdset, &fdset, NULL, &timeout);sleep(1);}return  (0);
}

1.2 select函數原型分析

LW_API INT   select(INT               	 iWidth, fd_set            	*pfdsetRead,fd_set            	*pfdsetWrite,fd_set            	*pfdsetExcept,struct timeval   	*ptmvalTO);
  • iWidth為設置的文件集中,最大的文件號 + 1;
  • pfdsetRead為關心的可讀文件集;
  • pfdsetWrite為關心的可寫文件集;
  • pfdsetExcept為關心的異常文件集;
  • ptmvalTO為等待超時時間,LW_NULL表示永遠等待。
  • 返回值:正常返回等待到的文件數量,錯誤返回 PX_ERROR。

2. 驅動中的select實現

2.1 驅動的ioctl實現

SylixOS的select接口實現中,系統會調用到每一個fd對應的設備驅動的ioctl接口,并會調用到如下表所示的兩個命令。

命令說明
FIOSELECT添加SEL_WAKE_NODE節點
FIOUNSELECT移除SEL_WAKE_NODE節點

2.2 SylixOS的select等待鏈

添加與移除SEL_WAKE_NODE的操作實際都是對SylixOS的select等待鏈進行操作, 對應調用如SEL_WAKE_NODE_ADD與SEL_WAKE_NODE_DELETE的系統接口。

等待鏈的作用就是將一堆阻塞待喚醒的線程組成集合,當需要被喚醒時可以通過調用系統的SEL_WAKE_UP系列函數實現對線程的喚醒。

SylixOS提供的喚醒命令如下表所示。

命令說明
SEL_WAKE_UP喚醒一個等待線程
SEL_WAKE_UP_ALL喚醒等待某一類型操作的所有線程
SEL_WAKE_UP_TYPE獲取節點的等待類型
SEL_WAKE_UP_ERROR由于產生了錯誤,喚醒一個等待的線程
SEL_WAKE_UP_TERM由于產生了錯誤,喚醒所有等待某一類型操作的所有線程

2.3 SylixOS中的select上下文

需要注意的是:select阻塞操作使用的信號量為select上下文之中的,并不需要在驅動的FIOSELECT里再實現一個信號量。

select的上下文如下段程序所示。

typedef struct {LW_OBJECT_HANDLE       SELCTX_hSembWakeup;         	    /*  喚醒信號量              */BOOL                   SELCTX_bPendedOnSelect;    	    /*  是否阻塞在 select() 上  */fd_set                *SELCTX_pfdsetReadFds;      	    /*  阻塞的讀文件集指針       */fd_set                *SELCTX_pfdsetWriteFds;    	    /*  阻塞的寫文件集指針       */fd_set                *SELCTX_pfdsetExceptFds;   	    /*  阻塞的異常文件集指針     */fd_set                 SELCTX_fdsetOrigReadFds;  	    /*  原始的讀文件集          */fd_set                 SELCTX_fdsetOrigWriteFds; 	    /*  原始的寫文件集          */fd_set                 SELCTX_fdsetOrigExceptFds;	    /*  原始的異常文件集        */INT                    SELCTX_iWidth;                   /*  select() 第一個參數    */
} LW_SEL_CONTEXT;
typedef LW_SEL_CONTEXT     *PLW_SEL_CONTEXT;

3. 阻塞與喚醒實現

3.1 阻塞操作

select的阻塞操作是在其內部調用的pselect函數中調用二進制信號量的pend操作實現的。但是在調用pend之前,pselect會首先調用ioctl,傳遞FIOSELECT參數,此接口中會判斷當前是否滿足select的喚醒條件,若滿足則先調用post,以使之后調用的pend不會被阻塞。

其流程如下圖所示。

select內核處理原理

3.2 喚醒操作

在需要進行喚醒的地方調用SEL_WAKE_UP系列接口,如產生中斷的地方、檢測的線程中。

轉載于:https://my.oschina.net/wPCBsKzQ/blog/1625033

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255400.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255400.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255400.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【pyqt5學習】——QLineEdit學習(回顯模式)

目錄 1、回顯模式 2、成果顯示 3、知識點 1&#xff09;FormLayout布局添加addRow方法 2&#xff09;在輸入框顯示灰色提示字體&#xff0c;輸入內容時消失setPlaceholderText 3&#xff09;設置回顯模式setEchoMode 4、完整代碼 1、回顯模式 QLineEdit控件的主要功能是輸…

有關機械手臂控制中的兩個重要輸入參數

1.在機械手臂中有兩個重要參數。一個是編碼器的值&#xff0c;另外一個是馬達的電流值。根據這兩個可以獲得機械手臂的運動學&#xff0c;動力學的一些數據。第一重要特征參數 是DH參數&#xff0c;另外一個就是每個軸的質心參數。

MySQL的權限分配

MySQL 賦予用戶權限命令的簡單格式可概括為&#xff1a;grant 權限 on 數據庫對象 to 用戶&#xff0c;如 GRANT PRIVILEGES ON datebase.* to user% IDENTIFIED by passwd;一、給表數據賦權 grant 普通數據用戶&#xff0c;查詢、插入、更新、刪除 數據庫中所有表數據的權利。…

用HttpURLConnection發送http請求

//發送http請求try {//1.使用網址構造一個URL對象 URL url new URL(path);//2.獲取連接對象 HttpURLConnection conn (HttpURLConnection) url.openConnection();//3.設置一些屬性 //設置請求方式&#xff0c;注意大寫conn.setRequestMethod("GET");//設置請求超時…

【pyqt5學習】——QLineEdit控件輸入校驗器Validator、掩碼setInputMask限制輸入、textChanged信號

目錄 1、輸入校驗器——限制輸入框輸入的內容 1&#xff09;校驗器類型——整數、浮點數、數字字母結合&#xff08;正則&#xff09; 2&#xff09;步驟 3&#xff09;結果 ?編輯 ?編輯 4&#xff09;完整代碼 2、利用掩碼進行輸入的限制 0&#xff09;掩碼對照表 1…

Call requires API level 3 (current min is 1)

結果出現“Call requires API level 3 (current min is 1): 解決方法&#xff1a; 在工程上點擊右鍵 -> Android Tools -> Clear Lint Markers&#xff0c;即可。轉載于:https://www.cnblogs.com/qianyukun/p/5458331.html

Product文本格式說明

使用txt進行產品信息的說明。 Product文本格式說明 //**************************************************** //產品信息 //固定標識符全部大寫&#xff0c;全部在等號&#xff08;&#xff09;前面 //****************************************************** PRODUCTTest //…

PyOpenCL圖像處理:Box模糊

為什么80%的碼農都做不了架構師&#xff1f;>>> # -*- coding: utf-8 -*-from __future__ import absolute_import, print_function import numpy as np import pyopencl as cl import cv2 from PIL import Imagedef RoundUp(groupSize, globalSize): r globalSi…

【python bug修復】——Script file ‘D:\softwares_install\Anaconda3\envs\PartTimes\Scripts\pip-scrip

目錄 1、問題描述 2、問題解決 1&#xff09;下載pip安裝腳本 2&#xff09; 運行安裝pip腳本 3&#xff09; 下載庫 1、問題描述 利用pip命令進行庫的安裝時&#xff0c;突然出現這個問題&#xff0c;之前使用還好好的 Script file D:\softwares_install\Anaconda3\envs\P…

項目中的那些事---下載pdf文件

最近做了一個下載pdf文檔的需求&#xff0c;本以為使用HTML5中<a>標簽的屬性download就能簡單搞定&#xff0c;不料IE竟然不支持這一簡單粗暴的H5新特性&#xff0c;而是直接在網頁中打開&#xff0c; 于是各種搜索之后得出以下結論&#xff1a;IE中下載文檔時&#xff0…

MySQL日志分類及性能分析你應該知道的知識

為什么80%的碼農都做不了架構師&#xff1f;>>> MySQL日志記錄了MySQL數據庫日常操作和錯誤信息&#xff0c;MySQL總共有四種類型的日志&#xff0c;通過分析這些日志可以查詢到MySQL的運行情況、用戶操作、錯誤信息等&#xff0c;可以為MySQL的管理和優化提供必要…

利用三個點(trsf)來實現各種規則圖形的實現

在Val3,是使用trsf(x,y,z,rx,ry,rz)來實現三維空間點的位置與方向。 其中第一點和第二點位置很重要&#xff0c;第三點是用來確定方向。根據這三個點先確定一個用戶坐標系。 在這個坐標系中&#xff0c;實現圓&#xff0c;三角形&#xff0c;矩形&#xff0c;腰圓&#xff0c;正…

android基礎組件----Button的使用

按鈕由文本或圖標&#xff08;或文本和一個圖標&#xff09;組成&#xff0c;當用戶觸摸到它時&#xff0c;會發生一些動作。今天我們開始Button的學習。少年的愛情永遠不夠用&#xff0c;一杯酒足以了卻一件心事。 Button的簡要說明 根據你是否想要一個帶有文本的按鈕&#xf…

@Repository、@Service、@Controller 和 @Component

Repository 、Service 、 Controller 、Component 這四個Spring注解 ,用于把加了注解的 類 加入到Spring 容器中管理&#xff0c;節省了xml 的繁重的配置&#xff0c;盡管如此xml 同樣可以實現&#xff08;一般建議先搞懂xml&#xff09;。 Repository Repository注解便屬于最先…

【pyqt5學習】——QTextEdit控件學習:獲取文本、添加文本

目錄 1、QTextEdit控件介紹 2、QTextEdit控件添加文本、添加HTML格式 3、QTextEdit控件獲取文本、獲取HTML格式文本 4、案例 1&#xff09;完整代碼 2&#xff09;效果 1、QTextEdit控件介紹 QTextEdit控件是一個支持多行輸入的輸入框&#xff0c;支持HTML進行格式的設置 2…

空間變化

空間變化 第一種&#xff1a;圓 第二種: 矩形 第三種&#xff1a;正五邊形 第四種:正六邊形 第五種&#xff1a;腰圓 算法&#xff1a; 在規則圖形&#xff08;不包括圓心-直徑法&#xff09;中&#xff0c;等于或者超過三個點。一般的&#xff0c;利用p1,p2,p3來建立一個用戶…

【pyqt5學習】——QAbstractButton學習(普通按鈕QPushButton、工具按鈕QToolButton、單選按鈕QRadioButton、復選框按鈕QCheckBox)

目錄 1、按鈕介紹 2、普通按鈕QPushButton學習 1&#xff09;特殊模式——開關按鈕&#xff08;toggle&#xff09; ①將按鈕設置為可選擇的 ②將按鈕按下 判斷按鈕是否被按下 isChecked() 2&#xff09;給按鈕設置前置圖標setIcon() ?編輯 3&#xff09;按鈕信號 4)完…

java 企業 網站源碼 模版 屏幕自適應 有前后臺 springmvc SSM 生成靜態化

前臺&#xff1a; 支持四套模版&#xff0c; 可以在后臺切換點擊&#xff1a;獲取地址QQ 313596790官網 http://www.fhadmin.org/系統介紹&#xff1a;1.網站后臺采用主流的 SSM 框架 jsp JSTL&#xff0c;網站后臺采用freemaker靜態化模版引擎生成html2.因為是生成的html&…

挖財后端架構簡介

挖財后端技術用的主要是比較大眾的東西&#xff0c;Web容器用Tomcat&#xff0c;框架主要是Spring MVC&#xff0c;也有少量的Play&#xff0c;中間服務層是Dubbo&#xff0c;微容器用Spring Boot&#xff0c;服務注冊這一塊是用ZooKeeper&#xff0c;核心業務開發方式還是圍繞…

【pyqt5學習】——QcomboBox學習

目錄 1、添加條目&#xff1a; 1)逐一添加 2&#xff09;批量添加 3&#xff09;獲取當前選中的索引 4&#xff09;獲取當前選中文本 5&#xff09;根據索引獲取文本 6&#xff09;統計條目總數 7&#xff09;信號——當前選中的索引發生改變currentIndexChanged() 2、…