【IO-2】NIO非阻IO-塞模型一

NIO,IO调用的时候如果数据还没准备好,调用直接返回,不阻塞傻等 !!!

总结描述:

  1. server端通过系统调用创建一个socket,在OS层面就是创建一个文件描述符 fd0
    1. fd0在用户进程空间开辟空间存储,在内核空间也开辟一个空间存储
  2. server端通过系统调用bind fd0 到端口8080
  3. server端通过系统调用监听 fd0,也即是监听8080端口
  4. server端通过系统调用accept() 后如果没有客户端连接进来则直接返回,在while循环中不断的去调用accept() 方法查看连接情况
    1. 当第一个client端通过TCP三次握手连接到server端,此时server端创建一个fd1来唯一标识这个客户,以后server端和client端都通过fd1来进行读写通信
    2. fd1在用户进程空间和内核空间都创建了空间保存
    3. client端 fd1创建连接后,server端通过系统调用read(fd1) 读取client端发来的数据,如果数据没有到达,read()方法直接返回,在while循环中不断的去调用read()方法查看数据是否到达,一旦到达开始处理数据

核心特点:

  1. IO操作非阻塞
    1. server端调用accept(fd0)后如果没有客户端连接进来则直接返回,在while循环中不断的去调用accept() 方法查看是否有客户端连接进来
    2. server端调用read(fd1)后如果数据没有到达,read()方法直接返回,在while循环中不断的去调用read()方法查看数据是否到达,一旦数据到达开始处理数据

优化点:
        创建连接用一个线程负责,另外用一个线程池来做读写数据


问题:

  1. 当没有连接进来,或没有读写数据的时候,进程虽然不阻塞,但是一直空轮询去问操作系统连接到来没、数据到来没,很多无效的调用浪费cpu资源
  2. 当有10w的并发连接进来,server端处理连接的线程一个这无压力,处理读写数据的线程10w个,这远远超过系统内存资源上限制
  3. IO操作通过牺牲CPU资源变成非阻塞了,但是客户端连接数和线程数量成正比的关系没改变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值