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.mzph.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、…