`

java thread : IO模型

阅读更多

 

IO复用:selectpoll函数

 

IO复用

参考多路复用模型,各个信道类比是各个描述字(),高速信道即select函数

  如果一个或多个IO条件满足(例如:输入已准备好被读,或者描述字可以进行输出时),我们就被通知到。这个能力被称为IO复用,是由select poll支持的。

 

多路复用模型:

首先,各个低速信道的信号通过多路复用器MUX,多工器)组合成一路可以在高速信道传输的信号。在这个信号通过高速信道到达接收端之后,再由分路器DEMUX,解多工器)将高速信道传输的信号转换成多个低速信道的信号,并且转发给对应的低速信道。[2]

 

 

IO模型:

阻塞IO

非阻塞IO

IO复用(select poll)

信号驱动IO(SIGIO)

异步IO(Posix.1aio_系列函数)

 

一个输入操作一般有2个不同的阶段:

1 等待数据准备好

2 从内核到进程拷贝数据

 

阻塞IO模型


 

 

recvfrom = receive from = 真正的IO操作 = 系统调用

进程调用recvfrom,此系统调用直到数据报到达且拷贝到应用缓冲区或出错才返回 . 最常见的错误是系统调用被信号中断。

  这里进程的阻塞时间是指从调用recvfrom开始到它返回的这段时间,当进程返回成功指示时,应用进程开始处理数据。

(活动)阻塞:即进程不占用CPU,不再运行下去,但内存状态保留

 

 

非阻塞IO模型

这种模型只是偶尔才遇到,一般只有专门提供某种功能的系统中才有。

应用程序不断地调用recvfrom,请求内核来看看某种操作是否准备好,这对CPU时间是极大的浪费.



 

 

 

IO复用模型

有了IO复用,就可以调用selectpoll,在这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种模型的主要区别是第

  • 大小: 8 KB
  • 大小: 33.4 KB
  • 大小: 51.3 KB
  • 大小: 49.9 KB
  • 大小: 47.1 KB
  • 大小: 38.6 KB
  • 大小: 55.5 KB
分享到:
评论

相关推荐

    java线程+java IO操作

    1. **IO流**:Java的IO模型基于流,流是数据的序列。分为字节流(`InputStream`和`OutputStream`)和字符流(`Reader`和`Writer`),并有输入流和输出流之分。 2. **缓冲流**:为了提高效率,Java提供了带缓冲的流,...

    IO和线程java输入输出 多线程

    Java NIO(New IO)库提供了非阻塞I/O模型,通过选择器(Selector)和通道(Channel)可以同时监控多个I/O事件,极大地提高了系统资源的利用率。 总的来说,理解和掌握Java的IO和线程机制对于任何Java开发者来说都...

    java源码:大文件上传的Java Applet mupload.rar

    3. **大文件处理**:由于大文件不能一次性加载到内存中,因此源码可能会使用流式处理技术,如`java.io.FileInputStream`和`java.io.BufferedInputStream`,分块读取和上传文件。此外,可能还涉及到断点续传的逻辑,...

    Scalable IO in Java

    ### Scalable IO in Java:详解Java NIO与网络服务扩展性设计 #### 一、概述 在《Scalable IO in Java》这篇文章中,作者Doug Lea深入探讨了如何利用Java NIO(非阻塞I/O)技术实现可扩展的网络服务。随着互联网...

    java基础反射IO流线程模式

    Java的多线程模型基于线程类`Thread`,可以创建并控制多个同时运行的线程。 #### 创建线程的方式 - 实现`Runnable`接口。 - 继承`Thread`类。 #### 线程生命周期 线程有多种状态:新建、就绪、运行、阻塞和终止...

    Java课程设计:ktv点歌系统源码.zip

    - 在KTV点歌系统中,可能会有多个并发任务,比如用户点歌、播放歌曲等,这些任务可以通过Java的Thread类或者ExecutorService来实现并发执行,提高系统响应速度。 4. **集合框架**: - 存储管理:Java的集合框架...

    JavaCoding:java语言练习题

    9. **JVM内存管理**:了解Java内存模型,包括堆内存、栈内存、方法区以及垃圾收集机制,有助于优化代码性能并防止内存泄漏。 10. **Java库和框架**:Java提供了丰富的标准库,如JDBC用于数据库操作,Servlet和JSP...

    Java编程宝典:十年典藏版7

    10.1 内存管理:理解Java内存模型,包括堆、栈、方法区和垃圾回收。 10.2 性能监控:学习如何使用JConsole、VisualVM等工具进行性能分析。 10.3 代码优化:掌握常见的代码优化技巧,如减少对象创建、避免过度同步等...

    java面试 java书籍

    - **线程的创建与同步**:掌握Thread类的使用,了解synchronized关键字的作用。 - **并发工具类**:如Semaphore、CyclicBarrier、CountDownLatch等的使用场景。 5. **IO流与NIO** - **传统IO**:熟悉InputStream...

    图书管理系统IO流版.zip

    《图书管理系统IO流版》是一个基于Java开发的后端项目,旨在帮助用户实现对图书信息的高效管理和查询。在这个系统中,IO流扮演了至关重要的角色,它负责数据的读取、写入和传输,是整个系统运行的基础。下面将详细...

    NIO与传统IO代码区别实例

    在Java中,IO模型通常涉及`InputStream`、`OutputStream`、`Reader`和`Writer`等基础类。IO模型的特点是当进行读写操作时,如果数据未准备好,线程会被阻塞,直到数据准备就绪。这在处理少量或连续的数据时效率较高...

    java程序员必读:基础篇

    8. **输入/输出流**:Java的IO流库支持对文件、网络和系统资源的读写操作。学习如何使用InputStream、OutputStream、Reader、Writer及其子类,以及File、Buffered和Object流。 9. **多线程**:Java内置对多线程的...

    Java20210219:巨匠东认Java OCP课程

    6. **多线程**:Java提供丰富的多线程支持,课程会介绍线程的创建与同步,如Thread类、Runnable接口,以及synchronized关键字、wait/notify机制和并发工具类如Semaphore、CyclicBarrier等。 7. **反射与注解**:...

    疯狂JAVA:突破程序员基本功的16课 源码

    6. **多线程编程**:Java提供了强大的多线程支持,通过Thread类和Runnable接口可创建和管理线程。理解线程同步机制(如synchronized关键字、wait/notify、Lock接口等)是编写高效并发程序的关键。 7. **IO流**:...

    基于JAVA IO, NIO, Netty, 多线程并发实战源码.zip

    IO模型基于阻塞I/O,意味着在数据传输过程中,如果数据没有准备好,调用者会被阻塞直到数据可用。主要类包括InputStream、OutputStream、Reader、Writer等,它们支持对文件、网络套接字、系统管道等多种资源的读写...

    Java::black_nib:Java 学习笔记

    9. **Java标准库(JDK)**:学习和熟悉Java的标准库(如java.util、java.io、java.net等包)是提高编程效率的关键。理解并掌握这些库中的类和方法可以帮助解决各种问题。 10. **Java虚拟机(JVM)**:理解JVM的工作...

    用JAVA语言编写:山寨版QQ课程设计报告

    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程序员必读:基础篇

    Java内置对多线程的支持,可以通过实现Runnable接口或继承Thread类创建线程,理解线程同步和锁机制至关重要。 8. **Java API**: Java标准库提供了丰富的API,如IO、集合、网络、日期时间等,熟悉这些API能提高...

    Java编程模式与范例:基础开发技巧.rar

    9. **IO流**:Java的`java.io`包提供了大量的类和接口来处理输入输出,如字符流、字节流、缓冲流、对象序列化等。学习如何使用它们进行文件操作、网络通信等是Java开发的基本功。 10. **设计原则**:包括开闭原则...

    java0316:java01

    9. **JVM**:理解Java虚拟机的工作原理,包括类加载机制、内存模型、垃圾收集等。 10. **泛型**:学习泛型的概念,如何使用泛型类、泛型方法,以及通配符的使用。 11. **枚举与注解**:理解枚举的使用,以及注解在...

Global site tag (gtag.js) - Google Analytics