【趣话计算机底层技术】一个故事看懂各种锁

这篇具有很好参考价值的文章主要介绍了【趣话计算机底层技术】一个故事看懂各种锁。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我是一个线程,一个卖票程序的线程。

自从我们线程诞生以来,同一个进程地址空间里允许有多个执行流一起执行,效率提升的同时,也引来了很多麻烦。

我们卖票线程的工作很简单,比如票的总数是100,每卖一张就减1,直到变成0售完为止。

以前单线程的时候没啥问题,但多个线程一起执行的时候就发现,有些家伙读取到票数是100,减1后变成99,还没等他把票数写回去,另外有别的线程去读也是100,也做了同样的事,结果卖了两张票,票数才减了1张,一天下来,多卖了很多票,气的人类差点想砸了我们。

原子操作

我们把这问题反馈给了操作系统大哥,他给我们的解决方案是:读取票数->票数减1->写回票数这三个步骤不能被拆分,中途不能被打断,他说这个叫原子操作

【趣话计算机底层技术】一个故事看懂各种锁

他给了我们一套原子操作的手册,里面不止有减法,还有加法、位运算,只要调用手册里的原子操作函数,就能保证逻辑的正确性。

我很好奇操作系统大哥是如何实现这个过程的原子化的,他告诉我,如果CPU只有一个核很好办,执行原子操作的时候,他不切换线程就可以。而如果是有多个核,就需要CPU来帮忙了。

你还别说,我们用这个原子操作来卖票后,再也没有发生超额卖票的问题。

自旋锁

有一天,我们卖票程序进行了升级,不再是直接读取票数->票数减1->写回票数这么简单,还需要安排座位,现在变成了:

【趣话计算机底层技术】一个故事看懂各种锁

 我们一翻手册,没有哪个原子操作函数能满足我们的功能,毕竟安排座位这个操作是咱们卖票程序自己的事儿,一点也不通用,操作系统大哥肯定不会专门为我们开发一个原子操作函数。

我们只好再一次求助操作系统大哥,他一看就说:“你们这个问题,用自旋锁就可以解决”

锁?我们还是第一次听说这玩意,不知道是什么意思。

操作系统告诉我们,让我们回去创建一个锁,这锁里面有一个状态标记来表示当前有没有被占用,所有线程在执行卖票操作之前,都得先去获取这个锁,如果锁被占用了,线程就会阻塞在获取函数那里,获取函数内部会不断循环去检查,直到别的线程释放后才返回。

【趣话计算机底层技术】一个故事看懂各种锁

 因为获取锁的时候线程会一直循环检查状态,所以这锁也叫自旋锁。

现在,我们的工作流程变成了:

【趣话计算机底层技术】一个故事看懂各种锁

我们又可以愉快地卖票了!

互斥锁

我们的业务发展很快,后来,我们用上了数据库,把票的数量写到了数据库里面,于是我们的工作流程变成了:

【趣话计算机底层技术】一个故事看懂各种锁

 本以为只是把票数从本地内存搬到了数据库,应该没什么不一样,结果发现我们运行经常出错,还莫名其妙地被杀掉进程。

我们向操作系统大哥大倒苦水,没想到他却说:“你们还好意思诉苦,你们获取自旋锁后搞那么耗时的操作,让别的线程一直自旋等待,把CPU都跑得飞起,风扇都转个不停···”

我们都羞愧地低下了头,原来,把票数从本地内存搬到了数据库,差别这么大。

操作系统又接着说道:“自旋锁因为会使得线程一直阻塞自旋,没有让出CPU,所以只适合处理比较快速的场合,像读取数据库这种很耗时的操作,不能用它,会白白浪费CPU时间!”

我们又询问:“有没有别的不浪费CPU的办法呢?”

操作系统大哥又给我们介绍了一个叫互斥锁的东西,听说获取这个锁的时候,线程不会去自旋检查,而是把自己放到这把锁的等待队列中,然后就交出CPU执行权限,进入睡眠,看起来就跟阻塞一样,等到后面别的线程释放锁之后,再去唤醒它的等待队列里的线程继续运行。

回去以后我们就用上了互斥锁,现在我们的流程变成了这样:

【趣话计算机底层技术】一个故事看懂各种锁

 我们又又能愉快地卖票了!

条件变量

有一天,我们的卖票程序又进行了升级,21-100号票价格比较便宜,交给其他线程来卖,1-20号票价格比较贵,交给我来卖。

现在,我们不同的线程卖的票不一样了。

别的线程的流程是这样:

【趣话计算机底层技术】一个故事看懂各种锁

 而我的流程是这样:

【趣话计算机底层技术】一个故事看懂各种锁

 使用互斥锁倒也没什么问题,可就是我经常拿到锁以后发现票号还大于20,不该我处理,只好默默的释放锁,白白把我唤醒,却什么也没干!

空手而回的次数多了以后,我又去请教操作系统大哥,能不能让我指定一个条件,等条件满足了再唤醒我运行,别让我白跑。

没想到还真有办法!操作系统告诉了我一个叫条件变量的东西,等待条件变量的线程平时阻塞着,别的线程发现条件满足之后,就将条件变量激活,那个时候等待的线程才会被唤醒。

回去之后,我跟我的小伙伴儿们商量了一下,我们创建了一个条件变量,等到它们发现票号小于等于20的时候,就把条件变量激活,我就会被唤醒,再也不用白跑了!

信号量

互斥锁和条件变量真是好东西,帮了我们大忙,不仅帮我们解决了卖票的问题,我们还在其他很多地方使用它,我们遇到的绝大多数同步和互斥问题都可以用它们来解决。

直到有一天,我们遇到了一个新的问题。

我们的票越卖越好,从100到1000,票的数量越来越多,来找我们买票的客户也越来越多。

因为每次售票都要访问数据库,连接它的线程有些多,那家伙有些吃不消了。

希望我们控制一下访问数据库的线程数量。

我们很自然的想到了互斥锁,只有拿到锁的线程才能去访问数据库。

可这互斥锁名叫互斥,只能允许一个线程拿到锁,总不能只允许一个线程访问数据库吧,那可不行。所以我们希望这个名额能放宽,允许多个线程同时获得锁。

我们再一次找到了操作系统大哥,大哥拿出了他的绝招——信号量

他告诉我们,这信号量就像一个升级版的互斥锁,它里面有一个计数器,可以用来指定最多允许多少个线程同时获得它。

这正是我们想要的锁!

很快我们用上了信号量,我们又又又能愉快地卖票了!

Tips:在信号量一节中,实际上数据库能承受的并发量远不止这点,这里为了故事情节需要,弱化了数据库的并发承受能力。

好了,这一期的故事就讲到这里了,如果你想查看更多未发布过的新鲜又有趣的技术小故事,可以扫描下方二维码购买我最新出版的《趣话计算机底层技术》图书。书中用一个个的小故事系统性的讲解了计算机底层技术的基本原理,以及如何运用他们解决日常工作中的各种实际问题。

【趣话计算机底层技术】一个故事看懂各种锁

往期推荐

  • 这玩意儿能逆向分析代码,我直接麻了!

  • 完了!CPU一味求快出事儿了!

  • 核弹级漏洞!我把log4j扒给你看

  • 可怕!CPU暗藏了这些未公开的指令!

  • 我是Redis,MySQL大哥被我害惨了!

 文章来源地址https://www.toymoban.com/news/detail-446203.html

到了这里,关于【趣话计算机底层技术】一个故事看懂各种锁的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 工业4.0 - Industrial 4.0领域的研究已经形成了一个完整体系,涉及机器人技术、生物技术、信息技术、工业控制系统、计算机视觉、大数据、人工智能、机器学习、人工神经网络等众多领域。

    作者:禅与计算机程序设计艺术 5月30日,由德国汉堡消费品有限公司发布了2020年度“汉堡行业报告”,预测,2020 年“汉堡市场规模将达到 2000亿美元”。这种估算引起轰动,而作为全球食品巨头,汉堡行业的估值也已超过了5000亿美元。与此同时,全球的“工业4.0”领域也走

    2024年02月10日
    浏览(44)
  • 计算机图形与图像技术

    可以使用Python、Java等语言。 下图中,图中各事物比例失调 如何使用代码去掉某个人(不允许使用抠图工具)?         像素(Pixel)是“图像元素”的缩写, 指的是图像的最小单位 。 它是构成数码图像或屏幕显示图像的基本单元,代表了图像中的一个小点或一个小方块

    2024年02月07日
    浏览(44)
  • 用Python写一个计算机

    如果你想用Python写一个计算器,可以按照以下步骤进行: 1. 设计计算器界面:可以使用Python图形库Tkinter等创建计算器的UI界面,包括数字和计算符号等。 2. 定义数字按钮和计算符号按钮:在UI界面上添加数字按钮和计算符号按钮,并绑定对应的点击事件。 3. 实现计算逻辑:

    2024年02月10日
    浏览(25)
  • 【计算机视觉】基于OpenCV计算机视觉的摄像头测距技术设计与实现

    在当今技术日益进步的时代,计算机视觉已成为我们生活中不可或缺的一部分。从智能监控到虚拟现实,计算机视觉技术的应用范围日益广泛。在这篇博客中,我们将探索一个特别实用的计算机视觉案例:使用OpenCV实现摄像头测距。这一技术不仅对专业人士有用,也为编程爱

    2024年02月04日
    浏览(36)
  • 计算机视觉:填充(padding)技术

    在前面的课程中,我们学习了使用3*3的过滤器去卷积一个5*5的图像,那么最终会得到一个3*3的输出。那是因为 3×3 过滤器在 5×5 矩阵中,只可能有 3×3 种可能的位置。 这背后的数学解释是,如果我们有一个n × n的图像,用f×f的过滤器做卷积,那么输出的维度就是 (n−f+1)×(

    2024年02月07日
    浏览(35)
  • 基于计算机视觉的手势识别技术

    一个不知名大学生,江湖人称菜狗 original author: Jacky Li Email : 3435673055@qq.com Time of completion:2023.5.2 Last edited: 2023.5.2 手语是一种主要由听力困难或耳聋的人使用的交流方式。这种基于手势的语言可以让人们轻松地表达想法和想法,克服听力问题带来的障碍。 这种便捷的交流方式

    2024年02月04日
    浏览(38)
  • 计算机视觉(CV)技术的优势

    计算机视觉(CV)技术的优势: 1. 自动化任务:计算机视觉技术可以自动执行一系列视觉任务,如图像分类、目标检测和识别等,从而实现任务的自动化。 2. 高速处理:计算机视觉技术可以在短时间内处理大量的图像和视频数据,实现快速的分析和决策。 3. 准确性:相对于

    2024年01月22日
    浏览(49)
  • 《计算机视觉技术与应用》重点复盘

    《计算机视觉技术与应用》-----第二章 图像处理基础 《计算机视觉技术与应用》-----第三章 图形用户界面 《计算机视觉技术与应用》-----第四章 图像变换 《计算机视觉技术与应用》-----第五章 边缘和轮廓 《计算机视觉技术与应用》-----第六章 边缘和轮廓 《计算机视觉技术

    2023年04月08日
    浏览(32)
  • 图像检索(Image Retrieval)是通过搜索引擎、计算机视觉等计算机技术对海量图片进行快速检索,找到最相关的图像或者按照某种相似性度量度进行排序的一类计算机技术

    作者:禅与计算机程序设计艺术 图像检索(Image Retrieval)是通过搜索引擎、计算机视觉等计算机技术对海量图片进行快速检索,找到最相关的图像或者按照某种相似性度量度进行排序的一类计算机技术。其目的是为了提高图片检索的效率及用户体验,从而节省时间、提升效率。

    2024年02月07日
    浏览(43)
  • 计算机三级(网络技术)一综合题(IP地址计算)

    计算并填写下表 地址类别 A类地址段是1.0.0.0~127.255.255.255       1~127 B类地址段是128.0.0.0~191.255.255.255    128~191 C类地址段是192.0.0.0~223.255.255.255     192~223 所以41填A 网络地址为主机位全0 根据子网掩码,可以确定网络位和主机位的分界 确定前6位为网络位,IP地址的前6位不变,

    2024年02月02日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包