彻底搞懂channel原理(二)

简介: 彻底搞懂channel原理(二)

上一篇文章主要介绍channel运行时是通过hchan表示的,也简单说明了hchan各个字段的含义

我们提到,对channel的操作,本质上就是对hchan里字段的操作。因为在操作的过程中使用了互斥锁,所以保证了channel的并发安全

这篇文章主要通过现实生活的一些例子来说明channel的一些原理,当然还是不会涉及过多源码。


无缓冲


我们都知道channel分为无缓冲和缓冲。这两者最大的区别是什么

我们用一个现实生活的快递例子来说明


1668512242071.jpg


上面场景是快递员在等小库,当然反过来小库也可能在等快递员


1668512257501.jpg


如果没有快递柜,快递员在送快递的过程中,如果家里没人,他就得在那等着,等着有人来签收快递,他才送货结束。

客户在快递员到来之前,他也不能离开家,不然快递来了没人收,所以他也得等到快递员上门,签字收了快递,他才算收货结束


当然,客户不止有这家快递,如果快递员A在等的时候又来一个快递员B给他送货。这个快递员B不仅得等着,还得排队。等到客户到家后,肯定是先签收A的快递,然后再签收B的快递。

对应到无缓冲channel

发送数据的时候,如果没有对应的接收者ready那么发送者就进入到等待发送队列中,等待有对应的接收者唤醒它。

接收数据的时候,如果没有对应的发送者ready那么接收者就进入到等待接收队列中,等待有对应的发送者唤醒它。

还记得上一篇文章我们介绍过hchan的结构吗


1668512274907.jpg


其中recvq表示等待接收消息的队列sendq表示等待发送消息的队列

我们来看waitq


1668512296761.jpg

1668512304580.jpg

本质上waitq就是一个链表,更确切的说是一个双向循环的链表。其中waitq记录了链表的头尾sudog记录了当前等待者的上一个等待者(prev)和下一个等待者(next)。

这就好像小库在签收完A的快递后喊,下一个是谁啊?

A会说:我的下一个是B。

B会说:是我。我记得我上一个是A,目前我没有下一个,所以我是最后一个


缓冲


看完了无缓冲队列,我们再来看缓冲队列。还是用上面的故事


1668512323547.jpg


只要快递柜有空闲柜子,快递员就可以直接把快递放到柜子里,让客户自己去柜子拿。如果发送没有空闲的柜子,那就只能等,等到别人告诉我有空闲柜子,我再把快递放到空出来的柜子里。

对应到缓冲channel上面的快递柜,就是缓冲channel中存储数据的buffer

对于发送者来说:只要缓冲区未满,发送者就可以继续发送数据存放在缓冲区。一旦缓冲区满了,发送者就只能进入到等待发送队列中,等待有对应的接收者唤醒它,然后它再把数据放入到刚刚被取走数据的位置。


对于接收者来说:只要缓冲区不为空,接收者就可以继续接收数据。一旦缓冲区空了,那么接收者就只能进入到等待接收队列中,等待有对应的发送者唤醒它。


上面还有什么问题吗?还真有。


我们取快递的时候,你一定会按照快递放入到快递柜的先后顺序取快递吗?咋么可能。

但是在channel中,是会保证消息的先进先出(FIFO)关系的。至于咋么保证的,我们终结篇解析代码细节的时候再说


总结


这篇文章主要通过一个快递的例子来介绍channel操作的原理。下一篇我们介channel针对上述处理的细节逻辑

相关文章
|
存储 数据挖掘 数据处理
R语言中的数据类型转换:解决常见问题的技术指南
【8月更文挑战第28天】数据类型转换是R语言编程中的一项基本技能,对于确保数据处理的准确性和效率至关重要。本文介绍了R中的基本数据类型及其转换方法,并探讨了解决常见问题的一些技巧。掌握这些知识和技巧,将有助于你更加高效地利用R语言进行数据分析和统计建模。
|
缓存 NoSQL 安全
玩转Redis!非常强大的Redisson分布式集合,少写60%代码
Redisson是Java的Redis客户端,提供实时数据平台服务,简化了分布式环境下的数据管理。它包含RList、RSet、RMap等分布式集合,支持ConcurrentMap和Set接口,确保线程安全和数据一致性。例如,RMap实现了本地缓存和监听器功能,允许数据监听和本地加速读取。此外,还提供了RSet的排序和去重功能,以及RQueue和RBlockingQueue等队列实现,支持阻塞操作。通过Redisson,开发者能轻松处理分布式系统的数据同步和操作。
|
11月前
|
弹性计算 运维 安全
阿里云云服务诊断工具评测报告
阿里云云服务诊断工具评测报告
257 13
|
机器学习/深度学习 人工智能 算法
量子计算算法:超越经典计算机的边界
【10月更文挑战第30天】量子计算基于量子力学原理,通过量子比特和量子门实现超越经典计算机的计算能力。本文探讨量子计算的基本原理、核心算法及其在密码学、化学、优化问题和机器学习等领域的应用前景,并讨论当前面临的挑战与未来发展方向。
|
机器学习/深度学习 存储 算法
基于Actor-Critic(A2C)强化学习的四旋翼无人机飞行控制系统matlab仿真
基于Actor-Critic强化学习的四旋翼无人机飞行控制系统,通过构建策略网络和价值网络学习最优控制策略。MATLAB 2022a仿真结果显示,该方法在复杂环境中表现出色。核心代码包括加载训练好的模型、设置仿真参数、运行仿真并绘制结果图表。仿真操作步骤可参考配套视频。
406 0
|
安全 Windows
怎么关闭Windows安全中心?
Windows安全中心是Windows的防护组件,负责抵挡病毒和威胁。关闭它可能增加安全风险,但若必须,可遵循以下方法:通过设置->更新和安全->病毒和威胁防护管理设置关闭实时保护;使用组策略编辑器禁用“隐藏病毒和威胁防护区域”;或在注册表编辑器中创建DisableAntiSpyware DWORD并设值为1。关闭前务必安装其他安全软件并保持系统更新。
怎么关闭Windows安全中心?
|
安全 算法 Android开发
Android10.0 人脸解锁(上)
Android10.0 人脸解锁(上)
Android10.0 人脸解锁(上)
|
API PHP 数据安全/隐私保护
IMAP邮箱API接收收取邮件的方法和步骤
IMAP邮箱API是用于自动接收和管理邮件的接口,允许程序无须手动登录即可操作邮件。要使用它,需先配置邮箱允许API访问,选择如Python的imaplib或PHP的imap扩展等IMAP库,然后连接到邮箱服务器,接收和处理邮件。处理完毕后断开连接。AokSend提供高效发信服务,支持SMTP/API接口。使用IMAP API能提升邮件管理效率。
|
存储 数据可视化 数据挖掘
单细胞分析(Signac): PBMC scATAC-seq 基因组区域可视化
单细胞分析(Signac): PBMC scATAC-seq 基因组区域可视化
|
机器人 定位技术 C++
技术笔记:ROS中测试机器人里程计信息
技术笔记:ROS中测试机器人里程计信息