微信搜索【脑补炸鱼】关注这条炸肝炸鱼。本文GitHubgithub.com/eddycjy/blog已收录,附有我的系列文章、资料和开源Go书籍。大家好,我是炸鱼。金三银四最近,正是面试季。在我的Go读者交流群里,很多小伙伴都讨论了自己在面试中遇到的一些Go面试题。今天的英雄是工程师的必修课,那就是《什么是协程,协程和线程的区别和联系?》既要了解线程,又要讲解协程,还要讲解两者的区别,但是因为说到线程,必然涉及到进程,所以本文将对“进程”的随笔知识进行梳理和介绍、协同程序和协同程序”。我希望它能给你一些思考。什么是流程?进程是操作系统对正在运行的程序的抽象,进程是资源分配的最小单位。为什么要有过程?为什么会有“过程”?说白了,为了合理压榨CPU的性能,分配运行时间片,不能“闲”。在计算机中,计算的核心是CPU,它负责所有与计算相关的工作和资源。单个CPU一次只能运行一个任务。如果一个进程在运行,完全占用唯一的CPU是很不合理的。那么为什么要压榨CPU的性能呢?因为CPU太快了,太快了,太快了,寄存器只能赶上他了,而挂在总线上的RAM等设备就更落后了。多进程的原因如果一个进程上的任务一直在运行,就会出现一个现象。也就是说,任务并不总是执行“计算”任务。他们很可能正在执行网络呼叫。如果他们被阻塞,CPU不就被浪费了吗?这又是多进程,多CPU,多进程。多进程是指计算机系统可以同时执行多个进程。从一个进程到另一个进程的转换由操作系统内核管理,一般同时运行多个软件。线程有多个进程,想必操作系统上可以同时运行多个进程。那么为什么有了进程还需要线程呢?原因如下:进程间数据共享困难,父子进程不共享内存。进程间需要进行进程间通信(IPC)来交换信息,性能开销较大。创建一个进程(通常调用fork方法)有很大的性能开销。大家又把目光投向了过程,过程中能不能做点什么?一个进程可以由多个称为线程的执行单元组成。每个线程都在一个进程的上下文中运行,共享相同的代码和全局数据。使用多个进程,您可以拥有更多线程。多个线程之间共享数据比多个进程之间更容易共享数据,并且线程在上下文切换方面通常比进程更高效。原因如下:线程可以非常方便快捷地共享数据。将数据复制到进程中的共享区即可,但需要注意避免多个线程修改同一块内存。创建线程比创建进程快10倍或更多。线程在同一个进程下都是自己的孩子,比如内存页、页表等都不需要。什么是协程?什么是协程?协程是用户模式下的线程。通常在创建协程时,会从进程堆中分配一块内存作为协程的栈。线程栈有8MB,协程栈的大小通常只有KB,而Go语言中的协程就更夸张了,只有2-4KB,非常轻巧。协程的诞生根据维基百科,MalvinConway于1958年发明了“协程”一词,并用它来构建汇编程序,并于1963年发表了第一个对协程的解释。也就是说,最早有“协程”的是历史,然后是“线程”。在协程的基础上增加了栈等功能后扩展了线程。但是协程为什么一开始没有火呢?这个比较难考证,大概率还是跟60年前电脑时代的背景有关。现在人们将协程调度的逻辑进一步抽象为“等待IO,放弃,IO完成”。在此基础上,人们发现协程的方式可以解决多线程环境下的很多代码逻辑“混乱”。协程的优点既然线程似乎很好地填补了进程的遗憾,为什么又要出来一个“协程”呢?是否只是重新发明轮子?协程的优点(viaInfoQ@八两)如下:节省CPU:避免在系统内核层面频繁切换线程,造成CPU资源的浪费。刀刃上用的是好钢。协程是用户态线程,用户可以控制协程的创建和销毁,大大避免了系统级线程上下文切换造成的资源浪费。节省内存:在64位Linux中,一个线程需要分配8MB的栈内存和64MB的堆内存。系统内存的限制让我们无法开启更多的线程来实现高并发。在协程编程模式下,协程可以轻而易举地达到几十万个,这是线程无法比拟的。稳定性:前面提到,线程通过内存共享数据,这也导致了一个问题。当任何一个线程出错时,进程中的所有线程都会一起崩溃。开发效率:在开发程序中使用协程可以很方便的将一些耗时的IO操作异步化,比如写文件、耗时的IO请求等。协程本质上是用户态的线程,所以有人说协程是“轻线程”,但是我们必须分清用户态和内核态的区别,这一点很重要。总结归根结底,当遇到“什么是协程,协程和线程的区别和联系?”这样的问题时。在日常生活或者面试中,面试官会例行公事地介绍进程、线程、协程。为了方便记忆和解读,建议大家结合故事来读。这首曲子可以参考阮一峰大师翻译的《进程与线程的一个简单解释》,会带来很多好感。而最关键的是协程和线程的区别和联系是什么?我们可以用文中的介绍,从协程->线程的历史过程来说明。那么,通过进一步对比协程和线程的优缺点,我们就可以更好的说明区别和联系。对于比较突出的部分,在解释完基本概念和区别之后,可以进一步延伸面试的职位。比如Go语言,可以介绍一下协程在Go语言中的具体应用和实现。毕竟Go语言可以毫不费力的发布几十万个协程。这更能体现你对协程和线程知识的深度和广度,而不是单纯的死记硬背概念。如有任何问题,欢迎在评论区反馈交流。最好的关系是相互成就。您的好评是创作炸鱼最大的动力。感谢您的支持。文章持续更新中,微信搜索【脑补炸鱼】即可阅读,回复【000】一线大厂面试算法方案和资料我都准备好了;本文已收录在GitHubgithub.com/eddycjy/blog,欢迎Star提醒。参考线程和进程有什么区别?有了多线程,为什么我们需要协程?进程和线程的简单解释
