前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >"女票"竟然问我什么是同步、异步、阻塞、非阻塞?

"女票"竟然问我什么是同步、异步、阻塞、非阻塞?

原创
作者头像
我是阿沐
修改2021-06-01 14:33:29
5770
修改2021-06-01 14:33:29
举报

1 故事的起源

哈喽,小伙伴们,大家好,我是阿沐!

大家应该看标题就知道了,今天要通过大白话+图形跟我女票(哪里来的女票?假想一下)讲解同步、异步、阻塞、非阻塞、并行、并发的理解。我女票是一个爱问问题的人,最喜欢没事问计算机方面的,尽管她是一名数学教师,尽管她学过计算机编程;但是我认为她啥都不会,有时候在我烦躁的问我,我会冲她发脾气,这里呢,认认真真(当面)跟女票道个歉,她纯粹是想帮我分忧解难。

今天就跟我女票唠一唠这个话题。

大家如果感兴趣,微信搜索「我是阿沐」关注我这枚有点神经但乐观的程序员~

2 什么是阻塞、非阻塞、同步、异步?

“老公我之前看你天天看操作系统的书的目录有阻塞和非阻塞,是个啥子意思嘛?是不是像我们平常坐地铁,有时候高峰期地铁🚇被堵了坐不上,有时候人又很少然后又不堵车了?”。你说说是啥意思嘛,是不是这样啊,撒个娇。

有这个点的意思,但是你这个只是片面的意思,我给你画图看看吧,这样你就一眼明白了。「我向来经受不住女生撒娇的

“从上面图形能看出来什么嘛?可以知道整体的流程是什么样子嘛?”,我对着女票问到

“老公,我看到了,看出来了”,女票兴奋激动的说道。

“快说说你看到什么了,难道我画的图结构这么清晰的嘛?我还以为你英文不咋地看不懂呢?”,我一脸期待的等着,脸上洋溢的微笑,我看到来自女票肯定的目光。

”老公你这个图画的挺好看的,用啥软件画的啊,好清晰哦!“,一脸崇拜的对我说。

”嚯嚯嚯,原来你看到的是这个啊!“,一盆冷水浇在了我的头上,冷冰冰的,女票你这是在侮辱我的画作;我还是对着图跟你讲一遍吧。

介绍一下图 1:

1)read用户请求调用read后,用户线程被阻塞。

2)no ready data内核没有准备好的数据。

3)data to cache准备好的数据放到内核缓存区。

  1. kernel copies data to user内核缓存区拷贝数据到用户空间。

5)copy data complete 数据拷贝完成返回给调用方使用

这么看来用户发起一个请求后,用户线程就会一直被阻塞,要等到内核把数据整理好拷贝给用户缓存区以后,请求才能拿到数据使用。整体的流程就是:内核从磁盘读数据进入内核缓存区;然后再把数据拷贝到用户缓存区;整个流程都处于阻塞状态中,必须一致进行下去,拿到结果才算完成一个请求。

总结阻塞是指:在请求调用拿到结果返回之前,当前的线程会被挂起。调用线程只有在得到结果之后才会被唤醒执行后续的操作。

介绍一下图 2:

基本逻辑跟阻塞一致,唯一不同的是:它多出了几次read请求(即轮询请求)。对,非阻塞主要就是体现在这里。

”那它是怎么体现出来的呢,老公可以举个简单的例子给我听听嘛,你专业术语我不是很明白“,一脸困惑迷茫的看着我。

举个例子论证给你听听:

例如:你坐地铁的时候,突然在安检门那边有个阿姨跟安检员吵起架了,阿姨扬言:”今天你要是不给老子一个说法,我跟你没玩,谁也别想过去“。阿姨搬个小板凳堵住门口,坐在哪里扣手机,时不时的询问那个安检员,这事怎么解决?那么这整个过程对于阿姨来说就是一个非阻塞操作。一边玩手机一边问安检员解决方案,说白了就是:你再等待解决方案的同时也没有闲着,可以在这个间隔时间期间做其他的事情,等到解决方案出来了,就完成了整个流程。

这里最后一步read操作是一个同步的一个过程,是需要线程去等待的过程;原因就是内核准备好了数据,要把数据拷贝到用户缓存区。

总结非阻塞是指:在调用结果没有返回之前,该调用不会阻塞住当前线程

同步

同步是指:用户发起一个请求,知道请求结果返回之后,才会进行下一步的操作逻辑。必须一件事一件事的去完成,只有前一个事情做完了,才轮到去做下面的事情。

例如:我们在疫情期间,去公园玩还是商场,我们都要通过“穗康码”登录,进行姓名、身份证进行实名认证,那么用户只有等待实名认证api有了响应结果,我们才能进行后续的扫码验证通过才能继续后面的事情。

异步

异步跟同步恰恰相反,两者的主要区别就是在于:是否需要等待结果集返回。用户进行读或者写操作后,将立刻返回,传入回调函数(callblack),然后内核开始去读取数据以及拷贝数据工作,完成之后通过回调函数用户可以立即处理数据(这个时候数据已经被复制到用户缓存区,不需要在获取)。

用通俗易懂的语言描述:

  • 阻塞/非阻塞:区别在于发起请求的人目前的线程/进程状态。一个是请求一直处于阻塞状态,用户什么都不能做;一个是用户在请求过程中可以做其他的,然后再等待结果。
  • 同步/异步:表示用户请求完成的方式,如果最终是由用户自己完成的,那么表示是同步;如果不是由自己完成而是别人完成之后通知用户接收的就是异步。主页术语区别:数据从内核拷贝到空户空间是否由用户线程来完成的

3 什么又是并行和并发呢?

女票的问题越来越有意思了,听我慢慢说哈,这里并行和并发经常会引起大家的误解,不少人区分不出来两者的差别在哪里?

其实但凡做过一些大型的项目,直播、电商、在线教育等等这种大型项目,第一个问题就是怎么解决并发,估计面试要是逃不掉的三高:高并发高性能高可用

并发和并行的区别程度还是蛮高的:主要就是看它是不是同时(PS:大学应该都会过计算机操作系统吧,前几页应该就有介绍并发和并行)

并发是指多个事件在同一时间间隔发生,而并行是指多个事件在同一时刻发生。言外之意:并发描述某个时间段,并行描述某个时间点

并行:当我们的cup是多核时,就能出现一个cpu在执行一个线程的同时,另外一个cpu可以执行另一个线程,它们两个相互不争抢cpu资源,在同一时刻,可以同时执行多种任务。

并发:当系统存在多个任务操作时,cpu会把运行时间分成多个时间段,然后分配个各个任务去执行,来回切换上下文,按照时间片来执行任务。

举例:

早上去公司吃早餐:早餐有小米粥、包子、豆浆、炒面,在规定的时间内,一会喝口粥、一会吃口包子、再一会吃口炒面,就这样来来回回的切换吃完了早餐 - 并发

吃早餐时发现你旁边同事跟你在同时吃早餐,互不影响,这就是一个并行的操作。

“哦哦哦,原来是这样啊,这计算机的概念是真的饶人啊,太难看懂了,还好有你能帮我白话一番。”,看着她那啥样子,我就想说这书上都有的概念,只要在实际项目中,遇到解决才能真正的理解这些。

最后总结

阻塞/非阻塞:主要是看应用程序等待消息通知的状态来看。阻塞当前线程被挂起,线程什么事情都不能做,只能等待有结果返回才能继续做下一件事情。非阻塞:在没有获取到结果时,可以继续做下面的事情;如果是同步非阻塞,就会通过轮询方式检查结果是否已经返回,否则就坐等通知,然后回调处理。

同步/异步:同步即是必须要等当前请求处理完才会直接返回结构,调用者在主动等待结果集。异步:用户发起请求后,被调用者直接返回结构,等待数据完成之后,通过回调函数或者状态的形式通知调用者接受数据处理,那么调用者处于被动接收结果集。这就是说为什么很多并发情况下,大家选择异步去处理业务逻辑。

这篇文章主要是讲下同步、异步、阻塞、非阻塞、并发、并行的概念性,并且通过实际的画图来解说他们到底是怎样的一种情况。可能大家在大学的时候学过《计算机组成原理》和《计算机操作系统》,这样就可以回顾看下了解下,毕竟面试的时候无论前端还是后端岗位都是必不可少的面试问题。

以上皆为个人对同步/异步/阻塞/非阻塞/并行/并发的理解,如有错误欢迎评论区指正。

参考文献

《计算机操作系统》

最后,欢迎关注我的个人公众号「我是阿沐」,会不定期的更新后端知识点和学习笔记。也欢迎直接公众号私信或者邮箱联系我,我们可以一起学习,一起进步。

好了,我是阿沐,一个不想30岁就被淘汰的打工人 ⛽️ ⛽️ ⛽️ 。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 故事的起源
  • 2 什么是阻塞、非阻塞、同步、异步?
    • 举个例子论证给你听听:
      • 同步
        • 异步
        • 3 什么又是并行和并发呢?
        • 最后总结
        • 参考文献
        相关产品与服务
        云直播
        云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档