线程的根本概念

引入过程的目标,是为了使多道程序并发履行,以进步资本应用率和零碎吞吐量;而引入线程,则是为了减小程序在并发履行时所支付的时空开支,进步操作零碎的并发功能。
线程最直接的了解就是“轻量级过程”,它是一个根本的CPU履行单位,也是程序履行流的最小单位,由线程ID、程序计数器、存放器聚集和客栈构成。线程是过程中的一个实体,是被零碎自力调剂和分配的根本单元,线程本人不具有零碎资本,只具有一点在运转中必弗成少的资本,但它可与同属一个过程的其他线程共享过程所具有的全体资本。一个线程可以创立和撤销另一个线程,统一过程中的多个线程之间可以并发履行。因为线程之间的互相制约,致使线程在运转中出现出连续性。线程也有停当、壅塞和运转三种根本形态。
引入线程后,过程的外延发作了改动,过程只作为除CPU之外零碎资本的分派单位,线程则作为处置机的分派单位。

线程与过程的比拟

1) 调剂。在传统的操作零碎中,具有资本和自力调剂的根本单元多是过程。在引入线程的操作零碎中,线程是自力调剂的根本单元,过程是资本具有的根本单元。在统一过程中,线程的切换不会惹起过程切换。在分歧过程中停止线程切换,如从一个过程内的线程切换到另一个过程中的线程时,会惹起过程切换。
2) 具有资本。不管是传统操作零碎照样设有线程的操作零碎,过程多是具有资本的根本单元,而线程不具有零碎资本(也有一点必弗成少的资本),但线程可以拜访其从属过程的零碎资本。
3) 并发性。在引入线程的操作零碎中,不只过程之间可以并发履行,并且多个线程之间也可以并发履行,从而使操作零碎具有更好的并发性,进步了零碎的吞吐量。
4) 零碎开支。因为创立或撤销过程时,零碎都要为之分派或收受接管资本,如内存空间、 I/O装备等,因而操作零碎所支付的开支弘远于创立或撤销线程时的开支。相似地,在停止过程切换时,触及以后履行过程CPU情况的保管及新调剂到过程CPU情况的设置,而线程切换时只需保管和设置大批存放器内容,开支很小。此外,因为统一过程内的多个线程共享过程的地址空间,因而,这些线程之间的同步与通讯十分轻易完成,乃至无需操作零碎的干涉。
5) 地址空间和其他资本(如翻开的文件):过程的地址空间之间相互自力,统一过程的各线程间共享过程的资本,某过程内的线程关于其他过程弗成见。
6) 通讯方面:过程间通讯(IPC)需求过程同步和互斥手腕的辅佐,以包管数据的分歧性,而线程间可以直接读/写过程数据段(如全局变量)来停止通讯。

线程的属性

在多线程操作零碎中,把线程作为自力运转(或调剂)的根本单元,此时的过程,已不再是一个根本的可履行实体。但过程仍具有与履行相干的形态,所谓过程处于“履行”形态,实践上是指该过程中某线程正在履行。线程的次要属性如下:

  1. 线程是一个轻型实体,它不具有零碎资本,但每一个线程都应有一个独一的标识符和一个线程掌握块,线程掌握块记载了线程履行的存放器和栈等现场形态。

  2. 分歧的线程可以履行相反的程序,即统一个效劳程序被分歧的用户挪用时,操作零碎为它们创立成分歧的线程。

  3. 统一过程中的各个线程共享该过程所具有的资本。

  4. 线程是处置机的自力调剂单元,多个线程是可以并发履行的。在单CPU的盘算机零碎中,各线程可瓜代地占用CPU;在多CPU的盘算机零碎中,各线程可同时占用分歧的CPU,若各个CPU同时为一个过程内的各线程效劳则可延长过程的处置工夫。

  5. —个线程被创立后便开端了它的生命周期,直至终止,线程在生命周期内会阅历壅塞态、停当态和运转态等各类形态变更。

线程的完成方法

线程的完成可以分为两类:用户级线程(User-LevelThread, ULT)和内核级线程(Kemel-LevelThread,  KLT)。内核级线程又称为内核支撑的线程。
在用户级线程中,有关线程治理的一切任务都由使用程序完成,内核认识不到线程的存在。使用程序可以经过运用线程库设计成多线程程序。平日,使用程序从单线程肇端,在该线程中开端运转,在其运转的任何时辰,可以经过挪用线程库中的派生例程创立一个在相反过程中运转的新线程。图2-2(a)阐明了用户级线程的完成方法。
在内核级线程中,线程治理的一切任务由内核完成,使用程序没有停止线程治理的代码,只要一个到内核级线程的编程接口。内核为过程及其外部的每一个线程保护上下文信息,调剂也是在内核基于线程架构的根底上完成。图2-2(b)阐明了内核级线程的完成方法。
在一些零碎中,运用组合方法的多线程完成。线程创立完整在用户空间中完成,线程的调剂和同步也在使用程序中停止。一个使用程序中的多个用户级线程被映射到一些(小于或等于用户级线程的数量)内核级线程上。图2-2(c)阐明了用户级与内核级的组合完成方法。

线程的概念和多线程模子_计数器
图2-2用户级和内核级线程

多线程模子

有些零碎同时支撑用户线程和内核线程由此发生了分歧的多线程模子,即完成用户级线程和内核级线程的衔接方法。

1) 多对一模子

将多个用户级线程映射到一个内核级线程,线程治理在用户空间完成。
此形式中,用户级线程对操作零碎弗成见(即通明)。
长处:线程治理是在用户空间停止的,因此效力比拟高。
缺陷:当一个线程在运用内核效劳时被壅塞,那么全部过程都邑被壅塞;多个线程不克不及并行地运转在多处置机上。

2) 一对一模子

将每一个用户级线程映射到一个内核级线程。
长处:当一个线程被壅塞后,许可另一个线程持续履行,所以并发才能较强。
缺陷:每创立一个用户级线程都需求创立一个内核级线程与其对应,如许创立线程的开支比拟大,会影响到使用程序的功能。

3) 多对多模子

将 n 个用户级线程映射到 m 个内核级线程上,请求 m <= n。
特色:在多对一模子和一对一模子中取了个折中,克制了多对一模子的并发度不高的缺陷,又克制了一对一模子的一个用户过程占用太多内核级线程,开支太大的缺陷。又具有多对一模子和一对一模子各自的长处,可谓集两者之所长。