IO复用:select和poll函数
IO复用:
参考多路复用模型,各个信道类比是各个描述字(),高速信道即select函数
如果一个或多个IO条件满足(例如:输入已准备好被读,或者描述字可以进行输出时),我们就被通知到。这个能力被称为IO复用,是由select poll支持的。
多路复用模型:
首先,各个低速信道的信号通过多路复用器(MUX,多工器)组合成一路可以在高速信道传输的信号。在这个信号通过高速信道到达接收端之后,再由分路器(DEMUX,解多工器)将高速信道传输的信号转换成多个低速信道的信号,并且转发给对应的低速信道。[2]
IO模型:
阻塞IO
非阻塞IO
IO复用(select poll)
信号驱动IO(SIGIO)
异步IO(Posix.1的aio_系列函数)
一个输入操作一般有2个不同的阶段:
1 等待数据准备好
2 从内核到进程拷贝数据
阻塞IO模型
recvfrom = receive from = 真正的IO操作 = 系统调用
进程调用recvfrom,此系统调用直到数据报到达且拷贝到应用缓冲区或出错才返回 . 最常见的错误是系统调用被信号中断。
这里进程的阻塞时间是指从调用recvfrom开始到它返回的这段时间,当进程返回成功指示时,应用进程开始处理数据。
(活动)阻塞:即进程不占用CPU,不再运行下去,但内存状态保留
非阻塞IO模型
这种模型只是偶尔才遇到,一般只有专门提供某种功能的系统中才有。
应用程序不断地调用recvfrom,请求内核来看看某种操作是否准备好,这对CPU时间是极大的浪费.
IO复用模型
有了IO复用,就可以调用select或poll,在这2个系统调用中的某一个上阻塞,而不是阻塞于真正的IO系统调用. (即select包含有一个阻塞的队列)
Select的好处是:一个select可以同时处理多个描述字,而不是一个一个的等待。
(即:select是一个 阻塞队列的Manager)
信号驱动IO模型
信号驱动IO:让kernel 在描述字准备好的时候用SIGIO通知我们
当数据报准备好被读时,就为该进程生成一个SIGIO信号。然后随即可以在信号处理程序中调用recvfrom来读取数据报。(PS:此时recvfrom还是会阻塞,因为需要从内核内存中拷贝数据到应用程序的缓存区)
异步IO模型
这种模型与信号驱动模型的主要区别在于:信号驱动IO是由内核通知程序何时可以启动一个IO操作,而异步IO模型是由内核通知我们IO操作何时完成.
异步IO的信号是直到数据已拷贝到应用缓冲区才产生的,这一点于信号驱动IO模型不同。
PS: 信号驱动,都是需要中断 支持的
各种IO模型的比较:
一个输入操作一般有2个不同的阶段:
1 等待数据准备好
2 从内核到进程拷贝数据
前4种模型的主要区别是第一阶段, 后2种模型的主要区别是第
相关推荐
1. **IO流**:Java的IO模型基于流,流是数据的序列。分为字节流(`InputStream`和`OutputStream`)和字符流(`Reader`和`Writer`),并有输入流和输出流之分。 2. **缓冲流**:为了提高效率,Java提供了带缓冲的流,...
Java NIO(New IO)库提供了非阻塞I/O模型,通过选择器(Selector)和通道(Channel)可以同时监控多个I/O事件,极大地提高了系统资源的利用率。 总的来说,理解和掌握Java的IO和线程机制对于任何Java开发者来说都...
3. **大文件处理**:由于大文件不能一次性加载到内存中,因此源码可能会使用流式处理技术,如`java.io.FileInputStream`和`java.io.BufferedInputStream`,分块读取和上传文件。此外,可能还涉及到断点续传的逻辑,...
### Scalable IO in Java:详解Java NIO与网络服务扩展性设计 #### 一、概述 在《Scalable IO in Java》这篇文章中,作者Doug Lea深入探讨了如何利用Java NIO(非阻塞I/O)技术实现可扩展的网络服务。随着互联网...
Java的多线程模型基于线程类`Thread`,可以创建并控制多个同时运行的线程。 #### 创建线程的方式 - 实现`Runnable`接口。 - 继承`Thread`类。 #### 线程生命周期 线程有多种状态:新建、就绪、运行、阻塞和终止...
- 在KTV点歌系统中,可能会有多个并发任务,比如用户点歌、播放歌曲等,这些任务可以通过Java的Thread类或者ExecutorService来实现并发执行,提高系统响应速度。 4. **集合框架**: - 存储管理:Java的集合框架...
9. **JVM内存管理**:了解Java内存模型,包括堆内存、栈内存、方法区以及垃圾收集机制,有助于优化代码性能并防止内存泄漏。 10. **Java库和框架**:Java提供了丰富的标准库,如JDBC用于数据库操作,Servlet和JSP...
10.1 内存管理:理解Java内存模型,包括堆、栈、方法区和垃圾回收。 10.2 性能监控:学习如何使用JConsole、VisualVM等工具进行性能分析。 10.3 代码优化:掌握常见的代码优化技巧,如减少对象创建、避免过度同步等...
- **线程的创建与同步**:掌握Thread类的使用,了解synchronized关键字的作用。 - **并发工具类**:如Semaphore、CyclicBarrier、CountDownLatch等的使用场景。 5. **IO流与NIO** - **传统IO**:熟悉InputStream...
《图书管理系统IO流版》是一个基于Java开发的后端项目,旨在帮助用户实现对图书信息的高效管理和查询。在这个系统中,IO流扮演了至关重要的角色,它负责数据的读取、写入和传输,是整个系统运行的基础。下面将详细...
在Java中,IO模型通常涉及`InputStream`、`OutputStream`、`Reader`和`Writer`等基础类。IO模型的特点是当进行读写操作时,如果数据未准备好,线程会被阻塞,直到数据准备就绪。这在处理少量或连续的数据时效率较高...
8. **输入/输出流**:Java的IO流库支持对文件、网络和系统资源的读写操作。学习如何使用InputStream、OutputStream、Reader、Writer及其子类,以及File、Buffered和Object流。 9. **多线程**:Java内置对多线程的...
6. **多线程**:Java提供丰富的多线程支持,课程会介绍线程的创建与同步,如Thread类、Runnable接口,以及synchronized关键字、wait/notify机制和并发工具类如Semaphore、CyclicBarrier等。 7. **反射与注解**:...
6. **多线程编程**:Java提供了强大的多线程支持,通过Thread类和Runnable接口可创建和管理线程。理解线程同步机制(如synchronized关键字、wait/notify、Lock接口等)是编写高效并发程序的关键。 7. **IO流**:...
IO模型基于阻塞I/O,意味着在数据传输过程中,如果数据没有准备好,调用者会被阻塞直到数据可用。主要类包括InputStream、OutputStream、Reader、Writer等,它们支持对文件、网络套接字、系统管道等多种资源的读写...
9. **Java标准库(JDK)**:学习和熟悉Java的标准库(如java.util、java.io、java.net等包)是提高编程效率的关键。理解并掌握这些库中的类和方法可以帮助解决各种问题。 10. **Java虚拟机(JVM)**:理解JVM的工作...
import java.io.*; import java.net.*; import java.sql.*; import java.util.Vector; class ServerThread extends Thread { private Socket socket; private BufferedReader in; private PrintWriter out; int...
Java内置对多线程的支持,可以通过实现Runnable接口或继承Thread类创建线程,理解线程同步和锁机制至关重要。 8. **Java API**: Java标准库提供了丰富的API,如IO、集合、网络、日期时间等,熟悉这些API能提高...
9. **IO流**:Java的`java.io`包提供了大量的类和接口来处理输入输出,如字符流、字节流、缓冲流、对象序列化等。学习如何使用它们进行文件操作、网络通信等是Java开发的基本功。 10. **设计原则**:包括开闭原则...
9. **JVM**:理解Java虚拟机的工作原理,包括类加载机制、内存模型、垃圾收集等。 10. **泛型**:学习泛型的概念,如何使用泛型类、泛型方法,以及通配符的使用。 11. **枚举与注解**:理解枚举的使用,以及注解在...