Linux14-io多路复用

UDP:单循环服务器,服务器同一时刻只能响应一个客户端的请求

TCP:并发服务器,服务器同一时刻只能响应多个客户端的请求

一、构建TCP并发服务器

让TCP服务端具备同时响应多个客户端的能力。

1.多进程

资源消耗大,同资源平台下,并发量小。

2.多线程

创建线程、进程,比较耗时

3.线程池

提前预创建大量线程,避免任务执行过程中创建线程的耗时


4.IO多路复用

多线程创建线程、进程,比较耗时线程池提前预创建大量线程,避免任务执行过程中创建线程的耗时

优势:节省资源

劣势:不利于处理比较耗时、延时比较长的任务

1.创建文件描述符集合
2.将关注的文件描述符加入到集合
3.等待IO事件到达
4.根据不同的I0事件处理不同的任务

阻塞IO:
            read、recv、fgets、recvfrom
IO多路复用(转接):

 在不创建新的进程和线程的前提下,可以在一个进程
    中同时监测多个IO(fd/sockfd/connfd)

1.select

  • select使用位图管理文件描述符,最多允许同时检测1024个文件描述符(有上限)
  • 文件描述符集合在应用层创建,需要实现应用层和内核层的反复拷贝
  • 需要应用层对集合表进行遍历,寻找到达事件
  • 只能工作在水平触发模式(低速模式),不能工作在边沿触发模式
int select(int nfds,fd set *readfds,fd set *writefds.fd set *exceptfds,stuct timeval *tine out);
select:实现IO多路复用

功能:阻塞等待IO事件,返回事件结果参数:
nfds:关注的最大文件描述符+1

readfds:文件描述符读事件集合表

wiitefils:写事件集合表

exceptfds:其他事件集合表

tineout:超时时间
NULL:不设置超时

返回值:

成功:返回到达的事件个数

失败:-1 

0:超时事件到达但没有返回文件

 void FD_CLR(int fd, fd_set *set);//指定fd清零
 int  FD_ISSET(int fd, fd_set *set);//判断集合里是否有fd文件描述符
 void FD_SET(int fd, fd_set *set);//将fd号描述符置给set
 void FD_ZERO(fd_set *set);//清零   

2.poll

3.epoll

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值