1.什么是线程?
线程其实就是轻量级进程(LWP)。
轻量级进程(Light Weight Process)是指在操作系统级别上,将一个进程划分为多个执行单元,每个执行单元拥有自己的堆栈、程序计数器和资源使用情况,但共享同一进程的地址空间和文件描述符等资源。这些执行单元通常被称为线程(Thread)或者轻量级进程。
轻量级进程特点:
-
与传统的进程相比,轻量级进程的创建、切换和销毁都更为高效,占用的系统资源也较少。
-
轻量级进程提供了一种并发执行的机制,使得多个任务可以在同一个进程中并行执行。
-
不同线程之间可以通过共享内存等机制进行通信和同步,而无需通过进程间通信(IPC)的方式。这使得线程间的数据共享更加方便快捷,并且避免了进程间切换的开销。
-
轻量级进程在多核处理器上能够充分利用并发执行的优势,提高系统的吞吐能力。由于创建和销毁线程的开销相对较小,因此在需要频繁创建销毁线程的场景下,使用轻量级进程可以显著提升系统性能。
-
由于线程共享进程的地址空间,因此需要注意线程之间的数据竞争和同步问题。同时,多个线程之间的调度可能引发资源竞争、死锁等并发编程问题。因此,在设计和实现使用轻量级进程的应用程序时,需要充分考虑线程安全和并发控制的问题,以确保程序的正确性和稳定性。
2.线程实现原理
Linux线程的实现主要是通过引入线程组概念来实现。
-
Linux线程组(Linux thread group)是一种进程内的线程组织方式,它们在内核中以一种特殊的方式进行管理。线程组由一个或多个线程组成,这些线程共享相同的进程资源,如虚拟地址空间、文件描述符和信号处理器。
-
在Linux中,每个进程都有一个主线程,也就是创建该进程的线程。当创建新的线程时,它们将与主线程一起组成一个线程组。线程组中的每个线程都有一个唯一的线程ID(TID),而线程组本身有一个线程组ID(TGID),该ID与主线程的TID相同。
2.1 多进程模型
每个进程都有独立的地址空间,文件表,信号表等资源。
2.2 多线程模型
线程是轻量级的进程,线程组把多个线程分成一组,首进程为主线程。
-
主线程有独立的地址空间,文件表,信号表等资源,线程组内其他线程共享主线程地址空间,文件表,信号表等资源。
-
tgid表示进程ID,pid表示线程ID。主线程tgid等于pid,其他线程tgid等于主线程tgid。
2.3 查看进程组信息
执行ps -eLf命令查看进程ID,线程ID,线程组线程数量。
PID:进程ID(tgid:线程组ID)。
LWP:线程ID(pid)。
NLWP:线程组线程数量。
3.有了多进程,还要实现多线程?
实现多线程的目的是为了更为高效的利用CPU。
-
多线程由于共享内存地址空间,相对于多进程会有更多优势:
-
线程创建和终止的成本降低。
-
线程切换成本降低。
-
线程通信成本降低。
4.线程VS进程
-
进程:资源分配最小单位。
-
线程:系统调度最小单位。
5.多线程缺点
人无完人,多线程也不完美,多线程编程存在以下缺点:
-
安全性差:线程之间相互耦合,一个线程出问题会影响其他线程。
-
竞态条件:多线程访问共享资源时,如果没有合适的同步机制,很容易出错。
-
死锁:多个线程同时持有一些资源,并试图获取其他线程占用的资源时,可能会出现死锁问题。
-
编程难度大:多线程编程要考虑线程同步和互斥问题,要考虑负载均衡问题,编程难度很大。
-
调试困难:由于多线程的执行是并发和随机的,当程序出现问题时,调试起来可能比单线程更加困难。