JAVA理论基础-I/O模型

I/O模型

1.阻塞/非阻塞的区别、同步/异步的区别?

例子

烧水
1.同步阻塞
水壶烧水,然后你进行等待,每隔一段时间去查看水开没开。
2.同步非阻塞
水壶烧水,然后去做其他事,每隔一段时间去查看水开没开。
3.异步阻塞
水壶烧水,然后站在那等待,水开以后,自动通知你水开了。
4.异步非阻塞
水壶烧水,然后去做其他事,水开以后,自动通知你水开了。

分析
同步和异步
同步就是水开与否,需要你去查看。异步就是水开了会自动提醒你。也就是说会不会等待结果返回。
同步异步是指访问数据的机制。同步是指主动请求并等待I/O操作完毕的方式。当数据就绪后再读写的时候必须阻塞等待。异步是指主动请求后就可以继续处理其他任务,I/O操作完毕之后会主动通知你去处理。
阻塞和非阻塞
阻塞就是在烧水的时候你是处于等待状态,非阻塞就是在烧水的同时你可以去做其他事儿。阻塞和非阻塞是相对于线程是否被阻塞。
阻塞和非阻塞是指进程访问的数据如果尚未准备就绪,进程是否需要等待。

同步和异步属于是多任务之间发生的一种关系。阻塞非阻塞是单线程执行过程中等待消息返回时的不同状态。

2.阻塞IO、非阻塞IO、多路复用IO、异步IO这四种IO模型

I/O操作主要包括:对磁盘的读写,对Socket的读写,以及外设的读写。并且需要进行用户空间和内核空间的区分(用户控件就是普通的用户进程。内核空间就是内核进程。只有内核进程才可以直接访问磁盘等I/O设备)。
用户控件产生一个请求,请求交由内核空间执行:
1.内核检查读取的数据是否就绪。
2.如果就绪,内核将数据从内核空间复制到用户空间(内存上的复制)。

阻塞I/O 非阻塞I/O

前者:内核检查数据未就绪时,会一直等待,知道数据就绪。
后者:如果数据没有就绪,则返回一个标志信息告知用户线程当前要读的数据没有就绪。

他们的区别在于:处理IO的第一阶段,是一直等待数据就绪还是返回未就绪的标志信息。

非阻塞IO的优势:
使用阻塞IO处理网络连接时,有1000个连接就要开1000个线程。无论是否IO处理完成,对应的想成必须处于等待状态。
而非阻塞IO的话,可以维护一个线程池100的线程池,当有数据就绪时,启动一个线程去接受,党没有数据是,线程不需要等待,直接返回到池中。等待被调度接受其他链接。

同步IO 异步IO

主要针对用户线程和内核的交互来说的,即数据是否就绪的消息传递机制
前者:当用户线程发出IO操作之后,需要用户线程或者内核不断地去轮训数据是否就绪,当数据就绪之后,再将数据从内核拷贝到用户线程。
后者:只有IO请求操作的发出是由用户线程来进行的,内核自动完成检查数据是否就绪和将数据拷贝到用户控件。然后再发送通知告知用户线程IO操作已完成。

阻塞非阻塞与同步异步的区别

前后两组阻塞的位置是不同的。同步异步IO阻塞的地方是用户或内核去轮训查看数据是否就绪。阻塞和非阻塞阻塞在数据未准备就绪的状态下。

3.NIO的原理、NIO属于哪种IO模型、NIO的三大组成等等

4.NIO并不是严格意义上的非阻塞IO而应该属于多路复用IO,NIO会阻塞在Selector的select方法?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值