计算机操作系统原理:线程

在开始编写文章前,有几个问题需要思考一下:

  • 线程的由来?
  • 线程的概念
  • 线程有哪些状态?
  • 线程由哪几部分组成?

1. 线程的由来

自 20 世纪 60 年代引入进程以来,它已是操作系统中最重要、最基本的概念。随着计算机技术的发展和应用的深入,传统的进程概念已经越来越不适应新的需要了,特别是计算机网络、数据库以及并行技术的发展,使进程的局限性越来越明显。20 世纪 80 年代,人们又提出了比进程更小的、能独立运行的基本单位 —— 线程,以进一步改善系统的性能。

进程有进程控制块、程序块、数据块和堆栈组成。进程创建后,系统需分配该进程基本的内存空间以及所需要的其他各种外围设备资源和软件资源等。随着计算机技术的发展,基于进程的并发程序设计存在一定的效率问题:

  • 进程粒度大,切换开销高:作为资源分配和调度的基本单位,进程状态的频繁切换,以及现场保护和恢复将浪费大量的 CPU 时间。此外,系统内存空间的容量也限制可容纳进程的总数。(进程切换时要切换页表,而且往往伴随着页调度,因为进程的数据段、代码段要换出去,以便把要将执行的进程内容换进来。本来进程的内容就是线程的超集,而且线程只需要保存线程的上下文,动作很小)
  • 进程的并发程度不高:进程包含信息较多、粒度太粗,导致其切换频率不宜太高,从而限制了进程的并发程度。此外,进程之间的通信等开销较大,导致进程不适合并行计算、分布式计算的要求。

为了解决进程所带来的上述问题,人们将进程的两个属性(“独立分配资源”与“被调度执行”)分离,即作为调度和分配的基本单位,不能同时作为独立分配资源的单位;而对于拥有资源的单位,不必频繁切换,进而提出了线程的概念。

2. 线程的概念

线程是系统独立调度和 CPU 分配的最小单位,它是进程中的一个实体,除拥有运行中必不可少的资源(程序计数器、寄存器和栈等)外,不拥有其他系统资源,故而又称轻量级进程。尽管线程不拥有系统资源,但它可与同属一个进程的其他线程一起共享该进程所拥有的全部资源。

多线程环境下,进程是系统进行资源分配的基本单位,仍然有一个进程控制和用户地址空间(如 CPU、I/O资源、文件以及其他资源等)。线程是 CPU 调度和分派的基本单位,拥有自己的独立堆栈和线程控制块,它是进程的组成部分,且能在进程中并发执行。线程和进程是两个既相互联系又相互区别的概念:

  • 划分尺度:线程是进程的一个执行单元,因而粒度更小。
  • 资源分配:进程是资源分配的基本单位,而线程不拥有系统资源,此外,同一进程内多个线程可共享该进程的资源。
  • 地址空间:进程拥有独立的地址空间,而线程不拥有独立的系统空间,但它与其他线程一起共享所属进程的地址空间。
  • CPU 调度:线程是 CPU 调度的基本单位。
  • 并发执行:一个进程可包含多个线程,但每个线程只能属于一个进程,因而线程并发程度更高。

每个进程可包含多个线程,它们共享所属进程所拥有的资源及地址空间,因而可访问相同的数据。由此可见,线程可以大大减少程序并发执行时所付出的时间和空间开销,从而极大地提高了系统效率

3. 线程有哪些状态?

线程与进程类似,在整个运行期间具有三种状态:

  • 就绪态:线程已经具备了各种执行条件,若获得 CPU 便可以立即执行。
  • 运行态:线程已经获得了 CPU,并处于执行过程中。
  • 阻塞态:线程在执行中,因某事件出现而受到阻塞,处于暂停执行状态。

线程之间的转换和进程状态之间的转换相同。由于线程不是资源的拥有单位,因此没有挂起状态。此外,若进程由于系统性能原因而被挂起,则它所包含的所有线程都必须对换出去。

4. 线程由哪几部分组成?

在结构组成方面,线程由线程控制块、用户堆栈、系统堆栈以及一组 CPU 状态寄存器和一个私用内存存储区组成。线程控制块是线程是否存在的唯一标志,它通常包括线程标识符、一组寄存器(程序计数器、状态寄存器和通用寄存器)、线程运行状态、优先级、线程专有存储区(用于线程切换时存放现场保护信息等)、信号屏蔽、堆栈指针等。

猜你喜欢

转载自blog.csdn.net/dilixinxixitong2009/article/details/80869775