多线程漫谈
Posted 码砖杂役
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程漫谈相关的知识,希望对你有一定的参考价值。
什么是多线程
线程是程序执行流的最小单元,也称为轻量级的进程。
一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成,线程是进程中的一个实体,是被系统独立调度和分派的基本单位。
多线程技术实现了多个执行流并发执行的效果。
你可以把新建一个线程理解为一个婴儿诞生,也可以理解为新招聘一个工人,新生的婴儿或者新招的工人,都有独立的行为(执行流)。
什么是执行流
执行流就是指令执行序列。计算机IP寄存器保存下一条要执行的指令,执行完该指令,IP寄存器会更新为下一条要执行的指令,程序执行过程中,IP寄存器会不停的更新指令,IP寄存器中的指令序列形成了程序的执行轨迹,该执行轨迹就叫执行流。
以c语言的入门程序为例:
int main()
{
printf("hello world\n");
return 0;
}
执行该程序,main是入口,进来之后,调用printf往屏幕打印输出"hello world",然后返回0,程序正常退出。从main函数到printf,再返回main函数,最后正常退出,这个执行过程,就是一个执行流。
进程和线程
线程比进程更轻量级,操作系统调度的单位是线程。
并发和并行
并发(Concurrency)是指多个执行流交错执行。注意:单cpu上执行的多线程可以是并发的,却不能是并行的,所以多线程不受限于cpu数量,单cpu机器也可以运行多线程程序。
并行(Parallellism)是指多个执行流同时执行。必须是时间上的同时,在同一时间点,两个执行流同时执行,齐头并进,所以单cpu机器上执行的程序不能并行。
多线程和CPU的关系
多线程能够利用多cpu多核的优势,提升计算能力。
单cpu依然能够运行多线程程序,且单cpu也有可能通过多线程设计获得性能提升。多线程不受限于cpu数量。
如果多线程程序运行在多cpu多核机器上,那它将真正的并行执行。如果运行在单cpu上,那它将交错执行,从逻辑上来看,他们都是并发执行的。
举一个例子,比如一个人负责做2个菜,蒸排骨和水煮鱼。
方法一,分成3个任务,先洗(排骨和鱼),再切(排骨和鱼),最后做(蒸肉和煮鱼),依次完成,这样的话,做2个菜花费的时间等于洗、切、煮的时间累加。
方法二,先洗排骨,然后切排骨,最后蒸排骨,在蒸排骨的同时,洗鱼和切鱼,最后煮鱼。
虽然只有一个人(相当于一个cpu),但是方法二利用蒸排骨的时间间隙,去洗鱼切鱼,节省了时间。
洗、切、煮,都是一个个任务(执行流),但是一个task不一定要做完,进行中可以切换到另一个任务,比如洗完排骨(还没洗鱼),便可以切换去切鱼,这就是任务切换(context swap),几个任务交错执行,充分利用人,节省了时间,提高了效率。
做菜的例子主要是因为蒸排骨比较费时间,而人不必一直等着,可以去做别的,对应到程序上,如果执行到一个慢速调用或者被阻塞,则cpu可以切换到另一个任务,继续执行,这样便能更好的利用cpu。
当然,如果有几个人(多cpu)一起做菜,可以更快做完2个菜,因为可以分开洗排骨洗鱼,做到真正并行。
多CPU、多核、超线程
多cpu对应多个cpu插槽(socket),这个比较容易理解。
一个cpu上可以集成多个计算核心(Core),一般是双数,比如4核、8核。
而超线程(Hyper Threading简称HT)是intel首先提出来的技术,利用特殊硬件指令,把一个物理内核模拟成两个逻辑内核,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高了CPU的运行速度。
从软件的观点来看,不管多cpu、还是多核、还是超线程,对于程序来说,只有逻辑cpu,这是一种软件抽象,所以程序并不关心硬件上的差异。比如一台计算机有2个cpu,每个cpu 4核,支持超线程,那就是2*4*2=16个逻辑cpu。
操作系统会给应用程序提供16个逻辑cpu的抽象,应用程序最多可以有16个执行流并行。
未完待续
后面会讲用户态-内核态、同步、锁、死锁、原子操作、生产者消费者模式,actor模式,消息机制等等。
以上是关于多线程漫谈的主要内容,如果未能解决你的问题,请参考以下文章