前提概要:

IO的过程:

整个IO的过程其实是应用发起IO的请求,到应用获取到IO请求数据的中间过程。

这个中间,其实主要的时间就是系统准备数据的过程。这也是异步技术的优化所在。

对系统调用的理解:

首先,我们要明确一点。IO的操作属于一种系统调用。也就是应用在运行中,进入到内核代码来执行某些重要的操作。

其实我们可以把系统调用看做是一个通信的过程。应用程序是A,操作系统是K。这就类似于一个C/S的模型。A向K发送请求信息。(系统调用)

K返回给A信息。(返回值)

会话结束。(我们认为,这样就是一个完整的通信过程)

当然,也可能会出现这样的通信过程。B发送给A信息。(比如回调)

会话结束。

一次IO请求,可能是一个通信过程,也可能需要多个通信过程。这就是各种IO的区别。

同步和异步:

同步:

由应用(A)向K发起请求,到A获取数据,期间一直是A作为会话的发起者。

异步:

和同步相反的自然就是异步。异步中,A获取数据这次会话,是由K发起的。

注意:这里有点困惑的是,K通知A时,可以直接把数据给它,也可以告诉A我准备好了,你来请求吧。感觉二者的区别应该就是IOCP和Epoll的区别。后者给人的感觉就是,异步中带有同步。网上的异步阻塞应该也就是这个。

区别:

可以看出,二者的区别就是在于最终获取到数据这个会话,是哪边发起的。对于应用而言,主动就是同步,被动就是异步。(这个有点像CPU的同步/异步中断)

阻塞和非阻塞:

它们的区别主要在于IO请求发起,直到获得数据,这段时间,应用是等着还是不等着。

阻塞:

阻塞,就是应用等待着,不干活。

其实对于操作系统而言,阻塞不是什么坏事,不然要我操作系统干嘛。操作系统功能之一就是系统资源的调度,当某个进程(线程)阻塞了,它就能调度CPU资源给别的进程。这其实能提高不少利用率。

非阻塞:

看网上不少人说,这看上去是个差一点的方案。它是让应用不断的轮询,直到拿到数据。它相比于阻塞,会浪费一些CPU,自然性能也就会差一些了。

总结:

各种IO设计不同,但目的是一样的。都是为了让应用程序跑的更快,系统资源利用的更充分。

异步对于同步的优化点:

我一直觉得异步多进程和同步的性能并没有什么差异。因为我们的优化点是在发起IO请求到获得请求数据之间的这段时间。这段时间如果等着,那就浪费了。同步程序中(阻塞模式),多进程的情况下,操作系统的调度让阻塞的程序停止,把CPU给另一个需要CPU的进程,比如计算,处理。

异步程序的话,程序自身就不阻塞,像一个工厂流水线一样,只要上面工件下来,干完扔给下一步就行。(有可能回到上一步,也就是回调)

看上去,二者用了不同的方法优化了那段时间。其实把同步的程序从操作系统调度的层面来看,它也是异步的,对于操作系统而言,进程就是一个task_struct嘛,现在的CPU和IO设备其实就是异步的。

所以,准确的说,是应用程序的同步还是异步。二者的区别在于代价,也就是管理的灵活和切换的性能损耗。因为在同步程序中,第一步完成后,需要切换任务。而异步程序就不需要了,它继续干它自己的活。那么切换的代价就小了。

有人说,协程让用户使用同步的方式写出异步的性能。主要也是因为协程的切换代价小。再看IOCP的设计,为了最有效的利用操作系统,它使用了线程池,其目的也就是让线程能保持一个合理的数量。

该阻塞还是非阻塞:

阻塞其实就是把调度的权力给了操作系统,让操作系统来提高利系统用率。非阻塞则是把这个权力给了开发者,因为不阻塞的话我们可以做些别的事情,类似于程序内部的一个调度功能。

协程就是在系统调用时,内部跳转到别的协程代码去执行。类似于是自己实现了一个轻量级的调度。

ajax是异步非阻塞,[转帖]再谈IO的异步,同步,阻塞和非阻塞相关推荐

  1. 同步IO、异步IO、阻塞IO、非阻塞IO、复用IO

    参考:同步IO 异步IO 作者:今天天气眞好 发布时间: 2021-04-19 09:42:29 网址:https://blog.csdn.net/qq_51118175/article/detail ...

  2. 简述同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别

    POSIX 同步IO.异步IO.阻塞IO.非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下. ...

  3. 同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区分

    POSIX 首先了解下什么是posix 可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX)是IEEE为要在各种UNIX操作系统上运行软 ...

  4. 【高并发编程】再谈同步、异步、阻塞、非阻塞

    同步.异步.阻塞.非阻塞的概念一直是计算机学科中很重要的概念,而这种细微的差别常常被大家混淆,我自己在过一段时间后也需要复习.今天再次翻出这个概念,仍然觉得不够清晰,今天再次深入了解了这四大天王. 以 ...

  5. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  6. 【多线程】0.理解一下5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO

    5种IO模型.阻塞IO和非阻塞IO.同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度.环境不一样.所以,我们先说明基本的IO操作及环境. 本文是在<UNIX网络编 ...

  7. java epoll select_Java 非阻塞 IO 和异步 IO

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 作者 | HongJie 链接 | javadoop.com/post/nio-and-aio 本文将介绍非阻塞 IO 和异步 IO,也就是 ...

  8. 5种网络IO模型:阻塞IO、非阻塞IO、异步IO、多路复用IO、信号驱动IO

    目录 前言 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) 模型间的区别 ...

  9. linux5种IO模型以及同步异步,阻塞非阻塞

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...

  10. Java 非阻塞 IO 和异步 IO

    转载自 Java 非阻塞 IO 和异步 IO 上一篇文章介绍了 Java NIO 中 Buffer.Channel 和 Selector 的基本操作,主要是一些接口操作,比较简单. 本文将介绍非阻塞 ...

最新文章

  1. Linux软件安装小结
  2. 【MyBatis】学习纪要六:动态SQL
  3. node更新到最新版本_win10怎么更新flash到最新版本「系统天地」
  4. mysql show slave status 无记录_Mysql show slave status 的研究
  5. tensorflow生成图片标签_Tensorboard高维向量可视化 + 解决标签和图片不显示BUG
  6. 查看ubuntu版本
  7. 有意思,USB资料分享
  8. temp变量this变量base变量 c# 1613715552
  9. 数据字符集mysql主从数据库,分库分表等笔记
  10. 六、3D-3D ICP问题线性SVD解法与非线性BA解法
  11. 2020年书法落款_书法落款的基本常识
  12. 现代软件工程讲义 如何提出靠谱的项目建议
  13. MTK: mtk 10A 建立socket连接问题
  14. 信号处理中简单实用的方法——对信号进行平滑处理
  15. GKCTF2020 逆向部分题的复现
  16. Latex 公式被压扁过小
  17. win10计算机拨号连接,Win10设置电脑开机自动连接宽带的方法
  18. python爬虫之Scrapy介绍八——Scrapy-分布式(以爬取京东读书为示例)
  19. android所有需要的Demo地址
  20. C# + Ext.Net打印

热门文章

  1. C# 引用访问权限,很多老手都不懂
  2. 使用RabbitMQ做的一些工作及经验教训
  3. SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEM...
  4. linux忘记root密码及时间设定
  5. 面向实时嵌入式系统的图形用户界面支持系统――MiniGUI 背景,发展及优势
  6. Spring框架利用PropertyPlaceholderConfigurer初始化加载多properties文件
  7. 2.数据中台 --- 什么是数据中台
  8. 20.UNIX 环境高级编程--数据库函数库
  9. 8.修改、扩展、重写Magento代码
  10. java定义不同类型参数_java – Mockito允许使用不同的参数类型来模拟重载方法