高性能服务器程序框架1——I/O模型

本文深入探讨了Linux下的五种I/O模型:阻塞I/O、非阻塞I/O、I/O复用、信号驱动I/O及异步I/O。详细讲解了各种模型的工作原理,如何提高程序效率,以及它们在实际应用中的角色。

在学习Linux高性能服务器程序框架时,学到了I/O模型。

Linux下的五种I/O模型:

  • 阻塞I/O(blocking I/O)
  • 非阻塞I/O (nonblocking I/O)
  • I/O复用(I/O multiplexing)
  • 信号驱动I/O ((SIGIO)signal driven I/O )
  • 异步I/O (asynchronous I/O

关于同步与异步,阻塞与非阻塞的概念,在我以前的博客里面有详细的介绍,戳这里啦

1. 阻塞I/O

进程会一直阻塞,直到数据拷贝完成

针对阻塞I/O执行的系统调用可能因为无法立即完成而被操作系统挂起,直到等待的事件发生为止。

比如,客户端通过 connect 向服务器发起连接时,connect 将首先发送同步报文段给服务器,然后等待服务器返回确认报文段。如果服务器的确认报文段没有立即到达客户端,则 connect 调用将被挂起,直到客户端收到确认报文段并唤醒 connect 调用。

socket 的基础 API 中,可能被阻塞的系统调用包括 accept、send、 recv 和 connect。

如下图:在调用 recv(recvfrom) 函数时,发生在内核中等待数据和复制数据过程。

2. 非阻塞I/O

非阻塞I/O执行的系统调用则总是立即返回,而不管事件是否已经发生。

如果事件没有立即发生,这些系统调用就返回-1,和出错的情况一样。此时我们必须根据 errno 来区分这两种情况。

对 accept、send 和 recv 而言,事件未发生时 ermo 通常被设置成 EAGAIN (意为“再来一次”),或者EWOULDBLOCK ( 意为“期望阻塞”);对 connect 而言,erno 则被设置成 EINPROGRESS (意为“在处理中”)。

如下图:

很显然,我们只有在事件已经发生的情况下,操作非阻塞I/O (读、写等),才能提高程序的效率。因此,非阻塞I/O通常要和其他I/O通知机制一起使用,比如I/O复用和SIGIO信号。

3. I/O复用

I/O复用是最常使用的IO通知机制。

I/O复用指应用程序通过I/O复用函数向内核注册一组事件,内核通过IO复用函数把其中就绪的事件通知给应用程序。

Linux 上常用的I/O复用函数是 select、poll 和 epoll wait 。需要指出的是,I/O复用函数本身是阻塞的,它们能提高程序效率的原因在于其具有同时监听多个I/O事件的能力。

如下图:

4. 信号驱动I/O

两次调用,两次返回 

SIGIO信号也可以用来报告I/O事件。我们可以为一个目标文件描述符指定宿主进程,那么被指定的宿主进程将捕获到SIGIO信号。这样,当目标文件描述符上有事件发生时,SIGIO 信号的信号处理函数将被触发,我们也就可以在该信号处理函数中对目标文件描述符执行非阻塞I/O操作了。

如下图:

5. 异步I/O

数据拷贝的时候进程无需阻塞

用户可以直接对I/O执行读写操作,这些操作告诉内核用户读写缓冲区的位置,以及I/O操作完成之后内核通知应用程序的方式。

异步IO的读写操作总是立即返回,而不论I/O是否是阻塞的,因为真正的读写操作已经由内核接管。

也就是说,同步I/O模型要求用户代码自行执行I/O操作(将数据从内核缓冲区读入用户缓冲区,或将数据从用户缓冲区写入内核缓冲区);而异步IO机制则由内核来执行I/O操作(数据在内核缓冲区和用户缓冲区之间的移动是由内核在“后台”完成的)。

可以这样认为,同步I/O向应用程序通知的是I/O就绪事件,而异步I/O向应用程序通知的是I/O完成事件。Linux 环境下,aio.h 头文件中定义的函数提供了对异步I/O的支持。

如下图:

 

注:文中5张图片均来自51CTO博客作者niche白。

传送门:

            高性能服务器程序框架2——事件处理模式

           高性能服务器程序框架3——并发模式

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值