前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你该懂得操作系统知识—内核态和用户态

你该懂得操作系统知识—内核态和用户态

作者头像
早安嵩骏
发布2020-08-11 16:22:11
1.6K0
发布2020-08-11 16:22:11
举报
文章被收录于专栏:程序猿人程序猿人

概念

现代操作系统一般将 OS 划分非若干层次,再将 OS 的不同功能分别设置在不同的层次中。通常将一些与硬件紧密相关的模块(如中断处理程序等)、各种常用设备的驱动程序以及运行频率较高的模块(如时钟管理、进程调度和许多模块所公用的一些基本操作),都安排在紧靠硬件的软件层次中,将它们常驻内存,即通常所称为的OS 内核。这种安排方式的目的在于两个方面:

  1. 便于对这些软件进行保护,防止遭受其他应用程序的破坏;
  2. 可以提高 OS 的运行效率。

内核的功能一般包括支撑功能(包括中断处理、时钟管理、原语操作)和资源管理功能(进程管理、存储器管理、设备管理)两大方面。为了防止 OS 本身及关键数据(如 PCB 等)遭受到应用程序有意或者无意的破坏,通常也将处理机的执行状态分为系统态和用户态两种:

  1. 系统态:又称管态,也称为内核态。它具有较高的特权,能执行一切指令,访问所有的寄存器和存储区,传统的 OS 都在系统态运行。
  2. 用户态:又称为目态。它具有较低特权的执行状态,仅能执行规定的指令,访问指定的寄存器和存储区。一般情况下,应用程序只能在用户态运行,不能去执行 OS 指令及访问 OS 区域,这样可以防止应用程序对 OS 的破坏。

相应地,现代操作系统将 CPU 的指令集分为特权指令和非特权指令两类,这种限制是由硬件实现的。

  1. 所谓特权指令,就是系统态时运行的指令,是关系到系统全局的指令。其对内存空间的访问范围基本不受限制,不仅能访问用户存储空间,也能访问系统存储空间,如启动各种外部设备、设置系统时钟时间、关中断、清主存、修改存储器管理寄存器、执行停机指令、转换执行状态等。特权指令只允许操作系统使用,不允许应用程序使用,否则会引发程序混乱。
  2. 非特权指令是在用户态时运行的指令。一般应用程序所使用的都是非特权指令,它只能完成一般性的操作和任务,不能对系统中的硬件和软件直接进行访问,其对内存的访问范围也局限于用户控件。这样,可以防止应用程序的运行异常对系统造成破坏。

用户态和内核态的切换

当系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成一些用户态自己没有权限完成的操作时,就会切换到内核态;这类 CPU 的上下文切换常常称之为“特权模式切换”,它与一般的上下文切换并不相同,一般的上下文切换肯定涉及进程或者线程的改变,而用户态到内核态的切换则是一个调用的过程,并不一定会带来进程或者线程的切换。

从用户态切换到内核态有三种方式:

  1. 系统调用这是用户态进程主动要求切换到内核态的一种方式。用户态进程通过系统调用申请使用操作系统提供的服务程序来完成工作;系统调用是通过终端机制来实现的。
  2. 异常当 cpu 在执行运行在用户态的程序时,发生了一些没有预知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关进程中,也就是切换到了内核态;
  3. 外围设备的中断当外围设备完成用户请求的操作后,会向 CPU 发出相应的中断信号,这时 CPU 会暂停执行下一条即将要执行的指令而转到与中断信号对应的处理程序中去执行。如果前面执行的指令是用户态下的程序,那转换自然就是由用户态到内核态的转换;

用户态到内核态具体切换步骤

  1. 从当前进程的描述符中提取其内核栈的 ss0 及 esp0 信息。
  2. 使用 ss0 和 esp0 指向的内核栈将当前进程的 cs,eip,eflags,ss,esp 信息保存起来,这个过程也完成了由用户栈找到内核栈的切换过程,同时保存了被暂停执行的程序的下一条指令
  3. 将先前由中断向量检索得到的中断处理程序的 cs,eip 信息装入相应的寄存器,开始执行中断处理程序,这时就转到了内核态的程序执行了。

其实就是一个保存当前的运行上下文(主要包括一些寄存器,栈等),调用系统中断进入内核态,使用系统指令完成操作,然后再恢复进程的过程(。

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

每次上下文切换都需要几十纳秒到数微秒的 CPU 时间。具体可看关于内核态和用户态切换开销的测试[1]。在实际的开发中,我们也应当尽量去避免这种切换,例如 netty 封装FileChannel.transferTo通过调用OS的sendfile()实现零拷贝正是从降低用户态到内核态的频繁转换和数据拷贝来降低资源消耗的。

参考资料

[1]

关于内核态和用户态切换开销的测试: https://www.cnblogs.com/sfireworks/p/4428972.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念
  • 用户态和内核态的切换
  • 用户态到内核态具体切换步骤
  • 用户态和内核态之间的切换消耗
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档