5-输入输出系统IO

【README】

1.本文总结自B站 《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐;


【1】 IO概述


【1.1】输入输出系统的发展概况

 

 通道(通道是netty的io多路复用的底层原理,需要重点了解):

  • 可以看做是一个小型的功能更强的DMA控制器;能够执行通道程序,具有自己的指令系统; 通过执行通道程序,可以连接通道上的IO设备与主机直接联系;

【1.2】输入输出系统组成

1)IO指令

  • 操作码:类似于标志,标识该条指令为IO指令;
  • 命令码:io命令,表示对io设备做什么操作;
  • 设备码:io设备地址,或io设备中的寄存器地址(io端口);

3)通道:

  • 小型DMA处理器; 能够实现IO设备与CPU间的信息传送;通道有自己的控制器,存储器; 通道执行通道指令; 通道下面可以连多个子通道;每个子通道可以连接设备控制器;每个设备控制器还可以连接多个设备;

硬件:

  • 设备通过接口连接到总线上,和cpu完成信息交换;
  • 如果是通道的话,那设备连接设备控制器,设备控制器连接通道,通道连接子通道;

【1.3】 IO设备与主机的联系方式

统一编址: io设备地址,看做是内存地址的一部分;

4)联络方式:

方式1:立即响应,如led灯;  
方式2: 异步工作采用应答信号;
Cpu与IO接口间采用并行传输;步骤如下(输出):

  • 步骤1:io接口(端口)把数据准备好了后,就发送 ready信号通知io设备说数据准备好;
  • 步骤2: io设备接收到信号后,从io接口中读取数据并给出应答信号(strobe-闪光或选通脉冲);
  • 若是输入的话,则 IO接口(端口)的缓冲器一旦空了,则发送ready信号给io设备;io设备收到信号后,发送数据给io端口,并发送应答信号(strobe);io端口把数据传输给cpu;

方式3: 同步工作采用同步时标:

  • 某时间点,必须开始某项工作;
  • 某时间点,必须结束某项工作;

5)IO设备与主机的连接方式

连接方式1:

  • 辐射式连接 == 分散连接; 即增加一个外设,主机或cpu就会增加一套io控制线路;成本非常高

连接方式2:

  • 总线连接;可移植性高;


 【1.4】IO设备与主机信息传送的控制方式(非常重要*)

  • 程序查询方式:cpu与外设采用串行方式工作 ;
  • 程序中断方式: cpu与IO设备采用部分并行工作;
  • DMA方式: 把cpu进一步从数据输入输出中解放出来,使得外部设备和内存间可以直接建立连接,由DMA控制器或DMA接口直接控制 外部设备与内存间的数据交换 ;

1)程序查询方式:

在等待过程中,cpu处于原地踏步等待状态;大致过程为:

  • cpu向外设发请求读取数据;
  • 外设准备好数据后通知cpu取数据(在外设准备数据期间,cpu一直等待)
  • cpu取数据到自身寄存器;
  • cpu把寄存器的数据写入内存;(但在外设准备数据的时候,cpu一直在等待,造成cpu效率非常低下);

尽管cpu比较快,但外设准备数据比较慢;


2)程序中断方式:

2.0)对程序查询方式进行改进:

  • 在io设备在准备数据时,cpu不会等待(不查询);
  • 只有当外部设备与内存间开始进行信息交换的时候,cpu才会暂停现行程序;然后为输入输出进行服务;

2.1)中断方式过程:

  1. Cpu 发出启动io设备指令后, cpu继续执行原来的程序;
  2. Io设备接收到输入或输出操作命令,然后开始准备数据;(期间cpu没有等待)
  3. 当io设备准备好接收数据或读取的数据后;
  4. io设备向cpu提出一个中断请求;
  5. 让cpu停止当前程序的执行; 转而和io设备进行数据交换;

2.2)上图中表示:

  1. cpu执行第k条指令过程中,收到了外部设备已经准备好的中断请求信号;
  2. cpu执行完第k条指令后,把程序现场(K+1条指令地址)保存;(注意,cpu必须是执行完第k条指令后才响应中断)
  3. 然后跳转到中断服务程序;通过跳转到中断服务程序来完成数据的输入输出操作;
  4. 执行完中断服务程序后,又回到之前的程序现场继续执行(执行K+1条指令);

2.3 在整个过程中,在外设准备阶段,cpu没有踏步等待;

  • 这种方式可以使得 cpu与io部分的并行工作(cpu没有参与外设准备阶段,但参与了数据传输);

2.4)缺点

  • 因为cpu保存程序现场,恢复程序现场是需要执行额外指令的,比如10几条指令; 如果传输的数据量非常小,如1个字节,耗费的成本是多执行10几条保存与恢复现场指令,那么cpu利用率就不高

2.5)小结

上述两种方式的数据io都需要cpu来参与; cpu架起了 外设与内存间的信息传输的桥梁;能不能不经过cpu来进行数据传输,这就引入了DMA


3)DMA方式

3.0)dma方式简介:

  • 内存与io设备之间通过DMA控制器进行数据交换, 完全不需要cpu的参与,不需要程序中断;
  • 但DMA控制器需要用到 地址总线,数据总线,控制总线;
  • 如果DMA使用了以上总线,则cpu需要让出这些总线控制权给DMA控制器(周期挪用的意思)

3.1) dma方式过程

  • 步骤1:Cpu执行主程序,在主程序中,碰到了io指令;
  • 步骤2:Cpu发出启动io指令;cpu继续执行自己操作;
  • 步骤3:Io设备在dma控制器的控制下完成数据准备;
  • 步骤4:当数据准备好以后,由DMA控制器发出DMA请求,占用总线使用权;占用一个存取周期,利用这个周期实现 外设与内存间的数据交换;

3.2)缺点:在这个存取周期中,cpu无法使用总线,无法访问内存
3.3)但是

  • 现代cpu并不是每执行一条指令就取一条指令,指令是可以预取的
  • 在指令执行之前,可能若干条指令已经被预取到指令缓存中了;
  • 只要这些指令不需要访问内存;
  • 那么cpu就可以利用指令缓存中的指令和数据缓存中的数据继续执行主程序中的指令;
  • 那么在这一个存取周期中,cpu也是可以并行操作的;(并行效率取决于指令是否访问内存更加确切的说,cpu是否使用总线,如不使用总线,则cpu执行指令,dma控制器利用总线完成数据io,两者相互独立不影响);

补充:通道结构方式,IO处理机方式,参考其他材料;


 三种方式下的cpu工作效率比较

在io数据传输场景下,推荐使用dma控制器方式进行io传输;


【2】 外部设备

 


【2.1】 概述

机机通信设备,如网卡;


【2.2】 输入设备

补充:键盘字母传输给cpu的过程

  • 步骤1:把若干键排列成矩阵,用计数器经过行译码,列译码后,对键盘进行扫描;确定是哪个键被按下了;
  • 步骤2:一旦扫描到被按下的键,则计数器可以停止;同时把计数器的输出作为 rom 的输入地址;这个rom就保存了键盘上每个键的 ascii 码; cpu通过中断方式可以读入这个ascii码;
  • 步骤3:cpu读入指令,经过一段时间延迟后,可以输入到中断控制装置来清除中断标记;可以用于再一次启动计数器,使计数器可以再一次对键盘进行扫描;为下一个字符的输入做准备; 

【2.3】输出设备

 


【2.4】其他


【3】 IO 接口

【3.1】 IO接口概述

为什么要设置接口(端口,或编址为内存地址或其他地址)?

  • 1)采用总线来连接外部设备与cpu;cpu通过地址来确认是和哪个设备传输;接口有地址(端口),可以实现设备选择;
  • 2)接口实现数据缓冲; 不同外设速度不同,如硬盘快,但键盘慢;
  • 3)Cpu与接口间采用并行传输,一次传输1个字或1个字节;但接口与外部设备间可能采用串行传输,一个bit一个bit的传;数据要在接口当中完成组装或拆解,以便做格式转换;
  • 4)电平转换: cpu与外部设备工作的电平不一致,需要接口来完成转换;
  • 5)传送控制命令:cpu把控制命令传输到接口,由控制命令来控制外设来工作 ;
  • 6)接口中有一些状态标志,用于标识外设是忙,还是闲; 外部设备是否有中断请求 ?

【3.2】接口的功能和组成

 

1)总线包括:

  • 设备选择线(设备地址或端口地址);
  • 数据线(完成数据的输入和输出);
  • 命令线(cpu命令,控制外设);
  • 状态线(反应外设是忙,还是准备,还是已完成); 

2)外部设备接口的功能和组成

设备状态标记由一些列的触发器来完成。如下:

  • 完成触发器 D;
  • 工作触发器 B;
  • 中断请求触发器INTR;(设备准备好以后,主动向cpu提出中断请求)
  • 屏蔽触发器 MASK ;(接口可能有中断请求,但是否允许它向主机提出中断请求,要看设备中断请求的重要性,因此可以屏蔽中断请求)
  • 如果 屏蔽触发器=1,那么尽管外设已经完成了工作,但仍然不能向cpu发出中断请求,因为cpu当前所处理工作的重要性比这次 io操作要高;

3)IO接口的基本组成

命令译码器:通过对命令译码,才知道cpu是要输入,还是输出还是其他操作;


【3.3】 接口类型


【4】 程序查询方式

详细内容参见本文【1.4】程序查询方式

 

检查状态标记: 测试指令;
准备就绪: 转移指令;
交换数据: 传送指令; 输入输出指令;访存指令;

设置计数器的值: 要传送的字的个数;每传输一个字,就减1;

 

  • 触发器B(BUSY信号):标记B为1,表示设备开始工作 ;设备处于忙的状态;
  • 触发器D(READY信号):标记D为0,表示数据没有准备好;数据是否准备好的信号;数据准备好后,标记D设置为1;;
  • DBR:数据缓冲寄存器;

【5】 程序中断方式

详细内容参见 本文【1.4】程序中断方式

1)中断定义

  • cpu在执行程序过程中,如果发生意外事件,cpu要中断当前程序的执行转而处理意外事件;通过执行中断服务程序的方式来处理意外事件;

如: cpu在执行第k条指令的过程中,外设通过中断请求线向cpu发送中断请求;cpu在执行完第k条指令后,会去查询是否有中断请求;如果有,能不能进行响应; 如果可以响应,则cpu执行中断服务程序处理中断请求;

【5.1】中断的概念

【5.2】IO中断的产生

 

【5.3】 程序中断方式的接口电路 

 

1)中断请求触发器:;
中断屏蔽触发器: ;
2)排队器:同一个时刻,向cpu发出中断请求的有多个设备;需要对中断请求按照优先级进行排序;
3)中断向量地址形成部件:;

 【排队器】

INTR1为1,则后面INTR(I,I>1)的为0;

确定了中断源之后, 下一步是找到中断服务程序的入口地址;因为cpu是执行中断服务程序来处理意外事件(中断)的;

3)中断向量地址形成部件

中断号:

  • 如8086cpu支持256个中断,那中断号可以编为0~255 ;

中断向量:

  • 理解为中断服务程序的入口地址; 在x86cpu中,可以理解为中断服务程序的段地址和偏移量 组成的向量;也指程序状态字; 如cpu发生中断时,一些非体系结构寄存器或程序状态寄存器,这些寄存器指令无法进行读取,那么就把它集成为一个字,这个字称为程序状态字;

向量地址:

  • 中断向量所属指令所在的内存地址; 如中断服务程序的入口地址,所保存的内存单元地址;或跳转指令所在的内存地址;cpu通过跳转指令转到中断服务程序(这时,向量地址指的是跳转指令所在内存地址,跳转指令内部再保存了入口地址);如向量地址为 12H;存储的指令为 JMP 200 ;而200是入口地址;

4)程序中断方式接口电路的基本组成


 【5.4】IO中断处理过程

 

地址线的设备选择信号和启动命令一并达到,才会启动外设接口;

 


【5.5】中断服务程序流程

2)多重中断:

  • 表示的是中断嵌套;
  • 即 cpu正在执行中断服务程序1; 这时,又有优先级更高的中断2产生;则cpu保存中断服务程序1的执行现场,然后转而执行中断服务程序2;这就叫嵌套;

3)单重中断和多重中断的服务程序流程

中断隐指令:

  • 并不是一条实际指令,它指定的是中断处理的一系列指令的集合;

4)主程序和服务程序抢占CPU示意图

 

cpu响应中断过程如下:

  • 步骤1:Cpu向io设备发送启动外设请求;
  • 步骤2:io设备启动,准备数据;
  • 步骤3:io设备准备好数据后,向cpu发送中断请求;
  • 步骤4:cpu执行完指令后,查看是否存在中断请求;若有,则保存现场,转而执行中断服务程序;
  • 步骤5:cpu执行完中断服务程序后,恢复程序现场,继续执行主程序;

 【6】DMA方式(非常重要*)

详情可以参见 本文 【1.4】-dma方式

【6.1】DMA方式特点

1)DMA和程序中断两种方式的数据通路比较

 

1.11)引入DMA的背景

  • 因为中断方式中,当io设备把数据准备好之后,cpu会响应io设备的中断请求;暂停执行主程序,保存现场,然后转而执行中断服务程序;影响了主程序的执行效率
  • 所以io设备的数据传输还是会影响cpu的执行;

1.2)DMA不一样: 把cpu从io数据传输的过程中解放出来;

  • 主存和io设备间的数据传输直接通过DMA控制器,而不是cpu;
  • 但DMA控制器需要占用总线,而此时cpu不能使用总线,无法访问内存;
  • 所以DMA还是会影响cpu的执行;(但cpu可以预取指令,如果执行的指令不访问内存或不使用总线,则影响比较小)

2)DMA与主存交换数据的三种方式 :

方式1: 停止cpu访问主存;

该方式的问题在于, DMA工作期间,cpu无法访问内存;

方式2:周期挪用(推荐*);

方式3:DMA与 CPU交替访问(不推荐,效率低)

 DMA与cpu交替使用内存,但实用性不强;


【6.2】 DMA接口功能与组成

1)DMA 接口功能

 

  • 步骤1:DMA向cpu申请总线和内存的控制权;
  • 步骤2:总线和内存控制器的转交;
  • 步骤3: 管理系统总线,控制数据传送; 是输入还是输出;
  • 步骤4:;
  • 步骤5:;

2)DMA 接口组成

2.1)寄存器列表

  • 地址寄存器AR:给出传输数据的内存地址;
  • 计数器:WC,传输的数据量(word count);
  • 数据缓冲器:BR, buffer;
  • 设备地址寄存器:DAR(把io设备地址保存在其中),供设备选择电路使用; 或当硬盘访问内存是,可以保持盘面好,磁柱,扇区号;

2.2)信号列表:

  • DREQ:设备请求缩写;
  • DACK:应答信号;
  • HRQ: 总线请求信号;
  • HLDA:总线应答信号;

2.3)中断机构

  • 用于数据传输完成后,对后续工作进行处理; 如当WC=0,表示数据准备完成;
  • WC就会向中断机构的中断触发器发送请求,表示数据准备完成;
  • 再由中断机构向cpu发出中断请求;

【6.3】 DMA数据传输方式

1)DMA传送过程:

1.1)预处理:

1.2)DMA传送过程示意:

 

1.3)数据传送过程(输入 ) :

步骤列表(数据从外设送入到内存) :  

  • 步骤1: 外部设备把数据送入br 数据缓冲器;
  • 步骤2: 外部设备向DMA控制器发送DREQ信号,说我已经把数据准备好了;
  • 步骤3: DMA控制器向cpu发送 HRQ信号,申请占用总线请求;
  • 步骤4: cpu在允许的情况下,会给出应答 HLDA,这时cpu会放弃对总线和内存的占用; 而总线和内存由DMA接口来控制;
  • 步骤5: DMA接口中的AR寄存器把内存地址(目的地址)通过地址总线传给内存;
  • 步骤6:DMA控制器给外设返回一个应答信号DACK,告诉外设数据传输可以开始了;
  • 步骤7: DMA控制器发出读写控制指令,同时BR寄存器把数据送入到数据总线上,进而送入到AR寄存器指定的内存地址;
  • 步骤8:每传输一个数据,AR内容加1(以便下一次传输使用加1后的地址);WC字计数器也加1;
  • 步骤9:判断是否传输完成? 若没有完成,则继续传输下一个字;若完成,则WC的值发生溢出,溢出信号发送给中断机构,使得中断机构中的中断请求触发器设置为1,参加中断排队;然后发出中断请求;
  • 步骤10:cpu接收到中断请求后,暂停当前出现执行,转而执行中断服务程序(以便进行后置处理);

1.4)数据传送过程(输出)

1.5)后处理

 

 


2)DMA接口与系统的连接方式

2.1)具有公共请求线的 DMA 请求

一台机器可以有多个DMA接口;多个DMA接口可以连接到总线上;  

  • 即,所有DMA接口共享一条DMA请求线,连接到CPU;

2.2)独立的DMA请求

每个DMA接口都有独立的 请求和响应总线;

3)DMA方式与程序中断方式比较:


【6.4】 DMA接口的类型 (非常重要,netty中io多路复用底层原理)

【6.4.1】选择型

设备地址寄存器用于选择是哪个设备(是否当前设备)与主存进行连接; 一旦设置后, 只能有1个设备使用DMA接口


【6.4.2】 多路型

多路型的DMA接口应用到了通道-io多路复用技术上,如netty(非常重要)

  • 但真正传输数据的时候,也只能有1个外设与内存进行数据传输;
  • 逻辑上连接多个设备,指的是数据准备阶段,可以有多个设备同时进行数据准备;  

以通道为例:

  • 通道也是一个小型的DAM控制器,用的也是DMA接口;
  • 1个通道包含多个子通道;每个子通道有自己独立的寄存器,包括字计数器,地址寄存器,数据缓冲寄存器等
  • 多个外部设备对应不同的子通道,可以同时进行数据准备;如磁盘和磁带同时准备数据;
  • 外部设备准备好了,通过子通道向通道提出数据传输请求;
  • 在数据传输过程中,只能有一个外设与内存进行传输,即数据传输是串行的,但数据准备可以并行同时进行

 【6.4.3】多路型 DMA接口原理

据上图,我们看出:

  • 一个多路型的通道,即便连接了多个外设,但在传输过程中,可以看出通道还有很多个时间片是空闲状态; 还可以连接更多的外设

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的基本数据类型转换(自动、强制、提升)

转载自 Java中的基本数据类型转换(自动、强制、提升) 说基本数据类型转换之前,先了解下 Java 中的 8 种基本数据类型,以及它们的占内存的容量大小和表示的范围,如下图所示。 重新温故了下原始数据类型,现在…

我是这样入侵 Hacking Team 的

在意大利间谍软件厂商 Hacking Team 的内部邮件和文档被曝光将近一年后,黑掉这家黑客公司的黑客公开了他如何入侵HT的完整细节。该文档于上周六在网上发布,本意是为了给黑客活动人士的一份指南。但对于安全从业人员来说,则意味着当任何企业或…

python 数据分析 书籍推荐 知乎_Python 爬取知乎 9674 个问答,揭秘最受欢迎的 98 本书!...

原标题:Python 爬取知乎 9674 个问答,揭秘最受欢迎的 98 本书!作者 | Yura责编 | 胡巍巍高尔基这话有没有道理我不知道,咱也不敢问,主要是现在也问不了。那对我来说,读书有什么意义呢?应该也是阶…

分布式作业 Elastic-Job 快速上手指南

转载自 分布式作业 Elastic-Job 快速上手指南Elastic-Job支持 JAVA API 和 Spring 配置两种方式配置任务,这里我们使用 JAVA API 的形式来创建一个简单的任务入门,现在都是 Spring Boot 时代了,所以不建议使用 Spring 配置文件的形式。 Elast…

7-指令系统

README】 1.本文总结自bilibili《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐; 机器指令: CPU能够识别并且执行的操作命令;有可以理解为不同cpu,在生产时预设了一组…

WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例

最近出于工作需要,了解了一下微服务架构(Microservice Architecture,MSA)。我经过两周业余时间的努力,凭着自己对微服务架构的理解,从无到有,基于.NET打造了一个演示微服务架构的应用程序案例&a…

常用的数据交换格式有哪些_高程数据格式介绍

高程数据格式介绍1 概述目前业内常用的地形数据格式有img,tif,grp及dem,其中dem在地形表达中能力最强,效果最好,本文围绕dem的数据格式进行介绍。2 DEM简介数字高程模型(Digital Elevation Model),简称DEM,是通过有限的地形高程数…

switch case 支持的 6 种数据类型

转载自 switch case 支持的 6 种数据类型那么今天就讲一下 Java 中的 switch case 语句吧,有忘记的同学正好可以温习一下。 Java 中 switch case 语句用来判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。 语法格式如下: switc…

1-操作系统启动前的工作

【README】 1.本文总结自B站《操作系统(哈工大李治军老师)》的视频讲解,非常棒,墙裂推荐; 【1】计算机上电 1) 问题: 这神秘的黑色背后发生了什么 ?计算机是怎么工作的&#x…

傅里叶变换公式_理解1维傅里叶变换

上个学期,学习了信号与系统。虽然知道了傅里叶变换的作用以及如何使用。但是对于它的本质,也就是FT是如何探测到频率的尚有疑惑。而恰好在知乎上发现了一些很好的回答。故将这些回答整理在这。感性理解1维FT知友Heinrich写的傅里叶分析之掐死教程&#x…

ASP.NET Core的配置(3): 将配置绑定为对象

出于编程上的便利,我们通常不会直接利用ConfigurationBuilder创建的Configuration对象读取某个单一配置项的值,而是倾向于将一组相关的配置绑定为一个对象,我们将后者称为Options对象。我们在《ASP.NET Core的配置(1)&…

11 个简练的 Java 性能调优技巧

转载自 11 个简练的 Java 性能调优技巧想要让你的项目一直高性能运作吗?以下有一些技巧你可以拿去消除缓存瓶颈,还有一些其他的性能调优建议。 大多数开发者认为性能优化是一个复杂的话题,它需要大量的工作经验和相关知识理论。好吧&#xff…

pre1-flink理论-批处理与流处理+简单示例

【README】 1.本文包含了 批处理与流处理的代码示例; 批处理:把数据 攒在一起(或攒一段时间或攒一定内存大小),然后再处理,这叫批处理;流处理:数据每来一个就处理一个;…

python表单提交的两种方式_Flask框架学习笔记之表单基础介绍与表单提交方式

本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式。分享给大家供大家参考,具体如下:表单介绍表单是HTML页面中负责数据采集功能的部件。由表单标签,表单域和表单按钮组成。通过表单,将用户输入的数据提交给服务器&am…

高级 | Java中获取类名的3种方法

转载自 高级 | Java中获取类名的3种方法获取类名的方法 Java 中获取类名的方式主要有以下三种。 getName() 返回的是虚拟机里面的class的类名表现形式。 getCanonicalName() 返回的是更容易理解的类名表示。 getSimpleName() 返回的是类的简称。 都有什么区别? 通过…

Asp.net 面向接口可扩展框架之核心容器

新框架的容器部分终于调通了!容器实在太重要了,所以有用了一个名词叫“核心容器”。 容器为什么那么重要呢?这个有必要好好说道说道。 1、首先我们从框架名称面向接口编程说起,什么是面向接口编程?(这个度娘回答一下) 解读一下:类是个体的定义…

pre2-flink单机部署与job提交

【README】 本文记录了flink单机部署,以及flink job2种提交方式; 【1】flink 单机部署 step1)下载flink 包; Apache Flink: Stateful Computations over Data Streamshttps://flink.apache.org/ step2)解压 tar -z…

到底什么是跨域?附解决方案

转载自 到底什么是跨域?附解决方案什么是跨域 要了解跨域,先要说说同源策略。 同源策略是由 Netscape 公司提出的一个著名的安全策略,所有支持 JavaScript 的浏览器都会使用这个策略。 所谓同源是指,域名,协议&#xf…

vue 字典_【开源】基于Vue的前端组件库HeyUI

说道vue组件库,目前主流的基本就是iview和element。今天又发现一个很不错的。HeyUI。组件也很丰富,入门比较简单。反正开源框架我们有不嫌多,多多益善啊。感兴趣的可以看看。关于HeyUIHeyUI 是一套基于 Vue2.0 的开源 UI 组件库,主…

(译)java8-流定义

【README】 本文翻译自 Stream In Java - GeeksforGeeks , 主要介绍了java8流; 【1】流 1)流定义:流是支持各种方法的对象序列(一系列对象),这些方法可以流水线化调用以产生期望结果&#xff…