说线程之前我们先来回忆一下什么是进程?
答:谈到进程,首先印入我们脑海当中的必然是PCB(进程控制块,Linux叫做task_struct),然后会想到页表,虚拟地址空间,映射关系,物理内存等等…
而我们今天要了解的线程跟进程有着莫大的关系,下面开始详细的介绍
什么是线程
- 程序中的一个执行流就是一个线程,更准确的说应该是一个进程内部的控制序列,后面讲。
- 一个进程中至少有一个执行流
- 线程在进程内运行,本质上是在进程地址空间内运行
- 在CPU眼里,线程是比进程还要轻量级的进程
- 通过进程虚拟地址空间,我们可以看到进程的大部分资源,将进程合理的分配给每个执行流,就形成了线程执行流
- 我们所说的线程在物理层面上是不存在的,而是站在PCB上谈的
画个图示意一下:
进程和线程区别
- 进程是资源分配的最小单位
- 线程是调度的基本单位
- 线程共享进程的一部分资源,但是有自己的一部分数据
- 线程ID
- 一组寄存器
- 运行时栈(每个线程内部为变量初始化就会分配自己的物理内存)
- 上下文信息
- 信号屏蔽字
- 调度优先级
线程和进程共享
- 数据段和代码段
- 文件描述符表
- 各种信号的处理方式
- 当前工作目录
- 用户ID和组ID(进程后面会讲作业和进程组)
线程优缺点
优点:
- 创建代价比进程小(每创建一个进程都要开辟一块空间,而线程是建立在进程基础上创建的并且共享一部分资源)
- 线程间切换效率高(同在一块地址空间内,切换当然快)
- 线程占用资源比进程少
- 能充分利用多处理器的可并行数量
- 等待慢速IO的同时可以做其他事情
- 对待计算密集型应用可以分解到多线程中运行,提高运算效率
- I/O密集型应用,为了能够提高性能,将I/O操作重叠,线程可以同时等待不同的IO操作缺点
- 性能损失
- 一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
- 程序健壮性降低
- 线程内部一不小心就会有线程安全问题,,比如:因时间分配上的细微偏差或者因共享了不该共享的变量而造成了不良影响的可能性是很大的
- 编程难度提高
- 缺乏访问控制
线程其他问题
线程异常:
- 多线程内如果其中一个线程出现了除0、野指针等问题会造成该线程崩溃,进而导致整个进程终止
- 线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出
线程用途:
不知道大家有没有用过快播下载片子,当时他可是非常火的一款视屏软件,为什么火?是因为它的下贼速度很快,其他的嘛(各位***自己脑补)。。。这里就用到了多线程,将我们的下载速率提到了另一个层次。
所以。。。。
- 合理使用多线程,可以提高CPU密集型程序的执行效率
- 合理使用多线程,能够提高IO密集型程序的用户体验