多线程
线程
如果把一个进程想象成一个工厂
线程就是工厂中的若干流水线
线程的特点
- 线程是包含在进程中的
- 一个进程中可能有多个线程
- 每个线程都有一段自己要执行的逻辑(指令),每个线程都是独立的"执行流"
- 同一个进程中的很多线程之间,是共享了一些资源
线程的介绍
- 所谓的 “线程” 可以理解成是一种轻量级的 “进程” ,也是一种实现并发编程的方式
- 创建一个线程比创建一个进程的成本低,销毁一个线程比销毁一个进程的成本也低
- 成本低的原因是,新创建一个线程,并没有去申请资源,销毁线程也不需要释放资源,让线程在进程内部公用之前的资源
- 如果新创建一个进程,就需要给这个进程分配比较多的资源
- 实际进行并发编程的时候,多线程比多进程方式更加常见,效率也更高
同一个进程的多个线程之间的共享资源主要是两方面
- 内存资源(但是两个不同进程之间的内存不能共享)
- 打开的文件
但是也有不共享资源
- 上下文 / 状态 / 记账信息 / 优先级(每个线程要独立参加CPU的调度)
- 内存中有一块特殊的区域, 栈 空间上每个线程要独立一份
使用的原因
- 线程比进程轻量,并发编程的效率更高
- 线程之间共享的资源多,完成一些操作时更方便
线程是如何创建的
当创建一个进程的时候,就会自动随之创建一个线程(主线程)
一个进程被创建出来的时候,至少会随之创建一个线程
进程是操作系统分配资源的最小单位
线程是操作系统进行调度和执行的最小单位
所谓操作系统对进程调度,本质上就是操作系统针对这个进程的若干个线程进行调度
一个线程是一个PCB
一个进程是多个PCB (使用线程组 id 来表示哪些PCB 从属与同一个进程)
线程和代码有啥关联?
可以认为,一个线程就是代码中的一个执行流 (按照一定的顺序来执行一组指令)
进程和线程的区别和练习(面试题)
- 进程是包含线程的一个进程里可以有一个线程,也可以有多个线程
- 进程和线程都是为了处理并发编程这样的场景,但是进程在频繁创建和释放时效率低,相比之下,线程更加轻量,创建和释放效率更高(因为少了申请释放资源的过程)
- 进程是操作系统资源分配的基本单位,线程是操作系统调度执行的基本单位 (以PCB为单位进行调度)
- 每个进程都有独立的内存空间,每个进程有各自的虚拟空间,一个进程挂了,不会影响到其他进程,同一个进程的多个线程之间,共用这个虚拟地址空间,所以一个线程挂了,可能会影响到其他线程的,甚至导致整个进程崩溃
一个进程中线程并不是越多越好
并发能力达到上限了,继续增加线程不会再提高效率,反而会降低效率(线程的调度也是有开销的)
一个进程最多能搞多少线程呢?
-
CPU的个数相关
-
和线程执行的任务类型也相关
1.CPU密集型 : 程序一直在执行计算任务
2.IO 密集型 : 程序没咋进行计算,主要进行输入输出操作
多线程程序还是有问题的
- “线程不安全”
- 线程如果抛出异常,没有很好地的处理这个异常的话,整个进程会被直接终止,其他线程也没法继续工作