I/O模式
Description
网络编程
网 络编程,就是在一定的协议下,实现两台计算机的通信的技术
通信一定是基于软件结构实现的:
- C/S 结构 :全称为 Client/Server 结构,是指客户端和服务器结构,常见程序有 QQ、IDEA 等软件
- B/S 结构 :全称为 Browser/Server 结构,是指浏览器和服务器结构
两种架构各有优势,但是无论哪种架构,都离不开网络的支持
网络通信的三要素:
-
协议:计算机网络客户端与服务端通信必须约定和彼此遵守的通信规则,HTTP、FTP、TCP、UDP、SMTP
-
IP 地址:互联网协议地址(Internet Protocol Address),用来给一个网络中的计算机设备做唯一的编号
-
IPv4:4 个字节,32 位组成,192.168.1.1
-
IPv6:可以实现为所有设备分配 IP,128 位
-
ipconfig:查看本机的 IP
- ping 检查本机与某个 IP 指定的机器是否联通,或者说是检测对方是否在线。
- ping 空格 IP地址 :ping 220.181.57.216,ping www.baidu.com
特殊的IP地址: 本机IP地址,127.0.0.1 == localhost,回环测试
-
-
端口:端口号就可以唯一标识设备中的进程(应用程序)。端口号是用两个字节表示的整数,取值范围是 0-65535,0-1023 之间的端口号用于一些知名的网络服务和应用普通的应用程序需要使用 1024 以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败,报出端口被占用异常
利用协议+IP 地址+端口号三元组合,就可以标识网络中的进程了,那么进程间的通信就可以利用这个标识与其它进程进行交互
参考视频:https://www.bilibili.com/video/BV1kT4y1M7vt
通信协议
网络通信协议:对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信
通信是进程与进程之间的通信,不是主机与主机之间的通信
TCP/IP协议:传输控制协议 (Transmission Control Protocol)
传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流,每一条 TCP 连接只能是点对点的(一对一)
- 在通信之前必须确定对方在线并且连接成功才可以通信
- 例如下载文件、浏览网页等(要求可靠传输)
用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,不可靠,没有拥塞控制,面向报文,支持一对一、一对多、多对一和多对多的交互通信
- 直接发消息给对方,不管对方是否在线,发消息后也不需要确认
- 无线(视频会议,通话),性能好,可能丢失一些数据
Java模型
相关概念:
- 同步:当前线程要自己进行数据的读写操作(自己去银行取钱)
- 异步:当前线程可以去做其他事情(委托别人拿银行卡到银行取钱,然后给你)
- 阻塞:在数据没有的情况下,还是要继续等待着读(排队等待)
- 非阻塞:在数据没有的情况下,会去做其他事情,一旦有了数据再来获取(柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理)
Java 中的通信模型:
-
BIO 表示同步阻塞式通信,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善
同步阻塞式性能极差:大量线程,大量阻塞
-
伪异步通信:引入线程池,不需要一个客户端一个线程,实现线程复用来处理很多个客户端,线程可控
高并发下性能还是很差:线程数量少,数据依然是阻塞的,数据没有来线程还是要等待
-
NIO 表示同步非阻塞 IO,服务器实现模式为请求对应一个线程,客户端发送的连接会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求时才启动一个线程进行处理
工作原理:1 个主线程专门负责接收客户端,1 个线程轮询所有的客户端,发来了数据才会开启线程处理
同步:线程还要不断的接收客户端连接,以及处理数据
非阻塞:如果一个管道没有数据,不需要等待,可以轮询下一个管道是否有数据
-
AIO 表示异步非阻塞 IO,AIO 引入异步通道的概念,采用了 Proactor 模式,有效的请求才启动线程,特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用
异步:服务端线程接收到了客户端管道以后就交给底层处理 IO 通信,线程可以做其他事情
非阻塞:底层也是客户端有数据才会处理,有了数据以后处理好通知服务器应用来启动线程进行处理
各种模型应用场景:
- BIO 适用于连接数目比较小 且固定的架构,该方式对服务器资源要求比较高,并发局限于应用中,程序简单
- NIO 适用于连接数目多且连接比较短(轻操作)的架构,如聊天服务器,并发局限于应用中,编程复杂,JDK 1.4 开始支持
- AIO 适用于连接数目多且连接比较长(重操作)的架构,如相册服务器,充分调用操作系统参与并发操作,JDK 1.7 开始支持
I/O
IO模型
五种模型
对于一个套接字上的输入操作,第一步是等待数据从网络中到达,当数据到达时被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区
Linux 有五种 I/O 模型:
- 阻塞式 I/O
- 非阻塞式 I/O
- I/O 复用(select 和 poll)
- 信号驱动式 I/O(SIGIO)
- 异步 I/O(AIO)
五种模型对比:
- 同步 I/O 包括阻塞式 I/O、非阻塞式 I/O、I/O 复用和信号驱动 I/O ,它们的主要区别在第一个阶段,非阻塞式 I/O 、信号驱动 I/O 和异步 I/O 在第一阶段不会阻塞
- 同步 I/O:将数据从内核缓冲区复制到应用进程缓冲区的阶段(第二阶段),应用进程会阻塞
- 异步 I/O:第二阶段应用进程不会阻塞