【操作系统篇】第四篇——线程(概念,实现方式,模型,状态与转换)

简介: 【操作系统篇】第四篇——线程(概念,实现方式,模型,状态与转换)

什么是线程


在一个程序中的多个执行线路就叫做线程。

更准确的定义:

线程是一个进程内部的一个控制序列,或者说是执行流(轻量级的进程)。(CPU调度执行的单位)一个进程至少有一条线程,即就是main函数所代表的执行序列,称为主线程。通过线程库可以创建线程--函数线程;主线程仅仅是代表进程执行的第一条线程而已,当主线程通过线程库创建出函数线程以后,两个线程就没有任何区别。


另外线程不拥有系统资源,线程会共享进程的系统资源。

image.png

为什么要引入线程


有的进程可能需要"同时"做很多事,而传统的进程只能串行地执行一系列程序。为此,引入了"线程",来增加并发度。

image.png

引入线程后,线程成为了程序执行流的最小单位。

线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内页可以并发处理各种任务(如QQ,视频,文字聊天,传文件)

引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打印机,内存地址空间等都是分配给进程的).线程则作为处理机的分配单元

引入线程后,有什么变化


资源分配,调度

  • 传统进程机制中,进程是资源分配,调度的基本单位。
  • 引入线程后,进程是资源分配的基本单位,线程是调度的基本单位

并发性

  • 传统进程机制中,只能进程间并发
  • 引入线程后,各线程间也能并发,提升了并发度

系统开销

  • 传统的进程间并发,需要切换进程的运行环境,系统开销很大
  • 线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小
  • 引入线程后,并发所带来的系统开销减小

类比:

去图书馆看书。桌子=处理机,人=进程,看不同的书=线程。切换进程运行环境:有一个不认识的人要用桌子,你需要把你的书收走,他把自己的书放到桌上

同一进程内的线程切换=你得室友要用这张书桌,可以不把桌子上的书收走。

线程的属性


  • 线程是处理机调度的基本单位
  • 多CPU计算机中,各个线程可占用不同的CPU
  • 每个线程都有一个线程ID,线程控制块(TCB)
  • 线程也有就绪,阻塞,运行三种基本状态
  • 线程几乎不拥有系统资源
  • 同一进程的不同线程间共享进程的资源
  • 由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预
  • 同一进程中的线程切换,不会引起进程切换
  • 不同进程中的线程切换,会引起进程切换
  • 切换同进程内的进程,系统开销很小
  • 切换进程,系统开销较大

线程的实现方式


用户级线程


有关线程管理的所有工作都由应用程序完成,内核意识不到多线程的存在。

用户级线程仅存在于用户空间中,此类线程的创建、撤销、线程之间的同步与通信功能,都无法利用系统调用来实现。


应用程序需要通过使用线程库来控制线程。 通常,应用程序从单线程起始,在该线程中开始运行,在其运行的任何时刻,可以通过调用线程库中的派生创建一个在相同进程中运行的新线程。由于线程在进程内切换的规则远比进程调度和切换的规则简单,不需要进行用户态/核心态切换,所以切换速度快。


用户线程多见于一些历史悠久的操作系统,例如Unix操作系统。


因为用户级线程驻留在用户空间,且管理和控制它们的线程也在用户空间,每个线程并不具有自身的线程上下文,所以它们对于操作系统是不可见的,这也就是它无法被调度到处理器内核的原因。


操作系统认为所有的进程都是单线程的,因此,就线程的同时执行而言,任意给定时刻每个进程只能够有一个线程在运行,而且只有一个处理器内核会被分配给该进程。对于一个进程,可能有成千上万个用户级线程,但是它们对系统资源没有影响。运行时库调度并分派这些线程。

image.png

从代码的角度来看,线程其实就是一段代码逻辑。下面三段代码逻辑上可以看作三个"线程'.while循环就是一个最弱智对的"线程库",线程库完成了对线程的管理工作(如调度)

image.png

思考:

1.线程的管理工作由谁来完成?

2.线程切换是否需要CPU变态?

3.操作系统是否能意识到用户级线程的存在?

4.这种线程的实现方式有什么优缺点?

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

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

3.在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。"用户级线程"就是"从用户视角看能看到的线程"

4.优缺点

优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高

缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。

内核级线程


内核线程建立和销毁都是在内核的支持下运行,由操作系统负责管理,通过系统调用完成的。

线程管理的所有工作由内核完成,应用程序没有进行线程管理的代码,只有一个到内核级线程的编程接口。内核为进程及其内部的每个线程维护上下文信息,调度也是在内核基于线程架构的基础上完成。

image.png

大多数现代操作系统都实现了内核级线程,如Windows、 Linux

内核线程驻留在内核空间,它们是内核对象。操作系统调度器管理、调度并分派这些线程。运行时库为每个用户级线程请求一个内核级线程,将用户进程映射或绑定到上面。用户线程在其生命期内都会绑定到该内核线程。一旦用户线程终止,两个线程都将离开系统。这被称作”一对一”线程映射。


内核空间内为每一个内核支持线程设置了一个线程控制块(TCB),内核根据该控制块,感知线程的存在,并进行控制。


操作系统的内存管理和调度子系统必须要考虑到数量巨大的用户级线程。您必须了解每个进程允许的线程的最大数目是多少。操作系统为每个线程创建上下文。进程的每个线程在资源可用时都可以被指派到处理器内核,这些线程可以在全系统内进行资源的竞争。


思考:


1.线程的管理工作由谁来完成?


2.线程切换是否需要CPU变态?


3.操作系统是否能意识到用户级线程的存在?


4.这种线程的实现方式有什么优缺点?

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

2.线程调度、切换等工作都由内核负责,因此 内核级线程的切换必然需要在 核心态下才能完成。

3.操作系统会为每个内核级线程建立相应的TCB(Thread Control Block,线程控制块),

通过 TCB 对线程进行管理。 “内核级线程” 就是 “从操作系统内核视角看能看到的线程”

4.优缺点

优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。

缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

多线程模型


多对一模型


多对一模型:多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程。

优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高

缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行

image.png

一对一模型


一对一模型:一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。

优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。

缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

image.png

多对多模型


多对多模型:n 用户及线程映射到 m 个内核级线程(n >= m)。每个用户进程对应 m 个内核级线程。 克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一模型中一个用

户进程占用太多内核级线程,开销太大的缺点。

可以这么理解:

用户级线程是“代码逻辑”的载体 ;内核级线程是“运行机会”的载体。

内核级线程才是处理机分配的单位 。例如:多核CPU环境下,左边这个进程最多能被分配两个核。

内核级线程中可以运行任意一个有映射关系的用户级线程代码,只有两个内核级线程中正在运行的代码逻辑都阻塞时,这个进程才会阻塞

image.png

线程的状态与转换


image.png

线程组织与控制


image.png

相关文章
|
1月前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
7天前
|
编解码 自然语言处理 JavaScript
智谱发布GLM-OS概念及Agent产品,CogAgent-9B模型开源助力GUI交互场景
11月29日,智谱正式提出 GLM-OS 概念,并发布 AutoGLM 和 GLM-PC 两款 Agent 产品。近期GLM-PC 的基座模型—— CogAgent-9B 开源,供社区进一步开发。
|
1月前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
1月前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
62 4
|
2月前
|
API 数据处理 C语言
探索操作系统:从基础概念到实际应用
本文将带你进入操作系统的世界,了解它的基本概念、发展历程和应用场景。我们将一起探讨操作系统的核心功能、体系结构以及它在计算机系统中的重要作用。同时,我们还将介绍一些常见的操作系统类型,并分析它们的特点。最后,通过一个简单的代码示例,展示操作系统在实际应用中的重要作用。让我们一起揭开操作系统的神秘面纱,探索它的奥秘吧!
|
2月前
|
机器学习/深度学习 人工智能 Anolis
手把手教学攻略:在Anolis OS上部署OpenVINO深度学习模型
Anolis OS 作为国内首个正式提供 OpenVINO 开发包和镜像的服务器端操作系统,推动国内 AI 推理生态和能力的升级。
|
2月前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
2月前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
48 2
|
2月前
|
调度 Python
深入浅出操作系统:进程与线程的奥秘
【10月更文挑战第28天】在数字世界的幕后,操作系统悄无声息地扮演着关键角色。本文将拨开迷雾,深入探讨操作系统中的两个基本概念——进程和线程。我们将通过生动的比喻和直观的解释,揭示它们之间的差异与联系,并展示如何在实际应用中灵活运用这些知识。准备好了吗?让我们开始这段揭秘之旅!
|
2月前
|
Linux 调度
探索操作系统核心:进程与线程管理
【10月更文挑战第24天】在数字世界的心脏,操作系统扮演着至关重要的角色。它不仅是计算机硬件与软件之间的桥梁,更是管理和调度资源的大管家。本文将深入探讨操作系统的两大基石——进程与线程,揭示它们如何协同工作以确保系统运行得井井有条。通过深入浅出的解释和直观的代码示例,我们将一起解锁操作系统的管理奥秘,理解其对计算任务高效执行的影响。