
一、为什么操作系统需要线程线程的由来1. 进程的致命缺点早期操作系统以进程为最小调度单位但进程有非常大的局限性进程资源太重每个进程独立内存、独立PC、独立地址空间虚拟内存页表创建、销毁、切换开销极大。进程切换慢进程切换需要刷新页表、刷新缓存、保存大量寄存器耗时高。进程内部无法并行一个进程同一时刻只能干一件事阻塞时整个进程卡死无法利用多核。进程间通信比较麻烦需要通过管道、虚拟内存、消息队列等才能实现进程间通信。2. 线程的诞生目的为了解决这些进程太重、切换慢、并发能力差的问题操作系统引入了线程轻量级进程。核心思想进程负责分配资源线程负责干活。线程共享进程大部分资源资源创建、销毁、切换成本极低一个进程可以包含多个线程真正实现一个程序同时做多件事极大提升 CPU 利用率、程序并发能力打个比喻如果将进程比作工厂中的一个车间那么线程就是每个车间中进行的工人二、线程的基本概念1. 什么是线程线程是操作系统能够进行运算调度的最小单位是进程内的一条执行路径。线程被称为是轻量级进程在计算机看来进程就是一个PCB结构体同样的线程就是一个和线程类似的TCB结构体。一个进程至少有一个主线程多个线程共享进程的堆内存、全局变量、文件描述符、信号、地址空间线程私有线程栈、程序计数器、局部变量、寄存器状态2. 线程的特点轻量级开销小共享进程资源通信简单切换速度远快于进程线程之间相互影响一个线程崩了可能影响整个进程三、线程与进程的核心区别重点这是面试最高频考点我帮你整理成博客通俗版1. 资源层面进程资源分配的最小单位独立地址空间互不干扰线程CPU调度执行的最小单位共享进程资源2. 开销层面进程创建销毁慢、切换极慢线程创建销毁快、切换极快3. 通信方式进程通信复杂管道、消息队列、共享内存、socket线程通信简单直接读写全局变量即可4. 独立性进程完全独立一个进程崩溃不影响其他进程线程不独立一个线程异常崩溃整个进程就会退出四、并发与并行彻底讲清楚区别1. 并发单核 CPU 快速交替执行多个线程宏观看起来同时运行微观上是在CPU中交替执行的。作用提高IO 密集型任务效率等待IO时切换线程2. 并行多核 CPU 同一时刻真正同时执行多个线程真正意义上的同时运行。作用提高CPU 密集型任务效率多核CPU3. 总结并发是交替做并行是同时做。五、线程安全问题为什么会出现线程不安全1. 线程不安全根本原因多线程共享资源全局变量、静态变量、堆对象CPU 时间片随机抢占、线程交替执行读写操作不具备原子性2. 经典案例count 线程不安全count 实际分为三步读取 count 值CPU 计算 1写回内存多线程交替执行会导致覆盖写、数据丢失最终结果偏小。3. 线程安全的定义多线程并发访问共享数据时最终结果和单线程顺序执行结果一致没有数据错乱、数据丢失。六、线程的同步与互斥核心重难点1. 互斥1互斥是什么同一时刻只允许一个线程访问共享资源。解决竞争资源冲突、数据覆盖问题。典型实现互斥锁 mutex、synchronized2如何实现互斥使用互斥锁或者信号量将信号量的初始值设置为1即可实现互斥的效果2. 同步1同步是什么线程按照预定顺序、有序执行。解决线程执行顺序混乱、生产者消费者顺序问题。2如何实现同步使用条件变量搭配互斥锁、信号量互斥竞争关系抢资源互斥排斥同步协作关系互相等待、有序执行七、死锁的概念、产生条件1. 什么是死锁多个线程互相持有对方需要的锁又互相等待对方释放锁无限阻塞、程序卡死无法继续执行。2. 死锁产生的四大必要条件必考互斥条件资源同一时刻只能一个线程持有持有并等待线程持有旧锁又请求新锁不可剥夺锁不能被强制抢走只能主动释放环路等待线程之间形成环形锁等待链四个条件同时满足才会死锁破坏任意一个即可避免死锁。八、死锁的预防、避免、解决方式1. 死锁预防从代码层面杜绝条件破坏请求与保持一次性申请所有需要的锁破坏环路等待所有线程统一锁的获取顺序破坏不可剥夺加锁倒计时超时放弃锁请求2. 死锁避免运行时动态规避经典算法银行家算法核心每次分配资源前预判如果预判的结果可以顺利执行并不会发生死锁就会进行资源分配如果会发生死锁则重新寻找新的资源分配的方案3. 工程中常用解决方案统一锁的获取顺序最常用、最简单加锁超时机制将所有需要的锁一次性申请完九、总结线程的出现解决了进程过重、并发能力弱的问题是现代高并发服务的基石。但多线程带来三大核心问题线程安全、同步互斥、死锁。