netty i/o模型


netty i/o模型

        

                

                                  

i/o 基础

      

内核空间、用户空间

                 

内核空间:存放系统代码和数据,提供接口供所有用户程序调用

用户空间:存放应用程序代码和数据,为应用程序私有

       

i/o:网络i/o、磁盘i/o,应用程序执行i/o时需要调用系统接口

                 

                 

磁盘i/o:应用程序读写磁盘数据时,需要调用系统接口,先读写到系统内存

网络i/o:应用程序读写网络数据时,需要调用系统接口读写网卡设备中的数据

i/o一般分为两步:数据准备、数据搬迁,网络i/o数据准备阶段可能花费的时间比较长

         

            

                                  

阻塞i/o模型

    

应用程序在数据准备、复制阶段应用程序都处于阻塞状态(进程挂起不消耗cpu资源)

                 

应用程序发起i/o调用

# 数据准备阶段
系统等待获取数据,将数据缓存在系统内存,此时应用程序处于阻塞等待状态

# 数据复制阶段
系统数据准备完成后,将数据复制到应用系统内存,此时应用程序处于阻塞等待状态

# 数据复制完成
数据复制完成后,应用程序阻塞结束,继续执行后续操作

使用场景:为每个i/o请求分配一个线程,不适合并发量大的场景

        

            

                                  

非阻塞i/o模型

  

应用程序在数据准备阶段不阻塞、复制阶段阻塞(数据准备阶段需要i/o轮询,会消耗cpu资源)

                 

应用程序发起i/o调用

# 系统数据准备阶段
如果数据没有准备好,立刻返回响应,
应用程序不会阻塞,后续不断发出i/o请求,准备完成后就进行数据复制

# 系统数据复制阶段
系统数据复制阶段,应用程序处于阻塞等待状态

# 数据复制完成
系统数据复制完成后,应用程序阻塞结束,继续运行

适用场景:适用于并发量小、且不需要及时响应的场景

        

            

                                  

多路复用i/o模型

             

应用程序的i/o请求注册到selector上,selector处理多个i/o请求

                 

应用程序发起i/o请求调用(select请求),注册到selector选择器上;

# 数据准备阶段
如果数据没有准备好,应用进程会一直阻塞;
数据准备好后,selector会通知应用进程发起i/o调用;

# 数据复制阶段
数据准备好后,selector会通知应用进程发起i/o调用;
在此期间,应用进程处于阻塞状态

# 数据复制完成
数据复制完成后,应用进程阻塞结束,继续执行后续操作

使用场景:一个线程处理多个连接,适用于高并发量的场景(低并发下不一定比阻塞i/o模型响应快)

       

select、poll、epoll

# select:使用数组存储fd
线性轮询:轮询注册的fd(文件描述符),查看i/o时间是否准备好,在fd数量不是很多时性能较好
内存复制:需要在用户内存、系统内存复制文件描述符
处理的fd有数量限制:32位默认为1024,64位默认为2048
查看单个进程处理fd数量:cat /proc/sys/fs/file-max

# poll:与select类似,但没有数量限制(使用链表存储fd)
线性轮询:轮询注册的fd(文件描述符),查看i/o时间是否准备好
内存复制:需要在用户内存、系统内存复制文件描述符
处理的fd数量没有限制:使用链表存储,fd数量没有限制

# epoll:注册回调函数,通过回调函数告知调用方i/o准备就绪(使用红黑树存储fd)
回调通知:不需要遍历fd(文件描述符),注册回调函数后,i/o事件就绪后会主动通知
共享内存:用户空间、系统空间共享内存,使用mmap(),不需要将文件描述符复制到系统空间
        文件就绪后,只需将准备就绪的fd复制到用户空间
处理的fd数量没有限制:使用红黑树存储,fd数量没有限制
说明:在fd数量不是很多时,由于epoll需要注册回调函数,性能比一定比select、poll好

       

             

                                  

信号驱动i/o模型

       

注册信号函数,应用程序在数据准备阶段不阻塞、数据复制阶段会阻塞

                 

应用程序注册信号函数,准备进行i/o操作

# 数据准备阶段
注册信号函数后,应用程序立刻返回,在此期间不阻塞

# 数据复制阶段
数据准备好后,内核发送信号,告知应用程序数据准备就绪,
应用程序发起i/o操作,在此期间应用程序阻塞

# 数据复制完成
数据复制完成后,应用程序阻塞结束,继续执行后续操作

使用场景:信号驱动i/o模型是伪异步i/o(数据复制阶段会阻塞),一般不常用

      

              

                                  

异步i/o模型

     

应用程序在数据准备、复制阶段不阻塞

                 

应用程序发起异步i/o请求,随后立刻返回,继续执行后续操作,整个过程都不阻塞;

内核接到i/o请求后,准备数据、然后进行数据复制,数据复制完成后告知应用程序;

         

               

                                  

同步、异步

      

同步:需要调用方主动询问请求结果

异步:调用方会被告知请求结果,不需要主动询问

                 

       

               

                                  

阻塞、非阻塞

   

阻塞:调用方发起请求后,一直等待获取请求结果

非阻塞:调用方发起请求后,不需要等待请求结果,继续执行后续操作

                 

       

            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值