本文为转载文章,觉得很有意思,原文在这里。

  我们知道,计算机中有很多概念并不容易理解,有些时候一个好的比喻能胜过很多句解释。下面两个是我看到的两个很精彩的比喻,拿出来和大家分享一下。

  第一比喻是关于吞吐量(throughput)和延迟(latency)的。如果你要搞网络性能优化,这两个概念是你必须要知道的,它们看似简单实则不是。我相信包括我在内的很多人都曾经认为大的吞吐量就意味着低延迟,高延迟就意味着吞吐量变小。下面的比喻可以解释这种观点根本不对。该比喻来自这里,我来做个大体意译(非逐字翻译)。

  我们可以把网络发送数据包比喻成去街边的 ATM 取钱。每一个人从开始使用 ATM 到取钱结束整个过程都需要一分钟,所以这里的延迟是60秒,那吞吐量呢?当然是 1/60 人/秒。现在银行升级了他们的 ATM 机操作系统,每个人只要30秒就可以完成取款了!延迟是 30秒,吞吐量是 1/30 人/秒。很好理解,可是前面的问题依然存在对不对?别慌,看下面。

  因为这附近来取钱的人比较多,现在银行决定在这里增加一台 ATM 机,一共有两台 ATM 机了。现在,一分钟可以让4个人完成取钱了,虽然你去排队取钱时在 ATM 机前还是要用 30 秒!也就是说,延迟没有变,但吞吐量增大了!可见,吞吐量可以不用通过减小延迟来提高。

  好了,现在银行为了改进服务又做出了一个新的决定:每个来取钱的客户在取完钱之后必须在旁边填写一个调查问卷,用时也是30秒。那么,现在你去取钱的话从开始使用 ATM 到完成调查问卷离开的时间又是 60 秒了!换句话说,延迟是60秒。而吞吐量根本没变!一分钟之内还是可以进来4个人!可见,延迟增加了,而吞吐量没有变。

  从这个比喻中我们可以看出,延迟测量的是每个客户(每个应用程序)感受到的时间长短,而吞吐量测量的是整个银行(整个操作系统)的处理效率,是两个完全不同的概念。用作者的原话说是:

  In short, the throughput is a function of how many stages are in parallel while latency is a function of how many are in series when there are multiple stages in the processing. The stage with the lowest throughput determines the overall throughput.

  正如银行为了让客户满意不光要提高自身的办事效率外,还要尽量缩短客户在银行办事所花的时间一样,操作系统不光要尽量让网络吞吐量大,而且还要让每个应用程序发送数据的延迟尽量小。这是两个不同的目标。

  另外一个比喻是解释信号量(semaphore)和互斥锁(mutex)的区别。该比喻最初来自这里,我先翻译一下,然后对它做个改进。

  互斥锁是一把公共厕所的钥匙。一个人使用厕所的时候可以拿到这把钥匙,用完之后把这把钥匙交给排队的下一个人。

  信号量是没有人使用的厕所的钥匙数量,所有厕所的钥匙都一样。比如有4个厕所有相同的钥匙和锁。信号量的值就是钥匙的数量,一开始是4。当进来一个人的时候数量就是少一个,如果4个厕所都满了,信号量就成0了,出去一个人就增加1,并把钥匙交给排队的下一个人。

  这个例子并不是太好,尤其是它无法解释 二元(binary)信号量和互斥锁的区别!我把这个比喻做了改进。互斥锁的比喻还是和上面一样,需要指出的是,当你拿到那把钥匙的时候你就是它的拥有者(owner),别人是无法打开厕所门的。

  而信号量什么呢?它就是一个大的公共厕所,里面有若干个位置,外面的大门口有一个可以翻动牌子写着“已满”和“可用”,当里面还有空的位置的时候,进去的人不用翻动这个牌子,直到没有位置时最后一个进去的人必须把它设成“已满”,这时后面的人必须排队等候,然后出去的人必须把牌子翻到“可用”,如果需要的话。

  很好理解对嘛?那么它怎么解释二元信号量呢?也就是当这个厕所里面能容纳一个人的时候,每个人进去的时候都要把门口的牌子翻到“已满”,出去的时候翻到“可用”。它和互斥锁的区别马上就可以看出来了,翻动的牌子在外面可以被别人翻的,而锁住的锁只有拿钥匙的人才可以开!

  当然了,信号量之所以翻译成“信号”,还是有道理的,因为它(厕所门口的牌子)标示的是资源(厕所空位)的状态,而互斥锁就是锁,它实实在在地锁住了资源。这在生产者消费者的情况下区别更明显。

两个精彩的比喻:吞吐量和延迟、信号量和互斥锁相关推荐

  1. Linux多线程的同步-----信号量和互斥锁

    前面两篇给基本概念讲过了,大家有兴趣的可以去看一下: Linux多线程_神厨小福贵!的博客-CSDN博客进程和线程的区别有哪些呢?进程是资源分配的最小单位,线程是CPU调度的最小单位进程有自己的独立地 ...

  2. 210224阶段三信号量、互斥锁

    目录 一.学习的知识点 进程 线程 进程和线程 信号量和互斥锁 应用场景 二.上课没有听懂或者没有理解的地方 三.当天学习的收获 一.学习的知识点 ls -a 显示隐藏文件 cd ~ 回到home目录 ...

  3. Linux内核中的同步原语:自旋锁,信号量,互斥锁,读写信号量,顺序锁

    Linux内核中的同步原语 自旋锁,信号量,互斥锁,读写信号量,顺序锁 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 1. Linux 内核中的同步原 ...

  4. 信号量和互斥锁的区别

    一:信号量与互斥锁之间的区别: 互斥量用于线程的互斥,信号线用于线程的同步.这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别. 互斥量值只能为0/1,信号量值可以为非负整数. 也就是说,一个互 ...

  5. Linux信号量与互斥锁解决生产者与消费者问题

    先来看什么是生产者消费者问题: 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问 ...

  6. 信号量、互斥锁、自旋锁

    信号量.互斥锁.自旋锁 前言 一.信号量 1.信号量初始化api 2.获取信号量 3.释放信号量 4.使用案例 二.互斥锁 互斥锁的API 三.自旋锁 1.初始化 2.获得自旋锁 3.释放自旋锁 4. ...

  7. 自旋锁与互斥锁的区别,信号量和互斥锁的区别

    文章目录 自旋锁与互斥锁的区别 信号量和互斥锁的区别 什么是信号量 什么是互斥锁 主要区别 生产者-消费者问题 使用mutex 使用信号量 信号量的优点 mutex的优点 信号量的缺点 mutex的缺 ...

  8. linux网络编程之posix 线程(三):posix 匿名信号量与互斥锁 示例生产者--消费者问题

    http://blog.csdn.net/jnu_simba/article/details/9123603 一.posix 信号量 信号量的概念参见这里.前面也讲过system v 信号量,现在来说 ...

  9. 进程、线程、信号量和互斥锁

    进程.线程.信号量和互斥锁 本文转自博客<进程与线程的一个简单解释> 计算机的核心是CPU,它承担了所有的计算任务.它就像一座工厂,时刻在运行. 假定工厂的电力有限,一次只能供给一个车间使 ...

最新文章

  1. Attempted relative import in non-package
  2. 教小学妹学算法:诺基亚引出的动态规划问题
  3. 三维重建15:最近遇到的-标定-EKF-优化方法等
  4. Nginx编译./configure翻译
  5. Linux桌面上的小动物,前方高能!我的OriginOS桌面上,出现了一群小动物
  6. MySQL 管理工具:Navicat for MySQL 8.0.19 中文版(破解版)
  7. wpsmac和pc版的区别_Mac版WPS Office和微软Office 2019哪个更好?
  8. SSM公司企业绩效考核管理系统
  9. C语言scanf为啥有时候要输入两次(解析)
  10. 曾被尊称为“教父级”人物的郭盛华,现在到底怎么样了?
  11. 大流量下订单号生成方法
  12. 上网课的心得体会1000字_上网课的感受作文600字
  13. C++容器方法大汇总
  14. 放弃理想,未必能成就现实
  15. 软件测试实习生面试归来
  16. 使 Windows 下的 Qt 应用程序获得 Administrator 权限
  17. 二次规划及qpoases简要介绍
  18. 计算机论文结束语致谢,论文结束语和致谢
  19. 第一章 分布式计算概述
  20. Linux桌面录屏分享

热门文章

  1. android 移除fragment,Android Viewpager+Fragment取消预加载及Fragment方法的学习
  2. php 安装pdo odbc,PHP PDO ODBC连接
  3. vscode使用sass_推荐7 个 极好用的VS Code 插件
  4. 代码中有个get是啥意思_是时候秀一波了,甩掉get和set,Lombok让代码更简洁
  5. oracle 表约束非空,oracle--约束(主键、非空、检查)
  6. elementui的upload组件怎么获取上传的文本流、_抖音feed流直播间引流你还不会玩?实操讲解...
  7. 对比损失的PyTorch实现详解
  8. android模拟器太卡,安卓模拟器安装之后太卡怎么解决
  9. c语言 函数指针开销,函数指针是否使程序变慢?
  10. python 在线预览文件_用Python PyQt写一个在线预览图片的GUI