Netty百万级连接

1.Netty是一个基于java nio 异步通信框架,其架构特点 异步非阻塞,基于事件驱动,高性能,高可靠性,高可定制性
2.BIO 优点模型简单代码简单,缺点请求数和线程数1:1,在高并发情况下cpu切换线程上下文损耗大,tomcat7之前使用的是BIO之后使用的是Nio,可以使用线程池使用伪Nio
同步阻塞IO:一个请求一个线程,客户发起一个请求服务器就需要启动一个线程去处理,如果这个请求没做任何事,会造成不必要的线程开销,可以通过线程池改善。
同步非阻塞IO:一个请求一个线程,客户端发送请求会注册到服务器的选择器上,通过轮训这个选择器来获取有IO事件的请求,在创建线程处理
异步非阻塞IO:服务器实现一个有效请求一个线程,客户端的IO请求都是由系统完成在通知服务器应用去启动线程去处理
Linux网络编程IO模型
    1.阻塞IO模型:
        用户进程想要读取数据了,于是就通过执行recvfrom来进行一次系统调用,进入内核态,内核空间准备数据,将准备好的数据复制的用户空间(整个过程处理阻塞状态)
    2.非阻塞IO模型:
        用户进程想要读取数据了,于是就通过执行recvfrom来进行一次系统调用,进入内核态,内核态如果还没有准备好数据就直接返回一个没有准备好的标志,
        用户进程还会去干别的事,但是还是会定时轮询系统调用来查看数据是否准备好了。
    3.多路复用IO模型
        当很多连接要进行读或写的时候,用户进程通过将fd_set传递给一个函数,比如select函数,select函数触发了系统调用,进入内核态,
        内核如果看到有某个fd对应的数据准备好了,就会返回这个fd,select在接收这个返回的过程中一直是阻塞的,
        当接收到这个返回之后就在用户进程的fd_set查找对应的fd,然后在执行系统调用,这次系统调用不在是让内核返回就绪文件描述符了,而是让内核读取数据返回,这个过程进程处于阻塞的。
        在select等待就绪fd的过程中,可以认为是使用了同步阻塞模式,在获取到数据可读的fd之后,再次系统调用时阻塞读取的,
        其实从select等待就绪fd的过程里面看,IO多路复用相对阻塞IO还有点相似也是在数据到来之前阻塞,但是IO多路复用的优势就是可以处理多个连接,这对于服务器来说是很重要的
    4.信号驱动IO模型
        使用信号,让内核在描述符准备就绪的时候发送SIGIO信号通知我们,然后在信号回调函数里面,将数据拷贝到用户空间。
    5.异步IO模型:
        内核在接收用户调度后会直接返回,但返回的不是数据。当内核把数据复制到用户空间复制完成在主动通知用户进程。
阻塞非阻塞说的是线程的状态
同步异步说的是消息的通知机制
同步需要主动读写数据,异步不需要主动读写数据
同步IO和异步IO针对的是用户应用程序和内核的交互
IO多路复用技术:
    IO指的是网络IO,多路指的的是多个TCP(socket,channel),复用指的是一个线程或几个线程
    一个线程或几个线程处理多个TCP连接,最大优势减少系统开销,不需要创建多个线程。
select
    基本原理:监听文件3类描述符writefds,readfds,exceptfds调用select后会阻塞住,
            等数据有可读可写出异常或超时就会返回,select函数正常返回后,通过遍历fdset整个数组才能发现那些句柄发生了事件,
            来找到就绪的描述符fd,然后进行对应的IO操作
    缺点
        1.select采用轮训方式扫描文件描述符,全部扫描,随着文件的fd数量增加性能减少
        2.每次select都需要把fd集合从用户态拷贝到内核态进行遍历
        3.单个进程的打开的fd是有限制,默认是1024
poll
    基本流程:select()和poll()系统调用的大体一样,处理多个描述符也是使用轮训的方式,根据描述符的状态进行处理,
            一样需要把fd集合从用户态拷贝到内核态,并进行遍历,最大的区别,poll没有最大文件描述符限制(使用链表的方式存储fd)。
epoll
    基本原理:在2.6内核中提出的,对比select和poll,epoll更加灵活,没有描述符限制,用户态拷贝到内核态只需要一次
            使用事件通知,通过epoll_ctl注册fd,一旦fd就绪,内核就会采用callback的回调机制来激活对应的fd
    核心函数
        epoll_create():在linux内核里面申请一个文件系统 B+数,返回epool对象,也是一个fd
        epoll_ctl():操作epoll对象,在这个对象里面修改添加删除对应的链接fd,绑定一个callback函数
        epoll_wait():判断并完成对应的IO操作
    优点:
        1.没fd这个限制,所支持的FD上限是操作系统的最大文件句柄数,1G内存大概支持10万个句柄
        2.效率提高,使用回调通知而不是轮训的方式,不会随着FD数目的增加效率下降
        3.通过callback机制通知,内核和用户空间同一块内存实现
    缺点:
        1.编程模型比select/poll复杂

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值