多任务
什么叫 多任务?简单说:就像是操作系统可以同时执行 多个任务。打个比方 你一边使用 浏览器上网,一遍在听MP3, 一边再用 word 赶作业。对于电脑来讲这就是多任务,还有很多任务悄悄的在后台同时运行着,只是桌面上没有显示
什么是并发:
Go 是并发语言,而不是并行语言。在讨论如何在 Go中进行并发处理之前。我们首先必须了解什么是并发。以及它 与 并行有什么不同。
并发性 Concurrency 是同时处理许多事情的能力。
例如:一个人在晨跑,在晨跑时 他的鞋带松了 现在这个人停止跑步, 系鞋带 然后再继续跑步。同一时间点只能做一个任务,你不能边跑步变 边系鞋带,这就是一个并发性的例子。这个人是能够同时处理跑步和 系鞋带。这是一个人 能够同时处理很多事情。但是同一时刻只能做一件
什么是 并行性 parallelise,它与 并发性 concurrency 有什么不同?
- 并行性就是同时做很多事情,这听起来感觉和 并发类似,但是还是有区别的。让我们继续以 慢跑的例子理解她, 在这种情况下:我们假设这个人再慢跑 并且再使用它的手机在听音乐,在这种情况下:一个人边跑步 边听音乐 那就是它同时在做很多事情 同时进行。同一个时刻点 可以做多件事情。 这就是所谓的并行性。(parallelism)
并发性 和 并行性 一种技术上的观点:
假设我们正在编写 一个web 浏览器。 web浏览器有各种组件。其中两个是 web 页面呈现区域 和 下载文件 从 internet 下载的下载器。假设我们以这种方式构建了 浏览器代码。这样每个组件都可以 独立的执行。当这个浏览器运行在 单核心的处理器上面的时候,处理器将在浏览器的两个组件 之间进行上下文切换。它可能会下载一个文件一段时间,然后它可能会切换到呈现用户请求的网页 html. 这就是所谓的 并发性。 并发从不同的时间开始,他们执行周期重叠,在这种情况下 下载和呈现从不同时间点开始。他们执行重叠。
假设同一浏览器在多核心的处理器上运行,这种情况下,文件下载 和 html 呈现组件在不同的核心中运行 这就是所谓的 并行性
- 并发性:利用 cpu 时间片 接替执行 看起来像是同时执行,实际上同一时刻只能做一件事情,就像 上面 边跑步 -> 系鞋带 -> 跑步
- 并行性:利用 多核CPU 同一时刻 同时干多件事情, 上面跑步 和 听音乐 同时进行
并行性 Parallelise 不会总是会更快(按照业务选择)。因为并行运行的组件如果通常需要相互通信,就需要等待等等的 操作也会使 并行的效率降低。
串行 并行 并发
时间片:
- 串行:依次执行
- 并行: 多核心同时执行 同一时间点 可以有多个
- 并发:轮流 切换执行, 同一时间点 就有一个在执行
进程 线程 协程
进程(process) 线程(Thread) 协程(Coroutine, 也叫轻量级线程)
进程:
进程是一个独立在一个数据集中的一次动态执行过程,可以简单理解为 “正在执行的程序”。 他是CPU资源分配和调度的独立单位。进程一般由程序,数据集,进程控制块三部分组成。我们编写的程序用来描述 进程要完成那些功能 以及如何完成;数据集则是程序在执行过程中需要使用的资源; 进程控制块用来记录程序外部特征。描述进程的执行变化过程。系统可以利用他来控制和管理进程,他是系统感知进程的唯一标志。 进程的局限是创建 撤销 和 切换 的 开销很大
线程:
线程实在进程之后被发展出来的的概念。线程也叫轻量级进程。 他是一个基本的 cpu 执行单元。也是程序执行中的最小单元, 线程由 线程ID 程序计数器, 集成器集合 和 堆栈共同组成。一个进程可以包含多个线程,一般会有一个主线程。 线程的有点是见笑了程序并发执行时的开销,提高了操作系统的并发性能。缺点是 线程没有自己系统的资源,只拥有在运行时必不可少的资源。 但同一个进程的各种线程 可以共享进程的所有系统资源,如果把进程比作一个车间,那么线程就好比是车间的 工人,不过对于某些独占性的资源存在锁的机制,处理不当可能会死锁。
协程:
协程是一种用户态的轻量级线程,又称为 微线程 英文名称Coroutine, 协程的调度完全是由用户控制。人们常常将协程和子线程 对比:
- 子线程调度是一个入口,一次返回 一旦退出即完成了子线程的执行。
- 于传统的 系统线程和进程相比,协程的最大优势在于其 "轻量级"。 可以轻松创建上百万个而不会导致系统资源衰竭。而线程和进程通常最多不能超过 1万的,这也是协程被称为轻量级线程的原因。
协程于多线程相比优势在于:
协程执行效率高,因为子程序切换不是线程切换,而是由本身程序控制,因此没有线程切换的开销 和 多线程比 线程数量越多 协程的性能优势越明显。
Go语言的并发是靠 协程 实现的 即: Goroutine