IO多路复用-select

IO多路复用(网络编程)select

问题:IO多路复用是要干什么?为什么要采用IO多路复用,为什么不采用多进程服务器?或者多线程服务器?

答:IO 多路复用是使用一个线程来检查多个文件描述符(Socket)的就绪状态,如果有文件描述符就绪,则返回,否则阻塞到超时。

IO多路复用,比多线程、多进程好,减少了内存开销和上下文切换的开销。

一、select()函数

1. 函数解释

int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);
//fd_set  是一个结构体,用于描述一张文件描述符表(以位图的方式)
//struct timeval 
struct timeval{
	long tv_sec;//秒
	long tv_usec;//微秒
}//参数
/*
//nfds :最大文件描述符加1(文件描述符集合中)
//readfds 读文件描述符集合
//writefds 写文件描述集合
//exceptfds  文件描述符异常处理表
//timeout 超时时间
//返回值  成功返回监听文件描述符个数,失败返回-1, 0表示监听超时;
*/
void FD_CLR( int fd,fd_set *set);//将文件描述符表的某一位清零
int FD_ISSET(int ffdf,fd_set *set);//判断文件描述符是否有IO操作,是返回1,不是返回0;
void FD_SET(int fd,fd_set *set);//将指定的文件描述符添加到表中
void FD_ZERO(fd_set *set);//清空文件描述符表

2.使用流程

(1)定义一张文件描述符表,进行初始化;
(2)通过select 函数检测文件描述表;
(3)记录需要检测的表,轮询更新表并处理需要操作的文件描述符;

3.缺点:

(1)内核使用轮询方式检测表中描述符是否就绪,文件描述符越多,消耗资源越多;
(2)文件描述符集合使用表最大为1024个文件描述符;
(3) 每次文件描述符集合更新时,重新拷贝到内核中;
(4)结果表会覆盖原始表,select函数实现中,一旦发现就绪的文件描述符就会返回,此时表中未就绪的描述符会被清除,每次都需要重新向新表加入需要检测的文件描述符;

总结:select()函数 将需要监测的文件描述符收集起来交给内核,让内核监控哪一个或者哪几个文件描述符内有数据写入,当一个或者多个文件描述符内有数据时,select()函数会返回有数据写入的文件描述符个数,并置位相应的bitmap表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jun8086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值