NIO,IO调用的时候如果数据还没准备好,调用直接返回,不阻塞傻等 !!!
总结描述:
- server端通过系统调用创建一个socket,在OS层面就是创建一个文件描述符 fd0
- fd0在用户进程空间开辟空间存储,在内核空间也开辟一个空间存储
- server端通过系统调用bind fd0 到端口8080
- server端通过系统调用监听 fd0,也即是监听8080端口
- server端通过系统调用accept() 后如果没有客户端连接进来则直接返回,在while循环中不断的去调用accept() 方法查看连接情况
- 当第一个client端通过TCP三次握手连接到server端,此时server端创建一个fd1来唯一标识这个客户,以后server端和client端都通过fd1来进行读写通信
- fd1在用户进程空间和内核空间都创建了空间保存
- client端 fd1创建连接后,server端通过系统调用read(fd1) 读取client端发来的数据,如果数据没有到达,read()方法直接返回,在while循环中不断的去调用read()方法查看数据是否到达,一旦到达开始处理数据
核心特点:
- IO操作非阻塞
- server端调用accept(fd0)后如果没有客户端连接进来则直接返回,在while循环中不断的去调用accept() 方法查看是否有客户端连接进来
- server端调用read(fd1)后如果数据没有到达,read()方法直接返回,在while循环中不断的去调用read()方法查看数据是否到达,一旦数据到达开始处理数据
优化点:
创建连接用一个线程负责,另外用一个线程池来做读写数据
问题:
- 当没有连接进来,或没有读写数据的时候,进程虽然不阻塞,但是一直空轮询去问操作系统连接到来没、数据到来没,很多无效的调用浪费cpu资源
- 当有10w的并发连接进来,server端处理连接的线程一个这无压力,处理读写数据的线程10w个,这远远超过系统内存资源上限制
- IO操作通过牺牲CPU资源变成非阻塞了,但是客户端连接数和线程数量成正比的关系没改变