# 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有多少个核

```bash
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操作比较多的时候；申请的核心数可以比线程数少；

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

## 参考

1. [高性能计算](https://blog.csdn.net/zhengyshan/article/details/80641770?tdsourcetag=s_pctim_aiomsg)
2. [计算机操作系统](https://zhuanlan.zhihu.com/p/110435826)
3. [百度百科](https://baike.baidu.com/item/%E5%86%AF%C2%B7%E8%AF%BA%E4%BE%9D%E6%9B%BC%E7%BB%93%E6%9E%84%E8%AE%A1%E7%AE%97%E6%9C%BA)
