操作系统——用户态与内核态、同步与异步、阻塞与阻塞

文章目录

  • 什么是用户态与内核态
  • 同步与异步、阻塞与非阻塞
  • 四种组合方式

什么是用户态与内核态

计算机系统中,通常 CPU 执行两种不同性质的程序代码:一种是操作系统内核程序(管理程序);另一种是用户自编程序(即系统外层的应用程序,或简称 “应用程序”)。CPU 运行这两种不同性质的程序,就是操作系统中最基本的两种运行模式:用户态和内核态。

先来说一些废话

程序执行目的就是操作计算机中的各种硬件资源,每个程序最终都会编程二进制语言来操作硬件,从而实现某种具体功能。这样一说,好像可以不用操作系统,每个程序自己就是操作系统了。行吗?肯定不行啊。应用程序大多是高级语言编写的,你会将高级语言编译成二进制语言吗?这时你会说“我不会”,但有牛人会编写,并提供编译工具给大家使用。好,即使你的程序已经转换成二进制语言了,那你知道接下来如何和硬件进行交互来操作硬件,这么多程序都要来使用有限的硬件,那到底是给你用还是给他用,谁有权力管理这些硬件资源、制定使用规则。这时你又会说“我不会”,但总牛人知道怎么和硬件交互,有这个能力来编写代码来统一管理资源并制定使用规则,我们这些普通人达成共识都遵循他的规则就行。这…我无法反驳了,因为这个牛人编写的代码就是操作系统了。

操作系统可以让你编写的应用程序代码与硬件交互,同时管理不同应用程序如何有序使用硬件资源,所有应用程序都是运行在操作系统之上的。所以一定要保证操作系统安全运行,才能确保上层应用程序正常运行。

操作系统经过这么多年的发展,由优秀科技人才经过深思熟虑写出来的程序,肯定比应用程序代码逻辑要严格。(形象化例子)既然大家都认同我(操作系统),我就有权利和责任让大家稳定运行,那大家就应该遵循和支持我制定的规则,并在我制定的规则内运行。我也想尽最大努力让大家方便快速地使用所需硬件资源,但这些资源都是有限的,怎么管理和使用(各种硬件的使用、内存管理、进程管理等),大家都不清楚,所以这些资源和功能我不能都对大家开放,我需要统一管理起来,才能合理分配,有什么需求就告诉我,我知道怎么使用这些资源并计算得到你想要的结果,你只需要在外面等我一会儿,我就会把结果返回给你。

什么是用户态和内核态?

程序运行其实是CPU处理计算这段程序代码,所以更好的理解用户态和内核态,可以从CPU的角度去看待。

  • 当CPU在计算用户应用程序代码时,此时CPU所处状态就是用户态;
  • 当CPU在计算操作系统内核代码时,此时CPU所处状态就是内核态。

即用户态是普通应用程序运行的模式,内核态是操作系统内核运行的模式。

为什么要区分用户态或内核态这两种运行模式?

在用户态下,程序只能访问自己分配的内存空间,不能直接访问操作系统内核提供的资源,如硬件设备、内存管理、进程管理等。内核负责管理硬件设备、进程调度、内存管理、文件系统等核心功能,内核态就是为了保证系统安全、稳定运行。从下面几个角度对比:

  1. 安全性和稳定性:
    如果所有的程序都运行在最高特权级别的内核态,一个程序的错误或恶意行为都可能导致整个系统崩溃。
    通过将应用程序限制在用户态,即使出现错误也不会直接影响到整个操作系统的稳定性。
  2. 资源访问控制:
    内核拥有对硬件资源的完全控制权,包括CPU、内存、外设等。
    如果所有程序都直接访问硬件资源,将会造成资源的冲突和安全隐患。
    通过用户态和内核态的隔离,操作系统可以有效地管理和调度系统资源的访问。
  3. 系统调用机制:
    用户态程序需要通过系统调用来请求操作系统内核提供的服务,如文件读写、进程管理等。
    系统调用是用户态程序与内核交互的主要方式,它提供了一个受控的接口,保证了系统的安全性。

用户态与内核态切换:

前面说了用户态与内核态是CPU执行的两种状态,好像CPU可以随意切换去执行用户程序还是应用程序。这当然是可以的,但要考虑CPU在这两种状态下切换所带来的开销对系统性能的影响。

当发生用户态到内核态的切换时,CPU需要保存当前用户态进程的执行状态(如寄存器、程序计数器等),这样再切回来时才能知道上次执行到哪里了,同时还要加载内核态进程的执行状态。同样,从内核态切换回用户态时,也需要进行相反的上下文切换操作。上下文切换需要大量的内存读写操作,会消耗CPU和内存带宽,造成一定的性能损耗。

其次,用户态程序和内核态程序访问内存的方式不同,用户态程序的内存访问受到限制,而内核态程序可以访问全部内存空间。
在切换的过程中,CPU需要切换内存管理单元(MMU)的页表设置,以适应不同的内存访问模式。这种切换也需要消耗一定的CPU时间和资源。以及指令集切换、系统调用都会造成性能开销。

同步与异步、阻塞与非阻塞

同步与异步、阻塞与非阻塞这两个概念经常看见,很容易混淆,所以在这里通过对比的方式解释并比较两者的区别:

  1. 对象
    • 同步与异步是指用户空间程序调用内核空间程序的发起方式,针对的是两个对象调用关系;
    • 阻塞与非阻塞指的是用户空间程序的一种执行状态,针对的是用户空间程序的执行状态。
  2. 目的
    • 同步与异步的目的是调用方获取被调用方返回的结果,但获取方式存在区别:
      • 同步:A 调用 B,由调用方 A 盲目主动询问 B 操作是否完成并获取返回结果的方式;
      • 异步:A 调用 B,由被调用方 B 主动回调或通知调用方任务已完成并获取返回结果的方式;
    • 阻塞与非阻塞的目的是用户空间程序是否继续执行。
      • 阻塞:用户空间程序调用某个耗时操作,用户空间程序需要等待这个操作完成才能继续执行;
      • 非阻塞:用户空间程序调用某个耗时操作,不需要等待这个操作完成就可以继续执行面的程序。

总结起来:同步与异步关注的是调用方获取被调用方响应结果的方式:同步(调用方主动获取)、异步(回调或通知,即调用方被动接收);阻塞与非阻塞关注的是调用方在调用耗时操作(被调用方)时,自己本身的执行情况:阻塞(操作未完成,调用方原地等待,不执行后面的程序),非阻塞(操作未完成,调用方先跳过,继续执行后面的程序)。

四种组合方式

同步与异步、阻塞与非阻塞可以有四种组合方式:同步阻塞、同步非阻塞、异步阻塞和异步非阻塞,下面已IO操作为例进行简单讲解:

  1. 同步阻塞(Synchronous Blocking)
    特点:线程发起I/O操作后,线程会被阻塞,直到I/O操作完成获取同步结果。
    缺点:线程在等待I/O期间无法做其他事情,系统吞吐量较低。
  2. 同步非阻塞(Synchronous Non-Blocking)
    特点:线程发起I/O操作后立即返回,线程不阻塞,I/O操作未完成期间,线程可以继续执行其他任务,需要主动轮询检查I/O操作是否完成。
    缺点:需要自己实现轮询机制,增加了编程复杂度。
  3. 异步阻塞(Asynchronous Blocking)
    特点:线程发起I/O操作后,线程会被阻塞,直到I/O操作完成,通过IO回调或通知等异步方式告知线程获取结果。
    缺点:这种毫无意义。线程在IO操作期间已被阻塞,异步通知完全是多余,直接等待同步获取结果就可以了。
  4. 异步非阻塞(Asynchronous Non-Blocking)
    特点:线程发起I/O操作后立即返回,线程不阻塞,线程可以继续执行其他任务,通过IO回调等异步方式通知线程获取结果。不要线程主动轮询,减轻了线程的负担。
    缺点:需要实现异步通知机制,编程复杂度较高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/17905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

欢乐钓鱼大师攻略大全,游戏自动辅助,钓鱼大全!

欢迎来到《欢乐钓鱼大师》的攻略大全!本文将为你详细介绍游戏中的各类玩法、技巧和注意事项,帮助你快速掌握游戏精髓,成为一名真正的钓鱼大师。攻略内容包括新手鱼竿选择、锦标赛攻略、实用技巧、藏宝图玩法、箱子开法等多个方面。让我们一起…

生成式AI模型大PK——GPT-4、Claude 2.1和Claude 3.0 Opus

RAG(检索增强生成)系统的新评估似乎每天都在发布,其中许多都集中在有关框架的检索阶段。然而,生成方面——模型如何合成和表达这些检索到的信息,在实践中可能具有同等甚至更大的意义。许多实际应用中的案例证明,系统不仅仅要求从上…

Leecode热题100---二分查找---搜索插入位置

题目: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 nums 为 无重复元素 的 升序 排列数组 常规思路: class Solution { public:int f…

管理node——NVM安装及使用

NVM安装及使用 前言正文下载安装及配置一、卸载原有的node版本(很重要!!!)- 卸载node- 清除npm相关文件 二、安装nvm,添加镜像1.nvm自定义安装位置2.nodejs版本存放位置- 未解决,无限踩坑- 已解…

crossover玩游戏缺少文件怎么办 为什么游戏打开说缺失文件 crossover支持的游戏列表 CrossOver 提示 X 11 缺失怎么办?

CrossOver是一款类虚拟机软件,可以实现在Mac电脑上运行exe程序。不少Mac用户为了玩游戏,选择使用CrossOver这款软件玩Windows平台的游戏。 一、CrossOver支持的软件多吗 CrossOver是一款基于Wine的兼容工具,它可以让你在Mac或Linux上运行许多…

大数据开发面试题【Flink篇】

148、flink架构 flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算 特点: 高吞吐和低延迟:每秒数百万个事件,毫秒级延迟 结果的准确性:提供了事件时间和处理时间语义,提供结果的一致…

解读makefile中的.PHONY

在 Makefile 中,.PHONY 是一个特殊的目标,用于声明伪目标(phony target)。伪目标是指并不代表实际构建结果的目标,而是用来触发特定动作或命令的标识。通常情况下,.PHONY 会被用来声明一组需要执行的动作&a…

某有赞滑块验证码

⚠️前言⚠️ 本文仅用于学术交流。 学习探讨逆向知识,欢迎私信共享学习心得。 如有侵权,联系博主删除。 请勿商用,否则后果自负。 网址 aHR0cHM6Ly9wYXNzcG9ydC55b3V6YW4uY29tL2xvZ2luL3Bhc3N3b3Jk 1. 首先来分析一下参数 1_1. get-beh…

@ConfigurationProperties结合Nacos配置动态刷新之底层原理分析

Hello,我是大都督周瑜,本文给大家分析一下ConfigurationProperties结合Nacos配置动态刷新的底层原理,记得点赞、关注、分享哦! 公众号:IT周瑜 应用背景 假如在Nacos中有Data ID为common.yml的配置项: m…

上海一儿童写真馆摄影师大量售卖女童照片!当你的肖像权或隐私权被侵犯时应如何写起诉状?

上海一儿童写真馆摄影师大量售卖女童照片!当你的肖像权或隐私权被侵犯时应如何写起诉状? 近日,上海市一儿童写真馆摄影师被指大量售卖女童的照片和特写花絮。对此, 上海市公安局徐汇分局发布了警情通报(见下图&#x…

VLDB ’25 最后 6 天截稿,58 个顶会信息纵览;ISPRS 城市分割数据集上线

「顶会」板块上线 hyper.ai 官网啦!该板块为大家提供最新最全的 CCF A 类计算机顶会信息,包含会议简介、截稿倒计时、投稿链接等。 你是不是已经注册了顶会,但对截稿时间较为模糊,老是在临近 ddl 时才匆忙提交;又或者…

K8s 部署prometheus

文章目录 K8s 部署prometheuskube-prometheus 部署部署流程安装卸载补充 K8s 部署prometheus kube-prometheus 部署 kube-prometheus 是 github 上开源的整合了 prometheus alertmanager granfana 等监控工具的项目,github地址 如果github 访问不了的也可以选择 g…

day20二叉树part06| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

**654.最大二叉树 ** 构造树一般采用的是前序遍历&#xff0c;因为先构造中间节点&#xff0c;然后递归构造左子树和右子树。 这题在找最大值和最大值下标的时候用了两个库函数 class Solution { public:TreeNode* constructMaximumBinaryTree(vector<int>& nums)…

Dropzone 4 for Mac:一拖即达,文件处理更高效!

在繁忙的工作中&#xff0c;你是否曾因频繁切换应用程序和文件夹而烦恼&#xff1f;Dropzone 4 for Mac&#xff0c;这款强大的文件拖拽操作工具&#xff0c;将彻底改变你的工作方式&#xff01; 只需简单地将文件、文本或图片拖放到Dropzone图标上&#xff0c;即可快速执行各种…

独孤思维:你做副业一定比我牛比

01 做副业&#xff0c;尤其是做ip&#xff0c;千万不要害羞。 要有不要脸的精神。 时时刻刻&#xff0c;都要想着如何展示自己&#xff0c;曝光自己。 不停地在各个平台上去输出内容&#xff0c;不停地直播&#xff0c;不停地发短视频。 就像独孤一直发文章&#xff0c;一…

6. CSS动画技巧

在前端开发中&#xff0c;动画可以极大地提升用户体验&#xff0c;使网页更加生动和互动。本章将探讨CSS3中高级动画技巧&#xff0c;包括复杂动画的实现、动画的延迟与序列控制、多步骤动画与状态切换以及动画性能优化。 6.1 复杂动画的实现 复杂动画通常涉及多个属性的变化…

Java NIO.2(New I/O) API的关键类和功能[简单示例]

Java NIO.2&#xff08;New I/O&#xff09;是Java SE 7引入的一组用于处理I/O操作的新API。它在Java标准库中提供了更灵活、高效的文件和文件系统操作方式&#xff0c;相对于传统的Java I/O&#xff08;java.io&#xff09;包&#xff0c;Java NIO.2提供了更多的功能和更好的性…

mysql实战——Mysql8.0高可用之双主+keepalived

一、介绍 利用keepalived实现Mysql数据库的高可用&#xff0c;KeepalivedMysql双主来实现MYSQL-HA&#xff0c;两台Mysql数据库的数据保持完全一致&#xff0c;实现方法是两台Mysql互为主从关系&#xff0c;通过keepalived配置VIP&#xff0c;实现当其中的一台Mysql数据库宕机…

NB55 牛的生长情况

描述 在一个牧场中&#xff0c;有n头牛&#xff0c;每头牛的体重都在增长。给定一个整数数组weights&#xff0c;表示每天的牛的平均体重&#xff0c;返回一个数组growth&#xff0c;其中growth[i]是指对于第i天&#xff0c;下一个平均体重更高的是在几天后。如果在这之后平均…

AI大模型的推理显存占用分析

了解Transformer架构的AI大模型显存占用是非常重要的&#xff0c;特别是在训练和推理过程中。以下是详细解释和分析这些组成部分及其影响的专业描述&#xff1a; 1 显存占用 1.1 模型本身参数 模型的参数包括所有的权重和偏置项&#xff0c;这些参数需要存储在显存中&#x…