前言
有关操作系统线程的一些概念,进程是资源拥有单位(Unit of Recource)和调度单位(Unit of Dispatching)
线程概念
- 资源拥有单元称为进程(或任务),调度单位称为线程(轻型线程LWP: light weight process)
- 线程定义为进程内一个执行单元或一个可调度实体
- 线程有执行状态,不运行时保存上下文,有一个执行栈和局部变量的静态存储,可以存取所在进程全部资源,可以创建、撤销其他进程
- 线程不拥有系统资源(资源分配于进程,线程只拥有少量的资源)
- 进程中的多个线程可并发执行,系统开销小(创建(结束)花费时间少),切换快,且同一进程中的线程通信无需调用内核
- 多进程适合多处理机系统
多线程模型
- 线程实现机制
- 用户级(user-level)线程
- 用户线程的维护由应用进程完成
- 内核不了解用户线程的存在
- 用户线程切换不需要通过内核
- 用户线程调度可针对应用优化
- 内核级(kernel-level)线程
- 内核维护进程和线程
- 内核完成线程切换
- 时间片分配给线程,线程因此获得更多cpu时间
- 一个线程发起系统调用后阻塞,不会影响其他线程运行
- 用户级(user-level)线程
- 多线程模型
- Many-to-Many
- 多个用户线程映射到单核线程中
- 通过用户级运行库实现,不需要OS支持,开销小
- OS不了解多线程
- Solaris Green Threads、GNU Portable Threads
- 并非真正并行
- 一个线程阻塞就会导致进程阻塞
- One-to-One
- 每一个用户级线程映射到了一个内核线程,各用户线程并行运行
- 每个内核线程独立调度(通过OS),开销大
- Windows NT/XP/2000、 Linux、Solaris 9+
- 一个线程阻塞不会影响其他线程调度
- Many-to-Many
- 多个用户级线程映射到多个内核线程
- OS创建足够的内核线程
- Solaris prior to version 9、 Win2000/NT with ThreadFiber package
- Two-level Model
- 类似M:M,但允许一个用户线程绑定到内核线程
- Many-to-Many
- 线程库(用户级库或OS内核级库)
- Pthreads(user-level or kernel-level): UNIX os
- Java Threads(JVM)使用底层OS提供的线程模型实现
隐私多线程(Implicit Threading)
- 多核多线程编程难题
- 编程挑战: 任务分解、工作量平衡、数据分割、数据依赖、测试和调试
- 同步、互斥
- 应对:将线程的创建和管理交给编译器和运行时库
- 设计方法
- Thread Pools
- Fork Join
- OpenMp:支持C、C++、Fortran
- Grand Central Dispatch(GCD,大中央调度):Apple
- Intel Thread Building Blocks(TBB):Intel开发
- Java
其他线程问题
- 取消线程(Cancellation)
- Asychronous: 直接结束线程
- Deferred cancellation: 目标线程检测是否自己可以结束
- 信号处理(Signal Handling)
- Signal通知进程某个事件(event)发生
- generated delivered handled
- deliver有多种方式: 直接交给所响应的线程;交给全部线程;…
- 线程池
- 预创建多个线程
- 通常比创建一个新进程快