V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
RedBeanIce
V2EX  ›  问与答

[求解] io 到底是什么

  •  
  •   RedBeanIce · 2022-03-07 10:51:54 +08:00 · 2193 次点击
    这是一个创建于 995 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    1 ,我的计网较差

    2 ,我的操作系统理论较差

    3 ,普通 Java 一枚

    我理解的

    1 ,了解一些 Java 的 io 基础,,理解的一般都是网络上的,内核交互已经被封装了。

    2 ,nio 与 netty 有一些理解

    3 ,

    求解

    1 ,io 到底是什么,入门了解可以查看什么资料

    2 ,io 到底是什么,深入了解可以查看什么资料

    24 条回复    2022-03-08 10:10:15 +08:00
    Cabana
        1
    Cabana  
       2022-03-07 11:44:28 +08:00   ❤️ 2
    input/output
    learningman
        2
    learningman  
       2022-03-07 11:45:13 +08:00 via Android
    入门楼上已经帮你入完了,深入的话,你就把你差的那两个补好就好了
    RedBeanIce
        3
    RedBeanIce  
    OP
       2022-03-07 11:46:42 +08:00
    @Cabana
    @learningman
    没有系统的了解,还是不懂
    cheng6563
        4
    cheng6563  
       2022-03-07 11:47:58 +08:00
    IO 就是输入输出啊,常用的要么是对网络输入输出,要么对硬盘输入输出。
    硬盘 IO 不能并发,所以能用就行资料并不太多。
    网络 IO 因为能并发问题就复杂些了。
    你想了解到啥程度?
    2NUT
        5
    2NUT  
       2022-03-07 12:31:21 +08:00
    同步 异步 阻塞 非阻塞

    理论上所有的东西都是 IO

    都是 通讯模型
    0TSH60F7J2rVkg8t
        6
    0TSH60F7J2rVkg8t  
       2022-03-07 12:36:04 +08:00
    i 是眼睛,o 是嘴巴
    cmdOptionKana
        7
    cmdOptionKana  
       2022-03-07 12:44:21 +08:00
    这个要看上下文啊,IO 可以指很多东西。

    而且,也没必要特别研究 IO ,等遇到问题再解决问题,搞具体一点,比抽象学习更高效。
    cpstar
        8
    cpstar  
       2022-03-07 14:01:04 +08:00
    @ahhui 6# 窃以为,一个是嘴一个是...
    Ediacaran
        9
    Ediacaran  
       2022-03-07 14:02:27 +08:00 via iPhone
    Read/Write
    villivateur
        10
    villivateur  
       2022-03-07 14:02:59 +08:00 via Android
    @ahhui o 怎么可能是嘴巴?嘴巴也是 i
    duke807
        11
    duke807  
       2022-03-07 14:06:27 +08:00 via Android
    in 是進,out 是出,加起來就是一進一出,跑起來就是一進一出一進一出…

    順便一提,很多人喜歡 .io 域名,就類似很多人設計 logo 喜歡用 pornhub logo 的配色,同樣的心理。

    見這標題第一反應是 io 口,芯片的管腳。。。
    AllenHua
        12
    AllenHua  
       2022-03-07 14:06:27 +08:00
    不管是 cpu 内部的寄存器还是内存(掉电失去数据),还是永久性的 flash 存储设备(比如 hdd 、ssd ),我所理解,IO 的终点都是往这些存储介质中读和写数据。IO 的过程就不那么重要了,殊途同归。
    Caturra
        13
    Caturra  
       2022-03-07 14:10:50 +08:00
    既然基础差,那么入门的方法就是补回基础。挑一本操作系统看看就理解了
    paradoxs
        14
    paradoxs  
       2022-03-07 14:11:45 +08:00
    直接理解为硬盘存储就行了
    WIN2333
        15
    WIN2333  
       2022-03-07 14:20:06 +08:00
    你需要补补操作系统的知识,就是输入输出,你跟硬盘交互需要输入输出,你的显示器,键盘等等,皆可称为 IO 设备。cpu 执行的是一条条指令,与 IO 设备交互属于特权指令,操作系统需要进入内核态,然后等待 IO 设备响应。Java 里面提到的不同的 IO 模式其实也是指操作系统跟 IO 设备交互式不同的方式,我在补操作系统的知识,有的地方说的可能不对。花点时间补补吧,挺有意思的。
    Leonard
        16
    Leonard  
       2022-03-07 14:21:57 +08:00
    @villivateur #10 嘴巴自己就可以 io
    bigbyto
        17
    bigbyto  
       2022-03-07 14:25:25 +08:00   ❤️ 1
    我尝试回答一下,这问题其实不好解释。I/O 其实就是指输入和输出,它本身的定义是比较抽象的,我贴一段维基百科的定义:

    In computing, input/output (I/O, or informally io or IO) is the communication between an information processing system, such as a computer, and the outside world, possibly a human or another information processing system. Inputs are the signals or data received by the system and outputs are the signals or data sent from it.

    我大概翻译一下:在计算机领域,IO 是指信息系统(比如计算机)和外部世界之间的通信,这个"外部"有可能是人类,或者另外一个计算机。输入(Input)是指系统接收的信号或数据,输出(Output)是指系统发出的信号或数据。
    Ref: https://en.wikipedia.org/wiki/Input/output

    如果用 f 来表示 information processing system ,那么 IO 可以用下面公示表示
    f(I) = O

    通过上面定义可以知道 I/O 就是外部世界跟系统的一种通信,我们日常生活中的 I/O 设备很多,比如鼠标、键盘等都是属于 I/O 设备。而我们平时经常说的,大多是指文件 I/O ,网络 I/O ,它们所指的是程序跟磁盘,网卡之间的通信。
    duke807
        18
    duke807  
       2022-03-07 14:41:51 +08:00 via Android   ❤️ 1
    我再補充一下吧,其實編程領域的 io 和底層 cpu 架構有一定關係。

    arm mips riscv 等 risc 架構的芯片(精簡指令集電腦),ram 、storage 、gpio 等各種 peripheral 都是映射到統一的地址空間( address space ),讀寫對應的地址就可以讀寫 ram 、storage 和各種 peripheral 外設,對於軟件沒有 io 的說法。

    然而,對於 x86 x64 這樣的 pc 機 cpu ,是 cisc 架構(複雜指令集電腦),複雜指令集 很複雜,讀寫 ram 和控制 peripheral 外設要用不同的 cpu 指令,其中訪問 peripheral 各種外設的指令的名字叫做 io 指令,所以後來讀寫硬盤、網絡什麼的,也就稱之為 io 操作了。(而讀寫 ram 不是 io 指令,所以不能稱之為 io 操作。)
    whx
        19
    whx  
       2022-03-07 14:44:08 +08:00 via iPhone   ❤️ 1
    I/O 是一个高层次的抽象,可以理解为程序和外界的通信。

    外界可以是其他程序,也可以是人类。

    任何程序(指有意义的),都是获取输入,产生输出。
    zhujinliang
        20
    zhujinliang  
       2022-03-07 14:50:11 +08:00 via iPhone
    I/O 就是南桥负责的东西
    cpstar
        21
    cpstar  
       2022-03-07 15:04:48 +08:00   ❤️ 1
    你们这么讲下去,不得把计算机体系结构讲一遍啊,LZ 更晕了。当然如果要补充知识,当然还是得补充这些基础知识的,而且 OP 最后两个问题,也确实是科班内容。

    按照冯·诺伊曼体系结构,计算机使用存储计算模型,存储单元向计算单元提供数据,计算完的数据再回到存储单元,这便是 input 和 output ,然后理论上的存储单元在实践中,成为了很多东西,比如内存、硬盘、网络,比如键盘、鼠标、显示器等等。你写一个程序,甚至程序本身,就是先从外部存储器调入到内部存储器中,再加载到核心计算单元的高速缓存中,然后加加减减乘乘除除,以及逻辑运算,得出来一个结果,再一级一级返回,最终用一些东西呈现出来。

    JAVA 中的 IO ,封装就比较完善了,但是这个完善是基于 JAVA 核心的,包括了很多 JAVA 不能做到的需要用 C 做到的 IO 内容,以及在此之上又用 JAVA 二次封装的很多东西,再以及一些组织和个人基于此再再次封装的更多功能的 API 包。
    sflypig
        22
    sflypig  
       2022-03-07 18:25:51 +08:00   ❤️ 1
    所有运行的程序本质都是=指令+数据,cpu 只会去执行预定义好的机器指令,根据机器指令去运算数据。所有的数据都需要从内存读取到 cpu 内部的寄存器才能被 cpu 的运算器运算。

    所以运行的程序的数据起码需要在内存中,cpu 才会通过指令可以直接读取访问到。而我们所知,现实的数据都是存在硬盘,或者经过网络传输。

    从硬盘读取数据到内存和从内存写到数据到磁盘 就是磁盘 IO 的过程,从网络接口读取数据到内存和从内存写数据到网络接口 就是网络 IO 的过程,站在内存的视角,这两者对内存来说就是数据 INPUT/OUTPUT 。

    所以 IO 到底是什么,它是一种行为,就是读取和写入数据到某个地方。关于这种行为如何实现,本质还是接口和指令的一层层封装,比如你的程序调用 netty 之类的网络库,库里最后会调用操作系统提供的 io 接口,操作系统提供的 io 接口会翻译成机器指令操作硬件。

    --------
    程序调用 netty 之类的网络库,内部发生的事情这个应该看 netty 的代码
    库里最后会调用操作系统提供的 io 接口,之后发生什么事情,建议学习大学计算机课程 操作系统
    操作系统提供的 io 接口会翻译成机器指令操作硬件,如何翻译成机器指令操作硬件,建议学习大学计算机课程 计算机组成原理
    night98
        23
    night98  
       2022-03-08 00:09:13 +08:00
    一个输入,一个输出,
    啥意思,输入就是从某个地方拿进内存,输出就是从内存拿到别的地方去,你大致就这么理解就行了,什么网络 io 文件 io 基本上都是这个套路,键盘和显示器差不多也是这么个套路
    zmqiang
        24
    zmqiang  
       2022-03-08 10:10:15 +08:00
    看到已经有很多专业的解释了,我这边提供一个比喻:

    我们日常的程序指令是通过 CPU 执行的,就像是显示工厂里的一个车间,按照操作步骤进行产品的组装工作。一些组装的原料和成品,放在工厂自己的仓库里,这个类似计算机里的硬盘。还有一些原料和成品是通过外面的公司提供的,这个就类似计算机里的网络。

    而 IO ,指的就是车间和本地仓库或者外面公司交互的过程,也就是现实中的物流系统。最大的特点是慢。nio 、netty 这些概念相当于一个专门搞物流的人,存在的意义就是怎么样合理安排物流,尽量减少对车间工作的影响。

    IO 本身不是一个实体,也不是一个复杂概念,只是对一个特定过程的称呼,我感觉本身没什么好了解。但是如何慢的 IO 和快的 CPU 进行统筹,降低 IO 对系统的影响,这里面是有很多技巧的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3065 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 113ms · UTC 14:36 · PVG 22:36 · LAX 06:36 · JFK 09:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.