哈喽,小伙伴们,大家好,我是阿沐!
大家应该看标题就知道了,今天要通过大白话+图形跟我女票(哪里来的女票?假想一下)讲解同步、异步、阻塞、非阻塞、并行、并发的理解。我女票是一个爱问问题的人,最喜欢没事问计算机方面的,尽管她是一名数学教师,尽管她学过计算机编程;但是我认为她啥都不会,有时候在我烦躁的问我,我会冲她发脾气,这里呢,认认真真(当面)跟女票道个歉,她纯粹是想帮我分忧解难。
今天就跟我女票唠一唠这个话题。
大家如果感兴趣,微信搜索「我是阿沐」关注我这枚有点神经但乐观的程序员~
“老公我之前看你天天看操作系统的书的目录有阻塞和非阻塞,是个啥子意思嘛?是不是像我们平常坐地铁,有时候高峰期地铁🚇被堵了坐不上,有时候人又很少然后又不堵车了?”。你说说是啥意思嘛,是不是这样啊,撒个娇。
有这个点的意思,但是你这个只是片面的意思,我给你画图看看吧,这样你就一眼明白了。「我向来经受不住女生撒娇的」
“从上面图形能看出来什么嘛?可以知道整体的流程是什么样子嘛?”,我对着女票问到
“老公,我看到了,看出来了”,女票兴奋激动的说道。
“快说说你看到什么了,难道我画的图结构这么清晰的嘛?我还以为你英文不咋地看不懂呢?”,我一脸期待的等着,脸上洋溢的微笑,我看到来自女票肯定的目光。
”老公你这个图画的挺好看的,用啥软件画的啊,好清晰哦!“,一脸崇拜的对我说。
”嚯嚯嚯,原来你看到的是这个啊!“,一盆冷水浇在了我的头上,冷冰冰的,女票你这是在侮辱我的画作;我还是对着图跟你讲一遍吧。
介绍一下图 1:
1)read
用户请求调用read后,用户线程被阻塞。
2)no ready data
内核没有准备好的数据。
3)data to cache
准备好的数据放到内核缓存区。
kernel copies data to user
内核缓存区拷贝数据到用户空间。5)copy data complete
数据拷贝完成返回给调用方使用
这么看来用户发起一个请求后,用户线程就会一直被阻塞,要等到内核把数据整理好拷贝给用户缓存区以后,请求才能拿到数据使用。整体的流程就是:内核从磁盘读数据进入内核缓存区;然后再把数据拷贝到用户缓存区;整个流程都处于阻塞状态中,必须一致进行下去,拿到结果才算完成一个请求。
总结阻塞是指:在请求调用拿到结果返回之前,当前的线程会被挂起。调用线程只有在得到结果之后才会被唤醒执行后续的操作。
介绍一下图 2:
基本逻辑跟阻塞一致,唯一不同的是:它多出了几次read
请求(即轮询请求)。对,非阻塞主要就是体现在这里。
”那它是怎么体现出来的呢,老公可以举个简单的例子给我听听嘛,你专业术语我不是很明白“,一脸困惑迷茫的看着我。
例如:你坐地铁的时候,突然在安检门那边有个阿姨跟安检员吵起架了,阿姨扬言:”今天你要是不给老子一个说法,我跟你没玩,谁也别想过去“。阿姨搬个小板凳堵住门口,坐在哪里扣手机,时不时的询问那个安检员,这事怎么解决?那么这整个过程对于阿姨来说就是一个非阻塞
操作。一边玩手机一边问安检员解决方案,说白了就是:你再等待解决方案的同时也没有闲着,可以在这个间隔时间期间做其他的事情,等到解决方案出来了,就完成了整个流程。
这里最后一步read
操作是一个同步的一个过程,是需要线程去等待的过程;原因就是内核准备好了数据,要把数据拷贝到用户缓存区。
总结非阻塞是指:在调用结果没有返回之前,该调用不会阻塞住当前线程。
同步是指:用户发起一个请求,知道请求结果返回之后,才会进行下一步的操作逻辑。必须一件事一件事的去完成,只有前一个事情做完了,才轮到去做下面的事情。
例如:我们在疫情期间,去公园玩还是商场,我们都要通过“穗康码”登录,进行姓名、身份证进行实名认证,那么用户只有等待实名认证api有了响应结果,我们才能进行后续的扫码验证通过才能继续后面的事情。
异步跟同步恰恰相反,两者的主要区别就是在于:是否需要等待结果集返回。用户进行读或者写操作后,将立刻返回,传入回调函数(callblack
),然后内核开始去读取数据以及拷贝数据工作,完成之后通过回调函数用户可以立即处理数据(这个时候数据已经被复制到用户缓存区,不需要在获取)。
用通俗易懂的语言描述:
女票的问题越来越有意思了,听我慢慢说哈,这里并行和并发经常会引起大家的误解,不少人区分不出来两者的差别在哪里?
其实但凡做过一些大型的项目,直播、电商、在线教育等等这种大型项目,第一个问题就是怎么解决并发,估计面试要是逃不掉的三高:高并发
、高性能
、高可用
。
并发和并行的区别程度还是蛮高的:主要就是看它是不是同时(PS:大学应该都会过计算机操作系统吧,前几页应该就有介绍并发和并行)
并发是指多个事件在同一时间间隔发生,而并行是指多个事件在同一时刻发生。言外之意:并发描述某个时间段,并行描述某个时间点
并行:当我们的cup是多核时,就能出现一个cpu在执行一个线程的同时,另外一个cpu可以执行另一个线程,它们两个相互不争抢cpu资源,在同一时刻,可以同时执行多种任务。
并发:当系统存在多个任务操作时,cpu会把运行时间分成多个时间段,然后分配个各个任务去执行,来回切换上下文,按照时间片来执行任务。
举例:
早上去公司吃早餐:早餐有小米粥、包子、豆浆、炒面,在规定的时间内,一会喝口粥、一会吃口包子、再一会吃口炒面,就这样来来回回的切换吃完了早餐 - 并发
吃早餐时发现你旁边同事跟你在同时吃早餐,互不影响,这就是一个并行的操作。
“哦哦哦,原来是这样啊,这计算机的概念是真的饶人啊,太难看懂了,还好有你能帮我白话一番。”,看着她那啥样子,我就想说这书上都有的概念,只要在实际项目中,遇到解决才能真正的理解这些。
阻塞/非阻塞:主要是看应用程序等待消息通知的状态来看。阻塞当前线程被挂起,线程什么事情都不能做,只能等待有结果返回才能继续做下一件事情。非阻塞:在没有获取到结果时,可以继续做下面的事情;如果是同步非阻塞,就会通过轮询方式检查结果是否已经返回,否则就坐等通知,然后回调处理。
同步/异步:同步即是必须要等当前请求处理完才会直接返回结构,调用者在主动等待结果集。异步:用户发起请求后,被调用者直接返回结构,等待数据完成之后,通过回调函数或者状态的形式通知调用者接受数据处理,那么调用者处于被动接收结果集。这就是说为什么很多并发情况下,大家选择异步去处理业务逻辑。
这篇文章主要是讲下同步、异步、阻塞、非阻塞、并发、并行的概念性,并且通过实际的画图来解说他们到底是怎样的一种情况。可能大家在大学的时候学过《计算机组成原理》和《计算机操作系统》,这样就可以回顾看下了解下,毕竟面试的时候无论前端还是后端岗位都是必不可少的面试问题。
以上皆为个人对同步/异步/阻塞/非阻塞/并行/并发的理解,如有错误欢迎评论区指正。
《计算机操作系统》
最后,欢迎关注我的个人公众号「我是阿沐」,会不定期的更新后端知识点和学习笔记。也欢迎直接公众号私信或者邮箱联系我,我们可以一起学习,一起进步。
好了,我是阿沐,一个不想30岁就被淘汰的打工人 ⛽️ ⛽️ ⛽️ 。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。