操作系统复习(八)——线程的实现

线程的实现方式

1.内核支持线程KST
内核级线程(Kernel-Level Threads, KLT 也有叫做内核支持的线程)

  1. 线程管理的所有工作(创建和撤销)由操作系统内核完成
  2. 操作系统内核提供一个应用程序设计接口API,供开发者使用KLT

纯内核级线程特点:

  1. 进程中的一个线程被阻塞,内核能调度同一进程的其他线程(就绪态)占有处理器运行。
  2. 多处理器环境中,内核能同时调度同一进程的多线程,将这些线程映射到不同的处理器核心上,提高进程的执行效率。
  3. 应用程序线程在用户态运行,线程调度和管理在内核实现。线程调度时,控制权从一个线程改变到另一线程,需要模式切换,系统开销较大。

2.用户级线程ULT
用户空间运行线程库,任何应用程序都可以通过使用线程库被设计成多线程程序。线程库是用于用户级线程管理的一个例程包,它提供多线程应用程序的开发和运行支撑环境,包含:用于创建和销毁线程的代码、在线程间传递数据和消息的代码、调度线程执行的代码以及保存和恢复线程上下文的代码。
所以线程的创建,消息传递,调度,保存/恢复上下文都有线程库来完成。内核感知不到多线程的存在。内核继续以进程为调度单位,并且给该进程指定一个执行状态(就绪、运行、阻塞等)。

纯用户级线程的特点:

  1. 线程切换不需要内核模式,能节省模式切换开销和内核资源。
  2. 允许进程按照特定的需要选择不同的调度算法来调度线程。调度算法需要自己实现。
  3. 由于其不需要内核进行支持,所以可以跨OS运行。
  4. 不能利用多核处理器有点,OS调度进程,每个进程仅有一个ULT能执行
  5. 一个ULT阻塞,将导致整个进程的阻塞。

3.组合方式
可以看出,用户级线程和内核级线程都有各自的优点和缺点,在应用上主要表现为:

  • 用户级多线程对于处理逻辑并行性问题有很好的效果。不擅长于解决物理并发问题。
  • 内核级多线程适用于解决物理并行性问题。

组合策略:
由操作系统内核支持内核级多线程,由操作系统的程序库来支持用户级多线程,线程创建完全在用户空间创建,现成的调度也在应用程序内部进行,然后把用户级多线程映射到(或者说是绑定到)一些内核级多线程。编程人员可以针对不同的应用特点调节内核级线程的数目来达到物理并行性和逻辑并行性的最佳方案。

组合方式下,分为三种不同的模型:

  1. 多对一模型,将用户线程映射到一个内核控制线程中。
  2. 一对一模型,将每个用户级线程映射到一个内核支持线程。
  3. 多对多模型,将许多用户线程映射到同样数量或者更少数量的内核线程上。
线程的实现

1.内核支持线程的实现
(1)系统在创建一个新进程时,便为它分配一个任务数据区PTDA,其中包含若干个线程控制块TCB空间,每一个TCB中保存的数据虽然与用户级线程TCB的信息相同,现在这些信息都存储在内核空间中。
(2)每当进程要创建一个线程时,变为新线程分配一个TCB,将有关信息填入该TCB中,并为之分配必要的资源。
(3)内核支持线程的调度和切换与进程的调度和切换十分相似,也分为抢占式和非抢占式方式两种。

2.用户级线程的实现
用户级线程是在用户空间实现的。所有用户级线程都具有相同的结构,他们都运行在一个中间系统上。当前有两种方式实现中间系统:
(1)运行时系统
实质上是用于管理和控制线程的函数(过程)的集合,其中包括用于创建和插销线程的函数、线程同步和通信的函数,以及实现线程调度的函数。因为这些函数,才使用户级线程和内核无关。
运行时系统中所有函数都驻留在用户空间,并作为用户级线程与内核之间的接口。
运行时系统的特点:

  1. 用户级线程切换时不用进入核心态。
  2. 用户级线程不能利用系统调用。

(2)内核控制线程
此类线程又称为轻型进程LWP。每一个进程都可以拥有多个LWP,同用户级线程一样,LWP也有自己的数据结构。
LWP可以通过系统调用获得内核提供的服务,因此当一个用户级线程运行时,只须将它连接到一个LWP上,就具有了内核支持线程的所有属性。(这种方式就是组合方式。)
一个系统中用户级线程数量可能很大,为节省系统开销,将这些LWP做成一个缓冲池,即线程池
当用户级线程需要与内核进行通信时,每个要通信的用户级线程都必须借助一个LWP。

线程的创建和终止

线程也具有生命期。由创建而产生,由调度而执行,由终止而消亡。
1.线程的创建
应用程序启动时,通常仅有一个线程在执行,此线程称为“初始化线程”,它的主要作用是用于创建新线程。
创建新线程时,需利用线程创建函数(或系统调用),并提供相应参数。在线程函数执行完后,将返回一个线程标识符供以后使用。

2.线程的终止
当线程完成自己的任务后,或是线程在运行中出现异常情况而被强行终止是,由终止线程通过调用响应函数(或系统调用)对他执行终止操作。(有一部分线程,主要是系统线程,一旦被建立就一直运行下去而不会终止)
线程被终止后并不立即释放它所占有的资源,只有当进程中的其他线程执行了分离函数后,被终止的线程才与资源分离,此时资源才能被其他线程使用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值