Java基础篇--IO

在之前的文章中,已经发布了常见的面试题,这里我花了点时间整理了一下对应的解答,由于个人能力有限,不一定完全到位,如果有解答的不合理的地方还请指点,在此谢过。

本文主要描述的是java面试中出现频率较高的IO。看过jdk源码的同学可能知道,java的IO模型分为两种,传统的IO和NIO。传统的IO就是我们平时常用的BIO(Blocking IO),它的包名是java.io;而NIO(NoBlocking IO)的包名是java.nio。网络io其实是面试中常见的问题,掌握这个对我们的面试会有很大的帮助。下面我们就io的常见面试题进行解答说明。

 

能简单说明一下你了解的网络IO模型么?

在回答这个问题之前,先来看下操作系统在完成一次IO的过程需要经过哪些操作。对于操作系统而言,外部设备的操作都可以看作是对文件的操作,当我们读写一个文件的时候,系统内核会返回一个文件描述符(file descriptor),该文件描述符指向内核中的一个结构体,我们操作文件就是对该结构体进行操作。我们都知道,在Linux系统中,内存被分为内核态和用户态。Linux的内核态管理所有接入的硬件资源,并且会提供相关的函数供用户态调用。在了解了这些操作系统上的概念之后,我们以读操作来描述一下一个IO过程。当我们的程序在调用读操作的时候,操作系统会发起read指令,同时在内核态中创建一个文件描述符,等待把读的数据放入到文件描述符指定的结构体缓冲区后然后将缓冲区的数据读回到用户态的内存中,这样就完成了一次IO的操作。我们可以用下面的示意图来描述一下io的过程。

基本上一个io的过程需要经过上图的两个步骤:

  1. 等待数据准备,将硬件读取数据到指定的内核缓冲区中(过程2)
  2. 将缓冲区的内容读回到用户态的应用程序中(过程1)

当然了写的过程就是相反的,把我们的数据写到硬件设备中。有了上面对于的知识,下面我们解释几个io中名词。

阻塞和非阻塞:阻塞和非阻塞的区别在上述描绘的两个阶段中,如果第一阶段就阻塞在那里等待数据的话,我们称为阻塞,否则是非阻塞。

同步和异步:同步和异步的区别在于如果两个阶段都不需要应用程序阻塞等待的话,那么称为异步,否则称为同步。

可能看完上面的基本概念之后会有些模糊,那么现在我们引用一下Unix网络编程中描述的5种网络io模型。

阻塞io

阻塞io是应用程序在调用io操作时,应用程序会一直等待内核操作完成,直到把数据返回回来。其特点在于两个阶段都阻塞了

非阻塞io

非阻塞io是在第一阶段发送请求之后,会立即得到数据是否准备好了,然后应用程序不断发起请求询问数据准备的情况,直到数据准备完成。进入第二阶段阻塞式拷贝回用户态。其特点是:第一阶段不阻塞,不过需要用户程序不断轮询数据准备的情况

Io多路复用

Io多路复用基于操作系统提供了select的分离函数。用户在第一阶段将socket添加到select中,然后阻塞等待select系统调用返回,当数据到达时,socket被激活然后发起read操作。其特点是:对于单个socket来说和阻塞io基本类似,甚至还更差点,但其优势在于用户可以在一个线程中添加多个socket请求,换句话说用户可以在一个线程内请求和处理多个io请求的目的。我们知道io的操作中本身就是io耗时,而cpu使用率较低,如果我们将多个io的请求放到一个线程上的话,对cpu来说完全是没有任何问题的,这也是其优势的地方。

Io多路复用是最长问的一个io

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值