文章目录

  • linux基础
  • 系统调用和库函数的区别
  • 为什么要区分用户态和内核态?
  • 用户态和内核态的切换耗费时间的原因
  • 哪些情况会出出现用户态和内核态的切换
  • 用户态切换到内核态的三种方式

linux基础

linux的kernel内核外是系统调用,系统调用外是shell、库函数,而应用程序则在最外层

系统调用和库函数的区别

  • 内核:屏蔽了调用各硬件资源的细节
  • 系统调用:内核提供给用户调用的接口,但系统调用的可移植性差
    移植性差的原因:windows、linux内核的系统调用是不同的,比如:同一个功能提供给用户的函数名、参数都不相同,会出现从一个系统移植到另一个系统无法正常运行。
  • 库函数:为了解决系统调用移植新差的问题,同时封装windows和linux系统调用,对用户提供一个的函数(接口)。
  • 系统调用在内核地址空间执行,而库函数是在用户地址空间调用。

为什么要区分用户态和内核态?

在CPU指令中,有些指令是非常危险的,如果错用将导致系统崩溃,比如清内存、设置时钟等,所以CPU将指令分为特权指令和非特权指令。对于危险指令,只允许操作系统及其相关模块使用,普通应用程序只能使用不危险的指令。

  • Intel的CPU将特权等级分为4个级别:Ring0~Ring3,而Linux使用Ring3级别运行用户态,Ring0作为内核态。
  • 操作系统启动时对内存进行了划分,操作系统的数据都是存放于内核空间的,用户进程的数据是存放于用户空间的。处于用户态级别的程序只能访问用户空间,而处于内核态级别的程序可以访问用户空间和内核空间。
  • 当一个进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核态

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

内核为上层应用使用CPU、存储、IO等硬件资源提供了接口,即系统调用,如果一个应用程序需要用到内核资源,就需执行系统调用的相关语句。
(1)当执行系统调用时,首先会保存现场,然后通过系统调用到内核态执行,最后内核态变为用户态执行用户程序时,需要恢复用户态的现场。
在进入内核的时候需要保存用户态的寄存器,在内核态返回用户态的时候会恢复这些寄存器的内容。

(2)每个线程都有两个栈:用户栈和内核栈,当执行系统调用时,线程就会由用户栈切换到内核栈,而内核代码对用户不信任,需要进行额外的检查。
Linux | 为什么用户态和内核态的切换耗费时间?

哪些情况会出出现用户态和内核态的切换

  • 线程间的切换(上下文):线程上下文切换时,前一个线程的线程线程(切换前最后时刻的数据和指令)会被保存到内核中,而切换回来时需要从内核空间中读取数据恢复现场。
  • Syncronized锁的获取和释放:使用内核中monitor对象

用户态切换到内核态的三种方式

  • 当程序在用户态需要申请外部资源(如声卡、网卡、U盘、磁盘)时,需要从用户态切换到内核态,主要有3种情况需要申请外部资源:
    (1)系统调用
    举例: 创建线程时,需要通过pthread函数库调用内核来创建
    (2)中断
    举例: 当外围设备完成用户请求的操作后,会想CPU发送中断信号。这时CPU会暂停执行下一条指令(用户态)转而执行与该中断信号对应的中断处理程序
    (3)异常:某些异常如缺页异常只能由内核进行处理

用户态和内核态的简单理解相关推荐

  1. 从根上理解用户态与内核态

    欢迎来到操作系统系列,采用图解 + 大白话的形式来讲解,让小白也能看懂,帮助大家快速科普入门. 本篇文章开始探秘用户态与内核态,虽然一般面试不会问这个,但搞清楚这块,对我们理解整个计算机系统是及其有意 ...

  2. java运行在用户态_理解Linux用户态和内核态

    Linux整体架构图 我们先来看一张Linux整体架构图. 系统调用 ​ 系统调用时操作系统的最小功能单位.根据不同的应用场景,不同的Linux发行版本提供的系统调用数量也不尽相同,大致在240-35 ...

  3. 用户态与内核态的区别与理解

    用户态与内核态的区别与理解 先给大家看看Linux进程的地址空间,如下: 对于Linux内核态的地址空间,3G-4G是大家共享的.这里存放的是整个内核的代码和所有的内核模块以及内核所维护的数据. 1. ...

  4. 用户态和内核态的理解和区别

    1.linux进程有4GB地址空间,如图所示: 3G-4G大部分是共享的,是内核态的地址空间.这里存放整个内核的代码和所有的内核模块以及内核所维护的数据. 2.特权级的概念: 对于任何操作系统来说,创 ...

  5. Linux用户态和内核态

    究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例 ...

  6. 多线程之:用户态和内核态的区别

    一:大话版用户态和内核态 (1)用户态和内核态的概念? --->内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序 ---& ...

  7. 操作系统基础知识用户态和内核态的区别

    这节课给你带来了一道非常经典的面试题目:用户态线程和内核态线程有什么区别? 这是一个组合型的问题,由很多小问题组装而成,比如: 用户态和内核态是什么? 用户级线程和内核级线程是一个怎样的对应关系? 内 ...

  8. IO操作底层调用过程 | 用户态切换内核态原理 | 中断概念

    IO操作底层调用过程|内核|中断| 做后端的程序员都知道我们编写的程序主要分方法程序和IO操作程序. 有什么不一样呢? 方法程序就不多说了.IO程序有什么不同呢?IO操作指的是对硬件设备操作,比如键盘 ...

  9. 「操作系统」什么是用户态和内核态?为什么要区分

    「操作系统」什么是用户态和内核态?为什么要区分 参考&鸣谢 从根上理解用户态与内核态 程序员阿星 并发编程(二十六)内核态和用户态 Lovely小猫 操作系统之内核态与用户态 fimm 文章目 ...

最新文章

  1. DIY自己的AI助理,萝莉御姐暖男霸道总裁全凭你定义,微软小冰团队发布新框架...
  2. 语音识别2:CTC对齐的算法
  3. python的yield和yield from
  4. 数据导入和整理模块---pandas
  5. js正则表达exec和match的区别(转)
  6. html提交form预处理,HTML5 之图片上传预处理
  7. 阿里云开源的Blink,计算能力很疯狂:一眨眼,全部都算好!
  8. 冯乐乐 unity_Unity常用矩阵运算的推导补遗——切线空间
  9. 四大步骤做好需求调研
  10. 窗体控件绑定数组 c# 1613698204
  11. antd权限管理_推荐6款超好看实用的管理后台模版
  12. 【Kafka】报错:Error while fetching metadata with correlation id 1 : {topic_lcc=LEADER_NOT_AVAILABLE}
  13. Smart Client Software Factory 初试
  14. redis面试常问--缓存穿透
  15. php 微信 token 刷新,自动更新微信access token
  16. 拟合和统计中的检验参数
  17. 他们都来全球边缘计算大会了,就差你了!
  18. 名士高罗佩:谁把狄仁杰推上了世界舞台?作家金满楼新浪博客
  19. 租的房子里有无线路由器有ip和dns服务器无密码可以联网吗,没网怎么设置路由器?...
  20. HTS快速交易接口——itpdk_typedef.h中关于ifdef _Windows系统无法识别的问题

热门文章

  1. 8.固若金汤 网站的安全架构
  2. STM32笔记:STM32F407的TIM1和TIM2同步配置
  3. python cookiejar_Python http.cookiejar模块:管理cookie
  4. python绘图函数教程_Python:海龟绘图(七)——初识函数
  5. 企业如何做客户分级和团队分组?
  6. ACM--火星文--HDOJ 1075--What Are You Talking About--map
  7. 【优化版】(终稿)C++实现科学计算器主函数代码(含调用函数)
  8. utf-8 中的一个汉字占几个字节
  9. SpringCloud微服务Zuul网关动态路由
  10. MATLAB GUI报错“创建控件失败,ProgIDMWLED.LEDCtrl.1无效”的原因