前言
在学习与开发的过程中,总能听到与看到
CPU,核数, 进程, 线程, 并行度, 串行, 并发, 并行, 同步, 异步 . . . . . .
这些东西,有时候在很相近的地方的一时半会区分一个1,2,3来,真的是说不上来。所以特意总结一篇。
其实这就是在大学学习《计算机组成原理》的内容。当时学习的时候,不能理解学习完这些就是知道了有啥用,现在工作几年了,回想起来真的很有用。对于还在大学的读者,要好好学习基础知识。所以,今天此篇是来重新从老师那边拿回咱们的东西,回想你的大学,还记得这位老师吗?来评论聊聊。
CPU
中央处理器,其功能主要是解释计算机指令以及处理计算机软件中的数据。CPU是计算机中负责读取指令,对指令译码并执行指令的核心部件。
运算器
(1)算术逻辑单元(ALU)。算术逻辑单元的运算主要是进行二位元算术运算,如加法、减法、乘法。在运算过程中,算术逻辑单元主要是以计算机指令集中执行算术与逻辑操作,通常来说,ALU能够发挥直接读入读出的作用,具体体现在处理器控制器、内存及输入输出设备等方面,输入输出是建立在总线的基础上实施。输入指令包含一 个指令字,其中包括操作码、格式码等。
(2)累加器(accumulator)是一种寄存器,用来储存计算产生的中间结果。如果没有像累加器这样的寄存器,那么在每次计算 (加法,乘法,移位等等) 后就必须要把结果写回到内存,也许马上就得读回来。
(3)状态寄存器用来存放两类信息:一类是体现当前指令执行结果的各种状态信息(条件码),如有无进位(CF位)、有无溢出(OV位)、结果正负(SF位)、结果是否为零(ZF位)、奇偶标志位(P位)等;另一类是存放控制信息(PSW:程序状态字寄存器),如允许中断(IF位)、跟踪标志(TF位)等
(4)通用寄存器。用于暂时存放或传送数据或指令。
控制器
控制器,是计算机的指挥中心,负责决定执行程序的顺序,给出执行指令时机器各部件所需要的操作控制命令。
(1)程序计数器(PC)。用来存储从内存提取的下一条指令的地址。当CPU执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为“取指令”。与此同时,PC中的地址或自动加1或由转移指针给出下一条指令的地址,此后经过分析指令,执行指令,完成第一条指令的执行,而后根据PC取出第二条指令的地址,如此循环,执行每一条指令,保证程序能够连续地执行下去。
(2)指令编译器。用于翻译指令及控制传输指令包含的数据。
(3)指令寄存器。用于缓存从内存或高速缓存里取出的指令,CPU执行指令时,就可以从指令寄存器中取出相关指令来进行执行。
(4)时序产生器。类似于“时间作息表”,给计算机各部分提供工作所需的时间标志,一般是利用定时脉冲的顺序和不同的脉冲间隔来实现。
(5)操作控制器。根据指令所需完成的操作和信号,发出各种微操作命令序列,用以控制所有被控对象,完成指令的执行。
核数
CPU核数即一个CPU由多少个核心组成,核心数越多,代表这个CPU的运转速度越快,性能越好。对于同一个数据处理,一核CPU相当于1个人处理数据,双核CPU相当于2个人处理同一个数据,4核CPU相当于4个人去处理同一个数据,因此处理核心数越多,CPU的工作效率也就越高。以windows为例:
插槽:1个CPU 内核:4核数 逻辑处理器:8线程
所以对于图片上的这台电脑看,这是一台单CPU 4核 8线程的电脑。
对于概念上来看,4核心指的的物理概念,8线程是逻辑概念。这是利用超线程技术将一个物理核心模拟为2个核心,这2个核心并不是物理上独立存在的电路,所以叫做逻辑核(逻辑处理器)。
多核与多CPU
多核,是指一个CPU有多个核心处理器,处理器之间通过CPU内部总线进行通讯。
多CPU是指简单的多个CPU工作在同一个系统上,多个CPU之间的通讯是通过主板上的总线进行的。
进程
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
结构
(1)文本区域:存储处理器执行的代码。
(2)数据区域:存储变量和进程执行期间使用的动态分配的内存。
(3)堆栈:存储着活动过程调用的指令和本地变量。
状态(就绪、运行和阻塞)
(1)就绪
阻塞态到就绪态:阻塞的进程获得等待的资源或信号。
运行态到就绪态:时间片轮转的情况下,进程的时间片用完。
运行态到就绪态:CPU调度给优先级更高的进程。
(2)运行态
正在运行的进程
(3)阻塞态
等待资源,信息交换,进程同步(停下来等待其他进程),这些情况都会存在阻塞。
线程
一个进程中可以包含若干个线程。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。
状态
(1)新建状态(new):新创建了一个线程。
(2)就绪状态(Runnable):线程对象创建后,该状态的线程位于可运行线程池 中,变得可运行,等待被线程调度选中,获取cpu的使用权。在java中调用了start()方法。
(3)运行状态(Running):就绪状态的线程获取了CPU时间片,执行程序代码。
(4)阻塞状态(Blocked):阻塞状态是线程因为种种原因丢掉了CPU使用,暂时停止运行。
(5)死亡状态(Dead):线程执行完了或者遇到异常,该线程结束生命周期。
进程与线程
有个形象的比喻就是:进程好比是火车,线程好比是车厢(多线程)。
对比项 |
进程 |
线程 |
定义 |
进程是程序运行的一个实体的运行过程,是系统进行资源分配和调配的一个独立单位 |
线程是进程运行和执行的最小调度单位 |
系统性能 |
创建撤销切换影响性能,资源要重新分配和收回 |
仅保存少量寄存器的内容,在进程的地址空间执行代码 |
拥有资产 |
资源拥有的基本单位 |
基本上不占资源,仅有不可少的资源(程序计数器,一组寄存器和栈) |
调度 |
资源分配的基本单位 |
独立调度分配的单位 |
安全性 |
进程间相互独立,互不影响 |
线程共享一个进程下面的资源,可以互相通信 |
地址空间 |
赋予的独立的内存地址空间 |
由相关堆栈寄存器和和线程控制表组成,寄存器可被用来存储线程内的局部变量 |
串行,并发与并行
串行: 多个任务,执行时一个执行完再执行另一个。
并发: 多个线程在单个核心运行,同一时间一个线程运行,系统不停切换线程,看起来像同时运行,实际上是线程不停切换。
并行: 每个线程分配给独立的核心,线程同时运行。
在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种机制有多种形式,但是大多数是时间片轮询方式为主,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent)。而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel)。
所以记住:并发在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。在软件领域,完成多个任务需要借助多线程完成。但是并不是并发操作能够完全优势于串行操作,因为进程间切换需要成本,但是有时候有些任务只能通过串行完成。
其他方式的理解
串行:打完游戏去睡觉。
并发:指两个或多个事件在同一时间间隔发生,交替做不同事情的能力。比如:上班的时候正在写代码,中间的时候领导让开了会,开完会,继续写代码。
并行:指两个或者多个事件在同一时刻发生,同时做不同事情的能力。比如:习惯性的边吃饭边看视频。
同步与异步
同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去。
异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。
当多个线程需要访问同一个资源时,它们需要以某种顺序来确保该资源在某一特定时刻只能被一个线程所访问,如果使用异步,程序的运行结果将不可预料。因此,在这种情况下,就必须对数据进行同步,即限制只能有一个进程访问资源,其他线程必须等待。
所以同步与异步的选择要看业务场景。
(文/图:王博——14计科)