用户态和内核态之间的切换

  1. 切换方式

从用户态到内核态切换可以通过三种方式,或者说会导致从用户态切换到内核态的操作:

系统调用,这个上面已经讲解过了,在我公众号之前的文章也有讲解过。其实系统调用本身就是中断,但是软件中断,跟硬中断不同。系统调用机制是使用了操作系统为用户特别开放的一个中断来实现,如 Linux 的 int 80h 中断。
异常:如果当前进程运行在用户态,如果这个时候发生了异常事件,会触发由当前运行进程切换到处理此异常的内核相关进程中
外围设备中断:外围设备完成用户请求的操作之后,会向CPU发出中断信号,这时CPU会转去处理对应的中断处理程序。

  1. 代价何在

当发生用户态到内核态的切换时,会发生如下过程(本质上是从“用户程序”切换到“内核程序”)

设置处理器至内核态。
保存当前寄存器(栈指针、程序计数器、通用寄存器)。
将栈指针设置指向内核栈地址。
将程序计数器设置为一个事先约定的地址上,该地址上存放的是系统调用处理程序的起始地址。

而之后从内核态返回用户态时,又会进行类似的工作。
3. 如何避免频繁切换

用户态和内核态之间的切换有一定的开销,如果频繁发生切换势必会带来很大的开销,所以要想尽一切办法来减少切换。这也是面试常考的问题。

3.1 减少线程切换

因为线程的切换会导致用户态和内核态之间的切换,所以减少线程切换也会减少用户态和内核态之间的切换。那么如何减少线程切换呢?

无锁并发编程。多线程竞争锁时,加锁、释放锁会导致比较多的上下文切换。(为什么加锁和释放锁会导致上下文切换,看文末的补充解释)
CAS算法。使用CAS避免加锁,避免阻塞线程
使用最少的线程。避免创建不需要的线程
协程。在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换

3.2 一个面试问题

I/O 频繁发生内核态和用户态切换,怎么解决。

首先要同意这个说法,即I/O会导致系统调用,从而导致内核态和用户态之间的切换。因为对I/O设备的操作是发生在内核态。那如何减少因为I/O导致的系统调用呢?答案是:使用户进程缓冲区。下面解释一下原因

用户进程缓冲区

你看一些程序在读取文件时,会先申请一块内存数组,称为buffer,然后每次调用read,读取设定字节长度的数据,写入buffer。之后的程序都是从buffer中获取数据,当buffer使用完后,在进行下一次调用,填充buffer。所以说:用户缓冲区的目的就是是为了减少系统调用次数,从而降低操作系统在用户态与核心态切换所耗费的时间。除了在进程中设计缓冲区,内核也有自己的缓冲区。

内核缓存区

当一个用户进程要从磁盘读取数据时,内核一般不直接读磁盘,而是将内核缓冲区中的数据复制到进程缓冲区中。但若是内核缓冲区中没有数据,内核会把对数据块的请求,加入到请求队列,然后把进程挂起,为其它进程提供服务。等到数据已经读取到内核缓冲区时,把内核缓冲区中的数据读取到用户进程中,才会通知进程,当然不同的IO模型,在调度和使用内核缓冲区的方式上有所不同。

小结

图中的read,write和sync都是系统调用。read是把数据从内核缓冲区复制到进程缓冲区。write是把进程缓冲区复制到内核缓冲区。当然,write并不一定导致内核的缓存同步动作sync,比如OS可能会把内核缓冲区的数据积累到一定量后,再一次性同步到磁盘中。这也就是为什么断电有时会导致数据丢失。所以说内核缓冲区,可以在OS级别,提高磁盘IO效率,优化磁盘写操作。
4. 补充解释

为什么加锁和释放锁会导致上下文切换

Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。但是由于使用Mutex Lock需要将当前线程挂起并从用户态切换到内核态来执行,这种切换的代价是非常昂贵的因此,这种依赖于操作系统Mutex Lock所实现的锁我们称之为“重量级锁”。
————————————————

原文链接:https://blog.csdn.net/qq_42052956/article/details/111562280

用户态和内核态之间的切换相关推荐

  1. 操作系统用户态和内核态之间的切换过程

    操作系统用户态和内核态之间的切换过程 1. 用户态和内核态的概念区别 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重 ...

  2. 用户态与内核态之间切换详解

    用户空间和内核空间 用户程序有用户态和内核态两种状态.用户态就是执行在用户空间中,不能直接执行系统调用.必须先切换到内核态,也就是系统调用的相关数据信息必须存储在内核空间中,然后执行系统调用. 操作硬 ...

  3. 操作系统 | 用户态和内核态的切换(中断、系统调用与过程(库函数)调用)

    文章目录 中断 过程调用 系统调用 过程调用和系统调用的区别 中断 用户态.内核态之间的切换是怎么实现的? 用户态→内核态 是通过中断实现的.并且 中断是唯一途径 . 核心态→用户态 的切换是通过执行 ...

  4. 系统调用原理与用户态以及内核态相互切换过程,以linux系统为主

    1. 讲系统调用前需要清楚的几个基本概念 1.1 内核态与用户态 内核态:当CPU执行内核的代码(CPU堆栈指针指向内核堆栈)时,我们就称此时处于内核态,内核态的代码可以使用特权指令,这些指令可以控制 ...

  5. 用户态和内核态的切换

    用户态和内核态的切换 我们经常说,一个程序依赖DMA设备来减少用户态和内核态的切换次数,以此来提升性能.那么对于它的细节是如何进行的呢?本篇,博主与你一起研究一下用户态和内核态的划分,以及这件事情的前 ...

  6. Linux系统编程33:进程信号之详解信号的捕捉过程,用户态和内核态及其切换,sigaction和signal

    文章目录 (1)用户态和内核态 (2)用户态和内核态的切换 (3)内核是如何实现信号的捕捉 (4)sigaction (1)用户态和内核态 我们说过,每个Linux进程有4GB的地址空间 其中0-3G ...

  7. 用户态和内核态的切换耗费时间的原因

    用户态和内核态的切换耗费时间的原因 总的来说,就是线程切换或者加锁解锁都是因为需要用户态和内核态的切换,从而导致的开销大. 应用程序的执行需要依托内核提供的资源,包括CPU.存储.IO等,因此内核提供 ...

  8. 进程用户态和内核态及其切换过程

    1.进程的堆栈 内核在创建进程的时候,会为进程创建相应的堆栈.每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间.当进程在用户空间运行时,CPU堆栈指针寄存器里面的内容是用户堆 ...

  9. 进程用户态和内核态及其切换过程(转)

    1.进程的堆栈 内核在创建进程的时候,会为进程创建相应的堆栈.每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间.当进程在用户空间运行时,CPU堆栈指针寄存器里面的内容是用户堆 ...

最新文章

  1. 计算机操作员考评标准,计算机操作员职业技能鉴定标准.doc
  2. matlab 高斯模糊_摸鱼 | 茴香豆的“茴”有四种写法,模糊有几种糊法?
  3. basys2数码管共阳还是共阴_数据选择器Multiplexer || 数码管动态显示 ||实现逻辑函数 || 重难考点 || 数电...
  4. NDK 开发实战 - 封装 java 层 sdk 模型
  5. sql语句为什么大写居多_懂EXCEL就会SQL,从此查数不求人
  6. asp.net 两个控件放一行_思维导图?试试这两个宝藏网站吧
  7. 任正非卸任上海华为董事;百度“云手机”今日线上发布;Inkscape 1.0 RC 版发布 | 极客头条...
  8. linux下怎么解压tar.xz,Linux下解压.tar.xz格式文件的方法
  9. LNMP 1.2/1.3+升级Nginx、MySQL/MariaDB、PHP教程
  10. unigui web app之title buttons
  11. Druid 在有赞的实践
  12. 轻松搭建docker应用的mesos集群
  13. 装机吧盘点电脑自动重启的解决办法
  14. C语言课程设计题目介绍(10个标准题目)
  15. php 随机输出字符串,如何使用PHP生成随机字符串
  16. android webview 跳转系统浏览器,webview 调用系统浏览器怎么解决
  17. 嵌入式分享合集106
  18. python基础: os.path.realpath()、os.path.getcwd()、 os.path.abspath() 的区别
  19. IDEA build时提示错误信息: java: System Java Compiler was not found in classpath
  20. 眼科刀行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)

热门文章

  1. java总结 --4.过滤器
  2. 解决Spring JPA删除方法报错问题
  3. 网络舆情分析公司哪家的系统好推荐
  4. 【云小课合集】华为云小课最全合集来了,让您上云无忧
  5. 什么是视频号?为什么视频号暂停申请?
  6. 第一次创业一定要轻资产,初次创业失败几乎是必然,如何总结教训爬起来继续前行、如何保存力量东山再起才是关键
  7. c++(sum求和---静态数据成员)
  8. QQ宣布即将关停这功能,网友炸了 !!!
  9. 晶圆测试中的pinforce
  10. 计算机主机电池,电脑(服务器)主板电池没电,会有什么影响?