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这种是无法应用于文件上的,磁盘文件永远可读。

  • 相关阅读:
    超文本传输协议 HTTP/1.0 Hyptertext Transfer Protocol
    VB.NET中使用代表对方法异步调用
    蚂蚁解道德经(1)[转载]
    vb.net 类的属性的设置和获取问题
    VB.net入门(6):类~构造函数,事件
    什么是Ajax技术
    千里之外
    一个asp.net2005的页面文件调用CSS样式的BUG
    一个.net发送HTTP数据实体的类
    利用ASP发送和接收XML数据的处理方法
  • 原文地址:https://www.cnblogs.com/scaugsh/p/10293401.html
Copyright © 2011-2022 走看看