进程(Process):
- 一个程序在执行时,操作系统为其分配的资源(如内存、CPU 时间等)构成了一个进程。
- 每个进程都有自己的独立的地址空间、堆栈和局部变量,它们之间不共享内存(除非通过特定的机制,比如共享内存或管道等)。
- 进程之间是隔离的,一个进程的崩溃通常不会影响到其他进程。
线程(Thread):
- 线程是进程中的执行单元,也叫做轻量级进程。一个进程至少有一个主线程(通常是程序启动时自动创建的),它也可以创建多个子线程来执行不同的任务。
- 线程之间共享同一个进程的地址空间和资源(如全局变量、打开的文件描述符等),但是每个线程都有自己的栈空间和程序计数器。
- 线程的创建和销毁比进程要轻量得多,因为它们共享父进程的资源,不需要独立的内存空间。
主线程(Main thread):
- 在程序启动时,操作系统会为程序创建一个主线程,也就是程序的入口点。
- 主线程通常负责启动程序的主要逻辑,在大多数程序中,主线程会处理用户输入、程序控制流等。
子线程(Child thread):
- 子线程是在程序运行过程中,由主线程或其他线程创建的线程。它们负责执行某些并行任务或辅助任务,以提高程序的效率。
例如,主线程可能负责UI渲染,而子线程则负责后台计算或处理I/O操作。 - 子线程通常在执行完它们的任务后结束,可以通过线程的join()方法或其他同步机制来等待子线程结束,确保程序的正确性。
单核CPU:
- 单核CPU一次只能运行一个线程。尽管操作系统支持多线程,但它会使用时间片轮转的方式,在不同线程之间快速切换,让用户感觉到多个线程是同时执行的。实际上,这些线程是按顺序轮流执行的。
多核CPU:
- 多核CPU能够同时运行多个线程,每个核心可以运行一个线程。因此,在多核处理器上,如果程序能够有效地利用多个线程(比如多线程计算任务),就能实现更高的并行度和更好的性能。
线程的执行与独立性
-
每个线程都有自己的 程序计数器(Program Counter,PC),用于记录当前执行指令的地址,确保线程能按照正确的顺序执行。
-
每个线程都有自己的 寄存器 和 堆栈,它们存储的是与该线程执行相关的数据(如局部变量、函数调用信息等)。
-
不同的线程可以共享进程中的资源,例如全局变量、打开的文件、内存空间等。
-
然而,线程间的共享资源也带来了潜在的竞争问题。当多个线程同时访问同一资源时,如果不加以控制,可能会导致数据竞争(Race Condition)或不一致的状态。因此,线程间常常需要通过 同步机制(如互斥锁、信号量、条件变量等)来保证共享资源的正确访问。
多线程编程中的挑战
- 同步与互斥:多个线程访问共享数据时,需要进行同步操作,避免数据竞争和不一致。
- 死锁:如果多个线程互相等待对方释放资源,可能会导致程序永远无法继续执行。设计时要避免死锁的发生。
- 上下文切换:操作系统在多个线程间进行切换时,会保存和恢复线程的状态。频繁的上下文切换会带来性能损失,因此需要合理设计线程的使用。
如果主线程需要其他功能的辅助时,此时可以创建一个新的线程,这个线程是子线程,而函数里的原本的命令是主线程
也就是说我运行一个程序,系统自动会为其创建一个线程,此为父线程,而程序中创建的所有线程都是隶属于该父线程的子线程
一个代码整体就是一个任务,一个任务就是一个进程。
单核CPU一次只能运行一个线程,多核CPU可以运行多个。一个进程可以包括多个线程,每个线程运行时会有一个程序计数器,记录当前程序执行的位置,多个线程有多个程序计数器,每个线程独立运行。每个线程有自己的寄存器和堆栈,线程间共享地址空间、全局变量、打开的文件等等信息