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