网络的基础叫做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:

Client:

相关链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: