1. Unix/Linux的体系架构

从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。内核从本质上看是一种软件,它控制计算机的硬件资源,并提供上层应用程序运行的环境。用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。为了使上层应用能够访问到这些资源,内核必须为上层应用提供访问的接口:即系统调用。

系统调用是操作系统的最小功能单位,每个系统调用都会实现一个简单的操作。在应用程序中可以调用所需的系统调用来完成任务,但是对于复杂的任务,需要频繁地调用大量的系统调用,这势必会增加程序员的负担。库函数正是为了将程序员从复杂的细节中解脱出来而提出的一种有效方法。它实现对系统调用的封装,将简单的业务逻辑接口呈现给用户,方便用户调用。这样的一种组成方式极大增强了程序设计的灵活性,对于简单的操作,我们可以直接调用系统调用来访问资源,对于复杂操作,我们借助于库函数来实现。

2. 用户态和内核态

内核态和用户态的概念,是操作系统为了有效实现CPU的权限分级和数据隔离而提出的。因为系统的资源是有限的,如果用户都去随意地访问和使用这些资源,会造成冲突和混乱。为了使得程序在系统上正常运行,Unix/Linux对不同的操作赋予不同的权限等级,Linux操作系统中主要采用了0和3两个特权级,分别对应内核态和用户态。运行于用户态的进程可以执行的操作和访问的资源都会受到极大的限制,而运行在内核态的进程则可以执行任何操作并且在资源的使用上没有限制。在用户态运行的程序,在运行过程中,一些操作需要内核的权限才能执行,这是就会涉及到一个从用户态切换到内核态的过程。

3. 线程切换的开销

我们都知道,线程切换会带来开销,如果频繁进行线程切换,所造成的开销是相当可观的。那么为什么线程切换会有开销呢,有哪些开销呢?这里涉及几个概念:CPU上下文切换、线程上下文切换、特权模式切换(内核态和用户态的互相转换)。

CPU上下文切换

在多任务操作系统中,对于一个CPU而言,它并不是一直为一个任务服务直到任务结束的,而是在不同的任务之间切换,使得多个任务轮流使用CPU。而在每个任务运行前,CPU都需要知道任务从哪里加载、此时的状态、从哪里开始运行,也就是说,需要系统事先帮它设置好CPU寄存器程序计数器,这些内容就是CPU上下文

稍微详细描述一下,CPU上下文切换可以认为是内核在 CPU 上对于进程(包括线程)进行以下的活动:(1)挂起一个进程,将这个进程的CPU 上下文存储于内存中的某处,(2)在内存中检索下一个进程的上下文并将其在 CPU 的寄存器中恢复,(3)跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行),以恢复该进程。

CPU上下文切换的分为几个不同的场景:进程上下文切换,线程上下文切换,中断上下文切换

线程上下文切换

当从一个线程切换到另一个线程时,不仅会发生线程上下文切换,还会发生特权模式切换。

首先,既然是线程切换,那么一定涉及线程状态的保存和恢复,包括寄存器、栈等私有数据。另外,线程的调度是需要内核级别的权限的(操作CPU和内存),也就是说线程的调度工作是在内核态完成的,因此会有一个从用户态到内核态的切换。而且,不管是线程本身的切换还是特权模式的切换,都要进行CPU的上下文切换。本质上都是从“一段程序”切换到了“另一段程序”,都要设置相应的CPU上下文。要明确一个问题,那就是内核也是有代码的,只是这些代码的机密性比较高,我们用户态无法访问。(要理清这几个概念的关系)

总结来说,线程切换过程包括:线程上下文的保存和恢复,用户态和内核态的转换,CPU上下文的切换,这些工作都需要CPU去完成,是一笔不小的开销

参考文章

linux体系架构

CPU上下文切换详解

深入理解CPU上下文切换

Linux | 用户态和内核态的切换耗费时间的原因

怎样去理解Linux用户态和内核态?

写给Java程序员看的,CPU 上下文切换、用户态、内核态、进程与线程上下文切换(转)

为什么线程切换开销大相关推荐

  1. linux 线程切换开销,协程 用户级(内核级)线程 切换开销 协程与异步回调的差异...

    今天先是看到多线程级别的内容,然后又看到协程的内容. 基本的领会是,协程是对异步回调方式的一种变换,同样是在一个线程内,协程通过主动放弃时间片交由其他协程执行来协作,故名协程. 而协程很早就有了,那时 ...

  2. java中线程切换的开销

    思路: 开三个线程A,B,C 线程A不断的调用LockSupport.park()阻塞自己,一旦发现自己被唤醒,调用Thread.interrupted()清除interrupt标记位,同时增加自增计 ...

  3. 线程的创建开销大吗?线程创建开销包括哪些?线程池

    1-1. 关于时间,创建线程使用是直接向系统申请资源的,这里调用系统函数进行分配资源的话耗时不好说. 关于资源,Java线程的线程栈所占用的内存是在Java堆外的,所以是不受java程序控制的,只受系 ...

  4. 应用退出前不让线程切换_用户级线程和内核级线程,你分清楚了吗?

    前天晚上有个伙伴私信我说在学进程和线程,问我有没有好的方法和学习教程,刚好我最近也在备相关的课. 班上不少学生学的还是很不错的.拿班上小白和小明的例子吧(艺名哈).小明接受能力很强,小白则稍差些. 关 ...

  5. 浅谈linux线程模型和线程切换

    本文从linux中的进程.线程实现原理开始,扩展到linux线程模型,最后简单解释线程切换的成本. 刚开始学习,不一定对,好心人们快来指正我啊啊啊!!! linux中的进程与线程 首先明确进程与进程的 ...

  6. linux yield_通俗易懂的了解——Linux线程模型和线程切换

    本文从linux中的进程.线程实现原理开始,扩展到linux线程模型,最后简单解释线程切换的成本. linux中的进程与线程 首先明确进程与进程的基本概念: 进程是资源分配的基本单位 线程是CPU调度 ...

  7. linux yield_带你通俗易懂的了解——Linux线程模型和线程切换

    本文从linux中的进程.线程实现原理开始,扩展到linux线程模型,最后简单解释线程切换的成本. linux中的进程与线程 首先明确进程与进程的基本概念: 进程是资源分配的基本单位 线程是CPU调度 ...

  8. java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之OS_Part_1整起(进程线程协程并发并行、进程线程切换进程间通信、死锁\进程调度策略、分段分页、交换空间、OS三大调度机制)

    PART0:OS,这货到底是个啥? OS,是个啥? OS的结构们: 存储器: 存储器的层次结构: 内存:我们的程序和数据都是存储在内存,我们的程序和数据都是存储在内存,每一个字节都对应一个内存地址.内 ...

  9. 获取返回值作为变量_解决多线程间共享变量线程安全问题的大杀器——ThreadLocal...

    微信公众号:Zhongger 我是Zhongger,一个在互联网行业摸鱼写代码的打工人! 关注我,了解更多你不知道的[Java后端]打工技巧.职场经验等- 上一期,讲到了关于线程死锁.用户进程.用户线 ...

  10. 线程切换是如何给 CPU 洗脑的?

    计算机系统中有很多程序员习以为常但又十分神秘的存在:函数调用.系统调用.进程切换.线程切换以及中断处理. 函数调用能让程序员提高代码可复用性,系统调用能让程序员向操作系统发起请求,进程线程切换让多任务 ...

最新文章

  1. 【laravel5.4】laravel5.4系列之生成_ide_helper.php文件
  2. 关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器
  3. 转: java web demo的示例
  4. 【渝粤题库】陕西师范大学500004 电动力学
  5. 用html5做淡出淡入效果,在Html5 canvas中淡入淡出
  6. 聊天系统服务器端类图怎么画,聊天系统服务器端类图
  7. android关于截屏,关于android截屏知识的学习
  8. 百度竞价点击器_同等预算,百度竞价托管如何让您的点击量高于您同行?
  9. Mysql --- 索引
  10. 【工具】支付宝免费卡校验接口调用及常用银行简称整理
  11. linux的显示器设置
  12. 前端H5 使用百度统计进行埋点
  13. 新浪igame连连看游戏截图
  14. 2022年3月显示器主观科普与配置选型
  15. qq邮件exchange服务器,解决Exchange邮件系统无法接收QQ邮件的问题
  16. 招商银行笔试题之爱吃喵粮的小招喵
  17. 高中会考计算机都考啥,高中会考都有哪些科目
  18. Visual Studio 2022 中的键盘快捷方式
  19. Aliyun 阿里云 机器翻译调用 详解
  20. 客户案例 | 初窥元宇宙,Oasis让更多人找到第二人生

热门文章

  1. 科大讯飞:5年内 科技会场没机器人端茶倒水就太low了
  2. 消息中间件activemq-5.13.0安全验证配置
  3. Selenium关于滚动条的定位方法总结
  4. 使用rsync+inotify配置触发式(实时)远程同步
  5. [BZOJ4540][HNOI2016]序列(莫队)
  6. Python 过滤a文件中每一行内容,保存到b文件中
  7. ComicEnhancerPro 系列教程
  8. 利用Code First在MVC4中创建数据驱动应用程序
  9. Silverlight实用窍门系列:20.后台CS代码中创建四种常用的动画效果【附带源码实例】...
  10. android重新打开应用程序,关于安卓应用后台运行后,重新进入,应用重新打开问题...