【OSTEP】并发:线程与多线程

2024-04-05 05:44
文章标签 线程 并发 多线程 ostep

本文主要是介绍【OSTEP】并发:线程与多线程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

" A flow of control within a process that consists of a PC, a register set and a stack space"

 本章将介绍为单个运行进程提供的新抽象 —— 线程 (thread) 

  • 线程是 \textrm{CPU} 调度的一个基本单位(basic unit of CPU scheduling)
  • 一个单独的线程至少有自己的寄存器状态,通常还有自己的栈。

" 在同一进程中可以创建多个线程,并共享代码、地址空间和进程的操作资源 "

❓ 思考:那么问题来了,线程和多线程的区别是什么?

这里有一个经典观点就是:一个程序只有一个执行点,但多线程有多个执行点。

 就让荀彧 (不是苟或!!!) 来给大家举个栗子:

  • 线程:一个程序计数器,用来存放要执行的指令。
  • 多线程:多个程序计数器,每个都用于取指令和执行。

多线程每个线程都类似于独立的线程,所以没有什么太大的区别,它们只有一点区别 ——

 (线程之间共享地址空间,从而能够访问相同的数据)

💡 区别:多线程 共享 地址空间  。因此,单个线程的状态与进程状态非常类似。

线程有一个程序计数器(\textrm{PC}),用于记录程序从哪里获取指令。

 每个线程都有自己的一组用于计算的寄存器,没错就是这么牛啤,人手一套的那种。

所以,如果有两个线程运行在同一处理器上,从运行一个线程 T1 切换到另一个线程 T2 时:

必定会发生 上下文切换 (context switch),我们讲过进程的上下文切换,它是通过 PCB 解决的。 

而线程的上下文切换也是类似于进程的上下文切换的,线程是通过 TCB 解决的。

  • 对于进程:我们将状态保存到进程控制块(PCB )
  • 对于线程:我们要保存每个线程的状态,就需要一个或多个线程控制块(TCB

 但是!与进程相比,线程的上下文切换有 "一点" 不同!

🔍 主要区别:线程的上下文切换,地址空间保持不变(这意味着不需要切换当前使用的页表)。

  • 当 T1\rightarrow T2 时,T1 的寄存器状态被保存,T2 的寄存器状态被恢复,地址空间保持不变。
  • 线程的创建和切换成本是很低的,非常的便宜,因为它们只需要一个栈和存储寄存器。

在多个线程中,每个线程独立运行,不是地址空间中只有一个栈,而是每个线程都有一个栈。

💭 假设:有一个多线程的进程,它有两个线程,结果地址空间看起来不同:

  • 从图中可以观察到,两个栈跨越了进程的地址空间,因此所有位于栈上的变量、参数、返回值和其他能放在栈上的东西,将被放置在线程本地 (thread-loacl) 存储的地方。
  • 多个栈也破坏了地址空间布局的美感,以前,堆和栈可以互不影响的增长,直到空间耗尽。而现在多个栈就没有这么简单了,值得庆幸的是,通常栈不会很大(除非大量使用递归程序)。

为什么要用线程?为什么?因为快!

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2022.
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau, Operating Systems: Three Easy Pieces

A. Silberschatz, P. Galvin, and G. Gagne,

Operating System Concepts, 9th Edition, John Wiley & Sons, Inc., 2014, ISBN 978-1-118-09375-7.

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

这篇关于【OSTEP】并发:线程与多线程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/877754

相关文章

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

SpringBoot3中使用虚拟线程的完整步骤

《SpringBoot3中使用虚拟线程的完整步骤》在SpringBoot3中使用Java21+的虚拟线程(VirtualThreads)可以显著提升I/O密集型应用的并发能力,这篇文章为大家介绍了详细... 目录1. 环境准备2. 配置虚拟线程方式一:全局启用虚拟线程(Tomcat/Jetty)方式二:异步

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

python多线程并发测试过程

《python多线程并发测试过程》:本文主要介绍python多线程并发测试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、并发与并行?二、同步与异步的概念?三、线程与进程的区别?需求1:多线程执行不同任务需求2:多线程执行相同任务总结一、并发与并行?1、

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren