zoukankan      html  css  js  c++  java
  • I/O模型

    I/O模型的一些基本概念

    POSIX定义

    • 同步I/O操作(Synchronous I/O operation)

      导致请求进程阻塞,直到I/O操作完成

    • 异步I/O操作(Asynchronous I/O operation)

      不导致请求进程阻塞


    • 阻塞( Blocking )

      阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。

    • 非阻塞( Nonblocking)

      非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

    同步异步,阻塞非阻塞是分别2个不同的概念,它们之间不是相互对应的,但是有关联。

    I/O模型

    UNIX中存在的5种I/O模型:
    阻塞式I/O非阻塞式I/OI/O复用[select,poll]信号驱动式I/O异步I/O (POSIX的aio函数)

    • 阻塞式I/O

    • 非阻塞式I/O

    • I/O复用[select,poll]

    • 信号驱动式I/O

    • 异步I/O (POSIX的aio函数)

    一个简单的输入操作通常包括两个不同阶段:

    1. 等待数据准备好;
    2. 从内核向进程复制数据。

    阻塞式I/O模型

    默认情况下,所有socket都是阻塞的。

    recvfrom系统调用,从进程转入kernel,直到kernel的数据准备好,再将数据从kernel拷到用户内存,kernel返回结果,进程解除阻塞。就是说从recvfrom直到返回的时间内进程是被阻塞的

    非阻塞式I/O

    进程把socket设置为非阻塞,这样当有I/O请求操作的时候,不会把进程阻塞,而是返回一个错误。

    recvfrom在前3次调用没有数据返回,kernel立即返回一个EWOULDBLOCK错误,第4次有数据准备好,就被copy到进程的缓冲区,然后返回结果。

    在非阻塞的recvfrom调用之后,进程没有被阻塞,kernel返回错误,进程在接到返回后会去做其他的事情,然后间隔一段时间后再次发起recvfrom调用,重复直到完成。这个过程被称为轮询。但是轮询这种操作耗费大量的CPU时间,推高CPU的占用率

    I/O复用

    I/O复用(IO multiplexing),可以调用select或者poll,阻塞在这2个系统调用的某个上,而不是阻塞在真正的I/O系统调用上 I/O Multiplexing IO多路复用模型

    用户进程调用select,那么进程会被阻塞,kernel监视所有selectsocket,当任一个socket数据准备好后,select返回可读标识,用户进程调用read,将数据从kernel拷贝到用户进程。

    I/O复用中的2个系统调用(select,read),它的好处在于通过select来处理多个connection,它对于每个socket,都是非阻塞。

    信号驱动式I/O

    skip

    异步I/O

    调用aio_read函数,给kernel传递参数,告诉kernel当整个操作完成后如何通知。该系统调用立刻返回,而且在等待I/O完成期间,进程不被阻塞。

    模型比较

    前4中模型区别在第一阶段,第二阶段是一样的(在data从内核复制到调用者的缓冲区期间,进程阻塞在recvfrom)。而异步I/O在这2个阶段都处理。

    所以前4种都属于同步I/O,因为真正的I/O操作(recvfrom)将阻塞进程。只有异步I/O与POSIX定义的异步I/O匹配。

  • 相关阅读:
    Rest Project Performace Pressure Test
    Tomcat APR & Linux Optimization
    关于启用 HTTPS 的一些经验分享(二)
    关于启用 HTTPS 的一些经验分享(一)
    JVM垃圾回收机制总结:调优方法
    LVS+Keepalived搭建高可用负载均衡
    LVS搭建负载均衡(二)DR模型
    LVS搭建负载均衡(一)NAT模型
    编译安装Nginx和PHP(带编译mysql)
    centos7下利用httpd2.4配置svn并使用Ldap用户认证
  • 原文地址:https://www.cnblogs.com/dreamtaker/p/14452716.html
Copyright © 2011-2022 走看看