• 用户态切换到内核态的方式


    概述

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

           CPU中有一个标志字段,标志着线程的运行状态。用户态和内核态对应着不同的值,用户态为3,内核态为0。

    用户态切换到内核态的方式:

    • 系统调用
      • 进程调用:exit、fork
      • 文件系统访问:chmod、chown
      • 设备调用:read、write
      • 信息读取:读取设备信息
      • 通信:mmap、pipe等
    • 中断
    • 异常

    系统调用

           这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现。

    异常

           当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

    外围设备的中断

           当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

           这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。

  • 相关阅读:
    设计模式的六大原则
    如何提升网站排名和用户体验:优化网站速度
    Day45-9大内置对象、JSP标签、JSTL标签、EL表达式、JavaBean
    vue开发在线表格
    java数据结构与算法刷题-----LeetCode27:移除元素
    WPF —— Calendar日历控件详解
    Spark AQE
    小爱开直播了,欢迎大家微观
    Python画小仓鼠
    Spring IoC源码:createBean(下)
  • 原文地址:https://blog.csdn.net/weixin_44515978/article/details/126339739