分类: LINUX
2018-12-09 17:18:07
一、介绍:
选自:认识cpu、核与线程
1、物理核:物理核数量=cpu数(机子上装的cpu的数量)*每个cpu的核心数
2、逻辑核:所谓的4核8线程,4核指的是物理核心。通过超线程技术,用一个物理核模拟两个虚拟核,每个核两个线程,总数为8线程。在操作系统看来是8个核,但是实际上是4个物理核。
通过超线程技术可以实现单个物理核实现线程级并行计算,但是比不上性能两个物理核。---超线程技术实现了单个物理核心同时两个线程,也就是别人常说的虚拟内核数。比如单物理核心实现的双线程,它同时可以处理两个线程,它的物理核心数其实是是1个,通过Hyperthreading技术实现的线程级并行(Thread Lever Parallelism)。
点击(此处)折叠或打开
3、进程是操作系统进行资源(包括cpu、内存、磁盘IO等)分配的最小单位。
4、线程是cpu调度和分配的基本单位。即,多进程中每个进程有自己的地址空间,而同一进程的多线程则共享地址空间。
二、绑定
对于普通的应用,操作系统的默认调度机制是没有问题的。但是,当某个进程需要较高的运行效率时,就有必要考虑将其绑定到单独的核上运行,以减小由于在不同的核上调度造成的开销。把某个进程/线程绑定到特定的cpu核上后,该进程就会一直在此核上运行,不会再被操作系统调度到其他核上。但绑定的这个核上还是可能会被调度运行其他应用程序的。
可以使用多种方法把进程/线程指定到特定的cpu核上运行。见网络。
三、查看:
1、 Linux下查看CPU相关信息
…
2、 Linux查看某个进程运行在哪个逻辑核上
...
3、 Linux查看某个线程运行在哪个逻辑核上
…
四、有趣的问题
单核单线程的CPU中,当一个空的死循环使CPU达到100%时,CPU还能做其它事嘛?如:输入或者run另一个进程。于是,我在一个单物理核单逻辑核的CPU上,测试各种死循环:
0、环境信息:
点击(此处)折叠或打开
点击(此处)折叠或打开
---空的死循环(即在循环中没有调用sleep()或者阻塞函数[阻塞函数]),并未占尽所有时间片,Linux操作系统还是会按时间片轮转执行其他进程的线程,只不过它线程得到操作系统切换过去执行的可能性极低。相反需要知道,进程在sleep()或阻塞的时候是不占用CPU的时间的。
2、调用函数
2.1、printf()点击(此处)折叠或打开
---由于串口不停的在打印,所以导致串口很难响应任何串口输入,但疯狂敲击串口也能输入,因而看起来很卡。相反,当改为./while.out > /dev/null执行时,串口正常。
2.2、system()
点击(此处)折叠或打开
[CPU: 18.0%左右 usr 75.5%左右 sys 0.0% idle][ 高概率R(偶尔会S) 18%左右 ./while1.out 111]
(即CPU占用率100%)。
串口流畅,但进程很难被Ctrl+c掉。
---虽然用户态进程CPU占用率低,但是由于此处调用了” 写文件“导致sys内核态执行占用了大量CPU时间,而导致整体CPU占用率100%。正因为此,系统虽能及时响应串口,却很难响应串口输入Ctrl+c。
3、调用sleep()
点击(此处)折叠或打开
3.1、Sleep(1)
[CPU: 0.0%左右 usr 0.0%左右sys 90.%左右 idle][S 0.0% ./while1.out 1]
3.2、Sleep(0)
[CPU: 0.3%左右 usr 0.7%左右 sys 95 %左右idle][高概率R(偶尔会S) 0.0% ./while1.out 0]
注意,以上程序是前台执行:./while1.out,而改为后台执行:./while1.out &结果也是一样的。
综上,即使是在单核单线程CPU中,当进程中一个空的死循环使CPU达到100%时,也不会导致别的进程完全得不到时间运行,如此时串口也是可以正常输入的,这是因为Linux操作系统按时间片轮转执行。