操作系统 第二章 进程的描述与控制(下)

2.6 线程的实现

2.6.1 线程的实现方式

1 内核支持线程(KST)从操作系统内核视角看能看到的线程

内核级线程的管理工作由操作系统内核完成。

内核级线程的切换必须在核心态下才能完成。

操作系统会为每个内核级线程建立相应的TCB ,通过TCB对线程进行管理。

优点:当一个线程被阻塞时,别的线程还可以继续执行,并发能力强。内核级线程有很小的数据结构和堆栈,切换开销小。多线程可并行运行。

缺点:同一进程中,从一个线程切换到另一个线程时需要从用户态转到内核态进行,成本高,系统开销大。

2 用户级线程(ULT)从用户视角看能看到的线程

用户级线程是在用户空间中实现的,其对线程的创建、撤销、同步与通信等功能都无须内核支持,即ULT与内核无关。

内核完全不知道ULT的存在。

对于设置ULT的系统,调度仍以进程为单位进行的。

用户级线程由应用程序通过线程库实现,所有的线程管理工作都由应用程序负责。

用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。

优点:线程切换不需要转换到内核空间。调度算法可以是进程专用的。用户级线程的实现与OS平台无关。

缺点:系统调用的阻塞问题。当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。

3 两种线程的组合方式

(1)一对一模型:将每个ULT映射到一个KST上。

优点:一个线程阻塞时,允许调度另一个线程运行,并发性高。

缺点:每创建一个ULT,相应地就需要创建一个KST,开销较大,要限制整个系统的线程数。

(2)多对一模型:将多个ULT映射到一个KST上。

优点:线程管理的开销小,效率高。

缺点:并发度不高,“牵一发而动全身”。

(3)多对多模型:将许多ULT映射到同样数量或较少数量的KST上。

2.6.2 线程的具体实现

1 KST的实现

在仅设置了KST的OS中,一种可能的线程控制方法是,系统在创建一个新进程时,便为它分配了一个任务数据区(PTDA),其中包括若干个TCB空间。

每当进程要创建一个线程时,便会为新线程分配一个TC,同时将有关信息填入该TCB中,并为之分配必要的资源。

当PTDA中的所有TCB空间已用完而进程又创建新的进程时,只要其所创建的线程数目未超过系统的允许值。系统可再为之分配新的TCB空间;在撤销一个进程时,也应回收该线程的所有资源和TCB。

KST的创建和撤销均与进程的相似。

线程的调度也可以采用时间片轮转调度算法、优先级调度算法

2 ULT的实现

ULT是在用户空间实现的。它们运行在一个中间系统上。中间系统有两种(运行时线程与核心线程)

(1)运行时线程

实际上是用于管理和控制线程的函数的集合,包括用于创建和撤销线程的函数、用于控制线程同步和通信的函数以及用于实现线程调度的函数。

(2)核心线程

又称为LWP。每一个进程都可拥有多个LWP。

线程池:一个系统中的ULT数量可能很大,为了节省系统开销,不可能设置太多的LWP,而是会把这些LWP做成一个缓冲区,这个缓冲区就称为“线程池”。

当ULT不需要与内核通信时,并不需要LWP;而当其要通信时,便需借助LWP,并且每个要通信的ULT都需要一个LWP。

2.6.3 线程的创建与终止

1 线程的创建

应用程序在启动时,通常仅有一个线程在执行,称为初始化线程,它的功能是创建新进程。创建新进程时,需要一个函数,指向线程主程序入口的指针、堆栈的大小以及调度的优先级等。

2 线程的终止

当一个线程完成了自己的任务或工作后,或是线程在运行中出现异常情况而须被强行终止时,由终止线程通过调用相应的函数(系统调用)对它执行终止操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值