WEBVTT

00:00.000 --> 00:00.990
教师：在本课中,

00:00.990 --> 00:03.390
我们将介绍CPU的功能｡

00:03.390 --> 00:05.340
这包括多线程､

00:05.340 --> 00:07.050
对称多处理､

00:07.050 --> 00:10.950
单核与多核以及虚拟化支持｡

00:10.950 --> 00:12.180
现在, 我们要介绍的第一件事是多线程,

00:12.180 --> 00:15.840
也称为SMT或同步多线程或超线程,

00:15.840 --> 00:21.480
这取决于您购买的CPU｡

00:21.480 --> 00:24.780
超线程是英特尔用于此过程的术语｡

00:24.780 --> 00:27.000
更通用的术语是SMT,

00:27.000 --> 00:29.340
即同时多线程｡

00:29.340 --> 00:31.050
现在, 当你处理线程时,

00:31.050 --> 00:37.350
这是一个由软件应用程序发送到处理器的单一指令流的概念｡

00:37.350 --> 00:42.150
现在, 大多数应用程序都被设计为在单个线程中运行单个进程｡

00:42.150 --> 00:45.720
这意味着该软件以串行方式执行所有操作｡

00:45.720 --> 00:50.730
所以, 如果我给你五件不同的事情做你会做这些事情的顺序,

00:50.730 --> 00:53.250
一, 二, 三, 四, 五｡

00:53.250 --> 00:55.260
如果每一个都花了你10分钟,

00:55.260 --> 00:57.510
那总共是50分钟｡

00:57.510 --> 01:01.650
但是如果我允许你做多线程, 不按顺序做这些事情,

01:01.650 --> 01:03.981
或者同时做这些事情, 你就可以一次做多件事,

01:03.981 --> 01:09.360
把这些事情发送到不同的线程或不同的流｡

01:09.360 --> 01:11.130
例如, 假设我告诉你,

01:11.130 --> 01:13.500
我想让你用右手写下一些东西,

01:13.500 --> 01:17.070
同时, 我想让你用左手敲桌子｡

01:17.070 --> 01:18.570
你可以同时做这两件事,

01:18.570 --> 01:19.830
因为你有两个线程,

01:19.830 --> 01:22.020
或者两只手来做这些动作｡

01:22.020 --> 01:23.970
这就是多线程的思想｡ 

01:23.970 --> 01:28.860
因此, 英特尔和其他制造商所做的就是开发一种方法,

01:28.860 --> 01:30.720
允许软件与他们的处理器对话,

01:30.720 --> 01:35.610
并在单个处理器内同时运行多个并行线程｡

01:35.610 --> 01:37.050
这允许这些线程在该处理器中运行,

01:37.050 --> 01:43.080
并减少CPU等待下一个操作的空闲时间｡

01:43.080 --> 01:46.680
通过这样做, 我们基本上可以尝试增加我们的能力,

01:46.680 --> 01:48.006
并通过处理器处理更多的事情,

01:48.006 --> 01:52.410
并尝试在相同的时间内完成更多的事情｡

01:52.410 --> 01:55.140
现在, 这很好, 但它只在一定程度上起作用,

01:55.140 --> 01:57.570
软件必须能够使用并理解这一点,

01:57.570 --> 02:02.790
才能告诉系统, 你想同时使用多个线程｡

02:02.790 --> 02:06.630
这是处理超线程之类的东西时的一个很大的限制｡

02:06.630 --> 02:13.320
现在, 另一种解决这个问题的方法是所谓的对称多处理（SMP）｡

02:13.320 --> 02:15.570
SMP是工作站和服务器的传统方式,

02:15.570 --> 02:20.370
因为它们实际上有多个处理器｡

02:20.370 --> 02:22.080
现在, 要做到这一点, 你必须有一个主板,

02:22.080 --> 02:28.890
有两个处理器插槽或四个处理器插槽, 然后你会安装两个或四个处理器到主板｡

02:28.890 --> 02:31.050
当您这样做时, 所有这些处理器都需要具有相同的类型和速度,

02:31.050 --> 02:34.290
以便它们可以一起工作｡

02:34.290 --> 02:39.690
你的底层操作系统必须了解如何使用多个处理器｡

02:39.690 --> 02:42.690
默认情况下, 大多数操作系统都不会这样做｡ 

02:42.690 --> 02:45.150
因此, 您必须拥有基于服务器的操作系统,

02:45.150 --> 02:47.670
如Windows Server 2019,

02:47.670 --> 02:49.350
才能支持多个处理器｡

02:49.350 --> 02:55.620
因此, SMP或对称多处理在台式机和笔记本电脑中不是很有用｡

02:55.620 --> 03:01.110
相反, 大多数台式机和笔记本电脑不得不依靠英特尔处理器的超线程或同步多线程,

03:01.110 --> 03:06.720
或SMT, 如果你使用的是AMD处理器｡

03:06.720 --> 03:09.480
所以, 超线程和SMT在很长一段时间内都工作得很好,

03:09.480 --> 03:16.920
但最终我们仍然达到了我们想要处理的东西的数量的限制, 并且只有一个处理器来处理它｡

03:16.920 --> 03:23.220
现在, 由于大多数操作系统不知道如何处理给定主板上的多个插槽或多个处理器,

03:23.220 --> 03:27.420
制造商开始创建所谓的多核软件包｡

03:27.420 --> 03:28.770
现在, 当我提到封装时,

03:28.770 --> 03:31.500
我指的是CPU, 物理芯片｡

03:31.500 --> 03:37.020
现在, 这些制造商决定做的不是在主板上的两个不同插槽上有两个物理封装或两个物理芯片,

03:37.020 --> 03:42.390
而是创建一个作为单个CPU运行的单个封装｡

03:42.390 --> 03:43.740
但在那个包里面,

03:43.740 --> 03:47.160
实际上有多个CPU或多个处理器｡

03:47.160 --> 03:49.410
这意味着对于主板来说, 它看起来像一个物理CPU,

03:49.410 --> 03:57.600
因为它是, 但在它的内部, 有多个核心, 或中央处理器核心, 在它的内部｡

03:57.600 --> 04:03.240
现在, 这允许任何操作系统与该单个处理器或处理器包进行对话,

04:03.240 --> 04:10.890
然后处理器包本身可以在该CPU内部的内部多核之间划分这些指令｡

04:10.890 --> 04:11.812
这样想吧

04:11.812 --> 04:14.250
你的房子有四间卧室｡ 

04:14.250 --> 04:16.320
如果有人来到前门, 他们说, 我需要一张床过夜,

04:16.320 --> 04:20.880
他们真的不在乎这四个人中的哪一个, 只要他们有一张床过夜｡

04:20.880 --> 04:22.710
所以, 你进入前门, 把他们带到一个房间,

04:22.710 --> 04:25.620
只给他们看一个房间｡

04:25.620 --> 04:28.560
这就是这个多核处理器的本质｡ 

04:28.560 --> 04:30.570
当新的人进来的时候, 它会把他们带到一个单独的房间,

04:30.570 --> 04:32.790
让他们在那里过夜, 或者做他们的处理,

04:32.790 --> 04:35.700
然后再把他们送出去｡

04:35.700 --> 04:38.220
所有这些都是由前门的人处理的,

04:38.220 --> 04:40.860
在这种情况下, 就是多核包｡

04:40.860 --> 04:43.200
然后, 它将它们放入单独的隔间或单独的子处理器,

04:43.200 --> 04:46.890
它需要做这项工作｡

04:46.890 --> 04:49.290
这就是多核软件包的概念｡ 

04:49.290 --> 04:51.480
现在, 我们大多数人都听说过这个,

04:51.480 --> 04:52.650
因为在你的系统上,

04:52.650 --> 04:55.110
你可能有一个多核处理器｡

04:55.110 --> 04:57.120
你可能有一个双核处理器, 这意味着你在一个芯片里有两个CPU,

04:57.120 --> 05:03.960
或者你有一个四处理器, 这意味着你在一个芯片里有四个处理器｡

05:03.960 --> 05:05.730
或者你有一个hexa处理器,

05:05.730 --> 05:08.340
这意味着你在一个芯片里有六个核心｡

05:08.340 --> 05:09.840
或者你有一个octa处理器,

05:09.840 --> 05:12.300
这意味着你在一个芯片上有八个核心｡

05:12.300 --> 05:16.090
例如, 在我的CPU上, 我的台式机上有一个八核处理器,

05:16.090 --> 05:21.630
它是一个物理芯片, 但它内部有八个子处理器｡

05:21.630 --> 05:25.410
因此, 这被称为八核或多核处理器｡

05:25.410 --> 05:27.240
现在, 除了拥有多核和超线程之外,

05:27.240 --> 05:32.846
您实际上可以将两者结合起来, 因此每个处理器都包含在软件包中, 例如,

05:32.846 --> 05:34.560
在我的系统中, 我有八核,

05:34.560 --> 05:37.530
它有八个处理器｡

05:37.530 --> 05:38.940
现在, 在这个包中,

05:38.940 --> 05:40.050
有八个处理器,

05:40.050 --> 05:43.710
这八个处理器中的每一个都可以支持超线程｡

05:43.710 --> 05:46.860
这意味着我有16个线程和8个CPU,

05:46.860 --> 05:50.850
在这台特定的机器上给了我大量的处理能力｡

05:50.850 --> 05:56.010
好了, 现在我们已经讨论了这节课要讲的四件事中的三件｡

05:56.010 --> 05:57.390
我们已经讨论了超线程和同步多线程,

05:57.390 --> 06:00.090
称为SMT｡

06:00.090 --> 06:02.460
我们已经讨论过对称多处理,

06:02.460 --> 06:04.830
或者说在插槽中有多个CPU,

06:04.830 --> 06:07.530
然后我们讨论了多核处理器的概念,

06:07.530 --> 06:09.120
即一个CPU内部有多个处理器,

06:09.120 --> 06:14.010
无论是两个､ 四个､ 六个还是八个｡

06:14.010 --> 06:17.400
现在, 我们需要讨论的最后一件事是虚拟化｡ 

06:17.400 --> 06:23.220
现在, 虚拟化是CPU的另一个特性, 但它与我们刚刚讨论的三个特性没有真正的关系｡

06:23.220 --> 06:28.710
我们刚才讨论的三个问题都是关于如何从单个芯片或多个芯片中获得更高性能｡

06:28.710 --> 06:30.300
但是当我们谈论虚拟化时,

06:30.300 --> 06:35.730
我们谈论的是能够模拟那里实际上不存在的硬件｡

06:35.730 --> 06:44.700
现在, 这实际上是通过英特尔的虚拟化技术（称为VT）或AMD的虚拟化技术（称为AMD-V）实现的｡

06:44.700 --> 06:47.340
现在, 这两个都提供了处理器扩展来支持虚拟化,

06:47.340 --> 06:52.050
这被称为硬件辅助虚拟化｡

06:52.050 --> 06:53.021
这可能会引出一个问题,

06:53.021 --> 06:55.470
什么是虚拟化？

06:55.470 --> 07:02.729
虚拟化是一种让一台计算机假装它在自己内部运行多台其他计算机的能力｡

07:02.729 --> 07:07.140
现在, 看起来像是, 我可能有一台像我的MacBook一样的笔记本电脑｡

07:07.140 --> 07:11.700
在这台MacBook上, 我只有一个操作系统, macOS｡ 

07:11.700 --> 07:13.710
现在, 如果我想运行Windows或Linux,

07:13.710 --> 07:16.920
我必须重新格式化我的机器并安装该软件｡

07:16.920 --> 07:18.780
那就太不方便了

07:18.780 --> 07:21.360
但有了虚拟化, 我就不必这样做了｡ 

07:21.360 --> 07:26.340
相反, 我可以运行一个像VMware或Virtualbox或Parallels这样的程序,

07:26.340 --> 07:30.000
在这个软件中, 我可以创建一个虚拟计算机｡

07:30.000 --> 07:34.950
我可以告诉它, 我希望它有一个处理器或两个处理器或四个处理器｡

07:34.950 --> 07:38.010
我可以告诉它我需要多少内存和存储空间｡

07:38.010 --> 07:39.930
它将创建这个虚拟计算机,

07:39.930 --> 07:42.510
这是只存在于软件中｡

07:42.510 --> 07:44.645
现在, 当我在它里面运行新的操作系统,

07:44.645 --> 07:48.660
比如Windows, 我可能会说这是一个双核处理器｡

07:48.660 --> 07:52.770
它有4G内存和50G硬盘｡ 

07:52.770 --> 07:54.750
所有这些都只存在于软件中｡ 

07:54.750 --> 07:59.670
但是当我将Windows安装到该虚拟机时, Windows认为它是一台完整的计算机｡

07:59.670 --> 08:06.270
它认为它有一个完整的两个处理器, 一个完整的4G内存和一个完整的50G硬盘驱动器｡

08:06.270 --> 08:07.200
因此, 对于Windows来说,

08:07.200 --> 08:11.400
它认为它拥有所有这些物理硬件, 这就是虚拟化允许我们做的事情｡

08:11.400 --> 08:15.600
它允许我们虚拟化计算机并提供虚拟硬件,

08:15.600 --> 08:20.280
并能够在单个物理主机内运行多个操作系统｡

08:20.280 --> 08:23.100
现在, 除了VT和AMD-V之外,

08:23.100 --> 08:28.860
您还可以在某些现代处理器中找到第二级虚拟化硬件支持｡

08:28.860 --> 08:33.480
在Intel系统上, 这被称为EPT或扩展页表｡

08:33.480 --> 08:35.490
当你使用AMD处理器时,

08:35.490 --> 08:39.810
他们称之为快速虚拟化索引, 或RVI｡

08:39.810 --> 08:45.450
这两者都被认为是软件虚拟化的第二级地址转换或SLAT功能,

08:45.450 --> 08:48.060
然后由硬件处理器底层支持,

08:48.060 --> 08:56.913
以允许更好的虚拟内存管理, 并在使用虚拟机内部的内存时提高性能｡

08:57.870 --> 09:00.150
我们将在各自的课程中详细讨论虚拟化,

09:00.150 --> 09:02.130
但现在, 我只想让您了解,

09:02.130 --> 09:19.260
某些CPU能够在其处理器集内执行此操作, 并且具有此功能的处理器（例如支持Intel的VT或AMD的AMD-V的处理器）在执行虚拟化时会比不支持虚拟化的处理器提供更好的性能｡

09:19.260 --> 09:20.698
因此, 如果您要构建一台机器,

09:20.698 --> 09:25.995
并希望将其用于虚拟化, 例如一台将在其上运行许多其他虚拟服务器的服务器,

09:25.995 --> 09:40.653
则需要确保您选择的处理器具有VT或AMD-V, 以便它们可以支持直接硬件加速虚拟化, 因为这将给你一个更好的体验和更好的性能, 而不是你必须做软件虚拟化｡
