1、线程是什么
线程是应用程序执行的最小单位,是CPU调度和执行的基本单元。然后每一个进程至少都会有一个线程(也就是main方法所在的线程,也称为主线程),也可以有多个线程。线程在进程运行中,也共享进程的资源(比如内存、文件扫描等等)。线程本身也拥有自己的执行路径、计数器、栈和局部变量等等。
简单来说,一个线程其实就是一个执行流,每个进程都能拥有一个或者多个执行流。
(需要了解进程的话可以去看上一篇博文,里面有具体内容)
1.1线程的状态
新建状态(New):线程被创建,但是还没启动。
就绪状态(Ready):线程准备好了,可以在CPU上运行,但是得等待调度。
运行状态(Running):线程被调度到CPU上运行。
阻塞状态(Blocked):线程在等待某些操作时(如I/O操作、锁),会被阻碍。
终止状态(Terminated):线程执行完毕,生命周期结束。
2、为啥要有线程
2.1、“并发编程”成为“刚需”
- 单核CPU的发展遇到了瓶颈,想要提高算力,就需要多核CPU,并发编程就更能利用多核CPU的资源。
- 有许多应用场景都需要“等待IO”,在等待IO的时候,为了能够让计算机继续运行其他工做,“并发编程”也就成了其中的关键。
2.2、进程可以实现并发编程,但是线程更加轻量级
- 创建线程比创建进程快。
- 销毁线程比销毁进程快。
- 调度线程比调度进程快。
3、线程和进程的区别
3.1、定义
进程:操作系统分配资源的基本单位,表示一个正在执行的程序。每一个进程都拥有独立的内存、系统资源、文件描述等。操作系统通过进程来隔离不同应用程序的运行。
线程:线程是进程的执行单位,是CPU指令执行的基本单位。一个进程可以拥有多个线程,这些线程共享进程所得的系统资源,但是每个线程都有自己的独立执行的栈和计数器。
就好比如一个黑老大,他有地盘有资源,他就要把这些地盘和资源分给小弟,让这些小弟给他处理各种杂碎的事情,这些小弟也就共享了黑老大的资源和地盘。
3.2、资源占用
- 进程:每一个进程都拥有自己独立的内存、代码、数据和堆栈,每一次创建都要较高的资源和时间开销。
- 线程:每一个进程都是在一个进程里面的,进程拥有的资源有限,多线程共享进程里的资源,线程之间的切换比进程之间的切换更加高效,因为他们切换不需要更改内存上下文。
3.3、内存空间
- 进程:进程之间是隔离的,每个进程都有自己的独立空间,所以当某个进程崩溃后其他进程并不会被影响。
- 线程:线程共享同一进程的内存空间,包括代码段、数据段等。这使得线程之间可以方便地进行通信,但也带来共享数据时需要同步的问题(如死锁、数据竞争等)。
3.4、通信方式
- 进程:进程间通信(IPC)需要专门的机制,如管道、消息队列、共享内存、套接字等。因为进程之间是独立的,所以直接访问其他进程的内存空间是不可行的。
- 线程:同一进程中的线程可以直接访问共享内存,进行高效的数据交换。线程间通信的方式比进程间通信更加直接和高效。
3.5、创建与销毁
- 进程:创建一个进程的开销比较大,需要操作系统分配独立的内存空间和资源。进程的创建和销毁都比较耗时和复杂。
- 线程:线程的创建和销毁比进程要轻量得多。因为线程共享进程的资源,线程的创建和销毁只需要分配和释放少量资源。
3.6、切换开销
- 进程:进程是操作系统资源的独立单位,当切换进程时,操作系统需要保存和恢复当前进程的上下文,包括寄存器、内存、打开的文件等。
- 线程:线程切换的开销较小,因为线程共享进程的资源,切换时只需要恢复上下文,不需要涉及进程级别的内存切换。
3.7、使用场景
- 进程:适用于独立的任务执行,如运行不同的应用程序、服务等。每个进程之间隔离性和独立性高,适合多任务操作。
- 线程:适用于需要大量并操作的场景,如在同一个应用程序中需要执行多个并发任务(例如浏览器中多个标签网页,Web服务器的请求处理等)。
选择使用进程还是线程取决于任务的需求,进程适合独立任务,线程适合并发执行和高效的资源共享。
标签:区别,线程,进程,共享,执行,CPU,资源 From: https://blog.csdn.net/2301_80302655/article/details/144751733