zoukankan      html  css  js  c++  java
  • AIO,BIO,NIO区别

    AIO,BIO,NIO都进程进行IO的三种不同方式。

    对于网络模型,这三种方式具体表现如下:

    BIO:最常见的阻塞同步IO,是指客户端请求时,服务端会起一个线程,或者是在线程池调一个线程去处理读写,并维护连接。如果此时是长连接的话,这种方式无法达到较高并发量,因为线程本身不能起太多。

    试想如下场景:做一个聊天服务器,你要对每个用户维护一个长连接。如果你用户量很高,有10w个同时在线,那你要起10w个线程,显然不实际。而且这10w个用户可能只有一部分在发送信息,那一定有很多线程是在阻塞态的,能不能让一个线程去阻塞呢?

    NIO:非阻塞同步IO,linux下的select,poll,epoll可以视为NIO的实现。非阻塞是指服务端不会等待IO事件,而是把等待交给内核或者一个专门的线程去做,利用异步回调的方式,将IO前的等待和执行IO的时间分离。

    继续上面的场景:如果这时候10w个用户在线,如果把等待都交给一个线程或者内核去做,像select,poll都是采用轮询的方式,即——我不知道谁要发生IO事件,那一个个问一下好了。如果用户数量少也没关系,但是用户数量到10w以上级别的话,你轮询一次也要10w次,十分浪费资源。epoll利用信号机制,当可读或者可写时,内核会发信号提醒,然后用户态调用回调函数执行对应事件。

    AIO:非阻塞异步IO,aio其实和epoll原理很像,但是epoll是信号提醒之后还要自己进行IO操作,而aio是先给内核制定对应内存,让内核有空就去读写,然后读写完发送信号告诉进程,由进程处理。其实从网络编程来说,我觉得aio和epoll差别不算太大,因为像TCP和UDP,内核都有维护一块缓存暂时存放数据,epoll也只是将数据从内核读出来而已。

    对于文件读写模型,AIO更有效,因为像epoll这种是无法应用于文件上的,磁盘文件永远可读。

  • 相关阅读:
    为图片指定区域添加链接
    数值取值范围问题
    【leetcode】柱状图中最大的矩形(第二遍)
    【leetcode 33】搜索旋转排序数组(第二遍)
    【Educational Codeforces Round 81 (Rated for Div. 2) C】Obtain The String
    【Educational Codeforces Round 81 (Rated for Div. 2) B】Infinite Prefixes
    【Educational Codeforces Round 81 (Rated for Div. 2) A】Display The Number
    【Codeforces 716B】Complete the Word
    一个简陋的留言板
    HTML,CSS,JavaScript,AJAX,JSP,Servlet,JDBC,Structs,Spring,Hibernate,Xml等概念
  • 原文地址:https://www.cnblogs.com/scaugsh/p/10293401.html
Copyright © 2011-2022 走看看