专栏首页小浩算法碎银几两,解不了的慌张

碎银几两,解不了的慌张

大家好,我是小浩。

最近都在说 “世人慌慌张张,不过为碎银几两;可偏偏这碎银几两,能解世间各种慌张”

但相信我,碎银几两解不了你面试时遇到的下面这些慌张。。。

真正能解惑的是:知识!

一、引言

相信线程,进程,协程, 并发,并行,同步,异步,阻塞和非阻塞这几个概念大家在编程过程中肯定会遇到,但是这几个概念又那么类似很容易让人模糊,今天就用这一篇文章来和大家梳理一下这几个概念。

二、并发与并行

2.1 并发

咱们用做早饭来举例,例如说你还没起床,你的女朋友已经早早的起来了,在厨房给你准备早饭,她想给你做一份面包片和煎蛋,她为了能让你尽快的吃上早饭,开了两个锅,一个锅用来煎蛋,一个锅用来煎面包片,但是她为了食物尽可能美味,只能看一下煎蛋的锅,在去看一下烤面包片,这样每个锅看一分钟,来回切换,这样终于把面包片和煎蛋做好了,这时你也睡醒了,吃到了美味的早餐。

你女朋友的这个做早饭的流程就是并发操作,因为她不可能同时将注意力放在两个锅上,只能通过逐渐切换注意力的方式来使任务很好的完成。

但是如果你的女朋友可以在两个锅之间切换的足够快,在旁边看起来就像是她在同时操作两个锅?。

2.2 并行

咱们还是用做早餐为例,现在你和你的女朋友在一起已经很久了,她再也受不了天天早上给你做饭的日子了,所以今天早上她把你也拽起来和她一起做饭。

同样还是煎面包片和煎蛋,这时你和你女朋友一份一个锅,你在准备煎蛋,你的女朋友在煎面包片,你俩就这样很和谐的做着自己的事互不干扰,很快就吃到了美味的早餐。

你和你的女朋友同时做饭,每个人操作一个锅的方式就是并行操作?。

2.3 图解并发并行

我们有两个任务A和B,分别采用并发和并行的方式执行。

上图是并发的方式执行任务,可以看到虽然A和B作为两个整体的任务但是未必会直接执行完,而是会在两个任务间来回切换。

因为cpu切换的速度实在太快了,所以我们看起来好像是A和B在同时执行,但其实在每个时间点上只有一个任务在执行。并行的方式就是将两个任务同时执行,如下图所示。

三、进程,线程与协程

3.1 进程

电脑中每个软件的启动就代表一个进程,简单来说就是把写的程序加载到操作系统中来执行预定好的任务。操作系统会为进程分配相应的资源来支撑它完成任务,每个进程会分配一个唯一的标识PID。

我们用老王来举例,假如说老王现在想盖个房子,我们就可以把盖房子这件事作为一个任务,当盖房子这件事启动的时候也就意味者启动了一个进程。

3.2 线程

线程是进程的执行实例,是一个程序执行的最小单元,每个进程里的任务会有线程去具体执行。

我们还是继续说老王,现在盖房子这个任务已经确定下来了,但是他发现自己不会盖,要请个工人来盖房子,于是他去外面请了一个工人A,这个工人A要做搬砖和搬木头的工作,此时这个工人A就是一个线程,老王还要求他这两个任务不能差距太大,要同步进行,所以这个工人A只能搬一趟转头,搬一趟木头,这样的操作就是单线程的并发操作。

干了两天,工人A不高兴了干的活太多了要加钱,这时老王一看一个人干也确实慢,就去外面又请了一个工人B,此时工人B也就对应着一个线程,老王让工人A继续搬砖,而工人B来负责搬木头,这样两个任务就能同时进行了,这就是多线程的并行操作。

而此时工人A和工人B是同时共享着老王提供的资源。

3.3 进程与线程+单核与多核

其实刚才老王那个例子已经能解释进程与线程的操作了,但是有些细节描述的不够清楚。

如果我们使用的是单核CPU,那么我们是无法执行并行操作的,只能做到并发,这样来充分调用CPU的资源。

如果我们使用的是多核CPU,我们才可以真正的意义上做到并行操作。我们的操作系统在进程或线程间切换是比较消耗资源的,因为要保存当前运行状态的上下文信息,而且进程或线程的切换是由操作系统决定的,到达运行时间之后,操作系统会将当前执行的任务挂起,我们只能等待下个分配到的时间片来继续执行任务。

这也就引出来协程的概念。

3.4 协程

就像我们刚才说到的,任务的切换是操作系统来控制,我们有没有什么办法来减小这种开销呢?我们就可以使用协程,协程我们可以理解为轻量级的线程。

协程在执行过程中不会由操作系统直接操作,而是由调度器决定,比如调度器发现协程A是一个长耗时操作,那么调度器就可以将其挂起去执行其他协程,等到协程A耗时任务结束后会加入待执行队列等待调度器调度。

四、同步与异步

  • 同步:当我们同步的执行某个任务时,我们需要等到这个任务执行完给我们反馈结果,我们才能去执行其他的任务。
  • 异步:但是异步的执行某个任务时,我们可以不用等这个任务结束就去执行另一项任务。通过异步执行的任务执行结束后我们可以通过回调函数获得结果。

我们可以明显的看出同步和异步的差别,那异步操作看起来效率那么高为什么不都使用异步操作呢?同步操作存在的意义是有些任务必须是按顺序执行的,就像我们去银行取钱,最起码的保证你的银行账户里有钱你才能取吧?,这也是为什么数据库中存在事务这一概念。

在一个系统中每一次请求,时间越长存在超时的风险就越大,逻辑越复杂执行的步骤越多,存在失败的风险也就越大。如果在业务允许的情况下,用户调用某个请求后只给用户必须要的结果,将一些操作作为异步进行操作,这就减少了超时的风险也把复杂业务进行拆分减低复杂度。常见的异步化操作有一下几种:

  • 服务端接收到请求后,创建新的线程处理业务逻辑,然后先将指定应答返回给客户端。
  • 服务端接收到请求后,服务端先给客户端返回指定应答,再继续处理业务逻辑。
  • 服务端接收到请求后,服务端把信息保存在消息队列或者数据库中,然后回应答给客户端,服务端业务处理进程再从消息队列或者数据库上读取信息处理业务逻辑。

五、阻塞与非阻塞

阻塞和非阻塞乍一听起感觉很好理解,但其实有许多细节值得去推敲,下面就用不那么严谨的描述先帮助大家理解阻塞与非阻塞的关系:

  • 阻塞调用是指调用结果在返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
  • 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

阻塞,非阻塞,同步,异步常与IO操作联系起来,你一定听过NIO(Non-blocking I/O),它是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被应用到许多大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。

关于阻塞,非阻塞,同步,异步与IO操作之间的区别与联系我们在下一篇文章再好好分析一下。

- END -

本文分享自微信公众号 - 小浩算法(xuesuanfa),作者:Subranium

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-01-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 『Python』python 弹窗、提示和警告框MessageBox部件

    风骨散人Chiam
  • Python 安装库的方法及解决pip 安装时速度缓慢的方法

    pip是python内置的非常好用的下载工具,基本可以下载全部的python库。 pip 是 Python 库管理工具,该工具提供了对Python 库的查找、...

    风骨散人Chiam
  • 『设计模式』我就要一个对象,你别给我这么多好不好!---单例模式

    作为一个现代社会文明青年,我觉得一夫一妻制非常合理。有些男人富裕了点,就想多照顾几个女人的行为,真的不可取,有的时候法律在这些面前显得难以生效,毕竟重婚罪又不能...

    风骨散人Chiam
  • 『数据库』朴实无华的数据库多表查询,连接查询、笛卡尔积

    (会用到连接运算,固定写法,连接运算在下面不用着急看) 先假设两张表: Table NSA1:

    风骨散人Chiam
  • 『Python』Python编译成计算机可执行文件(Windows计算机可执行文件exe,Linux 计算机可执行文件elf,Mac计算机可执行文件mach-O)

    Python 程序都是脚本的方式,一般是在解析器里运行,如果要想要给别的计算机使用,需要提前安装Python解析器和相关包才可以运行,为了在 Windows(或...

    风骨散人Chiam
  • 『数据库』无聊到爆炸的数据库文章--数据库的安全性

    计算机系统安全性 为计算机系统建立和采取的各种安全保护措施,以保护计算机系统中的硬件、软件及数据,防止其因偶然或恶意的原因使系统遭到破坏,数据遭到更改或泄露等...

    风骨散人Chiam
  • 『数据库』这篇数据库的文章真没人看--数据库完整性

    什么是数据库的完整性 ➢ 数据的正确性和相容性 ➢ 防止不合语义的数据进入数据库。 ➢ 完整性:真实地反映现实世界

    风骨散人Chiam
  • 3000多人被骗3亿元,“虚拟货币”诈骗案曝光!

    这两年,如果不晓得“区块链”“比特币”这些流行词,都不好意思出门。一时间,各种打着“去中心化”“运用区块链技术”旗号的虚拟货币大行其道,让人难辨真假。这不,深圳...

    安恒信息
  • 程序员告诉你:手机银行为何不如马云的支付宝和马化腾的微信支付好用?

    从移动支付兴起,到现在也有六七个年头了吧。短短几年内,出门就可以不带钱包了,移动支付给生活带来的变化可谓巨大无比,马云的支付宝也渐渐成为了金融支付行业的霸主。喜...

    一墨编程学习

扫码关注云+社区

领取腾讯云代金券