网上看了好多IO,NIO的文字,参差不齐,每篇总是差一两个点没有讲到,所以这里对于我自己理解的做一个总结,也许有不对的地方。
1,基本概念
1.1)同步/异步,阻塞/非阻塞
同步异步主要针对C端:
所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。
异步的概念和同步相对。当c端一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
阻塞非阻塞主要针对S端:
阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
1.2)面向流,面向缓冲区
面向流:每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。
面向缓冲区:数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。
1.3)内核态和用户态
内核空间可以访问受保护的内存(32位下高位1G为内核空间),剩下3G为用户空间
操作系统限制用户态不能直接访问硬件设备,所以数据从硬件移动到用户进程的内存时需要2步操作。
1.4)mmap(内存映射)
将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系
2,linux下的5种IO模型

5种IO模式关于同步异步,阻塞非阻塞的关系
阻塞 | 非阻塞 | |
同步 | BIO | nonblockingIO 多路复用IO(NIO1.0) |
异步 | X | AIO |
1,BIO:
阻塞当前线程,等待数据准备
2,nonblockingIO:
相当于轮训,将大片的等待时间切割成小片,
3,多路复用IO(IO mulitplexing)JAVA中的NIO
监听多个socket,当任何一个数据准备好后就返回,用户进程再调用read函数读取数据,极限情况,如果只监听一个socket那么和BIO是一样的,只有监听的socket多时,才会凸显效率。
重点,后面详细说明
4,信号驱动 I/O
5, asynchronous IO
目前已有Linux下实现方案,但是目前还存在BUG,并且操作效率并不比多路复用的高,所有JDK17之前还一直都是使用多路复用
相关推荐
在Linux操作系统中,标准输入/输出(Standard Input/Output,简称标准IO)是系统提供的一种基本I/O模型,用于程序与外部设备之间的数据传输。在这个案例中,我们关注的是如何利用标准IO进行学生信息的管理。`ls_stu....
《Linux设备驱动开发详解:基于最新的Linux4.0内核配套光盘》一书由宋保华编写,针对Linux4.0内核进行了深入浅出的解析与实践指导。本书结合了理论与实践,旨在帮助读者掌握Linux设备驱动程序的设计与开发技能。 ##...
### Java IO 完全总结 #### 一、历史背景 在计算机科学的发展历程中,输入输出(Input/Output,简称IO)...通过深入研究Java IO的设计模式和具体实现,我们可以更加有效地利用这一强大的工具来构建高质量的应用程序。
### Linux驱动架构介绍 ...通过对Linux驱动架构及其相关概念的详细介绍,我们不仅了解了驱动开发的基本流程,还深入探讨了Linux操作系统的关键组成部分。这对于理解现代操作系统的核心原理和技术细节具有重要意义。
11. **设计模式**:理解并应用常见的设计模式(如工厂模式、单例模式、观察者模式等),可以提升代码的可维护性和复用性。 12. **并发与多线程**:在多核处理器环境下,理解和使用线程、锁、同步机制是提升程序效率...
11. 文件权限与权限管理:了解不同操作系统下的文件权限设置,如Linux的chmod命令。 12. 多线程/多进程中的文件操作:并发环境下,需要考虑同步问题,避免数据冲突。 通过这个压缩包中的源码,学习者可以深入理解...
在开始之前,作者建议读者先准备好必要的开发工具,如文本编辑器或IDE,并了解一些基本的概念,比如什么是引导扇区以及它的作用。 **1.2 十分钟完成的操作系统** 本部分介绍了如何快速构建一个最小的操作系统,...
首先,我们需要理解GPIO的基本概念。GPIO是微控制器或处理器系统中常见的接口,用于与外部设备进行简单、灵活的双向通信。它们可以被配置为输入或输出模式,以读取外部信号或驱动负载,如LED。在ZYNQ平台上,GPIO...
【安卓Android源码——OA精灵2011_版.zip】是一个包含安卓应用程序源代码的压缩文件,专门针对OA(Office Automation)精灵2011版本。这个源码的分析和学习将帮助开发者深入理解Android应用开发的核心概念和技术,...
5. **操作系统**:对Linux操作系统有基础的了解,能够进行基本的命令操作,如文件管理、进程查看和控制。 6. **分布式技术**:了解分布式系统的基础知识,如缓存(Redis)、消息中间件(Kafka)、流处理(Storm)和...
作者建议通过双重循环结构——一个用于持续接收网络数据(网络循环),另一个用于解析接收到的数据并处理完整的报文(解析循环)——来有效解决这一问题。这种编程模式可以确保即使数据分片到达,也能正确识别和处理...
这些文档——JAVA应聘.doc、linux shell.doc、linux网络编程打印.doc、Java笔试大全.doc、JAVA面试.doc——提供了丰富的知识资源,涵盖了这两个领域的核心概念与实践技巧。 对于Java部分: 1. **基础语法**:Java...
1. **文件I/O操作**:在Android中,文件读取通常使用`java.io`或`java.nio`包下的类,如`BufferedReader`或`FileReader`。开发者需要实现打开、读取、关闭文件的功能,确保数据正确无误地加载到内存。 2. **文本...
除此之外,JavaWeb、数据库、Spring框架、Spring Boot、数据结构与算法、JVM、设计模式、Linux、SpringCloud、中间件技术、Vue前端框架、计算机网络、性能调优、系统设计、源码分析、计算机理论和阅读高质量代码的...
首先,我们要区分基本的I/O概念——阻塞与非阻塞。在阻塞模式下,如系统调用`read`或`accept`,如果数据尚未准备好,调用进程会被挂起,内核会调度其他进程执行。这种做法有利于资源分配,确保多个进程有机会获得CPU...
本文将深入探讨磁盘I/O的基本概念,分析其对Web应用程序的影响,以及如何检测和解决I/O瓶颈问题。 **磁盘I/O的本质** 磁盘I/O涉及从磁盘读取或向磁盘写入数据的过程。在这个过程中,处理器需要等待数据被读取或...
描述中的“如何讲linux的IO端口映射到虚拟地址空间”进一步强调了主题的核心——理解I/O端口映射的过程和它在Linux环境下的具体实现。在传统的x86架构中,CPU有专门的I/O指令(如IN和OUT)用于与I/O端口通信,但在...
这部分内容涵盖了 Rust 中的一些基本概念和技术: - **变量与可变性**:介绍 Rust 中的变量声明方式及其可变性。Rust 默认变量是不可变的,这意味着一旦赋值就无法改变。如果希望变量可变,则需显式指定 `mut` ...