欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java thread : IO模型

程序员文章站 2022-07-12 18:34:49
...

 

IO复用:selectpoll函数

 

IO复用

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

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

 

多路复用模型:

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

 java thread : IO模型
            
    
    博客分类: javathread javaniothread 

 

IO模型:

阻塞IO

非阻塞IO

IO复用(select poll)

信号驱动IO(SIGIO)

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

 

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

1 等待数据准备好

2 从内核到进程拷贝数据

 

阻塞IO模型

java thread : IO模型
            
    
    博客分类: javathread javaniothread 
 

 

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

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

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

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

 

 

非阻塞IO模型

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

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


java thread : IO模型
            
    
    博客分类: javathread javaniothread 
 

 

 

IO复用模型

有了IO复用,就可以调用selectpoll,在这2个系统调用中的某一个上阻塞,而不是阻塞于真正的IO系统调用. (select包含有一个阻塞的队列)

Select的好处是:一个select可以同时处理多个描述字,而不是一个一个的等待。

(即:select是一个 阻塞队列的Manager)


java thread : IO模型
            
    
    博客分类: javathread javaniothread 
 

 

 

信号驱动IO模型

信号驱动IO:让kernel 在描述字准备好的时候用SIGIO通知我们


java thread : IO模型
            
    
    博客分类: javathread javaniothread 
 

 

当数据报准备好被读时,就为该进程生成一个SIGIO信号。然后随即可以在信号处理程序中调用recvfrom来读取数据报。(PS:此时recvfrom还是会阻塞,因为需要从内核内存中拷贝数据到应用程序的缓存区)

 

异步IO模型


java thread : IO模型
            
    
    博客分类: javathread javaniothread 
 

这种模型与信号驱动模型的主要区别在于:信号驱动IO是由内核通知程序何时可以启动一个IO操作,而异步IO模型是由内核通知我们IO操作何时完成.

 异步IO的信号是直到数据已拷贝到应用缓冲区才产生的,这一点于信号驱动IO模型不同。

 

PS 信号驱动,都是需要中断 支持的

 

 

各种IO模型的比较:

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

1 等待数据准备好

2 从内核到进程拷贝数据


java thread : IO模型
            
    
    博客分类: javathread javaniothread 
 

4种模型的主要区别是第一阶段, 2种模型的主要区别是第

  • java thread : IO模型
            
    
    博客分类: javathread javaniothread 
  • 大小: 8 KB
  • java thread : IO模型
            
    
    博客分类: javathread javaniothread 
  • 大小: 33.4 KB
  • java thread : IO模型
            
    
    博客分类: javathread javaniothread 
  • 大小: 51.3 KB
  • java thread : IO模型
            
    
    博客分类: javathread javaniothread 
  • 大小: 49.9 KB
  • java thread : IO模型
            
    
    博客分类: javathread javaniothread 
  • 大小: 47.1 KB
  • java thread : IO模型
            
    
    博客分类: javathread javaniothread 
  • 大小: 38.6 KB
  • java thread : IO模型
            
    
    博客分类: javathread javaniothread 
  • 大小: 55.5 KB
相关标签: java nio thread