计算机原理:CPU、并发、并行、多核、多线程、多进程

  • 0、计算机工作流程
    • 0.0 基础概念:计算机组成
    • 0.1 CPU(Central Processing Unit)
      • (1)控制单元
      • (2)运算单元
      • (3)存储单元:
    • 0.2 计算机总线(Bus)
    • 0.3计算机工作流程
  • 1、线程和进程
    • 1.0 前提了解
    • 1.1进程(process):
    • 1.2 线程(thread)
    • 1.3 进程和线程的区别与联系
    • 1.4多线程和多进程
      • 一、什么是多线程?
      • 二、多进程
      • 三、多线程与多进程,选择谁?
  • 2、 多核,高并发,并行
    • 2.1 多核
      • 2.1.1 物理CPU多核
      • 2.1.2 逻辑处理器
    • 2.2 并发和并行
    • 2.3多线程和并发的关系
    • 2.4 多线程和并行之前的关系
  • 3 如何做并发、并行编程,提高代码的运行效率
    • 3.1并发编程
    • 3.2并行计算

写在前面的话:本篇博客参考了多篇文章,自己总结的笔记,如有错误,请评论区留言。

0、计算机工作流程

0.0 基础概念:计算机组成

计算机由五大部分组成:控制器、运算器、存储器、输入设备、输出设备。

(1)控制器和运算器集成在CPU上,后面重点介绍介绍。
(2)存储器是计算机记忆或暂存数据的部件。计算机中的全部信息,包括原始的输入数据。经过初步加工的中间数据以及最后处理完成的有用信息都存放在存储器中。
存储器分为内存储器(简称内存或主存,RAM)、外存储器(简称外存或辅存,如硬盘,ROM)。
(3)输入设备:键盘、鼠标、扫描仪、光笔等
(4)输出设备:扫描仪、打印机、显示器等

0.1 CPU(Central Processing Unit)

CPU又称中央处理器,通常被称为计算机的大脑。CPU由三大单元构成:运算单元、控制单元、存储单元。
需要指出的是,此处的存储单元和上文的存储器不同(即和RAM和ROM不同)

(1)控制单元

控制单元是整个CPU的指挥控制中心,指挥全机中各个部件自动协调工作。在控制器的控制下,计算机能够自动按照程序设定的步骤进行一系列操作。负责把内存上的指令、数据等读入寄存器,并根据指令的执行结果来控制整个计算机。

控制单元的组成:指令寄存器IR(Instruction Register)、指令译码器ID(Instruction Decoder)和操作控制器OC(Operation Controller)

(2)运算单元

运算单元是运算器的核心。可以执行算术运算(包括加减乘数等基本运算及其附加运算)和逻辑运算(包括移位、逻辑测试或两个值比较)。相对控制单元而言,运算器接受控制单元的命令而进行动作,即运算单元所进行的全部操作都是由控制单元发出的控制信号来指挥的,所以它是执行部件。

运算器负责运算从内存读入寄存器的数据。
运算单元的核心部件是算术逻辑部件ALU。ALU 主要完成对二进制信息的定点算术运算、逻辑运算和各种移位操作。ALU 是一种功能较强的组合逻辑电路,有时被称为多功能发生器。

(3)存储单元:

存储单元包括CPU片内缓存(CPU Cache)和寄存器组(Register),是CPU中暂时存放数据的地方,里面保存着那些等待处理的数据,或已经处理过的数据。采用缓存和寄存器,可以减少CPU访问内存的次数,从而提高了CPU的工作速度。
按与CPU远近来分,离得最近的是寄存器,然后缓存,最后内存。

a、寄存器
寄存器是最贴近CPU的,而且CPU只与寄存器中进行存取。(寄存的意思是,暂时存放数据,不中每次从内存中取,它就是一个临时放数据的空间,火车站寄存处就是这个意思)而寄存器的数据又来源于内存。于是 CPU<—>寄存器<----->内存 这就是它们之间的信息交换。

寄存器是CPU内部用来存放数据(且存储的是二进制的数据)的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。一个CPU内部会有20~100个寄存器。
寄存器组可分为专用寄存器和通用寄存器。专用寄存器的作用是固定的,分别寄存相应的数据。而通用寄存器用途广泛并可由程序员规定其用途。

b、Cache,那为什么有缓存呢?
因为如果老是操作内存中的同一址地的数据,就会影响速度。于是就在寄存器与内存之间设置一个缓存。缓存就把从内存提取的数据暂时保存在里面,如果寄存器要取内存中同一位置的东西,就不用老远巴巴地跑到内存中去取,直接从缓存中提取。因为从缓存提取的速度远高于内存。当然缓存的价格肯定远远高于内存,不然的话,机器里就没有内存的存在,只有缓存的存在了,但如果全是缓存,相信没有几个人买 得起计算机了。

CPU缓存:是用于减少处理器访问内存所需平均时间的部件。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近处理器的频率。
当处理器发出内存访问请求时,会先查看缓存内是否有请求数据。如果存在(命中),则不经访问内存直接返回该数据;如果不存在(失效),则要先把内存中的相应数据载入缓存,再将其返回处理器。
缓存之所以有效,主要是因为程序运行时对内存的访问呈现局部性
在处理器看来,缓存是一个透明部件。因此,程序员通常无法直接干预对缓存的操作。但是,确实可以根据缓存的特点对程序代码实施特定优化,从而更好地利用缓存

c、总结
由此可以看出,从远近来看: CPU〈------〉寄存器〈---->缓存<----->内存。
注意一下,寄存器并不每次数据都可以从缓存中取得数据,万一不是同一个内存地址中的数据,那寄存器还必须直接绕过缓存从内存中取数据。所以并不每次都得到缓存中取数据,这就是缓存的命中率,从缓存中取就命中,不从缓存中取从内存中取,就没命中。当然关于缓存命中率又是一门学问,哪些留在缓存中,哪些不留在缓存中,都是命中的算法。

0.2 计算机总线(Bus)

主板(Mother Board)是一座城市,那么总线就像是城市里的公共汽车(bus)。总线是一种内部结构,它是cpu、内存、输入、输出设备传递信息的公用通道,主机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统。在计算机系统中,各个部件之间传送信息的公共通路叫总线,微型计算机是以总线结构来连接各个功能部件的。

计算机的总线可以划分为数据总线DB(Data Bus)、地址总线AB(Address Bus)和控制总线CB(Control Bus),分别用来传输数据、数据地址和控制信号。这三条总线也统称为系统总线

0.3计算机工作流程

先放图片,下面将结合图片说明。

虚线为分割线,虚线上方是处理部分,包括CPU,IO操作系统,软件系统;下方是输入输出系统。
其流程如下:
1、输入系统结合软件编写helloWorld.py文件
2、py文件运行:控制器发出命令,将硬盘中的文件存到Cache中,Cache中的数据在寄存器中变为二进制数据
3、ALU完成计算,将结果返回到寄存器中
4、寄存器中的数据再次返回到输出系统中,完成运行
备注:所有的数据传输都是通过总线完成的。
其工作流程图如下:

1、线程和进程

线程和进程的区别与联系
需要注意的是,在此处的线程和进程和编程语言中的API接口对应的进程/线程是有差异的,需要区别开来。

1.0 前提了解

一个最最基础的事实:
CPU(此处的CPU指的是控制器+ALU)太快,太快,太快了,寄存器仅仅能够追的上他的脚步,RAM和别的挂在各总线上的设备则难以企及。当多个任务执行时,不管谁的优先级高,在CPU看来就是轮流着来。而且因为速度差异,CPU实际的执行时间和等待执行的时间是数量级的差异。比如工作1秒钟,休息一个月。所以多个任务,轮流着来,让CPU不那么无聊,给流逝的时间增加再多一点点的意义。这些任务,在外在表现上就仿佛是同时在执行。

一个必须知道的事实:
执行一段程序代码,实现一个功能的过程之前 ,当用到CPU的时候,相关的资源必须也已经就位,就是万事俱备只欠CPU这个东风。所有这些任务都处于就绪队列,然后由操作系统的调度算法,选出某个任务,让CPU来执行。然后就是PC指针指向该任务的代码开始,由CPU开始取指令,然后执行。

1.1进程(process):

什么是进程:进程是指在系统中正在运行的一个应用程序,是系统资源分配的基本单位,在内存中有其完备的数据空间和代码空间,拥有完整的虚拟空间地址。一个进程所拥有的数据和变量只属于它自己。

为什么要有进程(程序和进程的关系):程序并不能单独执行,只有将程序加载到内存中,系统为他分配资源后才能够执行,这种执行的程序称之为进程,也就是说进程是系统进行资源分配和调度的一个独立单位,每个进程都有自己单独的地址空间。所以说程序与进程的区别在于,程序是指令的集合,是进程运行的静态描述文本,而进程则是程序在系统上顺序执行时的动态活动。
下图为一条进程:

但是进程存在着很多缺陷,主要集中在两点:
(1).进程只能在同一时间干一件事情,如果想同时干两件事或多件事情,进程就无能为力了。
(2).进程在执行的过程中如果由于某种原因阻塞了,例如等待输入,整个进程就会挂起,其他与输入无关的工作也必须等待输入结束后才能顺序执行。

为了解决上述两点缺陷,引入了线程这个概念。

1.2 线程(thread)

线程是进程内相对独立的可执行单元,所以也被称为轻量进程(lightweight processes);是操作系统进行任务调度的基本单元。它与父进程的其它线程共享该进程所拥有的全部代码空间和全局变量,但拥有独立的堆栈(即局部变量对于线程来说是私有的)。

线程是进程的一个实体,也是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,有时又被称为轻权进程或轻量级进程,相对进程而言,线程是一个更加接近于执行体的概念,进程在执行过程中拥有独立的内存单元,而线程自己基本上不拥有系统资源,也没有自己的地址空间,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),线程的改变只代表了 CPU 执行过程的改变,而没有发生进程所拥有的资源变化。除了CPU 之外,计算机内的软硬件资源的分配与线程无关,但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

1.3 进程和线程的区别与联系

联系
(1)线程和进程的关系,可以理解为线程是进程的一部分。
(2)一个进程至少拥有一个线程——主线程,也可以拥有多个线程。
线程是进程的一部分,一个线程必须有一个父进程。
(3)多个进程可以并发执行;一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。

区别
(1)系统开销:进程和线程的主要差别在于操作系统并没有将多个线程看作多个独立的应用,来实现进程的调度和管理以及资源分配。在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

(2)资源管理:进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

(3)通信方式:进程间通信主要包括管道、系统IPC(包括消息队列,信号量,共享存储)、SOCKET,具体说明参考linux进程间通信方式。进程间通信其实是指分属于不同进程的线程之间的通讯,所以进程间的通信方法同样适用于线程间的通信。但对应归于同一进程的不同线程来说,使用全局变量进行通信效率会更高。

1.4多线程和多进程

多线程和多进程
操作系统的设计,可以归结为三点:
(1)以多进程形式,允许多个任务同时运行;
(2)以多线程形式,允许单个任务分成不同的部分运行;
(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

一、什么是多线程?

(1)、多线程的概念?
  进程可以简单的理解为一个可以独立运行的程序单位。它是线程的集合,进程就是有一个或多个线程构成的,每一个线程都是进程中的一条执行路径。
  那么多线程就很容易理解:多线程就是指一个进程中同时有多个执行路径(线程)正在执行。
(2)、为什么要是用多线程?
  1.在一个程序中,有很多的操作是非常耗时的,如数据库读写操作,IO操作等,如果使用单线程,那么程序就必须等待这些操作执行完成之后才能执行其他操作。使用多线程,可以在将耗时任务放在后台继续执行的同时,同时执行其他操作。
  2.可以提高程序的效率。
  3.在一些等待的任务上,如用户输入,文件读取等,多线程就非常有用了。
  
  缺点:
  1.使用太多线程,是很耗系统资源,因为线程需要开辟内存。更多线程需要更多内存。
  2.影响系统性能,因为操作系统需要在线程之间来回切换。
  3.需要考虑线程操作对程序的影响,如线程挂起,中止等操作对程序的影响。
  4.线程使用不当会发生很多问题。
  总结:多线程是异步的,但这不代表多线程真的是几个线程是在同时进行,实际上是系统不断地在各个线程之间来回的切换(因为系统切换的速度非常的快,所以给我们在同时运行的错觉)。

二、多进程

进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。凡是用于完成操作系统的各种功能的进程就是系统进程,而所有由你启动的进程都是用户进程。
同理,多进程就是指计算机同时执行多个进程,一般是同时运行多个软件。

三、多线程与多进程,选择谁?

知乎上的一个答案:
单进程单线程:一个人在一个桌子上吃菜。
单进程多线程:多个人在同一个桌子上一起吃菜。
多进程单线程:多个人每个人在自己的桌子上吃菜。

多线程的问题是多个人同时吃一道菜的时候容易发生争抢,例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候已经被夹走菜了。。。此时就必须等一个人夹一口之后,在还给另外一个人夹菜,也就是说资源共享就会发生冲突争抢。

1。对于 Windows 系统来说,【开桌子】的开销很大,因此 Windows 鼓励大家在一个桌子上吃菜。因此 Windows 多线程学习重点是要大量面对资源争抢与同步方面的问题。

2。对于 Linux 系统来说,【开桌子】的开销很小,因此 Linux 鼓励大家尽量每个人都开自己的桌子吃菜。这带来新的问题是:坐在两张不同的桌子上,说话不方便。因此,Linux 下的学习重点大家要学习进程间通讯的方法。

2、 多核,高并发,并行

介绍完之前的东西,就该重头戏了。了解了CPU的工作原理,了解了线程、进程,下面开始介绍多核,高并发以及并行,旨在通过此次学习能够提升代码的运行效率,在有限的计算资源的情况下,充分利用计算资源,达到最高的效率。

2.1 多核

多核CPU和多CPU之间的关系

2.1.1 物理CPU多核

双核 CPU 是整合两颗物理 CPU 核心做在一个 CPU 上
四核 CPU 是整合四颗物理 CPU 核心做在一个CPU上
由此可见,多核就是整合多个物理CPU核心做在一个CPU上。

看了上图,有人会有疑问,什么是逻辑处理器。

2.1.2 逻辑处理器

内核是指物理CPU,而虚拟处理器则是通过在一枚处理器上整合两个逻辑处理器(注:是处理器而不是运算单元)单元,使得具有这种技术的新型 CPU 具有能同时执行多个线程的能力。这就是我们所说的:超线程。
超线程技术为了避免 CPU 处理资源冲突,负责处理第二个线程的那个逻辑处理器,其使用的是仅是运行第一个线程时被暂时闲置的处理单元。所以虽然采用超线程技术能同时执行多个线程,但它并不象两个真正的 CPU 那样,每各 CPU 都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗 CPU 的性能。

所以,虚拟逻辑处理器指的就是支持超线程技术的处理器,在一个单核心的 CPU 内,利用其中空闲的执行单元,模拟出另外一个核心,使整个 CPU 有两个逻辑核心,从而提高整个 CPU 的工作效率。

注意:一个核并不代表只能有一个或两个逻辑 CPU,也可以有 4 个逻辑 CPU 或者更多。两个 CPU,可能都是四核的。如果一个在设备管理器或任务管理器中显示有 4 个,另一个在设备管理器或任务管理器中显示有 8 个,则说明其中一个每个核含有两个逻辑 CPU。

2.2 并发和并行

并发和并行的理解
并发(concurrency),并行(parallellism)都是完成多任务更加有效率的方式,但还是有一些区别的。并发和并行都可以处理“多任务”,二者的主要区别在于是否是“同时进行”多个的任务。
并发性,又称共行性,是指能处理多个同时处理多个任务的能力;并行是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行,也亦是说并发事件之间不一定要同一时刻发生。

并发:交替做不同事情的能力,不同的代码块交替执行。通过CPU调度算法,让用户看上去同时执行,实际上CPU操作层面不是真正的同时。
并发的问题:并发时如果操作了公用资源,可能产生线程安全问题。线程安全:多个线程操作公用资源,有可能产生安全问题。

并行在操作系统中是指,一组程序按独立异步的速度执行,不等于时间上的重叠(同一个时刻发生)。

并行:同时做不同事情的能力,不同的代码块同时执行。多个CPU实例或多台机器同时执行一段处理逻辑,是真正的同时。

并发是指:在同一个时间段内,两个或多个程序执行,有时间上的重叠(宏观上是同时,微观上仍是顺序执行)。
并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。

2.3多线程和并发的关系

2.多线程与高并发的联系。
  高并发:高并发指的是是一种系统运行过程中遇到的一种“短时间内遇到大量操作请求”的情况,主要发生在web系统集中大量访问或者socket端口集中性收到大量请求(例如:12306的抢票情况;天猫双十一活动)。该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求,数据库的操作等。如果高并发处理不好,不仅仅降低了用户的体验度(请求响应时间过长),同时可能导致系统宕机,严重的甚至导致OOM异常,系统停止工作等。如果要想系统能够适应高并发状态,则需要从各个方面进行系统优化,包括,硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化……。

而多线程只是在同/异步角度上解决高并发问题的其中的一个方法手段,是在同一时刻利用计算机闲置资源的一种方式。
  多线程在高并发问题中的作用就是充分利用计算机资源,使计算机的资源在每一时刻都能达到最大的利用率,不至于浪费计算机资源使其闲置。
  可能会有人疑问,既然并发是同一块cpu处理不同的事情,那么并发还能提升处理效率么?答案是肯定的。上文我们讲到,cpu具有强大的计算能力,它在任务之间的切换可以快到我们无法察觉,这样并发就能提升计算效率了。

同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。是一种线性执行的方式,执行的流程不能跨越。一般用于流程性比较强的程序,比如用户登录,需要对用户验证完成后才能登录系统。
异步则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。是一种并行处理的方式,不必等待一个程序执行完,可以执行其它的任务,比如页面数据加载过程,不需要等所有数据获取后再显示页面。
他们的区别就在于一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式,比如日志记录就可以使用异步方式进行保存。

2.4 多线程和并行之前的关系

(1)如果是单核多线程,那么多线程之间就不是并行,而是并发,在这种情况下多线程和并行之间毫无关系。
在上述情况下,为了均衡负载,cpu调度器会不断的在单核上切换不同的线程执行,但是我们说过,一个核只能运行一个线程,所以并发虽然让我们看起来不同线程之间的任务是并行执行的,但是实际上却由于增加了线程切换的开销使得代价更大了。

(2)如果是多核多线程,且计算机中的总的线程数量小于等于核数,那线程就可以并行运算在不同的核中。

(3)如果是多核多线程,且线程数量大于核数,其中有些线程就会不断切换,并发执行,但实际上最大的并行数量还是当前这个进程中的核的数量,所以盲目增加线程数不仅不会让你的程序更快,反而会给你的程序增加额外的开销。

3 如何做并发、并行编程,提高代码的运行效率

3.1并发编程

并发一定能提升效率么
并发并不一定能提升效率。因为一个核只能运行一个线程,所以并发虽然让我们看起来不同线程之间的任务是并行执行的,但是实际上却由于增加了线程切换的开销使得代价更大了。

那么什么任务下可以通过并发来提升计算效率呢?
对于I/O密集型任务,是可以在这样的系统中使用多线程的,因为在I/O等待的过程中,CPU是空闲的,其他的线程依然可以使用CPU来处理问题。

什么任务下不需要通过并发来提升计算效率呢?
当程序是计算密集型任务时,多线程的效果并不明显甚至不如单线程,因为创建线程本身就需要花时间,而这个时间可以计算许多的数字,因为计算数字对于CPU来讲完全是小儿科。

任务可以分为计算密集型和IO密集型。
假设我们现在使用一个进程来完成这个任务,对计算密集型任务(例如在一个大数组中求最大值,最小值,平均值),可以使用【核心数】个线程,就可以占满cpu资源,进而可以充分利用cpu,如果再多,就会造成额外的开销;
对于IO密集型任务(涉及到网络、磁盘IO的任务都是IO密集型任务),线程由于被IO阻塞,如果仍然用【核心数】个线程,cpu是跑不满的,于是可以使用更多个线程来提高cpu使用率。

3.2并行计算

并行计算一般可以提升计算效率。但盲目的并行计算也不一定能提升效率。

实现并行计算有三种方式,多线程,多进程,多进程+多线程。

使用并行计算需要注意的几个问题:
(1)当用多线程从一个公用硬盘I/O中读取大量的数据时,希望已此方式来提升I/O读取的性能,基本上很难(除非是SSD硬盘可以考虑),因为硬盘I/O本身就是硬件中最慢的设备,并行的效果只会导致更多的争用。

(2)当然若果发现做完I/O读操作后,处理数据的时间占比较大,这个时间浪费了不值得,因此有的小伙伴可能会说,可以将文件分解为多个片段,多个线程分开读取每个片段,不过这需要磁盘的IOPS能力足够强才行,要知道普通的机械磁盘是串行的。另外,需要考虑这个文件是否足够大,需要我们去分段。

(3)CPU 是多核时是支持多个线程同时执行。但在 Python 中,无论是单核还是多核,一个进程同时只能由一个线程在执行。其根源是 GIL 的存在。GIL 的全称是 Global Interpreter Lock(全局解释器锁),来源是 Python 设计之初的考虑,为了数据安全所做的决定。某个线程想要执行,必须先拿到 GIL,我们可以把 GIL 看作是“通行证”,并且在一个 Python 进程中,GIL 只有一个。拿不到通行证的线程,就不允许进入 CPU 执行。所以多线程在python中很鸡肋。

CPU,多核,多线程,并发,并行,计算效率相关推荐

  1. 多CPU/多核/多进程/多线程/并发/并行之间的关系

    多CPU,多核,多进程,多线程 当面临这些问题的时候,有两个关键词无法绕开,那就是并行和并发. 首先,要先了解几个概念: 1.进程是程序的一次执行. 2.进程是资源分配的基本单位(调度单位). 3.一 ...

  2. php100并发cpu告警,多线程并发导致CPU100%的一种原因和解决办法

    在用自定义线程池的时候,遇到cpu100%,经过验证后,发现问题来源于我定义的子线程. 子线程的主要功能是从任务队列(LinkedBlockingQueue)里面持续拿出任务,并且执行. 以下为令CP ...

  3. 多CPU 多核CPU | 多进程 多线程 | 并行 并发

    文章目录 区分 多CPU && 多核CPU CPU缓存 并行 && 并发 多CPU && 多核CPU | 多进程 && 多线程 | 并行 ...

  4. 浅谈多核CPU、多线程与并行计算

    浅谈多核CPU.多线程与并行计算 xiaofei0859 2017-05-09 17:07:11  3646  收藏 展开 0.前言 笔者用过MPI和C#线程池,参加过比赛,有所感受,将近一年来,对多 ...

  5. 一则故事表达:并发,并行,同步,异步,线程,多线程

    一个小事件说明下并发,并行,同步,异步,线程,多线程 一个广交会举办向8间公司发起展览邀请, 参展公司有8间,场地有80万平方米的展示区域, 每个参展商有10万平方米可以用于展出售卖, 每个参展公司仅 ...

  6. 单核cpu多核cpu如何执行多线程

    花了很多时间来整理这方面的相关内容,参考博客:多CPU,多核,多进程,多线程 程序和进程 程序: 为完成特定任务,用某种语言编写的一组指令集合,即一段静态的代码 进程: 是程序的一次执行过程,或是正在 ...

  7. 多核cpu与多线程理解

    计算机cpu与多线程 进程和线程: 进程包含线程,一个进程中包含多个线程. 线程是cpu调度和分配的基本单位,进程是操作系统进行资源分配(cpu,内存,硬盘io等)的最小单位. 单核cpu: 实现多进 ...

  8. 多线程并发和并行的区别

    背景  对于java开发从业人员来说,并发编程是绕不开的话题,juc并发包下提供了一系列多线程场景解决方案.  随着jdk1.8的普及,多线程处理问题,除了使用使用线程池(ExecutorServic ...

  9. 进程线程、同步异步、阻塞非阻塞、并发并行、多线程

    一: 进程和线程 1: 进程(Process) 是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程.线 ...

  10. 多线程、并发/并行、自定义线程类、线程安全、守护线程、定时器、线程状态、线程池

    目录 进程和线程: 进程: 线程: 多线程的好处: 线程调度: 分时调度: 抢占式调度: 并发与并行: 线程的生命周期: 实现线程的两种基本方式(还有第三种): 创建Thread线程类: 创建Runn ...

最新文章

  1. android加载时二级联动点击二级联动,Android实现联动下拉框二级地市联动下拉框功能...
  2. Python全栈 MongoDB 数据库(数据的修改)
  3. JSON数据格式解析库(cJSON、Jansson)的使用在STM32上移植和使用
  4. 对List集合中的元素进行排序
  5. python文本数据处理_python 数据处理 对txt文件进行数据处理
  6. 在ubuntu下使用搜狗的教育网代理
  7. Retrofit + RxJava + OkHttp 让网络请求变的简单-基础篇
  8. Ubuntu 12.04 下安装 Eclipse
  9. 企业微信邮箱登录入口在哪里?
  10. html控制word打印在一张页面,HTML文件到WORD文档双面打印三步曲
  11. c语言if语句作用及应用场景,c语言if语句如何使用
  12. “不仅仅是土豆”精神
  13. 如何制作内网web服务器,内网搭建WEB服务器教程
  14. 20190919-5 代码规范
  15. Babel 是干什么的
  16. 2021-03-04 mysql in里加个参数就查不到??是JSON_EXTRACT导致的,用JSON_UNQUOTE()去掉双引号就正常了
  17. 怎么理解幂等性[或者http幂等性]
  18. Face Attention Network: An Effective Face Detector for the Occluded Faces
  19. 怎样提升工单管理效率?
  20. 什么是A、NS、别名、MS记录

热门文章

  1. 用 Python 写脚本发送工作周报
  2. mysql 查询条件之外的数据_mysql 查询符合条件的数据
  3. Windows XP 超强syskey命令
  4. 看漫画MHGmhgui,Python爬虫之神奇的eval,附赠一个压缩模块
  5. *.py,*.pyc,*pyo
  6. 屏幕边框闪光_边缘闪光助手下载-屏幕边缘闪光工具1.0 最新版-东坡下载
  7. php实现解析二维码内容
  8. 荐剧:如果你是柯南迷,这部剧场版一定要再看看
  9. macos中homebrew下载更新太慢的解决
  10. 遇到问题:从采购申请 复制 建立分类的采购订单的时候, 报错: 采购申请未批准。