IO模型

作者: 巨子联盟 | 来源:发表于2018-07-10 09:17 被阅读0次
    微信图片_20180702194551.jpg

    同步和异步
    从消息通知机制角度来说的。 两个任务 同步一直等,异步不等

    阻塞和非阻塞
    程序(线程)等待消息通知时的状态角度来说

    同步和阻塞

    对于同步调用来说,很多时候当前线程可能还是激活的,只是从逻辑上当前函数没有返回而已,此时,这个线程可能也会处理其他的消息
    对于阻塞调用来说,则当前线程就会被挂起等待当前函数返回

    同步阻塞、同步非阻塞
    异步阻塞、异步非阻塞

    阻塞与非阻塞 CPU的利用率 vs 系统的线程切换,上下文切换

    同步非阻塞形式实际上是效率低下的,异步非阻塞形式却没有这样的问题

    同步/异步关注的是消息通知的机制,而阻塞/非阻塞关注的是程序(线程)等待消息通知时的状态
    以小明下载文件打个比方
    同步阻塞:小明一直盯着下载进度条,到 100% 的时候就完成。
    同步非阻塞:小明提交下载任务后就去干别的,每过一段时间就去瞄一眼进度条,看到 100% 就完成。
    异步阻塞:小明换了个有下载完成通知功能的软件,下载完成就“叮”一声。不过小明仍然一直等待“叮”的声音(看起来很傻,不是吗)。
    异步非阻塞:仍然是那个会“叮”一声的下载软件,小明提交下载任务后就去干别的,听到“叮”的一声就知道完成了。

    同步/异步是“下载完成消息”通知的方式(机制),而阻塞/非阻塞则是在等待“下载完成消息”通知过程中的状态(能不能干其他任务)

    “消息通知机制”和“等待消息通知时的状态” 是 理解 同步,异步,阻塞和非阻塞的关键


    用户空间与内核空间:
    操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。
    为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间
    进程切换
    缓存 IO
    在 Linux 的缓存 IO 机制中,操作系统会将 IO 的数据缓存在文件系统的页缓存( page cache )中,
    也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间

    read操作两个阶段:
    第一阶段:等待数据准备 (Waiting for the data to be ready)。
    第二阶段:将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)。

    网络IO的模型分类:

    • 同步模型(synchronous IO)
    • 阻塞IO(bloking IO)
    • 非阻塞IO(non-blocking IO)
    • 多路复用IO(multiplexing IO)
    • 异步IO(asynchronous IO)
    • 信号驱动式IO(signal-driven IO) 不常用
    • 同步阻塞 IO 模型:
    • 同步非阻塞 IO:
      同步非阻塞就是 “每隔一会儿瞄一眼进度条” 的轮询(polling)方式
      nonblocking IO的特点是用户进程需要不断的主动询问kernel数据好了没有
      这会导致整体数据吞吐量的降低。
    • IO 多路复用( IO multiplexing)
      如果轮询不是进程的用户态,而是有人帮忙就好了。那么这就是所谓的 “IO 多路复用”
      UNIX/Linux 下的 select、poll、epoll 就是干这个的(epoll 比 poll、select 效率高,做的事情是一样的)
      select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。
      从整个IO过程来看,他们都是顺序执行的,因此可以归为同步模型(synchronous)。都是进程主动等待且向内核检查状态。

    并发和并行的区别
    并发数是指同时进行的任务数(如同时服务的 HTTP 请求),而并行数是可以同时工作的物理资源数量(如 CPU 核数)

    异步非阻塞 IO(asynchronous IO)

    相关文章

      网友评论

          本文标题:IO模型

          本文链接:https://www.haomeiwen.com/subject/pyayeftx.html