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

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

线程

线程概念

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

线程(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.组合方式

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

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

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

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

希望对你有帮助!加油!

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

目录
相关文章
|
1月前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
151 0
|
21天前
|
安全
List并发线程安全问题
【10月更文挑战第21天】`List` 并发线程安全问题是多线程编程中一个非常重要的问题,需要我们认真对待和处理。只有通过不断地学习和实践,我们才能更好地掌握多线程编程的技巧和方法,提高程序的性能和稳定性。
127 59
|
10天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
12天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
13天前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
28 2
|
14天前
|
调度 Python
深入浅出操作系统:进程与线程的奥秘
【10月更文挑战第28天】在数字世界的幕后,操作系统悄无声息地扮演着关键角色。本文将拨开迷雾,深入探讨操作系统中的两个基本概念——进程和线程。我们将通过生动的比喻和直观的解释,揭示它们之间的差异与联系,并展示如何在实际应用中灵活运用这些知识。准备好了吗?让我们开始这段揭秘之旅!
|
2月前
|
存储 消息中间件 资源调度
「offer来了」进程线程有啥关系?10个知识点带你巩固操作系统基础知识
该文章总结了操作系统基础知识中的十个关键知识点,涵盖了进程与线程的概念及区别、进程间通信方式、线程同步机制、死锁现象及其预防方法、进程状态等内容,并通过具体实例帮助理解这些概念。
「offer来了」进程线程有啥关系?10个知识点带你巩固操作系统基础知识
|
1月前
|
算法 安全 调度
深入理解操作系统:进程与线程的管理
【10月更文挑战第9天】在数字世界的心脏跳动着的,不是别的,正是操作系统。它如同一位无形的指挥家,协调着硬件与软件的和谐合作。本文将揭开操作系统中进程与线程管理的神秘面纱,通过浅显易懂的语言和生动的比喻,带你走进这一复杂而又精妙的世界。我们将从进程的诞生讲起,探索线程的微妙关系,直至深入内核,理解调度算法的智慧。让我们一起跟随代码的脚步,解锁操作系统的更多秘密。
37 1
|
1月前
|
Java
【编程进阶知识】揭秘Java多线程:并发与顺序编程的奥秘
本文介绍了Java多线程编程的基础,通过对比顺序执行和并发执行的方式,展示了如何使用`run`方法和`start`方法来控制线程的执行模式。文章通过具体示例详细解析了两者的异同及应用场景,帮助读者更好地理解和运用多线程技术。
26 1
|
19天前
|
Linux 调度
探索操作系统核心:进程与线程管理
【10月更文挑战第24天】在数字世界的心脏,操作系统扮演着至关重要的角色。它不仅是计算机硬件与软件之间的桥梁,更是管理和调度资源的大管家。本文将深入探讨操作系统的两大基石——进程与线程,揭示它们如何协同工作以确保系统运行得井井有条。通过深入浅出的解释和直观的代码示例,我们将一起解锁操作系统的管理奥秘,理解其对计算任务高效执行的影响。