问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

windows select模型 和linux的区别

发布网友 发布时间:2022-05-01 05:39

我来回答

2个回答

热心网友 时间:2022-06-25 03:13

windows
select模型
在widows下提供了众多非阻塞的I/O模型,如select、WSAAsyncSelect、WSAEventSelect、overlapped、completion
port,其中IO
completion
port(IOCP)提供了较好的伸缩性,在windows应用比较广泛
说明:而select模型主要是解决在单一线程模式下只能处理一个套接字的问题,这样可以避免线程膨胀问题,但是。。。下面看完原型再讲起不足之处
select模型:winsock库主要有两个版本,这里主要以winsock2版本为说明,select模型
int
select(int
nfds,fd_set*
readfds,fd_set*
writefds,fd_set*
exceptfds,const
struct
timeval*
timeout);
其实主要是两者采用的标准一致,所以接口基本跟linux一致,不过nfds在windows其实是没有意义的,主要是为了兼容其他版本
处理过程:假设以read为例,在这里windows主要是先将套接字s添加到readfds集合中,然后等待select函数返回,在select函数里面会移除没有未决的
I/O操作的套接字句柄,即已经处理过的IO套接字句柄,然后看s是否认仍然还是readfs集合中,在就说明s可读了,但是这里面可读,不一定有数据
有几种情况都会引发:数据可读、连接关闭/重启/中断、监听套接字被调用,此时还有连接未决,accept函数接受新的套接字成功
不足:其实添加到fd_set套接字数量是有*的,winsock2.h定义的64,自定义也不超过1024,因为值太大,会对服务器的性能有影响,更高的就是可伸缩的IOCP
linux
select模型
其实原理跟windows是差不多的,只是处理过程在底层上有点区别
模型:int
select(int
maxfd,fd_set*readfds,fd_set*
writefds,fd_set*exceptfds,const
struct
timeval*timeout)
这里主要是maxfd,文件描述符的范围,比待检测的最大文件描述符大1
处理过程:也是先将监控的文件添加到文件描述符集合中,调用select监控,判断文件是否发生变化,但是在底层调用的确是poll方法;首先使用poll_wait将等待队列添加到poll_table中,返回描述符的掩码
poll原型:unsigned
int
(*poll)(struct
file*filp,poll_wait*
wait)
看如下一个简单的处理过程
unsigned
int
mem_poll(struct
file
*filp,
poll_table
*wait)
{
struct
mem_dev
*dev
=
filp->private_data;
unsigned
int
mask
=
0;
/*将等待队列添加到poll_table
*/
poll_wait(filp,
&dev->inq,
wait);
if
(have_data)
mask
|=
POLLIN
|
POLLRDNORM;
/*
readable
*/
return
mask;
}
在这里只是添加队列,返回可读可写的掩码,真正阻塞的不是这里,是在do_select(...)函数中,在linux内核fs/select.c里面
int
do_select(int
n,
fd_set_bits
*fds,
struct
timespec
*end_time)这个函数
if
(file)
{
f_op
=
file->f_op;
mask
=
DEFAULT_POLLMASK;
if
(f_op
&&
f_op->poll)
{
wait_key_set(wait,
in,
out,
bit);
mask
=
(*f_op->poll)(file,
wait);
}
这里面是先判断文件存在,然后读取你自己定义的操作设备I/O的f_op函数,这里有一个默认的mask,接着才判断然后返回描述符mask
=
(*f_op->poll)(file,
wait);用于区分当前哪个集合被触发了;接着判断f_op&f_op->poll在这里我们默认定义了poll函数,所以这里会进入此判断语句,mask
=
(*f_op->poll)(file,
wait);这个就是调用默认的poll函数进行处理,关键的是如何区分不同的读、写、异常过程?
(mask
&
POLLIN_SET)
&&
(in
&
bit),这里面就是对当前的可读、写、异常的&&过程,就是为了判断和区分当前的套接字只是某一个具体的fd_set集合下;当然某一个套接字也可能同时在可读可写里面,这时候两个会进行判断。
if
(retval
||
timed_out
||
signal_pending(current))
break;
上面的retval如果为0,且其他也不满足就会导致空循环状态,就处于阻塞状态了

热心网友 时间:2022-06-25 03:14

本质上没有什么区别,都是轮询而已
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2024年云南292分能考上什么大学? 2024高考多少分能被焦作大学录取 【芍药花茶】芍药花茶的功效与作用 芍药花茶怎样喝 芍药花茶的介绍 芍药花茶的属性和功效 联想拯救者电竞手机Pro评测 植物大战僵尸花园战争有用的激活码发给我,有用我就采纳 亲亲奶爸《亲亲奶爸》歌词 植物大战花园战争激活码只能用一次? 歌词中带有。我的好爸爸。我的好爸爸。儿女怎能舍得让你走,_百度... edge浏览器没声音是怎么回事-edge浏览器没声音解决办法 合肥有哪些习俗,风俗习惯? 长春 交友 长春大学生交友群74969882 木桶原理是什么意思 给几个长春市初高中生的交友群号,谢乐噢, UP↑UP↑UP↑长春交友群.群号 21186434 欢迎18周岁以上加入.!UP↑UP↑UP↑UP↑UP↑ 大阿牌怎么占卜大致运相?(只用大阿牌) select的详细介绍 长春交友聚会…… 长春交友群,要最火的,热闹点的,不乱七八糟的有没有? 有长春交友群>? perl如何判断文件句柄已经打开 有没有90后长春的交友群 句柄的由来 windows 句柄到底是什么 文件指针和文件描述符的区别 《寄生虫》细思极恐的地方有哪些? - 信息提示 微信青少年监护人可以有几个 微信监护人怎么拉黑被监护人 内衣穿久了会有白丝透出来 长春QQ交友群 “打香炭”为何成为合肥传统的年俗活动? 长春地区好的交友网站 linux 网络编程, linux内核 . 长春qq群 纱裙(是裤衩裙 很短),配什么样的丝袜和什么颜色的 长春交友 吉林长春那边有没有钱江御龙交友群啊 描写春天或植树的诗 高中英语写作公开课课后反思怎么写 三月,我们去植树的古诗是什么 高考作文辅导教案:如何在作文教学中培养学生的创新素质 最好的免费的中学语文高考作文教学资源在哪里? 博世洗衣机水龙头怎么样?哪种尺寸是洗衣机通用的呢 中国女人有戴阴环的吗 安徽黄山中西医结合医院拖欠员工工资 好女孩儿可以扎阴环吗? 公司拖欠公司和工伤赔偿 我在人教学习网上买了小学四年级上学期的语文电子课本课程,可是孩子现在已经到下学期了能换吗?23.5块钱