当前位置: 首页 > news >正文

操作系统用户态和核心态和CPU上下文切换

目录

  • 操作系统用户态和核心态
    • 用户态和核心态
    • 操作系统用户态和核心态是如何交换的
    • 系统调用
  • CPU上下文
    • 什么是CPU上下文和CPU上下文切换
    • CPU为什么要进行上下文切换

操作系统用户态和核心态

用户态和核心态

 
操作系统两种状态:用户态和内核态。
操作系统的用户态和内核态是操作系统的两种运行状态,出现这两种状态的原因主要是为了对访问能力进行限制,用户态的权限较低,而内核态的权限较高。

  • 用户态:用户态允许的程序只能受限访问内存,只能读取用户程序的数据,也就是处于用户态的CPU只能受限访问内存,并且不允许访问外围设备(包括网卡,硬盘等),用户态下CPU不允许独占,也就是说CPU能够被其他程序获取。
  • 内核态:内核态允许的程序可以访问计算机的任何数据和资源,不受限制,包括外围设备,也就是处于内核态的CPU能访问任意数据,包括外围设备,处于内核态的CPU可以从一个程序切换到另一个程序,并且不会发生CPU抢占的情况。
     

  当应用程序需要访问操作系统提供的资源或者执行一些特权操作时,需要从用户态切换到内核态,由操作系统内核来完成相应的操作。用户态下的应用程序只能访问自己的内存空间和一些受限的资源,不能直接访问操作系统资源的外围设备(包括网卡,硬盘等),也不能指向特权操作。用户态和内核态之间的切换需要一定的时间和资源,因此应该尽量减少切换次数,来提高系统的性能和稳定性。
 

操作系统用户态和核心态是如何交换的

 
  用户态和内核态的交换是通过系统调用(System Call)来实现的,当应用程序需要访问系统提供的资源或执行特权操作时,它会通过系统调用请求操作系统内核来完成相应的操作,系统调用是一种特殊的函数调用,它可以将应用程序从用户态切换到内核态,并将控制器交给操作系统内核。内核态下的操作系统内核会执行相应操作,并将结果返回给应用程序。完成操作后,操作系统内核将控制器重新交回应用程序,使其回到用户态。
  系统调用是用户态和内核态之间重要的接口,也是应用程序访问操作系统资源和执行特权的唯一途径。系统调用的实现需要一定的系统资源和开销,因此它的使用应该尽量减少,以提高系统的性能和稳定性。
 

系统调用

 
从用户态到内核态的转变,需要通过系统调用来完成。比如,当我们查看文件内容时,就需要多次系统调用来完成:首先调用 open() 打开文件,然后调用 read() 读取文件内容,并调用 write() 将内容写到标准输出,最后再调用 close() 关闭文件。系统调用会将CPU从用户态切换到核心态,以便 CPU 访问受到保护的内核内存。
系统调用的过程会发生 CPU 上下文的切换,CPU 寄存器里原来用户态的指令位置,需要先保存起来。接着,为了执行内核态代码,CPU 寄存器需要更新为内核态指令的新位置。最后才是跳转到内核态运行内核任务。
而系统调用结束后,CPU 寄存器需要恢复原来保存的用户态,然后再切换到用户空间,继续运行进程。所以,一次系统调用的过程,其实是发生了两次 CPU 上下文切换。

注意:系统调用过程中,并不会涉及到虚拟内存等进程用户态的资源,也不会切换进程。
系统调用过程通常称为特权模式切换,而不是进程上下文切换。
 

CPU上下文

什么是CPU上下文和CPU上下文切换

 
  CPU寄存器包括指令寄存器和程序计数器。他们是用来暂存指令、数据和地址,以及程序运行的下一条指令的地址,这些都是任务运行时的必要环境,这些也被称为CPU 上下文。上下文切换就是把当前任务的CPU上下文保存起来,然后加载新任务的上下文到这些指令寄存器和程序计数器等寄存器中,这些被保存起来的上下文被存储到操作系统的内核中,等待任务调度执行时再次加载进来,这样就能保证任务的原来状态不受影响,让任务看起来是运行的。

 

CPU为什么要进行上下文切换

 
  当多个进程竞争CPU的时候,为了保证每个进程可以公平被CPU调用,采用处理任务按照CPU时间片的机制,当某个时间片上的任务到达最后的时间点,那么这个任务就被挂起,然后CPU处理下一个任务,由于CPU处理的速度非常快,在人类的感知上认为是并行处理的,实际上是伪并行,同一个时间只有一个任务能被CPU运行处理

 

http://www.lryc.cn/news/107140.html

相关文章:

  • TSINGSEE青犀视频汇聚平台EasyCVR视频广场面包屑侧边栏支持拖拽操作
  • RocketMQ发送消息超时异常
  • WordPress做权重站:二级目录伪静态写法
  • 浅谈下API初步认知
  • LeetCode--剑指Offer75(2)
  • 基于vue-cli3的vue项目 通过postcss-pxtorem 实现px自动转换成rem并解决版本问题
  • 前端开发常用的方法封装(二)
  • 【Java】Springboot脚手架生成初始化项目代码
  • LLaMA系列 | LLaMA和LLaMA-2精简总结
  • 运动蓝牙耳机什么款式好、适合运动的蓝牙耳机推荐
  • 在敏捷项目中如何做好资源规划?
  • mybatis-plus 用法
  • 重测序数据分析流程丨操作步骤与代码与代码脚本
  • npm -v无法显示版本号
  • 【Vue】父子组件值及方法传递使用
  • 医药化工企业洁净厂房改造消防防爆安全的重要性
  • Web开发中防止SQL注入
  • 【LeetCode-中等】剑指 Offer 35. 复杂链表的复制(详解)
  • QT图形视图系统 - 使用一个项目来学习QT的图形视图框架 -第一篇
  • Cat.1如何成为物联网业务加速器?
  • Qt应用开发(基础篇)——布局管理 Layout Management
  • Python web实战之 Django 的 ORM 框架详解
  • pycharm制作柱状图
  • 静态资源导入探究
  • 安全狗V3.512048版本绕过
  • prometheus监控k8s kube-proxy target down
  • SPSS数据分析--假设检验的两种原假设取舍决定方式
  • Python实现猫狗分类
  • pjsip、pjsua2+bcg729 windows下编译java版本
  • 尝试多数据表 sqlite