`

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包相关流对象用法总结(尚学堂1002班王鑫) 165 IO中其他常用类 165 File类 165 RandomAccessFile 166 思考作业 166 上机作业 166 提高课外作业 166 第九章 多线程技术 167 基本概念 167 程序 167 进程 167 ...

    高清Netty5.0架构剖析和源码解读

    首先,我们通过下面这幅图来看下采用BIO 的服务端通信模型:采用BIO 通信模型的 1connect NewThread1 WebBrowse 2connect 2handle(Req) WebBrowse 3connect Acceptor NewThread2 WebBrowse WebBrowse 4connect New...

    疯狂JAVA讲义

    11.5.1 Java事件模型的流程 403 11.5.2 事件和事件监听器 405 11.5.3 事件适配器 409 11.5.4 事件监听器的实现形式 411 11.6 AWT的菜单 413 11.6.1 菜单条、菜单和菜单项 414 11.6.2 右键菜单 416 学生提问:...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    java面试考题

    包:java.util、java.lang、java.io、java.sql、javax.net、 java.awt、javax.xml 、javax.sevlet。 1.面向对象的特征有哪些? 1)、抽象(找共性,将共有的属性、方法放到父类中):是忽略一个主题中 与当前目标 ...

    java基础案例与开发详解案例源码全

    13.1 java.io.File类328 13.1.1 文件和目录是什么?328 13.1.2 Java对文件和目录的操作328 13.2 JavaIO原理332 13.3 流类结构333 13.3.1 InputStream和OutputStream333 13.3.2 Reader和Writer334 13.4 文件流336 ...

    基于JAVA的剪刀石头布游戏设计.docx

    基于JAVA的剪刀石头布游戏设计 摘要:本课程设计使用Java语言,运用 java.io包和java.net包及getInputStream()、getOutputStream()等方法,编写出一个能在dos环境中显示出剪刀石头布游戏界面,启动服务器端线程,...

    java经典面试2010集锦100题(不看你后悔)

    A) java.io.Exception B) java.lang.Throwable C) java.lang.Exception D) java.lang.Error 题目29:d 程序如下:  public class Foo {  public static void main(String[] args) {  try {  ...

    超级有影响力霸气的Java面试题大全文档

    sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程...

    java核心知识点整理.pdf

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    wam 的 分析 设计代码

    import java.io.IOException; public class MyCBSReceiveMidlet extends MIDlet implements CommandListener, Runnable, MessageListener { Command exitCommand = new Command("退出", Command.EXIT, 2); ...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    socket编程集萃

    事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些相对简单的Api来完成这些工作。Socket就是其中之一,...

    ieda+netty.zip

    阻塞IO模式就是一个客户端连接到服务端,服务端就为每个新的客户端 Socket 创建一个新的 Thread。 Netty的书我帮你看!---什么是Netty 什么是Socket?Socket就是你想用Java代码API去组织数据,指定协议去通讯,很烦!...

    gfirefly firefly-gevent是firefly的gevent版本基于coroutine的python网络开发框架

    协程是一种并发模型,但不同于thread和callback,它的所有task都是可以在一个线程里面执行,然后可以通过在一个task里面主动放弃执行来切换到另一个task执行,它的调度是程序级的,不像thread是系统级的调度。...

    积分管理系统java源码-alibaba-Interview-preparation:阿里巴巴实习生面试个人准备

    RxJava的调度器(io(优先级比低),密集计算线程(优先级比高,用于执行密集计算任务),安卓主线程,从Looper创建(实际上内部也是创建了Handler)) Java Executor框架的Executors#newCachedThreadPool(),不会造成资源浪费,60...

    Spring Cloud Finchley SR2全套(集成Spring Gateway)

    <groupId>io.zipkin.java <artifactId>zipkin-server ${zipkin.version} <!-- 剔除日志包 避免出现重复引用 --> <groupId>org.apache.logging.log4j <artifactId>log4j-slf4j-impl Redis二次...

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

Global site tag (gtag.js) - Google Analytics