日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SylixOS中select原理及使用分析

發布時間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SylixOS中select原理及使用分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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不會被阻塞。

其流程如下圖所示。

3.2 喚醒操作

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

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

總結

以上是生活随笔為你收集整理的SylixOS中select原理及使用分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产在线网站 | 国产美女视频免费观看下载软件 | 国产超碰 | jizzjizz视频 | 山外人精品影院 | aaa级片| jizzjizz中国精品麻豆 | 国产探花精品一区二区 | 在线观看日韩一区二区 | 性福宝av| 四虎新网站 | 免费成人在线看 | 成人动漫视频 | 欧美精品在线第一页 | 伊人久久久久久久久久久久 | 国产高清免费在线 | 久久片| 5566毛片 | 极品色av影院 | 伊人免费在线 | 亚洲最大成人网站 | 亚洲区一区 | 日韩av在线直播 | 西西44rtwww国产精品 | 熟女视频一区二区三区 | 91免费版在线 | 国产成人av一区二区三区 | 日韩大片在线免费观看 | 免费精品久久 | 亚洲欧美日韩成人 | 色综合久久久久久久 | 天天躁狠狠躁 | 亚洲黄色激情 | 国产区在线 | 欧美三级黄色大片 | 免费看国产曰批40分钟粉红裤头 | 欧美在线性视频 | 国产精品一区二区精品 | 国产一级二级在线 | 岛国激情 | 成人超碰在线 | 激情黄色av| 亚洲国产成人一区二区精品区 | 国产黄网站 | 免费国产区 | 放几个免费的毛片出来看 | 国产日韩欧美精品一区 | 综合久久久久久 | 爱情岛论坛亚洲品质自拍视频 | 亚洲一区国产精品 | 伦一理一级一a一片 | 韩国三级hd中文字幕有哪些 | 日本高清在线一区 | 青青草原一区二区 | 久久精品免费观看 | av在线二区 | 日韩久久毛片 | 免费成人美女在线观看. | 中文字幕人妻一区二区三区在线视频 | 在线播放ww | 欧美亚洲一级 | 免费av网站在线看 | 久久av无码精品人妻出轨 | 无遮挡的裸体按摩的视频 | 麻豆亚洲av熟女国产一区二 | 超碰精品在线观看 | 800av免费在线观看 | 久久一级黄色片 | 国产色婷婷一区二区 | 国产真实生活伦对白 | 国产成人午夜视频 | 久久最新网址 | 精品一区国产 | 国产成人无遮挡在线视频 | 天堂成人国产精品一区 | melody在线高清免费观看 | 国产精品一区二区自拍 | 欧美日韩在线视频播放 | 日本美女全裸 | 亚洲人天堂 | 男插女视频在线观看 | 99国产精品| 91久久色| 亚洲熟妇av一区二区三区漫画 | 久久人人干 | 亚洲人成色777777精品音频 | 国产精品成人久久电影 | 国产精品美女久久久久 | 亚洲人成电影在线播放 | 亚洲国产综合av | 日韩v在线| 青青草伊人久久 | 性爱视频免费 | 日本不卡一二 | 国模人体私拍xvideos | 五月激情久久 | 日本黄色片免费看 | 四虎成人在线观看 | 久久精品国产亚洲av麻豆色欲 |