• 【IO】同步、异步、阻塞、非阻塞的理解


    最近一直在看跟IO模型有关的内容,感觉差不多理解了,于是开始写这一篇总结博客。针对的操作系统为UNIX/LINUX,大致的体系结构如上图。

    操作系统中的客体主要包括了:文件,Socket和进程,本文主要讨论与IO相关的文件和Socket。

    IO主要分为文件IO网络IO,文件IO也就是对文件的读写,网络IO是利用socket进行数据传输,socket是对TCP/IP协议的封装而提供的编程接口。

    首先区分一下同步、异步、阻塞式、非阻塞式这些概念,参考知乎上解答

    1、同步、异步是针对消息通信机制而言的。

    同步指的是当发出一个调用时,如果结果没有计算好,就不会有返回值,而当结果计算完之后,就会返回。

    异步指的是发出调用后立刻返回,而结果在后台慢慢计算,当计算完成之后,通过回调函数告知调用者。常见的异步调用就是ajax和nodejs。

    2、阻塞式和非阻塞式是对于线程在等待结果时的状态。

    阻塞指的是线程在等待结果时会被“挂起”,也就是交出CPU资源让其他线程运行,不能做其他事。

    非阻塞就是在等待结果时依然拥有CPU资源,可以做其他的事。

    从这两个角度来看,同步异步与阻塞非阻塞其实没有什么关系,因为是针对于不同的方面来谈的。

    所以对于IO模型可以分为下面这几种类型:

    同步 阻塞式IO 非阻塞式IO IO多路复用
    异步 异步IO    

    多线程编程与异步编程的比较:

    多线程的优缺点:

    优点:顺序执行,思路简单

    缺点:上下文切换占用CPU资源;线程间共享变量已造成死锁;容易编写非线程安全的代码。

    异步调用的优缺点:

    优点:不会给CPU造成额外负担

    缺点:非顺序执行,不易理解,难以调试。

    适用场景:

    对于IO操作,异步调用比多线程+同步更适合,而线程的适用范围则是那种需要长时间CPU运算的场合,例如耗时较长的图形处理和算法执行。但是往 往由于使用线程编程的简单和符合习惯,所以很多朋友往往会使用线程来执行耗时较长的I/O操作。这样在只有少数几个并发操作的时候还无伤大雅,如果需要处 理大量的并发操作时就不合适了。

    参考:http://kb.cnblogs.com/page/85931/

  • 相关阅读:
    python3爬虫-快速入门-爬取图片和标题
    数据库Mysql的学习(八)-储存过程和事务和导入导出
    数据库Mysql的学习(七)-自定义函数和流程控制
    git reset --hard HEAD^
    list采坑记录一下
    Linux运行jar包
    JSONObject.toJSONString(map)
    String转list
    判断list中元素是否是相邻
    统计List中相同的元素
  • 原文地址:https://www.cnblogs.com/puyangsky/p/5699208.html
Copyright © 2020-2023  润新知