首页> 常识>

线程是什么有什么用(计算机为什么使用线程?)

时间:2024-08-13 14:45:10

一、基本的进程和线程概念


进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位,比如我们windows电脑上运行的一个程序就是一个进程。在传统进程中进程是资源分配和调度的一个基本单位,简而言之所有的活按部就班地干。

单线程处理(自绘):

在后来引入线程概念后,进程就变成了资源分配的基本单位但不是调度的基本单位。进程是一个可拥有资源的独立单位;
线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。如同公司将创建各个部门,每个部门各司其职的同时也需要协作完成的任务;

多线程处理(自绘):

每个进程至少包含一个线程,线程是CPU调度和执行的基本单位,WPS中可以一边接收文字输入、一边自动保存,这时会有两个进程,如图1

图1 多线程配合工作

(https://static1.haohuo.net/uploads/images/2172443/2172443_tuxing.html >几乎所有现代操作系统都允许一个进程包含多个线程。每个线程是 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:

图5

(https://static1.haohuo.net/uploads/images/2172443/2172443_tuxing.html powered-by="xiumi.us" >

三、线程的优点


多线程编程具有如下四大类的优点:

1、响应性:如果一个交互程序采用多线程,那么即使部分阻塞或者执行冗长操作,它仍可以继续执行,从而增加对用户的响应程度。这对于用户界面设计尤其有用。例如,当用户点击一个按钮以便执行一个耗时操作时,想一想会发生什么事。一个单线程应用程序对用户反应会迟钝,直到该操作完成。与之相反,如果耗时操作在一个单独线程内执行,那么应用程序仍可响应用户。

2、资源共享:进程只能通过如共享内存和消息传递之类的技术共享资源。这些技术应由程序员显式地安排。不过,线程默认共享它们所属进程的内存和资源。代码和数据共享的优点是:它允许一个应用程序在同一地址空间内有多个不同活动线程。

如图6,Google Chrome进程中存在十几个线程,尽管多数线程在CPU、GPU、网络等资源上无事可做,但各线程都占有了一部分内存,通过共享资源为占有CPU、GPU、网络资源的线程提供辅助,以减少主要线程的负担。

图6

3、经济:进程创建所需的内存和资源分配非常昂贵。由于线程能够共享它们所属进程的资源,所以创建和切换线程更加经济。虽然进程创建和管理与线程创建和管理的开销差异的实际测量较为困难,但是前者通常要比后者花费更多时间。例如,对于 Solaris,进程创建要比线程创建慢 30 倍,而且进程切换要比线程切换慢 5 倍。

图7

(https://static1.haohuo.net/uploads/images/2172443/2172443_pp >4、可伸缩性:对于多处理器体系结构,多线程的优点更大,因为线程可在多处理核上并行运行。不管有多少可用 CPU,单线程进程只能运行在一个 CPU 上。