请教一个网络通信的概念问题

2021-01-08 11:08:47 +08:00
 Kontinue

在博客上考看到两个概念:

一个是 linux 级别的 io 模型,比如同步阻塞 I/O 、同步非阻塞 I/O 、多路复用 I/O 、信号驱动 I/O 。

一个是程序语言层面的,比如 Java 中的 BIO 、NIO 、AIO 。

我想知道的是这两者之间的联系是什么?是不是 linux io 模型仅仅是一个理论的模型,具体的需要看程序语言是如实现的?还是说是一种依赖关系,比如 java 的 NIO 在 linux 上执行依赖于 os 的多路复用 I/O 模型这样?

2101 次点击
所在节点    程序员
12 条回复
luckyrayyy
2021-01-08 11:16:09 +08:00
依赖关系,最终都要依赖操作系统的实现,比如 AIO Linux 上就不成熟,Windows 才有真正的 AIO,因此语言层面上支持也白搭。
这是我的理解,不保证对噢😯
misaka19000
2021-01-08 11:18:41 +08:00
Java 是一种语言的 API,是对操作系统的 IO 的封装,本质上还是调用了 OS 的接口
opengps
2021-01-08 11:20:32 +08:00
每个地方都有 io,所以 io 这个词很宽泛。有些地方无法多路 IO,比如单个硬盘文件的操作,数据库能多连接实际上是程序做了高效分工共同了一个文件流。
物理上:硬盘有吞吐,网络有吞吐,内存也有吞吐
软件上:一个集合变量也有吞吐(这种往往跟大小和内存 io 有直接关系)
togou
2021-01-08 12:07:20 +08:00
最终还是看 os Java 的 nio 只不过是利用其自己的平台特性 封装成异步 io
carlclone
2021-01-08 12:21:15 +08:00
我也有一个问题,像 epoll 已经减少了大部分的 io 阻塞,那异步 io 解决的是哪里的阻塞
vk42
2021-01-08 12:26:40 +08:00
@carlclone epoll 哪里减少阻塞了?只是减少了轮询的代价。AIO 完全是不同的概念……
carlclone
2021-01-08 12:42:09 +08:00
@vk42 明白你说的,我说的是 epoll 多 socket 的时候不会阻塞在某个未就绪的 socket 上,
carlclone
2021-01-08 12:48:02 +08:00
@vk42 刚刚查了一下异步 io (在整个操作(包括将数据从内核拷贝到用户空间)完成后才通知用户进程) ,就是说即使 epoll 通知 socket 就绪了,去读 socket 时的数据拷贝过程还是阻塞的,所以异步 io 减少的是拷贝过程的阻塞,这样理解对吗
haosamax
2021-01-08 14:15:18 +08:00
NIO 还是需要一个线程去轮询 IO 状态,AIO 有数据操作系统通过回调机制处理
cheng6563
2021-01-08 14:41:01 +08:00
操作系统基本只提供 c 的 Api 。
你去看 Java 里的源码,稍微跟一下就能跟到个 native 方法,比如 FileInputStream,其实就是进入 c 的世界调用操作系统的 API 去了。
xcstream
2021-01-08 18:48:35 +08:00
不知道取什么名字就叫 io
比如 google io 大会
Firxiao
2021-01-11 17:07:18 +08:00
可以了解下 Linux 操作系统的结构, 软件是一层一层调用系统内核的, 所以语言越接近内核(硬件),效率越高.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/742879

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX