进程与线程一篇看完!
作者:互联网
文章目录
为什么要有进程和线程?
早先的计算机,同一个时间内只能执行一个任务。当我们切换任务,或者需要将任务暂停起来的时候,我们的计算资源属于空闲状态。
为了充分的利用空闲的资源,我们希望能够同时运行多个任务,这样当某一个任务正在使用计算资源的时候,别的任务能够挂起,当正在运行的任务使用完计算资源后,正在挂起的其他任务就可以立即使用当前的计算计算资源。在计算中中我们把这些同时存在计算机的多个任务抽象为一个进程。进程中的数据位于内存上,他们轮流使用我们的计算资源(可以看成使用CPU的计算资源)。
后来,人们发现,为了解决某一些问题,我们需要使用到多个进程来协作进行,由此人们引进了进程间通信,让多个之前相互独立的进程进行协作计算,从逻辑上看起来他们是一个进程在运行。
在后来,大家发现,进程间的通信和切换会消耗比较大的资源,如果我们的任务只是一些轻量级的任务,每一条任务的寿命时间很短,那么创建和销毁进程就会花费很多时间和资源,由此又引入了线程的概念
为什么线程切换比进程消耗少?
进程切换分两步:
1.切换页目录以使用新的地址空间
2.切换内核栈和硬件上下文
对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。
关系与区别
关系
- 一个程序至少一个进程,一个进程至少一个线程,进程中的多个线程是共享进程的资源
- Java 中当我们启动 main 函数时候就启动了一个 JVM 的进程,而 main 函数所在线程就是这个进程中的一个线程,也叫做主线程
- 一个进程中有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序 计数器,栈区域
- 区别
- 本质:进程是操作系统资源分配的基本单位;线程是任务调度和执行的基本单位
- 内存分配:系统在运行的时候会为每个进程分配不同的内存空间,建立数据表来维护代码段、堆栈段和数据段;除了 CPU外,系统不会为线程分配内存,线程所使用的资源来自其所属进程的资源
- 资源拥有:进程之间的资源是独立的,无法共享;同一进程的所有线程共享本进程的资源,如内存,CPU,IO 等
- 开销:每个进程都有独立的代码和数据空间,程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行程序计数器和栈,线程之间切换的开销小
- 通信:进程间 以IPC(管道,信号量,共享内存,消息队列,信号,套接字等)方式通信;同一个进程下,线程间可以共享全局变量、静态变量等数据进行通信,做到同步和互斥,以保证数据的一致性
- 调度和切换:线程上下文切换比进程上下文切换快,代价小
- 执行过程:每个进程都有一个程序执行的入口,顺序执行序列;线程不能够独立执行,必须依存在应用程序中,由程序的多线程控制机制控制
- 健壮性:每个进程之间的资源是独立的,当一个进程崩溃时,不会影响其他进程;同一进程的线程共享此线程的资源,当一个线程发生崩溃时,此进程也会发生崩溃,稳定性差,容易出现共享与资源竞争产生的各种问题,如死锁等
- 可维护性:线程的可维护性,代码也较难调试,bug 难排查
线程的优缺点
优点:
提高效率:切换开销小
通信方便,共享内存;进程必须通过进程间通信 IPC
缺点:
一个线程出错,操作系统会结束整个进程,不够健壮;而多进程就没有这个问题
同一进程中的多个线程共享内存,会有并发问题
线程独有的资源
1.线程ID
2.寄存器组的值
由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线程切换到另一个线程上时,必须将原有的线程的寄存器集合的状态保存,以便将来该线程在被重新切换到时能得以恢复。
3.线程的堆栈
堆栈是保证线程独立运行所必须的(在一个进程的线程共享堆区,而进程中的线程各自维持自己堆栈)。
线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所以线程必须拥有自己的函数堆栈,使得函数调用可以正常执行,不受其他线程的影响。
4.错误返回码
由于同一个进程中有很多个线程在同时运行,可能某个线程进行系统调用后设置了errno值,而在该线程还没有处理这个错误,另外一个线程就在此时被调度器投入运行,这样错误值就有可能被修改。
所以,不同的线程应该拥有自己的错误返回码变量。
5.线程的信号屏蔽码
由于每个线程所感兴趣的信号不同,所以线程的信号屏蔽码应该由线程自己管理。但所有的线程都共享同样的信号处理器。
6.线程的优先级
通信方式
进程间通信方式:
https://www.jianshu.com/p/c1015f5ffa74
线程间通信方式:
https://zhuanlan.zhihu.com/p/129374075
线程池
线程池(待加入):
https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html
https://zhuanlan.zhihu.com/p/156749747
标签:一篇,线程,切换,进程,共享,计算资源,资源 来源: https://blog.csdn.net/weixin_43236268/article/details/115818468