阻塞非阻塞和同步异步概念理解

2023-11-17

非阻塞算法 vs 阻塞算法

阻塞和非阻塞是在并发编程中常见的两个名称,其具体含义是什么呢?

我们所说的 “阻塞”是指进程在发起了一个系统调用(System Call) 后, 由于该系统调用的操作不能立即完成,需要等待一段时间,于是内核将进程挂起为等待 (waiting)状态, 以确保它不会被调度执行, 占用 CPU 资源。

友情提示: 在任意时刻, 一个 CPU 核心上(processor)只可能运行一个进程 。

阻塞算法简单概括为:会阻塞线程,直到请求的操作可以被执行,如果不能执行就需要一直等待

例如,如果一个线程产生往一个已经满了的阻塞队列里插入一个元素,这个线程就会阻塞,直到其他线程从这个阻塞队列中取走了一些元素。

例如阻塞式发送:发送方进程会被一直阻塞,直到消息被接受方进程收到

阻塞式接收:接收方调用 receive() 后一直阻塞, 直到消息到达可用。

而非阻塞算法则是,进行该操作之后立刻可以去干其他事情!,不是一直被阻挡在那里。其中可能得到一个失败的消息,或者得到一个不完整不正确的结果,但是不影响自己做其他事情。

例如在满了的非阻塞队列里插入一个元素,会通知插入失败,不会一直等待别人取走元素。

例如非阻塞式发送(nonblocking send): 发送方进程调用 send() 后, 立即就可以其他操作。

非阻塞式接受(nonblocking receive):接收方调用 receive() 函数后, 要么得到一个有效的结果, 要么得到一个空值, 即不会被阻塞。

非阻塞算法的优点

1.选择

当请求不能被执行时候,使用非阻塞算法能够多了一种选择。可以选择继续等待,也可以选择返回给用户失败信息。

2.没有线程挂起

挂起和恢复一个线程的代价是昂贵的。没错,随着时间的推移,操作系统和线程库已经越来越高效,线程挂起和恢复的成本也不断降低。不过,线程的挂起和户对任然需要付出很高的代价。

无论什么时候,一个线程阻塞,就会被挂起。因此,引起了线程挂起和恢复过载。由于使用非阻塞算法线程不会被挂起,这种过载就不会发生。这就意味着CPU有可能花更多时间在执行实际的业务逻辑上而不是上下文切换。

在一个多个CPU的系统上,阻塞算法会对阻塞算法产生重要的影响。运行在CPUA上的一个线程阻塞等待运行在CPU B上的一个线程。这就降低了程序天生就具备的并行水平。当然,CPU A可以调度其他线程去运行,但是挂起和激活线程(上下文切换)的代价是昂贵的。需要挂起的线程越少越好。

与同步异步区别

同步和异步关注的是消息通信机制

同步:调用者主动等待这个调用的结果。

异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。

image.png

总结来看:

阻塞非阻塞关注的是:程序调用是要一直办完这件事情还是可以立即可以做其他事情

同步异步关注的是:消息是怎么通信的,是一直询问还是被通知。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阻塞非阻塞和同步异步概念理解 的相关文章

随机推荐

  • leaflet-editable

    请参阅演示 UI 下面是更多示例 这也是uMap背后的绘图引擎 安装 您需要 Leaflet gt 1 0 0 然后包含src Leaflet Editable js 路径拖动 如果你想要路径拖动 你还需要包含Path Drag js 快速
  • vscode 预览图片 插件_真的动手写的VSCode的插件(图片浏览)之1

    由于本职工作中经常做图像处理 于时大量的图片浏览是不可避免的 怎么样不离开最近经常使用的VSCode 同时去看大量的图像对我来讲就是个不错的需求 尤其是某个目录下的文件 先谈基本的需求吧 显示一个目标下的所有图像 最好图像可以按列表 块显示
  • DQN学习使用混合规则的柔性车间AGV实时调度(关注点:状态、奖励函数的设置)

    1 文章简介 本文原文可查阅文献 Deep reinforcement learning based AGVs real time scheduling with mixed rule for flexible shop floor in
  • 1013: 防水堤坝_当堤坝断裂时:网页溢出问题的解决方案

    1013 防水堤坝 After unexpected gaps in pages perhaps the most common layout problem is content overflow Thankfully there are
  • Nginx负载均衡与高可用的实现

    当生产环境里有很大的流量产生时 通常需要用负载均衡技术来做优化 并确保容错配置 Nginx不光可以实现Web Server 还可以作为HTTP负载均衡来分发流量给后端的应用程序服务器 以此来提高性能 Nginx的负载均衡功能依赖于ngx h
  • Aix topas命令解析

    author skate time 2009 07 31 在网上闲逛时发现一片关于topas命令的详解 写的很全 于是记录在这 1 1 Aix topas命令解析 1 1 1 概述 1 1 2 命令报告及其输出 1 1 2 1 主要说明 1
  • C语言打印各种图案

    C语言打印各种图案 1 线段图案 include
  • 扩展练习4(学生类设计).设计一个友元函数,按照成绩从高到低的顺序输出姓名、学号和成绩信息

    include
  • 网络协议与分层模型

    文章目录 网络协议与分层模型 概述 网络分层模型 应用层 传输层 网络层 数据链路层 物理层 嵌入式设备接入互联网的需求越来越大 要想深层次的理解和应用好网络传输 就不得不挖一下计算机网络模型的老底 从系统角度 对网络应用进行分析 做到心中
  • XGBoost输入和输出维数

    XGBoost的输入和输出维数 python包 输入数据 2维 样本数 训练or测试 特征数 输出数据 1维 样本数 PS 单个树模型的输入似乎都是1维的
  • 大数据相关常用软件下载地址集锦

    文章目录 每日一句正能量 前言 一 软件下载地址如下 二 文档地址如下 结语 每日一句正能量 生命中有一些人与我们擦肩了 却来不及遇见 遇见了 却来不及相识 相识了 却来不及熟悉 熟悉了 却还是要说再见 前言 由于大数据开发中经常需要用到Z
  • python索引

    索引 作用 访问容器元素 str 齐天大圣 获取第一个元素 print str 0 获取第2个元素 print str 1 切片 从容器中取出相应的元素 语法 容器 开始索引 结束索引 步长 str1 我叫齐天大圣 print str1 0
  • 花呗最高额度只有5万,为何有人花呗额度可以达到1000万?

    我们都知道花呗正常的额度是在500块钱到5万块钱之间 大多数朋友的额度基本上是都是在2000到3万之间 就说花呗的额度5万已经封顶了 就算你条件再好想要获得更高的额度也没办法 但是在众多支付宝用户当中有一个是比较特殊的 因为他有特殊权益 据
  • 部署3节点k8s集群,要求使用版本1.24.2

    集群创建方式 containerd 以下操作三台设备都需完成 1 三台虚机设置时间同步和域名解析 2 禁用iptables和firewalld服务 3 禁用swap分区 4 升级操作系统内核 rpm import https www elr
  • PaddleDetection使官方使用手册细节点总结(2):模型部署

    1 导出可预测模型 训练得到一个满足要求的模型后 如果想要将该模型接入到C 预测库或者Serving服务 需要通过tools export model py导出该模型 同时 会导出预测时使用的配置文件 路径与模型保存路径相同 配置文件名为i
  • unity双击脚本无反应

    为了解决我每次都寻找解决方法而导致浪费时间的问题 把本人遇到的问题和解决方法记录下来 点击unity的window组件 再点击Package Manager 弹出以下界面 根据图中指示操作即可 最后 等待更新完成就可以啦
  • UnityVR--机械臂场景11-简单流水线应用3

    目录 一 前言 二 设置一个定时器 三 添加机械臂事件 四 机械臂控制函数OnArmCtrl 五 定义上面的3个机械臂移动方法 六 机械臂各关节转动控制 七 场景实现 八 完整代码 一 前言 上一篇使用了DoTween插件 并且改写了事件的
  • Pandas导入导出excel、csv、txt文件(全网最全教程)

    Pandas导入导出excel csv txt文件 Pandas 是一个强大的数据分析和处理库 可以用来读取和处理多种数据格式 包括 Excel 文件 下面是如何使用 Pandas 读取 Excel 文件的示例 首先 确保您已经安装了 Pa
  • 软件开发实施

    1 前期准备 公司开发人员对系统开发前期进行充分的用户调研 需求分析和系统体系结构的设计准备工作 公司开发人员以及业务需求人员共同组建项目组 一名或两名项目经理负责监控项目的整体实施 共同参与系统的全面设计 开发 并针对业务提出进一步开发需
  • 阻塞非阻塞和同步异步概念理解

    非阻塞算法 vs 阻塞算法 阻塞和非阻塞是在并发编程中常见的两个名称 其具体含义是什么呢 我们所说的 阻塞 是指进程在发起了一个系统调用 System Call 后 由于该系统调用的操作不能立即完成 需要等待一段时间 于是内核将进程挂起为等