操作系统概念 线程/Thread 第四章笔记

2017年9月27日
17:44

写在前面

本笔记仅仅是本人在上课时的一些随手记录,并不完整也不完全正确。

如有错误,请在评论中或直接联系我指正,谢谢!

原始文件下载:(mht)(pdf)

提高系统运行效率
相比进程更加轻量化

对于任务切换:

每次分配资源越多越好,避免频繁分配
每次调度的基本单位越小越好

对于上图,显然B效率更高

Main idea

Separate the allocation and scheduling of the process resource
The concept of threads is introduced.

目的:

一次性分配充足资源——避免频繁分配资源
降低调度单位,提高并发性

原因:

系统开销
切换线程比进程所需时间少很多

通讯

进程间通讯费时且不便利
统一进程下线程交换信息高效便捷

定义:

线程

  • 有时称轻量进程
  • 进程中的一个运行实体
  • 是一个CPU调度单位
  • 资源的拥有者是进程或称任务
  • 可由内核控制,也可由用户控制
    也描述为:

    进程的执行体一个执行单元、进程内的一个可调度实体等。

基本不拥有系统资源,存取所在进程的内存和其他资源
只包含一些如程序计数器,寄存器和一组栈
TCB(线程控制块)

不运行时保存上下文

TCB:

  • CPU执行状态:寄存器,PC,堆栈指针
  • 调度信息
  • 统计信息
  • 队列指针

多线程实现机制

用户级线程

  • 通过库函数直接编程,对程序员友好(Pthread)
  • 仅存在于用户空间中
  • 许多功能无需系统调用,切换无需内核管理,切换规则简单

优点

  • 不调用内核
  • 调度由应用程序特定:可以选择最好的算法
  • 可以运行在任何操作系统上(只需线程库)(可移植性)

缺点

  • 许多系统调用形成阻塞
  • 统一进程中两个线程不能同时运行于两个处理器上
  • 只适合单CPU

内核级线程

优点

  • 可调度一个进程中的多个线程,可同时再多核cpu上运行
  • 其中一个阻塞不影响其他线程
  • 内核本身可以以线程方式实现多处理器的处理功能,内核可以同时调度同一进程的多个线程
  • 阻塞是在线程一级完成
  • 内核例程是多线程的

    缺点

  • 线程调度在内核态下运行,应用程序在用户态下运行
  • 控制过程中需要内核态和用户态的两次模式切换
  • 同一进程内的线程切换调用内核,导致速度下降

模型:

多对一

  • 一般在不支持内核级进程的机器上运行
  • 线程管理在用户空间完成,所以它的效率比较高。
  • 如果一个线程调用了导致阻塞的系统调用的话,那么将阻塞整个进程。

    一对一

  • 保持了更好的并发性
  • 创建内核线程的开销会加重应用程序的负担,所以这种模型的大多数实现都要限制系统支持的线程数量。

    多对多

  • 集合了上两者的优点
  • 然而对操作系统的实现上会比较复杂困难
  • 多对多模型将用户级线程多路映射到内核线程,映射的内核线程数量可以与之相等或更少。
  • 多对一模型允许开发者创建任意多个用户线程。但是,因为内核一次只能调度一个线程,所以并不能获得真正的并行性。

轻量级进程(LWP)

是一种实现多任务的方法。与普通进程相比,LWP与其他进程共享所有(或大部分)它的逻辑地址空间和系统资源

与线程相比,LWP有它自己的进程标识符,优先级,状态,以及栈和局部存储区,并和其他进程有着父子关系;

LWP的一个重要作用是提供了一个用户级线程实现的中间系统。LWP可以通过系统调用获得内核提供的服务,因此,当一个用户级线程运行时,只需要将它连接到一个LWP上便可以具有内核支持线程的所有属性。

进程库

给程序员提供API来创建管理线程

有两种主要实现方式

把库完全放在用户空间

OS支持的内核级库