CPU核、多线程、多进程

在1945年,美国科学家冯诺依曼,提出了冯诺依曼计算机结构,计算机主要由运算器、控制器、存储器、输入输出设备组成。这一理论一直延续至今,并且构成所有现代电子计算机的模板。简单的将这些术语翻译成我们日常听到的就是:

  • CPU

  • 操作系统

  • 硬盘

  • 鼠标、键盘、显示器等

CPU这个中央大脑负责对传进来的数据进行复杂的逻辑判断和运算,当然不是所有的数据都需要经过CPU的,比如DMA(Direct Memory Access,直接存储器访问),可以协调不同硬件对数据的读写,不需要经过CPU计算。这样设计的理由主要是CPU这个老大哥算的非常快,而一般涉及到I/O(输入、输出)时,让CPU等待程序读好数据,就会浪费资源,这时候我们可以把IO操作交给DMA去做,然后让CPU负责其他的计算。其中最经典的两个例子就是:

  • 序列比对

  • 网络爬虫

序列比对这种程序,一般涉及到的是大量的科学运算,和少量的文件读取;因此占有CPU的时间很长

网络爬虫,这个程序会不断的爬取网上的数据,然后将数据写进磁盘中;涉及到的计算量不是很大;主要是对页面进行请求后,将数据写入磁盘中,I/O占主要

CPU核心

CPU核的概念有有两个:物理核心、逻辑核心

物理核心

这个是CPU中集成了多少个核,是真实存在的,在linux中可以通过查看/proc/cpuinfo文件看到你的CPU有多少个核

processor       : 2
vendor_id       : GenuineIntel
cpu family      : 6
model           : 62
model name      : Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.60GHz
stepping        : 4
microcode       : 0x428
cpu MHz         : 2900.244
cache size      : 15360 KB
physical id     : 0
siblings        : 6
core id         : 2
cpu cores       : 6   ##CPU核心数目

逻辑核

通过使用超线程技术,将物理核虚拟成多个虚拟的处理单元,增加CPU处理多个任务的能力。例如我们在买电脑的时候,一般看i5、i7、i9;其实还可以根据CPU型号看一下它的核心数和运行频率等指标

进程与线程的关系

进程类似的就是两个程序的运行

这两个程序互相不会干扰;而线程就是进程中运行一系列子功能。

例如当你打开电脑上的QQ和QQ音乐时,你就创建了两个进程;这时候这两个进程占据了CPU的两个核;当你的CPU是单核的时候,QQ音乐与QQ无法各自占据一个核,这时候操作系统就会想办法,让QQ占据一会核,让QQ音乐占据一会核,这就是所谓的进程调度;这么理解的话,当你CPU的核越多时候,电脑也就能同时远程的程序也就越多。

线程相当于进程中的一个操作

例如打开QQ音乐的时候,一边播放歌曲、一边下载歌曲。其实它是在放一会歌,又跑去下载歌曲;下了一会又跑过来给你放歌,只是你感觉不出来。

QQ一边接受别人的消息,一边给其他人发送消息。

总的来说进程的切换,是在CPU核水平,把CPU资源分配;线程的切换是在CPU核内,把CPU资源进行分配

高性能计算

  • 窜行

    多个任务,任务A完成后才开始任务B

  • 并行

    多个任务,任务A与任务B同时进行

  • 并发

    单个任务A,任务A里面要干很多事情,但是一会干B事情,一会干C事情,两件事情在CPU中来来回回切换,让你感觉这些事情是同时在进行的

LSF集群资源申请

在大多数时候,软件参数内写的都是--threads,多少个线程的意思;而我们向系统申请资源的时候,申请的是核心数。因为一个核心其实是可以开多个threads的,只是当多个thread占据一个核心的时候,这个核心就要来来回回切换线程,这个核心进行的是并发运算;而核心数和线程数一样的话,进行的就是并行运算啦。

总的来说就是,当系统资源不多,并且涉及到的I/O操作比较多的时候;申请的核心数可以比线程数少;

而当程序主要是科学运算的话,尽量让申请的核心数和程序中线程数一致,因为线程间切换也会消耗一定的时间

参考

Last updated