操作系统-线程
操作系统-线程
操作系统
线程是为了更好的使多个程序并发执行,同时减少系统的开销而出现的
线程与进程的比较
- 调度的基本单位
传统的OS中,进程作为独立调度和分派的基本单文,每一次调度的时候,都要进行上下文的切换,开销比较大,而用线程作为独立运行的基本单文是,线程的切换只需要保存和设置少量的寄存器内容,开销比进程的销。在同一进程能切换线程不会引起进程的切换,如果切换到另一个进程的线程,则需要切换进程 - 并发性
在引入线程之后,不仅进程之间可以并发执行,一个进程中的多个线程也可以并发执行,甚至还允许一个进程中所有的线程并发执行,更加有效的提高了系统资源的利用率和系统的吞吐量 - 拥有资源
线程本身不像进程那样拥有系统资源,仅有一些必不可少的,能保证独立运行的资源,例如线程控制块TCB等,除此之外,多个线程共享进程所拥有的资源 - 独立性
在独立性方面,线程不够进程好,进程为了防止进程之间干扰,破坏,每个进程都拥有一个独立的地址空间和其他资源,而线程是为了提高并发性以及进程相互之间的合作而创建的 - 系统开销
进程在系统上的开销主要是创建进程,撤销进程,进程切换,特别是在进程切换的时候,涉及到上下文的切换,开销比较大,而由于线程只有少量的资源,在上下文切换的时候,开销比较小 - 支持多处理机系统
线程的控制块TCB
线程和进程一样,拥有控制块TCB,在TCB中有:
- 线程标识符
每个线程的唯一标识 - 寄存器
包括程序计数器PC,状态寄存器和通用寄存器的内容 - 线程运行状态
用于描述线程在哪一个状态 - 优秀级
描述线程执行的优先级 - 线程专有存储区
用于线程切换时存放的现场保护信息,和与该新城的统计信息 - 信号屏蔽
对某些信号屏蔽 - 堆栈指针
保存局部变量和返回地址。在线程中设置了两个专项堆栈的指针
- 指向用户自己堆栈的指针
在用户态时,使用用户自己的用户栈来保存局部变量和返回地址 - 指向核心栈的指针
在内核态,线程运行在核心态使用系统的核心栈
- 指向用户自己堆栈的指针
线程的实现方式
- 内核支持线程KST
线程的创建,阻塞,撤销和切换等都是内核空间实现,在内核控制中也设置了线程控制块TCB,用来管理内核线程
- 优点
- 能够同时调度同意进程中的多个线程并执行
- 进程中的一个线程被阻塞的时候,内核可以调度该进程中其他线程占有处理器运行,也可运行其他进程的线程
- 支持线程具有很小的数据结构和堆栈,切换快,开销小
- 采用了多线程的技术,提高了系统的效率
- 缺点
- 对于用户的线程切换的话,切换开销大,需要从用户态切换到核心态,这是因为用户线程在用户态运行,而线程调度和管理在内核实现。
- 优点
-
用户级线程ULT
线程的创建,阻塞,撤销和切换等都是用户空间实现,不需要内核的支持,与内核无关- 优点
- 线程切换不需要转换到内核空间,在用户态进行,开销小
- 用户线程与OS平台无关
- 调度算法可以使进程专用
- 缺点
- 系统调用的阻塞问题,大多数的系统调用都会使进程阻塞,所以当线程执行系统调用时,进程内所有的线程都会被择善
- 优点
-
组合方式
- 多对一模型
- 一对一模型
- 多对多模型
- 多对一模型
线程的实现
-
内核支持线程的实现
在仅设置内核支持的线程OS中,一种可能的线程控制方法是系统在创建一个新进程时,为它分配一个任务数据区PTDA,但进程要创建一个线程的时候,就分配一个TCB,将相关信息填入该TCB,并分配资源。在撤销线程事不立即回收该线程的资源和TCB,在创建新线程时,直接利用这个。 -
用户级线程的实现
用户线程在用户空间实现,所有的用户线程都具有相同的结构,都运行在一个中间系统上。有两种方式实现中间系统,运行时系统和内核控制线程- 运行时系统
运行时系统实质是用于管理和控制线程的函数(过程)的集合,所有的函数都驻留在用户空间,并作为用户级线程与内核的接口 - 内核控制线程
这种线程有叫做轻型进程LWP,在系统中,LWP不会设置太多,而是把这些LWP做成一个缓冲池,成为“线程池”,当用户级线程需要与内核通信的时候,借助LWP就可以实现,有LWP实现了内核与用户级线程直接的隔离
- 运行时系统