- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Go 面试官:什么是协程,协程和线程的区别和联系?由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
大家好,我是煎鱼.
最近金三银四,是面试的季节。在我的 Go 读者交流群里出现了许多小伙伴在讨论自己面试过程中所遇到的一些 Go 面试题.
今天的男主角,是工程师的必修技能,那就是 “什么是协程,协程和线程的区别和联系?” 。
既要理解线程,还要讲解协程,并且诠释两者间的区别,但是由于提到线程,就必然涉及进程,因此本文将会同时梳理介绍 “进程、协程、协程” 三者的随笔知识,希望能引发大家的一些思考.
吸鱼之路开始.
。
进程是什么 。
进程是操作系统对一个正在运行的程序的一种抽象,进程是资源分配的最小单位.
进程在操作系统中的抽象表现 。
为什么有进程 。
为什么会有 ”进程“ 呢?说白了还是为了合理压榨 CPU 的性能和分配运行的时间片,不能 “闲着“.
在计算机中,其计算核心是 CPU,负责所有计算相关的工作和资源。单个 CPU 一次只能运行一个任务。如果一个进程跑着,就把唯一一个 CPU 给完全占住,那是非常不合理的.
那为什么要压榨 CPU 的性能?因为 CPU 实在是太快,太快,太快了,寄存器仅仅能够追的上他的脚步,RAM 和别的挂在各总线上的设备则更是望尘莫及.
多进程的缘由 。
如果总是在运行一个进程上的任务,就会出现一个现象。就是任务不一定总是在执行 ”计算型“ 的任务,会有很大可能是在执行网络调用,阻塞了,CPU 岂不就浪费了?
进程的上下文切换 。
这又出现了多进程,多个 CPU,多个进程。多进程就是指计算机系统可以同时执行多个进程,从一个进程到另外一个进程的转换是由操作系统内核管理的,一般是同时运行多个软件.
。
有了多进程,想必在操作系统上可以同时运行多个进程。那么为什么有了进程,还要线程呢?
原因如下:
进程间的信息难以共享数据,父子进程并未共享内存,需要通过进程间通信(IPC),在进程间进行信息交换,性能开销较大.
创建进程(一般是调用 fork 方法)的性能开销较大.
大家又把目光转向了进程内,能不能在进程里做点什么呢?
进程由多个线程组成 。
一个进程可以由多个称为线程的执行单元组成。每个线程都运行在进程的上下文中,共享着同样的代码和全局数据.
多个进程,就可以有更多的线程。多线程比多进程之间更容易共享数据,在上下文切换中线程一般比进程更高效.
原因如下:
。
协程是什么 。
协程(Coroutine)是用户态的线程。通常创建协程时,会从进程的堆中分配一段内存作为协程的栈.
线程的栈有 8 MB,而协程栈的大小通常只有 KB,而 Go 语言的协程更夸张,只有 2-4KB,非常的轻巧.
协程的诞生 。
根据维基百科的说法,马尔文·康威于 1958 年发明了术语 “coroutine” 并用于构建汇编程序,关于协程最初的出版解说在 1963 年发表.
也就是历史上是先有的 “协程”,再有的 “线程”,线程是在在协程的基础上添加了栈等功能后扩展出来的.
但为什么一开始协程没有火起来呢?这个比较难考证,大概率还是与 60 年前的计算机时代背景有关.
而如今人们把协程调度的逻辑更进一步抽象为 “等 IO,让出,IO 完毕”,在此基础上人们发现协程的方式能解决多线程环境下很多代码逻辑 “混乱”.
协程的优势 。
既然线程似乎已经很好地填补了进程的遗憾,那怎么又出来了一个 “协程”,难道是重复造轮子吗?
协程的优势(via InfoQ @八两)如下:
协程本质上就是用户态下的线程,所以也有人说协程是 “轻线程”,但我们一定要区分用户态和内核态的区别,很关键.
。
归归根到底,在日常或面试中遇到 “什么是协程,协程和线程的区别和联系?” 这类问题时,面试者常规会把进程、线程、协程都介绍一遍.
为了方便记忆和诠释,推荐大家结合故事来讲会比较好,这一块可以参考阮一峰大神翻译的《进程与线程的一个简单解释》,会带来不少好感.
而最关键的部分,在于协程和线程的区别和联系是什么?
我们可以通过文章中的介绍,从协程 -> 线程的历史进程来说明。接着进一步对比协程和线程两者的优势和缺点,就能比较好的诠释区别和联系了.
更优秀的部分,可以诠释完基本概念和区别后,进一步延伸都你所面试的岗位,例如是 Go 语言,就可以介绍 Go 语言的协程的具体应用和实现.
毕竟,Go 语言可以轻轻松松开数十万个协程,毫无波澜。这样能够更好的体现你对协程、线程的知识深度和广度应用,而不是单纯的背概念.
参考 。
线程和进程的区别是什么?
有了多线程,为什么还要有协程?
进程与线程的一个简单解释 。
原文地址:https://mp.weixin.qq.com/s/vW5n_JWa3I-Qopbx4TmIgQ 。
最后此篇关于Go 面试官:什么是协程,协程和线程的区别和联系?的文章就讲到这里了,如果你想了解更多关于Go 面试官:什么是协程,协程和线程的区别和联系?的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!