进程,线程切换

2023-09-20 10:35:22

目录

Linux线程切换:

Linux进程切换:

进程切换和线程切换的区别

虚拟地址空间切换耗时的原因


Linux线程切换:

Linux线程切换的实现涉及到操作系统的调度和线程上下文的切换。

线程上下文包括程序计数器(PC)和寄存器值,以及线程的堆栈和堆栈指针等。

操作系统通过调度器决定哪个线程将获得CPU时间片来执行。

当一个线程被操作系统调度器选中时,线程上下文会从CPU寄存器和内存中保存。然后,操作系统会将另一个线程的上下文加载到CPU中,这个新的线程开始执行,之前的线程则被暂停。

在 Linux 中,有两种类型的线程:用户线程和内核线程。用户线程是应用程序中的线程,内核线程则是由操作系统创建和管理的线程。用户线程的调度是由用户空间的调度器完成的,而内核线程的调度则是由内核空间的调度器完成的。

Linux线程切换的实现有两种情况:

  • 如果前后两个线程属于不同进程,那么线程切换就跟进程切换一样,需要保存和恢复所有的资源和寄存器。
  • 如果前后两个线程属于同一个进程,那么线程切换只需要保存和恢复线程的私有数据和寄存器,因为虚拟内存等资源是共享的。

线程切换的实现主要涉及到以下几个步骤:

  • 保存当前线程的上下文:当一个线程被抢占时,它的上下文将被保存到内存中。这个过程包括将程序计数器(PC)和寄存器中的值保存到线程的内存区域中。
  • 选择下一个线程:操作系统的调度器从就绪队列中选择下一个将要执行的线程,并将其上下文从内存中读取到CPU寄存器中。
  • 恢复下一个线程的上下文:调度器将下一个线程的上下文从内存中读取到CPU寄存器中,并开始执行新的线程。
  • 执行新线程:CPU开始执行新的线程,直到发生抢占或线程完成。如果线程完成,操作系统将释放线程的资源,如果发生抢占,重复步骤1-3。

Linux采用一对一的线程模型,用户线程切换与内核线程切换之间的差别非常小。同时,如果忽略用户主动放弃用户线程的执行权(yield)带来的开销,则只需要考虑内核线程切换的开销。

总的来说,Linux线程切换的实现是一个复杂的过程,涉及到多个组件和操作系统的核心机制。不过,操作系统的调度器和线程库已经对这个过程进行了封装和优化,使得开发者可以方便地使用线程来编写高效的并发程序。

Linux进程切换:

进程切换就是上下文切换。

进程切换和线程切换的区别

这里说的是相同进程下的线程。

最主要的一个区别在于进程切换涉及虚拟地址空间的切换而线程不会。因为每个进程都有自己的虚拟地址空间,而线程是共享所在进程的虚拟地址空间的,因此同一个进程中的线程进行线程切换时不涉及虚拟地址空间的转换。

虚拟地址空间切换耗时的原因

现在我们已经知道了进程都有自己的虚拟地址空间,把虚拟地址转换为物理地址需要查找页表,页表查找是一个很慢的过程,因此通常使用Cache来缓存常用的地址映射,这样可以加速页表查找,这个cache就是TLB。由于每个进程都有自己的虚拟地址空间,那么显然每个进程都有自己的表,那么当进程切换后页表也要进行切换,页表切换后TLB就失效了,cache失效导致命中率降低,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢,而线程切换则不会导致TLB失效,因为线程线程无需切换地址空间,因此我们通常说线程切换要比较进程切换块,原因就在这里。
 

更多推荐

SpringBoot整合Redis,基于Jedis实现redis各种操作

前言(三步教你学会redis,主打一个实用)springboot整合redis步骤,并基于jedis对redis数据库进行相关操作,最后分享非常好用、功能非常全的redis工具类。第一步:导入maven依赖<!--springboot整合redis--><dependency><groupId>org.springfr

C++11的半同步半异步线程池

C++11的半同步半异步线程池简介同步队列Take函数Add函数Stop函数SyncQueue完整代码线程池主函数测试简介半同步半异步线程池用的比较多,实现也比较简单。其中同步层包括同步服务层和排队层,指的是将接收的任务排队,将所有的任务排队到一个队列中,等待处理;异步层指多个线程处理任务,异步处理层从同步层取出任务,

shell编程之循环

循环是当循环控制条件为真时,一系列命令迭代执行的代码块。1、for循环语法:forargin[list]这是shell中最基本的循环结构,它与C语言形式的循环有着明显的不同。forargin[list]docommand(s)...done在循环的过程中,arg会从list中连续获得每一个变量的值。forargin"$

深拷贝与浅拷贝,就是这么简单

目录1.拷贝的概念2.浅拷贝2.1.浅拷贝的定义2.2.浅拷贝的实现方式2.3在内存中:3.深拷贝3.1.深拷贝的定义3.2.深拷贝的实现方式3.3在内存中4.深拷贝与浅拷贝的区别5.原型模式与深浅拷贝的关系6.总结1.拷贝的概念在编程中,拷贝(或复制)是常见的操作之一。拷贝操作用于创建一个新对象或数据结构,使其具有与

Mybatis-Plus入门(1)

单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是MybatisPlus.官方网站如下:简介|MyBatis-Plus当然,MybatisPlus不仅仅可以简化单表操作,而且还

【NLP入门教程】目录

当今,自然语言处理(NaturalLanguageProcessing,NLP)已经成为计算机科学与人工智能领域的重要研究方向之一。它涉及计算机如何理解、分析和生成人类语言,使得计算机可以与人类进行自然而流畅的交流。NLP的应用范围广泛,涵盖机器翻译、文本分类、情感分析、问答系统、语音识别等诸多领域。本教程旨在为初学者

【完全攻略】畅游NLP海洋:HuggingFace的快速入门

目录前言一、HuggingFace介绍1-1、HuggingFace的介绍1-2、安装二、Tokenizer分词库:分词工具2-0、加载BertTokenizer:需要传入预训练模型的名字2-1、使用Tokenizer对句子编码:2-2、使用增强Tokenizer对句子编码:2-3、批量编码单个句子:2-4、添加新词:

【Cocos Creator 3.5实现赛车游戏】10.实现汽车节点的运动逻辑

转载知识星球|深度连接铁杆粉丝,运营高品质社群,知识变现的工具项目地址:赛车小游戏-基于CocosCreator3.5版本实现:课程的源码,基于CocosCreator3.5版本实现上一节的学习后,您已经完成了对汽车节点的控制逻辑,所在在这一章您将会实现让汽车节点去响应对汽车的控制。在这之前您需要想一下真实世界中汽车的

IntelliJ IDEA 2023 年下载、安装教程、好用插件推荐

文章目录下载与安装IDEA常用插件推荐AlibabaJavaCodingGuidelines(阿里巴巴Java开发规约)KeyPromoterX(IDEA快捷键提示)Translation(翻译插件)SaveActions(优化保存插件)CodotaAIAutocomplete(代码自动提示和推荐)Autofillin

Python基于Flask的高校舆情分析,舆情监控可视化系统

目录一、前言二、使用Python爬取舆情数据1.安装requests库2.分析数据3.爬取数据三、通过代理IP提高数据爬取效率1.获取代理IP2.使用代理IP四、使用Flask框架实现舆情监控可视化系统五、使用MongoDB存储数据六、总结一、前言在当今社会,舆情监控越来越被重视。随着互联网技术的发展,我们从传统媒体渠

系统性能调优:提升服务器响应速度

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

热文推荐