高性能服务器————高性能服务器之IO复用

1.为什么要使用IO复用?
在很多文章中都能够看到IO复用的讲解但是很少看到过,对IO复用使用原因的讲解,和应用场景的说明。
(1)在不使用线程的情况下,独立处理每个文件描述符,单个进程无法同时在多个文件描述符上阻塞,只有在这些描述符处于就绪状态(关于就绪状态,下文会说明)时,才能进行对文件描述符的操作(IO操作),否则会导致进程阻塞在IO操作上(此处的IO均为阻塞IO)。例如:发送了read()调用,但是还没有数据可读,此时进程阻塞,无法对其他文件描述符提供服务。
(2)文件描述符与IO总是关联的(如:管道描述符和管道的IO操作是关联的),此时对文件描述符的监控将更有利于处理IO操作,提高效率。
(3)就网络应用程序而言,可能同时打开多个文件描述符(这里指socket),当一个socket处于阻塞时,后续的socket也无法获取到服务(单线程/单进程)。
注意:
上述的原因都是基于单线程、单进程和阻塞IO的,那么可以通过多线程、多进程、非阻塞IO来替代,不过IO复用有点也是它们无法替代的,这就取决与应用场景了。
IO复用对比与非阻塞IO:
非阻塞IO:应用发送IO请求时,使用非阻塞IO便会立即返回,而不是阻塞,此时只需要做连续随机发送IO操作,直到某个打开的文件描述符可以执行IO操作。
形如:

int fd = open(.....);
//连续随机发送IO操作
while(1)
{
	int read_sz = read(fd,buf,1024);
	if(read_sz>0)
		break;
}

IO复用:将所有关心的文件描述符集中处理,并将文件描述以及关心的事件监控起来,此时,如果文件描述符没有发生改变(处于有绪状态)时,进程处于睡眠状态,当有一个或多个文件描述符发生改变(可进行IO操作)时,唤醒进程。
非阻塞IO与IO复用的对比:
非阻塞:采用连续随机发送IO操作,cpu资源未释放
IO复用:采用进程睡眠的方式,当有文件描述符发生状态改变时,唤醒进程。对于进程睡眠阶段,cpu资源是释放了的
从这个角度来对比,IO复用是有必要的,而且能够更好的利用cpu资源,此外cpu资源的宝贵就不用多说了。
多线程、多进程与IO复用的对比:
仅从一点便可知晓IO复用的必要性,1.进程的开销就不必多说了,而IO复用的开销还是相对较小的;2.线程虽比进程的开销较小一点,但总归还是比较于IO复用要大一点。3.线程和进程的创建是有上限的,而IO复用在单线程单进程的情况下便能够处理,当要对更多的文件描述符提供服务时,仅凭多进程、多线程的一己之力是不够的,此时结合IO复用就呢能够更好的解决问题。总之,到底使用那个解决方案会更好点,哪得要根据具体的情况,具体分析,这里就不再赘言了。
2.什么是IO复用?
相信通过上面的介绍我们对IO复用有了一定的了解,那么我们在这就说说什么是IO复用吧。
IO复用: 同时监控(监听)多个文件描述符,只将这些文件描述符中发生状态改变的(处于就绪状态的,关于就绪,下面会细说)的文件描述符返回给用户,有用户来对这些文件描述符进行IO操作。
文件描述符处于就绪状态的条件:
就绪:即文件描述符可读、可写或出现异常。
以下以socket为例:
socket可读的情况:
1.socket的内核接收缓冲区中字节数大于或等于低水位标志SO_RCVLOWAT时,进程可以无阻塞的读,并且read返回值大于0。
2.socket通信对端关闭连接。socket读返回0。
3.socket上有新连接请求。
4.socket上有未处理的错误。
socket可写的情况:
1.socket的内核发送缓冲区中字节数大于或等于低水位标志SO_SNDLOWAT时,进程可以无阻塞的写,并且write返回值大于0。
2.socket的写操作被关闭,执行写操作触发一个SIGPIPE信号。
3.socket使用非阻塞connect连接失败、成功或超时之后。
4.socket上有未处理的错误。
**低水位标志:**实质是一个触发可读/可写的标准(或者说约定),假设接收的低水位标志为64个字节,那么接收缓冲区有64个字节(或大于),此时描述符就绪(可读)。
3.IO复用的应用场景:
1.客户端程序需要同时处理多个socket。如:非阻塞的connect请求。
2.客户端程序要同时处理用户输入和网络连接。
3.服务器同时处理TCP和UDP请求。
4.服务器要监听多个端口,或处理多种服务。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值