阻塞IO和非阻塞IO

IO:用于文件读取和写入操作。

很多时候不要把技术想的很高大上,其实在其中的设计模式或者说设计理念,是为解决什么而生,为什么必须使用,这些才是真正的难点。

在我的认知里

第一,我们写的代码其实本质就是文件,无论文件是什么结尾,其实都是无关紧要的,都是字母和数字,制定规则的人才是最为强大的。

第二,互联网和计算机就像是代替了传统的邮件信息传输,而计算机就将互联网中的信息通过IO读取和写入到我们的视野面前。

第三,任何程序都会有主方法,运行程序其实本质就像是计算机在调用方法去执行。

第四,数据的传输只有字符串,无论时XML数据,还是JSON数据其实都是认为设置的数据格式,都是为了方便数据的传输和接受,要明白的为什么要这样设计这种数据传输,而不是要在意这个技术点,XML数据,JSON数据都是字符串,只是通过规则解析为Map集合。

有远程连接(TCP,UDP)的时候,Linux系统会相应的创建文件,其中含有相应的字符串,也就是数据(JSON,XML)和读写操作,计算机不会知道要做什么,计算机和人是不一样的,并且需要自己去解析,所以都需要自己去设计。

BIO:阻塞IO,来了一个连接,我创建线程等待它给我发送数据,不管发没发都一直要监督着,优点方便,便于相应,但是过于浪费资源,并且不适用于连接数量过多。

NIO:非阻塞IO,不会去每连接一个就创建线程,而是知道每个连接创建文件的所属地址。

NIO有不同的设计模式,其中比较经典的就是IO多路复用,为什么会有这些设计,原因是NIO我知道了连接创建的文件,但是他不一定会有数据呀,如果当有10000的连接过来时,其中只有50个有数据操作,而你只有一个线程,那我只能每次去遍历每次都去看看连接文件中有没有数据操作,效率就会很低。

这其中的设计方案就大家自己去看看哈。

其中我想讲的一点是异步IO和非阻塞IO是不相同的,这里而是无论在BIO还是NIO在进行数据读取和写入操作时都是单线程进行操作。这里异步的意思呢,就像是我叫另一个线程帮我去读写操作,我自己不读写,等它读写完了在告诉我是否成功,然后我自己在采取操作,这样节省了时间,不用去等待IO读取操作(打个比方:1个G的数据的读写操作,你要等很久才能完成,会浪费大量的等待时间),这里可能有人会想,我不关注它我怎么知道他读写操作完成了呢,这里就会有设计方案,采用轮询时间去询问?还是采用事件驱动,回调设计模式?

还有就是任何设计还是要自己考虑,异步IO其实还是需要创建线程去操作,如果CPU效率不够呢,并且传输数据很小呢?还会使用吗?

当采用技术时,犹豫才是成长。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值