问题引入
点开任务管理器,打开这个面板,你绝对会吓一跳
逻辑处理器和核心数这两个参数,分明只有 8 个和 4 个呀,左边这里有 2644 个线程,怎么应付的过来啊?
分析
这的确是个好问题,一个人就算再能打,面对成百上千的敌人,也不好对付吧?
难道这个真的有这么强吗?
CPU的参数列表
先随便找个 CPU 的参数来看看
这里明明写的是 12 线程啊,怎么回事
- 确实,CPU 里面有的物理核心数就那么多
- 不过,这个问题不用太担心,因为他下面有个好兄弟帮他
你被操作系统操作了
CPU 的好兄弟就是他,操作系统
操作系统里面有一个很重要的东西,叫做虚拟化,CS 的课程中,肯定会讲这个东西
虚拟化可以分为两种:
- 内存虚拟化
- CPU 虚拟化
这里就只提 CPU 的虚拟化
为什么需要虚拟化?
CPU 的资源是有限的,而在操作系统中,各种各样的程序都在向操作系统索要资源,所以,必须想出个对策来,怎么用有限的资源去应对各种各样的需求
所以,虚拟化这种理论就被提出来,并且应用了
原来是这么回事
在操作系统中,程序有以下三个状态
- 就绪
- 运行
- 挂起
操作系统是实现虚拟化的呢?
这里需要引入一个新概念:CPU 时钟
这个是 CPU 内部用来计算时间的标准,现实世界中,我们可以看到的是 h,min,second 这些计时单位,而 CPU 中,有专门的的单位用来计算时间,这个单位特别小(相对于现实中的时间)
操作系统是这么做的:
- 根据系统自己指定的策略,当一个程序可以运行的时候,将他从就绪态转入运行态,然后,程序可以开始跑,就是 上图中的 (1)
- 当经历了一个 CPU 时钟的时间长度后,如果这个程序没有执行完,让他回到就绪态(2),如果执行完了,让他跑向挂起态(3)
- 当一个程序准备东山再起的时候,让他从挂起态变成就绪态(4)
程序没有执行完,就让他停下来,什么时候能继续执行呢?
这个就需要根据每个操作系统里面的策略不同(这就是操作系统的调度),进行具体的分析了
诶? 程序们像这样还没运行完就突然停下来,为什么我在使用计算机的时候察觉不到?
CPU 时钟的长度很短,现实世界中都是用毫秒,微秒这种级别的单位来衡量的,而在你察觉他开始卡顿之前,他已经进入了下一个 CPU 时钟内继续执行了,你肯定发觉不了啊
但实际上程序的执行步骤是:
- 执行
- 暂停
- 继续执行
- 暂停
………………
总结
所以,在底层的世界里,操作系统将 CPU 有限的资源通过 CPU 时钟,将这些资源划分成很多个小块,造成一种资源非常丰富的错觉,让每个程序都认为他拥有充足的 CPU 资源去运行程序,而不是认为当前的资源不够,就罢工