1 进程

进程是什么
进程是操作系统对一个正在运行的程序的一种抽象,进程是资源分配的最小单位。
进程在操作系统中的抽象表现
为什么有进程
为什么会有 ”进程“ 呢?说白了还是为了合理压榨 CPU 的性能和分配运行的时间片,不能 “闲着“。

在计算机中,其计算核心是 CPU,负责所有计算相关的工作和资源。单个 CPU 一次只能运行一个任务。如果一个进程跑着,就把唯一一个 CPU 给完全占住,那是非常不合理的。

那为什么要压榨 CPU 的性能?因为 CPU 实在是太快,太快,太快了,寄存器仅仅能够追的上他的脚步,RAM 和别的挂在各总线上的设备则更是望尘莫及。

多进程的缘由
如果总是在运行一个进程上的任务,就会出现一个现象。就是任务不一定总是在执行 ”计算型“ 的任务,会有很大可能是在执行网络调用,阻塞了,CPU 岂不就浪费了?

进程的上下文切换
这又出现了多进程,多个 CPU,多个进程。多进程就是指计算机系统可以同时执行多个进程,从一个进程到另外一个进程的转换是由操作系统内核管理的,一般是同时运行多个软件。

线程
有了多进程,想必在操作系统上可以同时运行多个进程。那么为什么有了进程,还要线程呢?

原因如下:

进程间的信息难以共享数据,父子进程并未共享内存,需要通过进程间通信(IPC),在进程间进行信息交换,性能开销较大。

创建进程(一般是调用 fork 方法)的性能开销较大。

大家又把目光转向了进程内,能不能在进程里做点什么呢?

进程由多个线程组成
一个进程可以由多个称为线程的执行单元组成。每个线程都运行在进程的上下文中,共享着同样的代码和全局数据。

多个进程,就可以有更多的线程。多线程比多进程之间更容易共享数据,在上下文切换中线程一般比进程更高效。

原因如下:

线程之间能够非常方便、快速地共享数据。

只需将数据复制到进程中的共享区域就可以了,但需要注意避免多个线程修改同一份内存。

创建线程比创建进程要快 10 倍甚至更多。

线程都是同一个进程下自家的孩子,像是内存页、页表等就不需要了。

协程是怎么回事
协程是什么
协程(Coroutine)是用户态的线程。通常创建协程时,会从进程的堆中分配一段内存作为协程的栈。

线程的栈有 8 MB,而协程栈的大小通常只有 KB,而 Go 语言的协程更夸张,只有 2-4KB,非常的轻巧。

协程的诞生
根据维基百科的说法,马尔文·康威于 1958 年发明了术语 “coroutine” 并用于构建汇编程序,关于协程最初的出版解说在 1963 年发表。

也就是历史上是先有的 “协程”,再有的 “线程”,线程是在在协程的基础上添加了栈等功能后扩展出来的。

但为什么一开始协程没有火起来呢?这个比较难考证,大概率还是与 60 年前的计算机时代背景有关。

而如今人们把协程调度的逻辑更进一步抽象为 “等 IO,让出,IO 完毕”,在此基础上人们发现协程的方式能解决多线程环境下很多代码逻辑 “混乱”。

协程的优势
既然线程似乎已经很好地填补了进程的遗憾,那怎么又出来了一个 “协程”,难道是重复造轮子吗?

协程的优势(via InfoQ @八两)如下:

节省 CPU:避免系统内核级的线程频繁切换,造成的 CPU 资源浪费。好钢用在刀刃上。而协程是用户态的线程,用户可以自行控制协程的创建于销毁,极大程度避免了系统级线程上下文切换造成的资源浪费。

节约内存:在 64 位的Linux中,一个线程需要分配 8MB 栈内存和 64MB 堆内存,系统内存的制约导致我们无法开启更多线程实现高并发。而在协程编程模式下,可以轻松有十几万协程,这是线程无法比拟的。

稳定性:前面提到线程之间通过内存来共享数据,这也导致了一个问题,任何一个线程出错时,进程中的所有线程都会跟着一起崩溃。

开发效率:使用协程在开发程序之中,可以很方便的将一些耗时的IO操作异步化,例如写文件、耗时 IO 请求等。

协程本质上就是用户态下的线程,所以也有人说协程是 “轻线程”,但我们一定要区分用户态和内核态的区别,很关键。

总结
归归根到底,在日常或面试中遇到 “什么是协程,协程和线程的区别和联系?” 这类问题时,面试者常规会把进程、线程、协程都介绍一遍。

为了方便记忆和诠释,推荐大家结合故事来讲会比较好,这一块可以参考阮一峰大神翻译的《进程与线程的一个简单解释》,会带来不少好感。

而最关键的部分,在于协程和线程的区别和联系是什么?

我们可以通过文章中的介绍,从协程 -> 线程的历史进程来说明。接着进一步对比协程和线程两者的优势和缺点,就能比较好的诠释区别和联系了。

更优秀的部分,可以诠释完基本概念和区别后,进一步延伸都你所面试的岗位,例如是 Go 语言,就可以介绍 Go 语言的协程的具体应用和实现。

毕竟,Go 语言可以轻轻松松开数十万个协程,毫无波澜。这样能够更好的体现你对协程、线程的知识深度和广度应用,而不是单纯的背概念。

参考
线程和进程的区别是什么?

有了多线程,为什么还要有协程?

进程与线程的一个简单解释

什么是协程,协程和线程的区别和联系?相关推荐

  1. 1.Unity协程、进程、线程的区别

    1.进程拥有自己独立的堆和栈,堆和栈都不共享,进程由操作系统调度. 2.线程有自己独立的栈和共享的堆,栈不共享,堆共享,标准的线程也是由系统调度. 3.协程有自己独立的栈和共享的堆,栈不共享,堆共享, ...

  2. 进程 线程 协程_进程,线程,协程那些事

    无论我们写出怎样的程序,最后都是由操作系统来运行我们的程序,而操作系统如何管理我们的程序,我们程序的数据如何保存和计算,这些都是操作系统需要处理的事情,我们只要将写好的程序交给操作系统就好. 虽然操作 ...

  3. 动手实现Kotlin协程同步切换线程,以及Kotlin协程是如何实现线程切换的

    前言 突发奇想想搞一个同步切换线程的Kotlin协程,而不用各种withContext(){},可以减少嵌套且逻辑更清晰,想实现的结果如下图: 分析 实现我们想要的结果,首先需要知道协程为什么可以控制 ...

  4. 协程,又称微线程和纤程

    协程,又称微线程和纤程等,据说源于 Simula 和 Modula-2 语言(我没有深究,有错请指正),现代编程语言基本上都有支持,比如 Lua.ruby 和最新的 Google Go,当然也还有最近 ...

  5. UNITY所谓的异步加载几乎全部是协程,不是线程;MAP3加载时解压非常慢

    UNITY所谓的异步加载几乎全部是协程,不是线程;MAP3加载时解压非常慢 实践证明,以下东西都是协程,并非线程(thread): 1,WWW 2,AssetBundle.LoadFromFileAs ...

  6. python 协程、进程、线程_Python 中的进程、线程、协程

    1. 进程 进程是正在运行的程序实例,是内核分配资源的最基本的单元.进程拥有自己独立的堆和栈,独立的地址空间,资源句柄.进程由 OS 调度,调度开销较大,在并发的切换过程效率较低. Python 提供 ...

  7. java main 如何不退出_为什么java main主线程退出了子线程还能运行;golang main结束所有协程都被结束了...

    最近看golang main函数结束,所有协程都被结束了 结论是这样:A不是main程的情况下,在A程里开启B程,A程执行完,A程return之后,B程不受影响,不会挂掉.所有子协程与main程同级的 ...

  8. 进程 线程 协程_进程 线程 协程 管程 纤程 概念对比理解

    不知道是不是我自己本身就有那么一丝丝的密集恐惧,把这么一大堆看起来很相似很相关的概念放在一起,看起来是有点麻,捋一捋感觉舒服多了. 相关概念 任务.作业(Job,Task,Schedule) 在进程的 ...

  9. 协程和线程的区别、协程原理与优缺点分析、在Java中使用协程

    文章目录 什么是协程 协程的优点与缺点 协程实现原理. 协程与线程在不同编程语言的实现 在Java中使用协程 Kilim介绍 Kilim整合Java,使用举例 小总结 什么是协程 相对于协程,你可能对 ...

  10. python协程和线程区别_python 协程 及其与python多线程的区别和联系

    协程(coroutine)又称微线程,纤程,是种用户级别的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时候,将寄存器上下文和栈保存到其他地方,等待切换回来的时候恢复,并从之前保存的寄存器 ...

最新文章

  1. UCL葡萄酒(red white wine quality)数据集字段解释、数据导入实战
  2. MDI接口原理图设计
  3. C++的#include_next
  4. 我使用过的Linux命令之clear - 清除终端屏幕,不是cls
  5. 安卓短信加密_发短信控制车辆!苹果发布ios14,手机可作车钥匙
  6. 【UDP协议头解析】
  7. C++ 对引用的理解
  8. KAFKA 集成 SpringBoot2 消息发送和消费消息(基础篇)
  9. mysql慢查询日志分析工具比较_MySQL慢查询日志总结 日志分析工具mysqldumpslow
  10. 谷歌浏览器flash崩溃怎么办 Google Chrome flash崩溃解决方法
  11. 设置简体中文_键盘不好用了?看看是不是设置有问题
  12. 在DataGridView中显示合计,并且合计始终在最后一行
  13. mybatis配置文件的bug
  14. 二分模板 from y总
  15. Android Studio第三十六期 - 模块化Activity管理Fragment
  16. c# xaml语言教程,Xamarin XAML语言教程XAML文件结构与解析XAML
  17. Start11软件1.0版发布:如果适应了win10或win7的系统,可一键将win11改回
  18. 天之痕java 郡王府_轩辕剑3外传天之痕图文攻略【含支线任务】
  19. socket+threading实现python多人局域网聊天室
  20. 分享几个在线网站备案查询

热门文章

  1. 移动互联网的入口-二维码(二维码生成原理及流程)
  2. python安装EMD
  3. 北京房租大涨?6个维度,数万条数据帮你揭穿
  4. VS2022 VC++下控制台程序SetTimer定时器的应用
  5. 异常检测 IsolationForest 返回概率
  6. java 打印图形 (* 各种图形)
  7. 自动驾驶方案及相关对标
  8. TortoiseGit小乌龟Git提交代码到码云Gitee-学习记录
  9. 计算机 设置登录密码 无效,bios设置开机密码无效怎么办
  10. Centos 系统 FTP服务器搭建