在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有多少个核
1 | processor : 2 |
逻辑核
通过使用超线程技术,将物理核虚拟成多个虚拟的处理单元,增加CPU处理多个任务的能力。例如我们在买电脑的时候,一般看i5、i7、i9;其实还可以根据CPU型号看一下它的核心数和运行频率等指标
进程与线程的关系
进程类似的就是两个程序的运行
这两个程序互相不会干扰;而线程就是进程中进行运算的基本单位。
例如当你打开电脑上的QQ和QQ音乐时,你就创建了两个进程;这时候这两个进程占据了CPU的两个核。当你的CPU是单核的时候,QQ音乐与QQ无法各自占据一个核,这时候操作系统就会想办法,让QQ占据一会核,让QQ音乐占据一会核,这就是所谓的进程调度。
当你CPU的核越多时候,电脑也就能同时远程的程序也就越多。
例如下面开启了四个进程A、B、C、D;右边的图是在单核的情况下,四个进程交替的占据CPU时间,实现并行的计算
线程相当于进程中基本运算单位
例如
- 打开QQ音乐的时候,一边播放歌曲、一边下载歌曲
- QQ一边接受别人的消息,一边给其他人发送消息
其实它是在放一会歌,又跑去下载歌曲;下了一会又跑过来给你放歌,只是你感觉不出来。
下图是多个线程占据一个进程的示意图,同样在某一时刻,也仅仅只能有一个线程能够使用进程中的资源
总的来说进程的切换,是在CPU核水平,把CPU资源分配;线程的切换是在进程内,对资源进行切换
一个进程占据一个核,一个核执行多个进程时,涉及进程的切换
一个线程占据一个进程,一个进程内部多个线程时,涉及线程的切换
进程、线程状态的切换
- 就绪状态(ready):等待被调度
- 运行状态(running)
- 阻塞状态(waiting):等待资源
需要注意的是
- 只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得 CPU 时间,转为运行状态;而运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度。
- 阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括 CPU 时间,缺少 CPU 时间会从运行态转换为就绪态
高性能计算
并行,多个进程间切换
多个任务,任务A与任务B同时进行;A任务对应的进程和B任务占据的进程各占一个核
并发,多个线程间切换
单个任务A,任务A里面要干很多事情,但是一会干B事情,一会干C事情,两件事情在CPU中来来回回切换,让你感觉这些事情是同时在进行的
LSF集群资源申请
在大多数时候,软件参数内写的都是--threads
,多少个线程的意思;而我们向系统申请资源的时候,申请的是核心数。因为一个核心其实是可以开多个threads
的,只是当多个thread
占据一个核心的时候,这个核心就要来来回回切换线程,这个核心进行的是并发运算;而核心数和线程数一样的话,进行的就是并行运算啦。
总的来说就是,当系统资源不多,并且涉及到的I/O操作比较多的时候;申请的核心数可以比线程数少;
而当程序主要是科学运算的话,尽量让申请的核心数和程序中线程数一致,因为线程间切换也会消耗一定的时间