1. 进程和线程的基础知识
1.1 进程
并发和并行的区别
1.1.1 进程的状态
1.1.2 进程的控制结构
1.1.3 进程的控制
我们熟知了进程的状态变迁和进程的数据结构PCB后,再来看看进程的创建、终止、阻塞、唤醒的过程,这些过程也就是进程的控制。
1.1.4 进程的上下文切换
场景:时间片耗尽,系统资源不足,进程主动sleep,优先级更高进程要运行,发送硬件中断。
1.2 线程
进程中更小的能独立运行的基本单位
1.2.1 线程的必要性
单进程执行以下操作会画面和声音不连贯,各个函数之间并不是并发执行。
1.2.2 线程的定义
1.2.3 线程与进程的比较
1.2.4 线程的上下文切换
1.2.5 线程的实现
优点:每个进程都有控制块,用内核函数完成切换,速度更快。
缺点:系统无法识别单个线程,一阻塞全阻塞,线程不可被其他线程打断,多线程抢时间执行较慢。
优点:能阻塞单个线程,具有更多运行时间。
缺点:内核支持,系统调用,开销大
1.3 进程调度(主线程调度)
1.3.1 调度原则
1.3.2 调度算法
2. 进程间通信方式
2.1 管道
![](https://i-blog.csdnimg.cn/direct/957ebfb67dca455c99026d81f5b5a3af.png)
![](https://i-blog.csdnimg.cn/direct/f3e3e9092812454b872cfce25ff78a7e.png)
2.2 消息队列
2.3 共享内存
2.4 信号量
2.5 信号
2.6 Socket
2.6.1 针对TCP协议通信的socket编程模型
![](https://i-blog.csdnimg.cn/direct/049bd547242b48bf93a6d7d660a18f15.png)
2.6.2 针对 UDP 协议通信的 socket 编程模型
2.6.3 针对本地进程间通信的 socket 编程模型
2.7 总结
3. 多线程冲突问题
3.1 互斥和同步
![](https://i-blog.csdnimg.cn/direct/8d9c385e7978438da3e49dcb8bb5cba8.png)
![](https://i-blog.csdnimg.cn/direct/da574a32fdfa4004a256252ab105eb8a.png)
3.2 互斥和同步的实现
3.2.1 锁
3.2.2 信号量
4. 死锁的概念
4.1 互斥条件
4.2 持有并等待条件
4.3 不可剥夺条件
4.4 环路等待条件
4.5 避免死锁问题的发生
5. 悲观锁和乐观锁
5.1 互斥锁与自旋锁![](https://i-blog.csdnimg.cn/direct/e230c72a71114c549a761ae849dfb244.png)
5.2 读写锁
5.3 乐观锁和悲观锁
5.4 线程崩溃会导致进程崩溃吗