CPU、核心、进程、线程、串行、并发、并行

<html lang="zh-CN"> <head> <meta charset="UTF-8"> </head> <body class="nodata " > <h1>1、计算机硬件基本组成</h1> <p>一个计算机(冯·诺依曼结构)【主要】硬件组成:</p> <ul> <li><b>主板:</b>是“交通枢纽”,各个部件工作的所在平台,它负责将各个部件紧密连接在一起,各部件通过主板进行数据传输</li> <li><b>CPU:</b>中央处理器(Central Processing Unit),决定电脑的性能等级。主要有3大组成部分 <ul> <li>运算器:算术逻辑运算单元(ALU,Arithmetic Logic Unit),负责执行所有的数学和逻辑工作</li> <li>控制器:控制单元(CU,Control Unit),控制计算机的所有其他部件,如输入输出设备以及存储器</li> <li>寄存器:存储单元,包括CPU片内缓存和寄存器组,是CPU中暂时存放数据的地方</li> </ul> </li> <li><b>内存:</b>将输入设备接收到的信息以二进制的数据形式存到存储器中 <ul> <li>RAM</li> <li>ROM</li> <li>CMOS</li> </ul> </li> <li><b>外存:</b>辅助存储器,像硬盘等,能长期保存信息</li> <li>显卡、网卡、声卡、电源、键盘、鼠标、显示器等<br> <img src="https://img-blog.csdnimg.cn/20190519200456513.png" alt="在这里插入图片描述"></li> </ul> <p>win10下观察其内存动态使用图:<br> <img src="https://img-blog.csdnimg.cn/20190519204557641.png" alt="在这里插入图片描述"><br> CPU是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit)。它的<b>功能主要是<font color="red" size="4">解释计算机指令、处理计算机软件中的数据。</font></b><br> <img src="https://img-blog.csdnimg.cn/20190519235114686.png" alt="在这里插入图片描述"><br> CPU工作原理图:<br> <img src="https://img-blog.csdnimg.cn/20190519203353802.png" alt="在这里插入图片描述"></p> <p>windows10下 CPU动态使用图:<br> <img src="https://img-blog.csdnimg.cn/20200323161012368.png" alt="在这里插入图片描述"><br> 上述这款CPU的 构造:<br> <img src="https://img-blog.csdnimg.cn/20200323161342218.png" alt="在这里插入图片描述"><br> 这就是我们购买电脑时,所看到的CPU参数:该电脑拥有<code>1个CPU,它有4个内核(表示有4个相对独立的CPU核心单元组,这是物理概念)</code>。</p> <p>上述这个CPU可描述为:<font color="red">单CPU 4核心 4线程。</font>4核 指的是物理核心(物理概念)。4线程(线程数是一个逻辑概念)。</p> <blockquote> <p>上述这个CPU<font color="red">不支持</font> 超线程技术。超线程技术、虚拟化技术 是两个不同的东西。</p> </blockquote> <p>也可以通过cmd,<code>wmic</code>,<code>cpu get</code>查看:</p> <ul> <li>NumberOfCores:表示CPU核心数</li> <li>NumberOfLogicalProcessors:表示CPU线程数</li> </ul> <p>多核 是指一个CPU有多个核心处理器,处理器之间通过<b>CPU内部总线</b>进行通讯。</p> <p>多CPU是指简单的多个CPU工作在同一个系统上,多个CPU之间的通讯是<b>通过主板上的总线</b>进行的。</p> <p><img src="https://img-blog.csdnimg.cn/20190520113314511.png" alt="在这里插入图片描述"></p> <p>参考文章:<br> <a href="https://blog.csdn.net/hong10086/article/details/81633669">CPU个数,核心数,线程数</a></p> <h1>2、进程(process)、线程(thread)</h1> <p><img src="https://img-blog.csdnimg.cn/20190519214940824.png" alt="在这里插入图片描述"><br> 注意下方语句中的 主体:操作系统、CPU</p> <p><b>进程:</b>是<b><font color="red">操作系统(OS)</font></b>进行资源(CPU、内存、磁盘、IO、带宽等)分配的最小单位;</p> <p>是OS对正在运行的程序的一种抽象,是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成。</p> <p>打开一个浏览器、一个聊天窗口分别是一个进程。进程可以有多个子任务,如聊天工具接收消息、发送消息,这些子任务是线程。<br> 资源分配给进程,线程共享进程资源。</p> <p><b>线程:</b>是<b><font color="red">CPU</font></b>调度和分配的基本单位。<br> 一个进程可由多个线程的执行单元组成,每个线程都运行在同一进程的上下文中,共享同样的代码和全局数据。<br> 每个进程至少有一个主执行线程,它无需由用户主动创建,一般由系统自动创建。系统创建好进程后,实际上就启动了执行该进程的执行主线程,执行主线程以函数地址形式,即程序入口函数(如 main函数),将程序的启动点提供给操作系统。主执行线程终止了,进程也就随之终止。</p> <p>线程数 是一种逻辑概念,是模拟出的CPU核心数。</p> <p><font color="red">进程和线程的关系:</font>进程可以简单理解为一个容器,有自己独立的地址空间,其内部的各个线程共享该地址空间。<br> 其实严格讲应该是线程能够获得CPU资源,进程对CPU资源的获取也是体现在线程上的。<font color="red">至于CPU内核数,和进程线程没直接关系。</font>操作系统(OS)可以把某个进程部署在某个CPU核上,当然这要取决于系统设计。</p> <p>线程是CPU调度和分配的最小单位,操作系统会根据进程的优先级和线程的优先级去调度CPU。一个计算机可以并发(同时)的线程数,等于计算机上的逻辑处理器的个数(<code>CPU个数 *每个CPU核心数 *每个内核线程数</code>)。</p> <p>进程、线程是操作系统调度的,<font color="red">进程本身不会负责调度线程。</font>在操作系统看来,线程和进程其实差不多,不同点是线程是迷你的进程,并且进程可以包含多个线程。</p> <table class="md-table"><thead><tr class="md-end-block"><th><span class="td-span"><span>对比</span></span></th><th><span class="td-span"><span>进程</span></span></th><th><span class="td-span"><span>线程</span></span></th></tr></thead><tbody><tr class="md-end-block"><td><span class="td-span"><span>定义</span></span></td><td><span class="td-span"><span>进程是程序运行的一个实体的运行过程,是系统进行资源分配和调配的一个独立单位</span></span></td><td><span class="td-span"><span>线程是进程运行和执行的最小调度单位</span></span></td></tr><tr class="md-end-block"><td><span class="td-span"><span>系统开销</span></span></td><td><span class="td-span"><span>创建撤销切换开销大,资源要重新分配和收回</span></span></td><td><span class="td-span"><span>仅保存少量寄存器的内容,开销小,在进程的地址空间执行代码</span></span></td></tr><tr class="md-end-block"><td><span class="td-span"><span>拥有资产</span></span></td><td><span class="td-span"><span>资源拥有的基本单位</span></span></td><td><span class="td-span"><span>基本上不占资源,仅有不可少的资源(程序计数器,一组寄存器和栈)</span></span></td></tr><tr class="md-end-block"><td><span class="td-span"><span>调度</span></span></td><td><span class="td-span"><span>资源分配的基本单位</span></span></td><td><span class="td-span"><span>独立调度分配的单位</span></span></td></tr><tr class="md-end-block"><td><span class="td-span"><span>安全性</span></span></td><td><span class="td-span"><span>进程间相互独立,互不影响</span></span></td><td><span class="td-span"><span>线程共享一个进程下面的资源,可以互相通信和影响</span></span></td></tr><tr class="md-end-block"><td><span class="td-span"><span>地址空间</span></span></td><td><span class="td-span"><span>系统赋予的独立的内存地址空间</span></span></td><td><span class="td-span"><span>由相关堆栈寄存器和和线程控制表TCB组成,寄存器可被用来存储线程内的局部变量</span></span></td></tr></tbody></table><p><span class="md-line md-end-block"></span></p><h2 class="md-end-block md-heading"> </h2><p><font color="red">线程切换</font></p> <ul> <li> <p>CPU给线程分配<font color="red">时间片</font>(也就是分配给线程的时间),执行完时间片后会切换都另一个线程。</p> </li> <li> <p>切换之前会保存线程的状态,下次时间片再给这个线程时才能知道当前状态。</p> </li> <li> <p>从保存线程A的状态再到切换到线程B时,重新加载线程B的状态的这个过程就叫<font color="red">上下文切换</font>。</p> </li> <li> <p>而上下切换时会消耗大量的CPU时间。</p> </li> </ul> <p><font color="red">线程开销</font></p> <ul> <li>上下文切换消耗</li> <li>线程创建和消亡的开销</li> <li>线程需要保存维持线程本地栈,会消耗内存</li> </ul> <p><font color="red">程序与进程、线程的关系</font></p> <p><font color="blue">程序 只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态的实体。<br> 而进程则不同,它是程序在某个数据集上的执行(即 <font color="red">进程是程序的一次执行</font>),是一个动态的实体,有自己的生命周期,因创建而产生、因调度而运行、因等待资源或事件而被处于等待状态、因任务完成而被撤销,反映的是一个程序在一定的数据集上运行的全部动态过程。</font></p> <p>进程和程序并不是一一对应的:一个程序执行在不同的数据集上就成为不同的进程,可以用进程控制块来唯一地标识每个进程。这是程序无法做到的,因为程序没有和数据产生直接的联系,即使是执行不同的数据的程序,但它们的指令的集合依然是一样的,因此无法唯一地标识出这些运行在不同数据集上的程序。<br> 一般来说,一个进程肯定有一个与之对应的程序,而且只有一个。而一个程序有可能没有与之对应的进程(因为它没有执行)、也可能有多个进程与之对应(运行在不同的数据集上)。</p> <p><font color="red">不同的进程可以执行同一段程序,比如读取同一个文件数据,它们的读取函数的代码是相同的,并被2个进程或线程运行了。</font></p> <p>一般情况下,写一个程序,没有单独开线程,那么默认这个程序的一次运行就是一个单进程;而如果调用了fork,这时将会有2个进程,调用thread,则这个进程就会有2个线程。</p> <p>进程是一个实体,每一个进程都有它自己的内存地址段(heap、stack等),进程是执行中的程序。</p> <p>程序是一个没有生命的实体,只有处理器赋予程序生命时,才能成为一个活动的实体。</p> <p>线程,程序执行的最小单元,每个程序都至少有一个线程,若程序只有一个线程,那就是它程序本身。单线程的进程可以简单地理解为只有一个线程的进程。一个进程在同一时间只做一件事,但有了多线程后,一个进程同一时间可以做多件事,每个线程可以处理不同的事务。无论系统有几个CPU,其实进程运行在单CPU上,多线程也可以是进程并发处理多个事务。一个线程阻塞不会影响另一个线程。</p> <p>多线程的进程可以尽可能地利用系统CPU资源,但也不是线程越多越好,线程越多,CPU分配给每个线程的时间就越少。</p> <p>线程 包含了表示进程内执行环节所必需的信息:标识线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno变量、线程私有数据。<br> 对于内存而言,堆内存、代码区一般属于一个进程,但是栈却是属于一个线程的,且每个线程拥有一个独立的栈。<br> errno也是属于单个线程的,每个线程中的errno是独立的。<br> 进程内所有信息对于线程是共享的,包括执行代码、全局变量、堆内存、栈、文件描述符。</p> <p>总结:<br> <font color="red">进程和线程都是一个时间段的描述,是CPU工作时间段的描述:</font></p> <ul> <li>进程就是上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文</li> <li>线程是共享了进程的上下文环境,的更为细小的CPU时间段。</li> </ul> <h1>3、串行、并发、并行</h1> <p>这些概念对于进程、线程都适用。</p> <p><font color="red">3.1、串行</font></p> <p>多个任务,执行时一个执行完再执行另一个。</p> <p><font color="red">3.2、并发(concurrency)</font></p> <p>多个线程在单个核心运行,同一时间一个线程运行,系统不停切换线程,看起来像同时运行,实际上是线程不停切换。</p> <p>即一个指令 和另一个指令交错执行,操作系统实现这种交错执行的机制称为:上下文切换。上下文是指操作系统保持跟踪进程或线程运行所需的所有状态信息,如寄存器文件的当前值、主存内容等</p> <p><font color="red">3.3、并行(parallelism)</font></p> <p>每个线程分配给独立的核心,线程同时运行。</p> <p>单核CPU多个进程或多个线程内能实现并发(微观上的串行,宏观上的并行);多核CPU线程间可以实现微观上并行。</p> <p>总结:<font color="red"><br> 1、单CPU中进程只能是并发,多CPU计算机中进程可以并行。<br> 2、单CPU单核中线程只能并发,单CPU多核中线程可以并行。<br> 3、无论是并发还是并行,使用者来看,看到的是多进程,多线程。<br> </font></p> <h1>4、CPU处理程序</h1> <p>4.1、单核CPU处理程序</p> <p><font color="red">在单CPU计算机中,有一个资源是无法被多个程序并行使用的:CPU。</font></p> <p><b>单进程多线程处理:</b></p> <p>在一个程序里,有两个功能:听歌、发送消息,这就是单进程2线程。如果听歌线程获取了锁,那么这个线程将获取CPU的运行时间,其他线程将被阻塞。但CPU始终处于运行状态,影响计算时间的其实只是加锁、解锁的时间,并不会发生CPU空闲的现象,CPU利用率100%。</p> <p>线程阻塞:一般是被动的,在抢占资源中得不到资源,被动的挂起在内存,等待某种资源或信号将它唤醒。(释放CPU,不释放内存)</p> <p><b>多进程处理:</b><br> 将听歌、发消息分别写出两个独立的程序,独立运行,与上面不同的是,如果进程间需要通信,比如交换数据,则会需要很多步骤,效率低。</p> <p>4.2、多核CPU处理程序</p> <p>单进程多线程处理:线程可以跨核处理,进程之间则不能,如同支付宝不能访问QQ一样(安全性)。<br> 跟单核对比:如果A核处理听歌线程阻塞,B核空闲,则CPU工作效率下降一半;没有阻塞时,QQ的A线程听歌、B线程发消息,多核CPU效率比单核快很多。</p> <p>多进程多线程处理:不同的程序,不可能一个进程融合QQ、支付宝、浏览器等</p> <p><font color="red">多核下线程数量选择</font></p> <ul> <li> <p>计算密集型<br> 程序主要为复杂的逻辑判断和复杂的运算。<br> CPU的利用率高,不用开太多的线程,开太多线程反而会因为线程切换时切换上下文而浪费资源。</p> </li> <li> <p>IO密集型<br> 程序主要为IO操作,比如磁盘IO(读取文件)和网络IO(网络请求)。<br> 因为IO操作会阻塞线程,CPU利用率不高,可以开多点线程,阻塞时可以切换到其他就绪线程,提高CPU利用率。</p> </li> </ul> <p>总结:</p> <ul> <li>提高性能的一种方式:提高硬件水平,处理速度或核心数。</li> <li>另一种方式:根据实际场景,合理设置线程数,软件上提高CPU利用率。</li> </ul> <p>进程:处理任务多,每个进程都有独立的内存单元,占用CPU资源相对较少。缺点是 进程间切换开销大。进程之间通信就如同两个程序之间的通信。</p> <p>线程:处理任务相对较少,同时为了处理【并发】,多个线程共享内存单元,占用资源少。线程之间的通信就如同一个程序里的两个函数间通信,在函数里定义一个全局变量,两个线程(两个函数)都能用,线程间共享内存。</p> </body>

神是念着倒 2019-05-20 11:44:38 3419 已收藏 31
分类专栏: 计算机理论与基础
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38256474/article/details/90347263

posted @ 2020-07-06 22:47  AIxiaodi  阅读(245)  评论(0)    收藏  举报