共计 3809 个字符,预计需要花费 10 分钟才能阅读完成。
本文非原创,译自 https://www.backblaze.com/blo…
第一次翻译,文中有谬误的中央还请斧正,谢谢。
让咱们来说说线程
想必你屡次据说过计算机程序中的“线程”了吧?然而你不能确定它是什么意思?过程又是怎么的呢?你可能晓得线程在某种程度上跟程序和过程是密切相关的,如果你不是计算机科学业余的话,兴许这就是你的了解了。
如果你是一名程序员,那么晓得这些术语的含意是相对必要的,但对于一个一般的计算机用户而言理解了它们也是有用的。有助于你应用 Mac 的流动监视器,Windows 的工作管理器,或者 Linux 的 Top(性能剖析工具),它能够帮忙你定位解决计算机上呈现问题的程序,或者是否须要装置更多的内存来使你的零碎运行的更好。
让咱们花几分钟来摸索计算机程序的世界,并弄请这些术语的含意。咱们将去简化并概括一些概念,涵盖的这些概念将有助于咱们理清这些术语之间的区别。
Programs(程序)
首先,你可能晓得程序是存储在计算机上的旨在完特定工作的代码,程序有多种类型,其中包含计算机的函数程序和操作系统局部的程序,以及特定工作的其它程序。这些特定工作的程序也被称为“应用程序”,它包含诸如文本处理程序,web 浏览程序,或通过电子邮件将音讯发送到另一台计算机的程序。
程序通常以计算机能够执行的模式存储在磁盘或者非易失性存储器中。在此之前,它们应用像 C,Lisp,Pascal,或其它编程语言创立,这些编程语言应用波及逻辑,数据,设施治理,递归,以及用户交互的指令。为了在计算机中运行,最终后果是被编译成了二进制模式(1 和 0)的代码文本文件。另一种类型的程序被称为“解释型编程语言”,它是在运行的时候被解释成可执行代码,而不是为了运行而提前去编译。一些常见的解释型编程语言有 Python,PHP,JavaScript 和 Ruby。
最终后果是雷同的,因为程序在运行的时候,它是以二进制的模式加载到内存中。计算机的 CPU(Central Processing Unit)仅了解二进制指令,因而当 CPU 运行时程序须要被转换为二进制的模式。
二进制是计算机原生语言,因为电子电路有两种根本状态,关上或者敞开,它们用 0 和 1 来示意。在咱们日常应用的通用编码零碎中,是基于 10 进制的,每个数位都能够是从 0 到 9 的数字。在而二进制中,每个地位能够是 0 或 1。
兴许你听过一个对于程序员的笑话,“世界上只有 10 种人,懂二进制的人和不懂二进制的人”
十进制 | 二进制 |
---|---|
0 | 0000 |
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
过程怎么工作?
程序曾经以二进制的模式加载到计算机内存中了。那么接下来呢?
执行中的程序不只是须要通知计算机做什么的二进制代码。程序还须要内存和各种操作系统资源能力运行。“过程”就是咱们说的程序,它和它所须要去操作的所有资源一起被加载到内存中。“操作系统”是调配所有资源的大脑,它有多种类型,诸如 macOS,IOS,Microsoft Windows,Linux,以及 Android。操作系统负责管理将程序转换为运行中的过程所需的资源。
任何过程都须要一些必要的资源,如寄存器,程序计数器和栈。“寄存器”是计算机处理器(CPU)用于数据存储区域的局部。寄存器能够寄存指令,存储地址,或过程须要的其它类型的数据。“程序计数器”也被称为指令指针,它用于批示计算机在其程序序列中的地位。“栈”是一种存储计算机程序的以后子程序信息(这里集体了解为你调试代码时的执行上下文)的数据结构,被用于过程的暂存空间。它跟为过程动态分配的内存(被称为“堆”)是须要辨别开来的。
单个程序能够有多个实例,且运行中的程序的每个实例都是一个过程。每个过程有独自的内存地址空间,这意味着过程是独立运行的并且和其它过程是互相隔离的。它不能间接拜访其它过程的共享数据。从一个过程切换到另一个过程须要一些工夫(绝对地)来保留和加载寄存器,内存映射以及其它资源。
过程的这种独立是很重要的,因为操作系统会尽可能的隔离过程以保障一个过程的问题不会影响到另一个过程。你必定碰到过计算机一个应用程序卡死或者呈现问题的状况,并且你可能在不影响其它程序的状况下退出该程序。
线程如何工作?
你还在跟着咱们往下浏览吗?咱们终于讲到了线程!
线程是过程的执行单元。一个过程能够有一个或者多个线程。
当一个过程开始时,它会被指定内存和资源。过程中的每个线程共享内存和资源。在单线程过程中,过程只蕴含一个线程。过程和线程是雷同的,并且只有一件事在产生。
在多线程过程中,过程蕴含多个线程,而且该过程在同时做多个事件(从技术角度而言,有时 简直等于 同时 ——想理解更多参见“ 并行和并发?”上面的局部)
咱们谈到了过程或线程可用的两种内存栈和堆。辨别这两类过程内存是很重要的,因为每个线程都有它本人的栈,然而过程中的所有线程将共享堆。
线程有时被称为轻量级过程,是因为它们都有本人的栈而且能够访问共享数据。因为线程跟过程以及过程中的其它线程共享雷同的地址空间(示意计算机实体所占用的内存大小),两个线程之间的通信开销就很低,这是无利的。不利的是过程中的一个线程有问题必定会影响到其它线程以及过程自身的存活。
过程 VS 线程
咱们来回顾一下:
- 程序以编程代码的文本文件开始
- 程序会被编译或解释成二进制的模式
- 程序会被加载进内存
- 程序能够运行一个或多个过程
- 过程通常是和其它过程独立开的
- 线程作为过程的子集存在
- 线程之间通信比过程之间通信要容易的多
- 线程更容易被雷同过程下的其它线程导致的问题影响
线程 vs 过程 —— 劣势 和 劣势
线程 | 过程 |
---|---|
过程操作是重量级的 | 线程操作是更轻量的 |
每个过程都有本人的内存空间 | 线程应用它们所属过程的内存 |
过程之间通信较慢,因为过程都有不同的内存地址 | 线程之间通信比过程之间通信更快,因为对立过程的线程共享它们所属过程的内存 |
过程之间上下文切换是代价更高的 | 雷同过程下的线程上下文切换是代价较低的 |
过程不与其它过程共享内存 | 线程和同一过程下的其它线程共享内存 |
并行和并发?
你兴许有这样一个疑难,过程或者线程是否能在同时运行?答案是:这要看状况。对于多处理器或 CPU 内核(与古代处理器一样)的零碎,多个过程或线程能够并行的执行。对于单个处理器,它是不可能有多个线程或过程真正的同时执行。在这种状况下,CPU 在运行的过程或线程之间共享,应用过程调度算法来划分 CPU 运行的 工夫(此处不是很了解),进而产生并行执行的错觉。调配给每个工作的工夫被称为“工夫切片”。在工作之间来回切换很快,简直是无奈觉察的。术语并行(真正同时执行)和并发(过程及时的交替执行产生的同时执行的景象),用真正同时执行的操作和靠近同时执行的操作来辨别。
为什么抉择过程而不是线程,或者线程而不是过程?
那么 当程序员在创立同时执行多个工作的程序时该怎么去抉择过程或线程呢?咱们在下面曾经概括了它们的差别,当初让咱们来看一个实在的例子,咱们很多人都在应用的程序——Coogle Chrome。
Google 在设计 Chrome 浏览器的时候,它们必须思考如何同时解决许多须要计算机、通信和网络资源的不同工作。每个浏览器窗口或者选项卡与网络的多个服务通信去获取文本,程序,图像,音频,视频,以及其它资源,继而渲染这些数据以供显示和与用户交互。除此之外,浏览器能够关上多个窗口,每个窗口都有很多工作。
Google 必须思考如何去解决工作的隔离。他们抉择把 Chrome 中每个浏览窗口作为一个独自的过程去运行,而不是像其它浏览器一样作为一个或多个线程去运行。这样做给 Google 带来了许多益处。将运行中的每个窗口作为一个过程爱护了总体应用程序不被渲染引擎的异样和故障影响,并限度每个渲染引擎过程对其余过程和零碎其余部分的拜访。隔离了过程中的 JavaScript 程序避免它占用太多的 CPU 工夫和内存从而导致整个浏览器失去响应
Google 认真衡量了多过程的设计。每个浏览器窗口开始一个新的过程在内存和资源方面比起应用线程有更高的固定开销。然而他们敢说他们的办法最终会缩小总体的内存收缩。
当内存不够的时应用过程代替线程也能提供更好的内存用法。不沉闷的窗口会被操作系统视为较低的优先级,并且当其它过程须要内存时有资格被调换到磁盘中去。这有助于放弃用户显示的窗口更好的响应。如果窗口应用的是线程,想要齐全的分隔开已用和未应用的内存是将会更艰难,无疑节约了内存和性能。
您能够在 Google 的 Chromium blog 或 Chrome Introduction Comic 上理解更多的 Google 对 Chrome 的设计决策。
上面的屏幕截图将展现运行在 MacBook Air 上关上了多个选项卡的 Google Chrome 过程。有些 Chrome 过程应用了很多的 CPU 工夫和资源,而有些过程应用的非常少。你能够看到每个过程也有许多线程正在运行。
零碎上的流动监视器或工作管理器在微调你的计算机或者定位解决问题时是个不错的帮手。如果你的计算机或程序运行的很慢,或者浏览器窗口在一段时间没有响应,你能够应用零碎监视器查看它的状态。有时你将会看到过程被标记为“没有响应”。试图退出那个过程而后看看你的零碎是否会运行的更快。如果某个应用程序占用着大量的内存,你应该思考抉择其它的应用程序来实现这个工作。
残余一点附录未齐全翻译,有趣味请移步原文。https://www.backblaze.com/blo…