基于进程的并发
基于进程的并发服务器
进程的优劣
基于 I/O 多路复用的并发
基于 I/O 多路复用的并发事件驱动服务器
I/O 多路复用技术的优劣
基于线程的并发
线程
- 用户线程
- 内核线程
- 轻量级进程:内核中实现,支持用户线程(Solaris)
管理、控制线程的模块称作线程包。
线程模型中,由一个线程作为协调者来分派任务,而其他线程负责处理任务的模型称作分派/工作模型。
各线程相互独立,每个线程可单独完成任务的接收、处理、结果返回的模型称作队列模型。
进程 = 资源 + 指令执行序列
是否可以资源不动而切换指令序列?可!只切PC!保留了并发的优点,避免了进程切换的代价。从而引入线程。
线程切换:TCB 与栈互相配合。
yield,next,突然想起了py的协程
与进程的区别
线程:处理器分配调度的基本单位,进程内资源所有线程共享,线程切换开销小
进程:其他资源(除处理器外)分配的基本单位,进程切换开销大
进程可以创建线程、子进程,线程只能创建线程。
线程执行模型
POSIX 线程
创建线程
终止线程
回收已终止线程的资源
分离线程
初始化线程
基于线程的并发服务器
多线程程序中的共享变量
线程内存模型
将变量映射到内存
共享变量
用信号量同步线程
进度图
信号量
用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作。
信号在进程间通信、同步起到了重要的作用,但信号表示的含义有限,信号 => 信号量。
struct semaphore { |
P 消费资源。来自荷兰语的 problem,即 test。
V 生产资源。来自荷兰语 verhogen,即 increment。
特点
信号量的双用途
- 互斥和条件同步
- 但等待条件是独立的互斥
容易出错
- 使用的信号量已经被另一个线程占用
- 忘记释放信号量
不能够处理死锁问题
互斥
mutex = 1
同步
xxx = 0
前驱
每一个前置都能看成一个同步关系
信号量
使用信号量实现互斥
利用信号量来调度共享资源
综合:基于预线程化的并发服务器
使用线程提供并行性
其他线程并发问题
线程安全
可重入性
在线程化的程序中使用已存在的库函数
竞争
死锁