select、poll和epoll的区别

IO多路复用是网络编程中比较难理解得知识点,总结下该知识点供以后使用:

IO多路复用:IO操作时常发生阻塞现象,一旦一个IO操作发生了阻塞,操作系统就不能再执行其他IO操作,即使其他IO并不依赖这个阻塞得IO且可以独立运行,这样就使操作系统执行IO得效率非常低。BUT,可以采取一些方式使操作系统跳过阻塞的IO去执行其它的IO,这种达到得效果就叫IO多路复用。

实现IO多路复用的方式:select、poll、epoll

实现逻辑为:1、集中监控IO     2、当IO上发生了事件(例如:可读、可写、异常)    3、对发生的IO事件进行处理

select:通过select调用,程序监控多个IO设备,若果某个IO处于就绪状态,则select返回,并将(可读、可写、异常)的IO放入三个列表(rs,ws,xs),如果没有产生IO事件,则select阻塞等待。

select代码实现步骤:

1、创建socket套接字作为关注的IO;

2、创建IO关注列表;

3、调用select,程序监控IO时间,并将返回事件赋给rs、ws、xs三个IO事件列表;

4、循环遍历三个列表,对每个列表的值进行判断,具体是哪个IO事件,对不同的IO事件分别作出相应处理;

5、有新IO事件发生时,将该IO加入相应关注列表,若某IO事件终结则再相应关注列表中进行移除操作。

 

poll:和select类似,由于是链式结构存储得,所以同时监控IO得数量没有限制

poll代码实现:

1、创建套接字作为关注得IO

2、建立一个fd(文件描述符)和IO事件列表相互映射得字典,同时将前面创建得socket加如该字典中,用于后续根据fd查找相应事件

3、创建poll对象,将前面得socket这个IO事件注册到关注列表中(p.register(socket, POLLIN | POLLERR))

4、循环建立连接

5、调用poll对象得poll方法,阻塞等待IO事件得发生,返回值为fd和事件

6、遍历5中得返回值,根据fd,在2中创建得字典中进行查找相应得IO事件,判断不同的事件作出相应得处理

7、若有新的IO事件发生,将该IO事件注册(register)到关注列表(也叫poll监控列表),若IO事件结束则取消关注(unregister(socket))

注意:1、register有两个参数——socket, 事件类型,unregister有一个参数——socket

           2、事件类型:POLLIN(可读)、POLLOUT(可写)、PULLERR(异常)、PULLNVAL(无效请求)、PULLHUB(断开连接)

 

区别:1、select支持IO得数量有限,1024个;

           2、poll支持的IO数量没有限制;

           3、select支持windows,poll不支持windows

           4、epoll会将事件和fd绑定,不用再轮询查找就绪的IO事件,时间复杂度较低O(1)

共同:1、select和poll都需要在应用程序和内核之间拷贝数据(将用户传入的数据(fd得数组)拷入到内存空间,然后查询每一个fd对应得的设备状态),都是无差别轮询查找发生就绪的IO事件;

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值