线程的魔法:揭开现代操作系统并发执行的面纱

简介: 线程的魔法:揭开现代操作系统并发执行的面纱

线程

线程概念

现代操作系统中,进程作为资源拥有者,而调度和运行的属性赋予新的实体——线程

线程(Thread)是进程中实施调度和分派的基本单位。

线程引入

传统进程的两个基本属性:
资源的拥有者:

每个进程有自己的地址空间,保存进程映像,控制一些资源(文件,I/O设备),有状态、优先级、调度

调度单位

进程是一个执行轨迹

以上两个属性构成进程并发执行的基础


系统管理传统进程必须完成的操作:

  • 创建进程
  • 撤消进程
  • 进程切换

缺点:负载重,时间空间开销大,限制并发度的提高

将进程的上述两个属性分开,线程因而产生。

引人进程的目的是为了使多个程序并发执行,以改善资源利用率、提高系统吞吐量。

线程的引人是为了减少程序并发执行时的所付出的时空开销。

1.线程的组成

  • 每个线程有一个thread结构,即线程控制块TCB用于保存自己私有的信息,主要由以下4个基本部分组成:

  • 线程必须在某个进程内执行
  • 一个进程可以包含一个线程或多个线程

2.线程的状态

与进程相似,线程也有若干种状态

  • 运行状态:线程在CPU上执行
  • 就绪状态:具备运行条件,一旦分到CPU,可以马上投入运行
  • 阻塞状态:线程在等待某个事件发生
  • 终止状态:线程完成任务后

线程的状态转换是在一定的条件下实现的

3.线程的管理

线程创建:调用thread_create创建新线程,建立thread结构,分配栈结构等,设置为就绪状态,放入就绪队列

线程终止:线程完成工作后,调用thread_exit终止自身

线程等待:调用thread wait等待指定线程终止此时该线程处于阻塞状态,指定线程终止时转为就绪态

线程让权:调用thread_yield放弃CPU,让给另外的线程运行

4.线程和进程的关系

  1. 一个进程可以有多个线程,但至少要有一个线程;而一个线程只能在一个进程的地址空间内活动。
  2. 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
  3. 处理机分配给线程,即真正在处理机上运行的是线程。
  4. 线程在执行过程中需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
  • 由于线程拥有较少的资源,但又具有传统进程的许多特性,有的把线程叫做轻型进程(light weightprocess, LWP),
  • 把传统的进程叫做重型进程(heavy weightprocess,HWP),可把它看成拥有一个线程的进程。

5.引入线程的好处

①线程切换开销少。
②提高并发性。
③提升响应能力。
④利于充分发挥多处理器的效能。

线程的引用使系统设计变得复杂

无论是采用多进程还是一个进程的多线程来实现其并发性都是合理的,用哪一种结构更有效则取决于应用程序的要求。

线程的实现

很多系统中已经实现线程,如Solaris2,Windows2000,Linux,Java语言

实现线程的方式主要有:

  • 在用户空间实现
  • 在核心空间实现
  • 组合方式:将用户级线程和核心级线程结合在一起,取长补短

1.在用户空间实现线程

把线程库整个地放在用户空间,内核对线程一无所知。

在用户空间实现线程的优点
  1. 线程切换速度很快。
  2. 调度算法可以是应用程序专用的。
  3. 用户级线程可以运行在任何操作系统上,包括不支持线程机制的操作系统。
用户级线程的主要缺点
  1. 系统调用的阻塞问题
  2. 在单纯用户级线程方式中,多线程应用程序不具有多处理器的优点。

2.在内核空间实现线程

内核知道线程存在,并对它们实施管理。

  1. 在多处理器系统中,内核可以同时调度同一进程的多个线程
  2. 如果一个进程的某个线程阻塞了,内核可以调度同一个进程的另一个线程。
  • 优点:克服了用户级线程方式的主要缺陷;内核线程本身也可以是多线程的。
  • 主要缺点:控制转移开销大。

3.组合方式

把用户级线程和内核级线程两种方式结合在一起,吸收二者优点,克服各自不足

内核只知道内核级线程,也只对它们实施调度

实现组合方式有不同的模型:

  • 多对一模型
  • 一对一模型
  • 多对多模型

希望对你有帮助!加油!

若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!

目录
相关文章
|
3月前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
275 0
|
1月前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
2月前
|
安全
List并发线程安全问题
【10月更文挑战第21天】`List` 并发线程安全问题是多线程编程中一个非常重要的问题,需要我们认真对待和处理。只有通过不断地学习和实践,我们才能更好地掌握多线程编程的技巧和方法,提高程序的性能和稳定性。
235 59
|
1月前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
2月前
|
安全 Java
线程安全的艺术:确保并发程序的正确性
在多线程环境中,确保线程安全是编程中的一个核心挑战。线程安全问题可能导致数据不一致、程序崩溃甚至安全漏洞。本文将分享如何确保线程安全,探讨不同的技术策略和最佳实践。
51 6
|
2月前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
71 6
|
2月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
2月前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
2月前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
2月前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
46 2