IO读写

Posted jx9527

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO读写相关的知识,希望对你有一定的参考价值。

1、read & write

      read: 把数据从内核缓冲区复制到进程缓冲区。 write: 把数据从进程缓冲区复制到内核缓冲区。

      上层程序的IO操作、不是物理设备级别的读写,而是缓存的复制。而内核缓冲区和物理设备之间的数据交换则是由操作系统的Kernel来完成。

2、缓冲区

      缓冲区的目的:减少频繁地与设备之间的物理交换。

      Linux系统中,操作系统只有一个内核缓冲区,而每个用户,有自己的独立缓冲区,叫进程缓冲区。

3、四种IO模型

      同步阻塞IO(Blocking IO):

           【优点】阻塞等待数据期间,用户线程挂起,不会占用CPU资源。

           【缺点】为每个连接配置一个线程,在并发量大的情况下,内存、线程切换的开销会非常巨大。

           【高并发场景下不可用】 【Socket默认模式

      同步非阻塞IO(Non-blocking IO)

           【优点】 应用程序不断地进行IO系统调用,轮询数据是否准备好,在内核等待数据地过程中立即返回,在内核缓冲区有数据时才开始阻塞,实时性较好。

           【缺点】 不断地轮询,占用大量CPU时间,效率低下。

           【高并发场景下不可用

      IO多路复用(IO Multiplexing): 避免轮询等待问题。

           【特点】 涉及两种系统调用,一种select/epoll,另一种是IO操作。select先查询注册的socket连接对应的文件描述符(轮询),若可读则用户线程阻塞read读取。

           【优点】 与一个线程维护一个连接的阻塞IO模型相比,select/epoll可以一个选择器同时处理成千上万个连接。不必创建大量的线程,减少系统开销。

           【缺点】 select/epoll是阻塞式的,整个读写过程是阻塞的。

           【New IO技术应用】【Netty】

      异步IO(Asynchronous IO):彻底解除线程的阻塞。

           【特点】 在内核等待和复制数据阶段都不需要阻塞,用户只注册一个IO操作完成的回调函数。

           【缺点】 应用程序仅需要事件注册和接收,其余工作留给操作系统。

4、高并发IO---百万级并发连接

      ulimit -n 1000000

 

    

以上是关于IO读写的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Java API读写HDFS

java 基础io读写字节以及缓存读写字节

挖掘 Rust -- 文件读写

IO编程-----读写文件

第五篇:使用无缓冲IO函数读写文件

Python3 IO编程之文件读写