网络的基础叫做socket IO:网络通信
Netty是对NIO做了一层封装,大部分场景下是使用的tcp,长连接;是解决网络问题的,
BIO:Block IO(Input-Output)网络上的输入输出,阻塞io
涉及到输入输出都需要优化,CPU的速度很快,比IO要快的很多,比磁盘上IO的读取速度快了1千万倍,网络上的需要看网速,
问题:
线程内存浪费,CPU调度消耗
根源:
Blocking阻塞:accept,recv
NIO:single Thread(Non-Blocking)
单线程模型下,通过selector轮训监控连接server的client,通过selector去读写,
NIO-reactor模式:响应是编程,selector不去管读写,只负责发现连接,提供链接,读写交给其他的线程去操作,
selector+worker(线程池)=reactor
NIO中必不可少的是轮询,能不能有一种模型能通知我有client存在;定义了bossGroup为selector作为发现连接,使client和server相互连接;定义workGroup作为io处理操作,进行读写
NIO:在java中是New IO,构建一套新的IO体系
在Linux中是Non-blocking IO,非阻塞IO
NIO优势:
规避了多线程的问题
C10K问题
假设有1万个连接,只有一个发来数据,每循环一次,其实你必须想内核发送1万次recv的系统调用。有9999次无效。
NIO-----》selector------>pool------>epoll
select(只能建立1024次连接) ,poll多路复用器:
优势:通过一次调用,把fds,传递给内核,内核进行遍历;这种遍历减少了系统调用次数
弊端:
1.重复传递fd
2.每次select,poll都要重新遍历全量的fd
那么就是AIO:
AIO:不需要轮询,(Asynchronous 一步的)
当有client想要连接了,交给os处理,去连接。
Netty:实现对于NIO的封装,封装成AIO的样子
Linux下的AIO的效率未必比NIO高(底层实现一样,使用epoll,AIO多了一层封装),
windows的server比较少,netty未做重点;
同步--异步--阻塞--非阻塞
同步异步关注的是消息的通信机制
阻塞非阻塞关注的是等待消息的状态
举例:
同步:我去烧水,水烧开了,还得由我本人再去拿水
异步:我去烧水,但是水烧开了,我不管了
阻塞:我在烧水,但是烧水的时候我不能干其他的事,我得一直等着
非阻塞:我在烧水,但是我可以去做其他的事,
同步阻塞:我在点火烧水,一直傻等着水开(阻塞),然后我在关火拿水(同步)
同步非阻塞:我在点火烧水,我跑去看电视了,时不时看下水开没(非阻塞),等水开了然后我在关火拿水(同步)
异步阻塞:我在点火烧水,一直傻等着水开(阻塞),然后我在找个别人帮我监控着,别人自动处理。(异步)(这种很少有)
异步非阻塞:
我在点火烧水,该干嘛干嘛去(非阻塞),然后我在找个别人帮我监控着,别人自动处理。(异步)
程序----内核
通过晶振来告诉cpu切换指令程序执行,内核程序中有个程序进程的队列,Cpu每次执行都是从内核程序中得知接下来去执行哪个app,从app的缓存中复制到CPU的缓存去执行,当下一次晶振震动,在把cpu值得东西放回APP的缓存里,清空CPU的缓存,
当程序使用了内核的系统调用,会使用到一个中断,int X80,会来回切换,性能损耗。
一个java启动就是个多线程,有8个线程,像什么gc,主线程
创建serversocket(3),把8090绑定到(3)这个socket,之后监听有没有连接到这个socket的
strace命令,可以追踪io的;strace -ff -o out java *****.java
查看系统级的命令解释:man 2 socket
server: