【Netty 系列】第一章: I/O 模式

1 篇文章 0 订阅

系列文章目录

  • 第一章: I/O 模式

前言

         随着web2.0 的到来,用户普及率大大提高了,用户群体集体增长,维护用户需要大量的服务器。如何突破单机性能局限,是高性能网络编程所必须要直面的问题。Netty 作为高性能 Java 网络通信的底层框架,是必须要掌握的技能之一。这之前我们需要学习一些基础知识。IO

一、用户空间和内核空间

为了保证操作系统的稳定性和安全性,一个进程的地址空间划分为 用户空间(User space) 和 内核空间(Kernel space ) 。

用户空间的程序不能直接访问内核空间。当想要执行 IO 操作时,由于没有执行这些操作的权限,只能发起系统调用请求操作系统帮忙完成。

因此,用户进程想要执行 IO 操作的话,必须通过 系统调用 来间接访问内核空间。

我们在平常开发过程中接触最多的就是 磁盘 IO(读写文件) 和 网络 IO(网络请求和响应).

从应用程序的视角来看的话,我们的应用程序对操作系统的内核发起 IO 调用(系统调用),操作系统负责的内核执行具体的 IO 操作。也就是说,我们的应用程序实际上只是发起了 IO 操作的调用而已,具体 IO 的执行是由操作系统的内核来完成的。

当应用程序发起 I/O 调用后,会经历两个步骤:

  1.  内核等待 I/O 设备准备好数据;
  2. 内核将数据从内核空间拷贝到用户空间。

常见的IO模型:

UNIX 系统下, IO 模型一共有 5 种: 同步阻塞 I/O、同步非阻塞 I/O、I/O 多路复用、信号驱动 I/O 和异步 I/O。

二、阻塞I/O 模式:

阻塞 I/O 模式是最普遍使用的 I/O 模式。大部分程序使用的都是阻塞模式的 I/O 。

解释:

用户程序调用read 函数获取网络数据的时候,网卡首先要获取数据,然后把数据拷贝到内核空间中。此时内核才会返回read 的读取,把数据拷贝到用户空间中。这个过程中,用户程序一直是阻塞的。

 优劣:

读取数据的时候,调用完read,就可以一直等待着,等待数据来了处理即可。省事

一个线程对应一个连接,一直被阻塞,想要做其他的,就要开新的线程,浪费资源。

三、非阻塞模式 I/O

当用户程序请求的 I/O 操作不能够马上完成,内核会马上返 回一个错误给用户程序。

解释:

当用户程序进行read函数请求的时候,因为内核没有网络数据,所以内核马上返回一个错误,暂无数据。第三次请求的时候,一个数据已经被拷贝到内核空间,返回给用户程序,用户程序就可以对数据进行处理。在前两次的请求中,用户程序是不阻塞的,但是在内核拷贝数据到用户程序的时候,是需要阻塞的。

优劣:

  • 在没数据的时候,不会一直等待,直接返回错误,告知用户程序暂无数据。如果read 还有其他的事情可以做,可以先去处理。

  • read 反复的请求;相等于使用一个循环来不停的请求是否有数据可以读取。这是一个及其浪费CPU资源的操作。

四、I/O 多路复用:

在使用 I/O 多路技术的时候,我们调用 select()函数和 poll()函数,在调用它们的时候 阻塞,而不是我们来调用 recvfrom(或 recv)的时候阻塞。

解释:

用户程序使用select 函数,系统没有数据,阻塞中。有数据后,select 函数会返回一个文件描述符,用户程序会使用read 去请求数据,等待数据拷贝内核空间中,然后返回,从内核向用户空间拷贝。此时是阻塞中。

优劣:

和阻塞I/O 相比,I/O 多路复用没啥高明之处呀,还要多使用一个函数。其实多路复用的优点在于它能同时等待多个文件描述符,只要任意一个准备完成,即可开始读取数据。

五、信号驱动 I/O 模式:

使用信号,让内核在文件描述符就绪的时候使用 SIGIO 信号来通知我们。我们将这种模式称为信号驱动 I/O 模式。

解释:

用户程序请求后,系统调用会立即返回,然后用户程序可以做其他的事情;当系统的数据准备好后,会发送一个SIGIO 通知,用户程序就可以接着干了。但是在read的时候,还是会阻塞的。

 优劣:

信号I/O 可以说是异步的。程序进行I/O操作时,内核会立即返回给程序结果。程序就可以去做其他的操作,I/O结束后,内核告诉程序,程序就可以做自己的事情。极大的提高了cpu 的利用率。

可是,因为我们在开发中大部分用的都是Tcp协议,而Tcp 协议的socket 可以产生的信号事件有7种之多,所以用户程序无法区分发送的信号到底代表着什么,所以,很遗憾它我们也无法使用。除非你用的是UDP协议。

六、异步 I/O 模式:

信号I/O,在内核拷贝数据到用户空间的时候,还是阻塞的。我们想要个纯异步的。

解释:

就是说,用户程序只需要告诉内核,我需要数据,就返回了。然后等到内核把数据拷贝好了给用户程序后,会告诉用户。好了。

 优劣:

        非常强的一种I/O模式,唯一的缺点就是目前Linux 对异步I/O 支持不足,而我们的服务器大多部署在Linux 上。

        Windows 实现了异步I/O,如 AIO,就是异步I/O。


总结

主流是 I/O 多路复用。

参考资料:

  • 《UNIX网络编程》
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值