I/O复用-Select函数

本文介绍I/O复用技术及其在并发服务器中的应用,重点解析Select函数的工作原理及其实现过程,包括如何利用fd_set数组监视多个文件描述符的状态。

I/O复用的意义

为了构建并发服务器,一般需要为每个客户端连接都创建一个进程进行通信,不过创建和维护进程的开销是巨大的,需要大量的运算和内存空间,每个进程都有独立的内存空间,所以相互交换数据也要求采用相对复杂的方法,比如管道等。

这时I/O复用就能有效的改善这种情况,他可以使一个进程同时为多个客户端提供服务,当然这里所说的同时并不是真正意义上的同时发生。

 

Select实现复用服务器端

实现原理

select函数可以将多个文件描述符集中在一起统一监视。根据函数返回的值找出发生事件的描述符。

函数详解

select函数使用方法与一般函数区别较大,定义如下:

int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset,

const struct timeval *timeout);

/* 成功时返回大于0的值,为几代表有几个套接字状态发生了变化,失败返回 -1 */

 

参数中有3个fd_set数组,这个数组是存有0和1的位数组,readset、writeset、exceptset这三个分别代表对套接字数组监视的事件,如readset数组中值如下:

readset

| 0 | 1 | 0 | 0 | 1 |

 

表明select函数监听了套接字1和4的读事件,也就是说如果套接字1和4变得可读,那么select就会成功返回。另外两个数组道理也是一样。

处理fd_set位数组,c已经提供了基础的函数:

位操作函数

FD_ZERO (fd_set *fdset); /* 将数组位全部置为0 */

FD_SET (int fd ,fd_set *fdset); /* 往数组中注册套接字fd,即将该位置为1 */

FD_CLR (int fd ,fd_set *fdset); /* 从数组中清除套接字fd,即将该位置为0 */

FD_ISSET (int fd ,fd_set *fdset); /* 查询数组中是否已经注册了套接字fd,是返回true */

文件描述中的监视范围与select的第一个函数有关,因此需要得到fd_set数组的注册元素大小,然后作为maxfd值传入函数。

另外一个重要的参数就是timeout,select默认在发生监视的事件时才返回,不然会一直阻塞,为了防止阻塞时间过长,就可以通过传递timeout设置超时时间,超过timeout后函数会返回0;

struct timeval

{

long tv_sec; /* seconds */

long tv_usec; /* microseconds */

}

 

查看结果

select返回后如何判断哪些描述符发生了变化呢?还是通过fd_set数组,函数完成后,fd_set除了发生事件的描述符,其他的都会被置为0,因此返回后位数组中还是为1的描述符就是发生事件的描述符,查找的方式就是循环fd_set数组,使用FD_ISSET函数判断是否该位为1,然后根据3个数组分别进行相应的读写操作即可。

需要注意的是,当需要select循环监听时,select每次成功返回后,都需要重新设置监听位,因此上一次返回后将位数组都打乱了。

 

Apache默认使用的就是select机制,对应的Nginx使用的是Epoll,这个后面会再做分析。

以上就是select函数的使用和原理,可以称为I/O复用的核心。

内容概要:本文介绍了基于贝叶斯优化的CNN-LSTM混合神经网络在时间序列预测中的应用,并提供了完整的Matlab代码实现。该模型结合了卷积神经网络(CNN)在特征提取方面的优势与长短期记忆网络(LSTM)在处理时序依赖问题上的强大能力,形成一种高效的混合预测架构。通过贝叶斯优化算法自动调参,提升了模型的预测精度与泛化能力,适用于风电、光伏、负荷、交通流等多种复杂非线性系统的预测任务。文中还展示了模型训练流程、参数优化机制及实际预测效果分析,突出其在科研与工程应用中的实用性。; 适合人群:具备一定机器学习基基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)础和Matlab编程经验的高校研究生、科研人员及从事预测建模的工程技术人员,尤其适合关注深度学习与智能优化算法结合应用的研究者。; 使用场景及目标:①解决各类时间序列预测问题,如能源出力预测、电力负荷预测、环境数据预测等;②学习如何将CNN-LSTM模型与贝叶斯优化相结合,提升模型性能;③掌握Matlab环境下深度学习模型搭建与超参数自动优化的技术路线。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注贝叶斯优化模块与混合神经网络结构的设计逻辑,通过调整数据集和参数加深对模型工作机制的理解,同时可将其框架迁移至其他预测场景中验证效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值