计算机系统应用教程网站

网站首页 > 技术文章 正文

为什么网络 I/O 会被阻塞?I/O 到底是什么?

btikc 2024-10-25 10:51:27 技术文章 7 ℃ 0 评论

为什么网络 I/O 会被阻塞?I/O 到底是什么?

背景

对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务,本文就IO进行论述,如果对你有所学习,那就留下一个关注吧。

I/O 到底是什么

I/O,就是input(输入)/output(输出)。

总结下:I/O 就是指内存与设备之间的数据交互(数据拷贝)。Java.io是大多数面向数据流的输入/输出类的主要软件包。

Java IO 流的整体架构图:

I/O输入和输出

Java 库的IO 类分割为输入与输出两个部分。

输入:用于读取单个字节或字节数组。

输出:用于写入单个字节或者字节数组。

InputStream 的类型

InputStream的功能是标记从不同来源生成输入的类。这些起源地包括(每个都有一个相关的 InputStream 子类):

(1) 字节数组

(2) String 对象

(3) 文件

(4) “管道”

OutputStream 的类型

OutputStream是所有输出字节流的父类,它是一个抽象类。一个字节数组。一个文件;或者一个“管道”。

阻塞含义

访问IO的线程是否会阻塞(或处于等待),线程访问资源,该资源是否准备就绪的一种处理方式。

socket 通信内幕流程

1、创建 socket客户端

首先服务端需要先创建一个 socket。

2、Bind绑定

需要指定一个地址和端口来与这个 socket 绑定一下。

3、listen

调用 listen 方法,让 socket 进入被动监听状态,这样的 socket 才监听到客户端的连接请求。

4、accept

从已完成连接队列中拿到连接进行处理,这个动作就由 accpet 来执行

5、connect

调用connect需要指定远程的address和port进行建连。

这里的两个阻塞点:

  • connect:需要阻塞等待三次握手的完成。
  • accept:需要等待可用的已完成的连接,如果连接队列为空,则被阻塞。

6、read、write

连接建立成功之后,就能开始发送和接收消息了。

read 为读数据,read 读不到数据阻塞等待。

write 为写数据,这个写入也可能会被阻塞。

为什么网络 I/O 会被阻塞?

因为及到的 accept、connect、read、write 这几个操作的时候都可能会发生阻塞。

阻塞会占用当前正在运行的线程,由于阻塞的原因,以前的解决的方案就是建立多个线程, 所以后来就搞个非阻塞套接字, I/O多路复用、信号驱动I/O、异步I/O等等。

Java 共支持5种网络编程模型/IO 模式

1、阻塞I/O

2、非阻塞I/O

3、I/O多路复用

4、信号驱动I/O

5、异步I/O

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表