2017年9月27日
17:44
写在前面
本笔记仅仅是本人在上课时的一些随手记录,并不完整也不完全正确。
如有错误,请在评论中或直接联系我指正,谢谢!
提高系统运行效率
相比进程更加轻量化
对于任务切换:
每次分配资源越多越好,避免频繁分配
每次调度的基本单位越小越好
对于上图,显然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支持的内核级库