For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
java编程开发随着互联网的不断发展而被越来越多的程序员掌握并应用到不同软件开发项目之中,今天武汉达内培训就给大家简单介绍一下,java编程什么是I/O与常见问题。
I/O是计算机获取和交换信息的关键途径,而流则是执行I/O操作的主要手段。
在计算机领域,流代表信息的传输。流具有顺序性,因此,对于特定的机器或应用程序,我们通常将机器或应用程序从外部接收信息称为输入流(InputStream),将信息从机器或应用程序输出到外部称为输出流(OutputStream),统称为输入/输出流(I/OStreams)。
当机器或程序之间进行信息或数据交换时,先需要将对象或数据转换为特定形式的流。随后,通过流的传输将其传递至指定的机器或程序,后将流重新转换为对象或数据。因此,流可视为数据的载体,通过它可以实现数据的交换和传输。
传统I/O的性能问题
我们了解到,I/O操作可分为磁盘I/O操作和网络I/O操作。磁盘I/O操作指的是将数据从磁盘读入内存,然后将读取的信息持久化输出到物理磁盘上。而网络I/O操作是指从网络中读取信息输入到内存,后将信息输出到网络中。然而,在传统I/O中,无论是磁盘I/O还是网络I/O,都面临着严重的性能问题。
1.多次内存复制
在传统I/O中,我们可以通过InputStream从源数据中读取数据流输入到缓冲区里,通过OutputStream将数据输出到外部设备(包括磁盘、网络)。
JVM会发出read()系统调用,并通过read系统调用向内核发起读请求;
内核向硬件发送读指令,并等待读就绪;
内核把将要读取的数据复制到指向的内核缓存中;
操作系统内核将数据复制到用户空间缓冲区,然后read系统调用返回。
在这个过程中,数据先从外部设备复制到内核空间,再从内核空间复制到用户空间,这就发生了两次内存复制操作。这种操作会导致不必要的数据拷贝和上下文切换,从而降低I/O的性能。
2.阻塞
在传统I/O中,InputStream的read()是一个while循环操作,它会一直等待数据读取,直到数据就绪才会返回。这就意味着如果没有数据就绪,这个读取操作将会一直被挂起,用户线程将会处于阻塞状态。
在连接请求较少的情况下,使用传统I/O方式通常不会出现问题,响应速度也相对较高。然而,在面临大量连接请求时,系统需要创建大量的监听线程。若线程没有数据就绪,它们将被挂起并进入阻塞状态。一旦线程阻塞,这些线程会不断争夺CPU资源,从而导致大量的CPU上下文切换,进而增加系统的性能开销。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。