IO

作者: 我是大兄弟 | 来源:发表于2020-03-19 21:51 被阅读0次
Java io和Linux io有什么对应关系? java在部署在平台上很多实现依赖平台的API。高效实现如:read,write这样的系统调用,肯定也是java IO的底层实现

数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间,可以认为,read是把数据从内核缓冲区复制到进程缓冲区。write是把进程缓冲区复制到内核缓冲区
(read和write系统调用在操作磁盘文件时不会直接发起磁盘访问,而是仅仅在用户空间缓冲区与内核缓冲区高速缓存之间复制数据,采用这一设计,意在使read和write调用的操作更为快速,因为它们不需要等待(缓慢的)磁盘操作。同时,这一设计也极为高效,因为这减少了内核必须执行的磁盘传输次数。)

阻塞IO:在内核将数据准备号之前,系统调用会一直等待,直至数据从内核缓冲区复制到进程缓冲区

非阻塞IO:如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回WOULDBLOCK错误码。非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符,这个过程称为轮询

信号驱动IO:内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作

IO多路:是一种IO事件的监控,同时对大量的描述符进行事件监控;监控是否具有IO条件

异步IO:由内核在数据拷贝完成时,通知应用程序(同步与异步区别:功能是否由自己完成)

Java对BIO、NIO、AIO的支持:

Java BIO : 同步并阻塞,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。
Socket(监听) --》 bind(IP+PORT) --》 accept(阻塞) --》 read

Java NIO(reactor模型) : 同步非阻塞,客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。


image.png

Reactor模式是处理并发I/O比较常见的一种模式,用于同步I/O,中心思想是将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程/进程阻塞在多路复用器上;一旦有I/O事件到来或是准备就绪(文件描述符或socket可读、写),多路复用器返回并将事先注册的相应I/O事件分发到对应的处理器中。

Java AIO (proactor模型): 异步非阻塞,此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别

select、poll、epoll之间的区别?
(1)select:时间复杂度O(n)

I/O事件发生:无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。

(2)poll:时间复杂度O(n)

poll本质上和select没有区别, 但是它没有最大连接数的限制,原因是它是基于链表来存储的.

(3)epoll:时间复杂度O(1)

epoll会把哪个流发生了怎样的I/O事件通知我们。(复杂度降低到了O(1))

相关文章

网友评论

      本文标题:IO

      本文链接:https://www.haomeiwen.com/subject/odfryhtx.html