一周总结(七)

前言

有关操作系统线程的一些概念,进程是资源拥有单位(Unit of Recource)和调度单位(Unit of Dispatching)

线程概念

  1. 资源拥有单元称为进程(或任务),调度单位称为线程(轻型线程LWP: light weight process)
  2. 线程定义为进程内一个执行单元或一个可调度实体
  3. 线程有执行状态,不运行时保存上下文,有一个执行栈和局部变量的静态存储,可以存取所在进程全部资源,可以创建、撤销其他进程
  4. 线程不拥有系统资源(资源分配于进程,线程只拥有少量的资源)
  5. 进程中的多个线程可并发执行,系统开销小(创建(结束)花费时间少),切换快,且同一进程中的线程通信无需调用内核
  6. 多进程适合多处理机系统

多线程模型

  1. 线程实现机制
    • 用户级(user-level)线程
      • 用户线程的维护由应用进程完成
      • 内核不了解用户线程的存在
      • 用户线程切换不需要通过内核
      • 用户线程调度可针对应用优化
    • 内核级(kernel-level)线程
      • 内核维护进程和线程
      • 内核完成线程切换
      • 时间片分配给线程,线程因此获得更多cpu时间
      • 一个线程发起系统调用后阻塞,不会影响其他线程运行
  2. 多线程模型
    • 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,但允许一个用户线程绑定到内核线程
  3. 线程库(用户级库或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

其他线程问题

  1. 取消线程(Cancellation)
    • Asychronous: 直接结束线程
    • Deferred cancellation: 目标线程检测是否自己可以结束
  2. 信号处理(Signal Handling)
    • Signal通知进程某个事件(event)发生
    • generated delivered handled
    • deliver有多种方式: 直接交给所响应的线程;交给全部线程;…
  3. 线程池
    • 预创建多个线程
    • 通常比创建一个新进程快