线程的引入是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。
进程有两个属性:
- 可拥有资源的独立单位
- 可独立调度和分派的基本单位
线程和进程的比较
-
线程为轻型进程或进程元;进程称为重型进程
-
调度的的基本单位
- 进程
- 在传统的OS中,进程是作为独立调度和分配的基本单位,因而进程是能独立运行的基本单位。
- 但是,每次被调度都需要进行上下文的切换,开销较大。
- 线程
- 在引入线程后,把线程作为调度和分配的基本单位,因而线程是能独立运行的基本单位。
- 当线程切换时,仅需保存和设置少量的寄存器内容,切换代价远低于进程 。
- 进程
-
并发性
- 在引入线程之后,不仅进程直接可以并发
- 一个进程中的不同线程可以并发执行
- 不同进程中的线程也可以并发执行
-
拥有资源
- 进程可以拥有资源,并作为系统中拥有资源的一个基本单位
- 而线程本身并不拥有系统资源,而是仅有一点必不可少的、能保证独立运行的资源。
-
独立性
- 同一进程中的不同线程之间的独立性要比不同进程之间的独立性要低的多。
-
系统开销
- 在创建或撤销进程时,系统都需要为之分配和回收进程控制块、分配或回收其他资源。明显要大于创造或撤销线程所付出的开销。
-
支持多处理器系统
- 对于进程,不管多少处理机,该进程之能运行在一个处理机上。
- 但对于多线程进程,就可以将一个进程中的多个线程分配到多个处理机上,使它们并行执行,这无疑加速了进程的完成。
线程的三个状态
执行状态、就绪状态、阻塞状态
线程控制块TCB
- 线程控制块内:
- 线程标识符
- 一组寄存器
- 线程运行状态
- 优先级
- 线程专有存储区:用于存放现场信息
- 信号屏蔽
- 堆栈指针
多线程OS中的进程
- 一个可拥有资源的基本单位
- 多个线程可并发执行
- 进程已不是一个可执行的实体
线程的实现
内核支持线程KST(Kernel Supported Threads)
优点
- 多处理机系统中,内核能够同时调度同一进程中的多个线程并发执行。
- 如果进程中的一个线程被阻塞了,内核可以调度该进程中的其他线程占有处理器运行,也可以运行其他进程中的线程。
- 内核支持线程具有很小的数据结构和堆栈,线程的切换比较快,切换开销小。
- 内核本身也可以采用多线程技术,可以提高系统的执行速度和效率。
缺点 - 对于用户的线程切换而言,其模式切换的开销较大,在同一个进程中,从一个线程切换到另一个线程时,需要从用户态转到和心态进行,这是因为用户进程的线程在用户态进行,而线程调度和管理需要在内核实现的,系统开销较大。
用户级线程ULT(User Level Threads)
优点
- 线程切换不需要转换到内核空间
- 调度算法可以是进程专用的
- 用户级线程的实现与OS平台无关,因为对于线程管理的代码时属于用户程序的一部分,所有的应用程序都可以对之进行共享。
缺点 - 系统调用的阻塞问题
- 在单纯的用户级线程实现方式中,多线程应用不能利用多处理机进行多重处理的优点,内核每次分配给一个进程的仅有一个CPU,因此,进程中仅有一个线程能执行,在该线程放弃CPU之前,其他线程只能等待。
组合方式
之后再看吧