图1 多线程配合工作
(https://baijiahao.baidu.com/s?id=1663040868828329048&wfr=spider&for=pc)
几乎所有现代操作系统都允许一个进程包含多个线程。每个线程是 CPU 使用的一个基本单元,它包括线程 ID、程序计数器、寄存器组和堆栈。
进程与同一进程的其他线程共享代码段、数据段和其他操作系统资源,如打开文件和信号。每个传统或重量级进程只有单个控制线程。如果一个进程具有多个控制线程,那么它能同时执行多个任务。
如下图2,CPU正在运行201个进程和2488个线程,平均每个进程将任务分配给12-13个线程处理,相比于单线程大大提高工作处理速度。
图2 (截屏自本人电脑)
二、为什么使用线程
现代计算机运行的大多数应用软件都是多线程的。一个应用程序通常作为具有多个控制线程的一个进程来实现。
2.1分配任务,合作共赢
例如,一个 Web 浏览器可能有一个线程来显示图像和文本,另一个线程从网络接收数据。一个字处理器可能有一个线程用于显示图形,另一个线程用于响应用户的键盘输入,还有一个线程在后台进行拼写和语法检查。应用程序也可以设计成利用多核系统的处理能力。这些应用程序可以在多处理核上并行执行多个 CPU 密集型的任务。
例如图3,在Google Chrome观看视频时,Google Chrome进程创建十几个线程,但各线程占有的不同资源却不尽相同。
第一个线程处理了进程中全部网络连接任务;
第三个线程处理了进程中全部图形显示任务;
倒数第四个线程则承担大部分计算处理任务;
其他线程则分担此进程文件读写等繁杂但必须执行的任务(通俗地说就是干杂活)。
值得注意的是,搜狗输入法本应该是搜狗软件创造的线程,却出现在Google Chrome进程中,体现了由不同进程创造的线程之间也可以相互合作。
图3多线程分担不同任务图5(截屏自本人电脑)
线程之间合作:线程在远程过程调用(RPC)系统中,也起着至关重要的作用。RPC 通过提供一种类似于普通函数或子程序调用的通信机制,以允许进程间通信。通常,RPC 服务器是多线程的。当一个服务器收到消息时,它使用一个单独线程来处理消息。这允许服务器处理多个并发请求。
最后,大多数的操作系统内核现在都是多线程的。多个线程在内核中运行,每个线程执行一个特定任务,如管理设备、管理内存或处理中断。例如,Solaris 有一组内核线程以处理中断,Linux 采用一个内核线程以便管理系统空闲内存的数量。
2.2 快速处理高负荷任务
当我们处理一个高负荷的任务(如观看高码率视频),如果让主线程执行这个任务,它会等到动作完成,才继续后面的代码。在这段时间之内,主线程处于“忙碌”状态,也就是无法执行任何其他功能。体现在界面上就是,用户的界面完全“卡死” 。
图4显示,当打开一个负荷较大的任务时,相比于图3,计算机短时间内虽然只增加12个进程,但线程却增加301个。说明对繁重任务使用多线程分担工作量可在短时内解决问题并为其他任务快速腾出资源,保证计算机整体上高效率工作。
图4(截屏自本人电脑)
在WPS中输入文字,程序自动保存,但并没有出现卡顿,这是因为CPU在执行多线程的时候采用时间分片,由于CPU切换非常快才感觉不到卡,其实某一个时间点上CPU只会执行一个线程,这种多个线程切换执行就叫做并发,如图5: