墙上时钟时间 ,用户cpu时间 ,系统cpu时间内,核态和用户态的区别

2023-11-14

时钟时间(墙上时钟时间wall clock time):从进程从开始运行到结束,时钟走过的时间,这其中包含了进程在阻塞和等待状态的时间。
用户CPU时间:就是用户的进程获得了CPU资源以后,在用户态执行的时间。
系统CPU时间:用户进程获得了CPU资源以后,在内核态的执行时间。

     进程的三种状态为阻塞、就绪、运行。

     时钟时间 = 阻塞时间 + 就绪时间 +运行时间
     用户CPU时间 = 运行状态下用户空间的时间

   系统CPU时间 =  运行状态下系统空间的时间。


   用户CPU时间+系统CPU时间=运行时间。

任一进程都可以调用times函数获取它自己以及已经终止子进程的上述值.

#include <sys/times.h>

clock_t times(struct tms *buf);//返回值:若成功,返回流逝的墙上时钟时间(以时钟滴答数为单位);若出错,返回-1.

其中buf指向tms结构:

struct tms {

clock_t tms_utime; /* 用户CPU时间 */

clock_t tms_stime; /* 系统CPU时间 */

clock_t tms_cutime; /* 已终止子进程的用户CPU时间 */

clock_t tms_cstime; /* 已终止子进程的系统CPU时间 */

};

注意此结构并没有墙上时钟值,而是返回值作为墙上时钟,并以滴答数为单位.这里返回值是想对于过去的某一时刻度量的,需要拿新返回值减去以前的返回值.如果要转换为秒的话需要除以每秒时钟滴答数(这个用sysconf(_SC_CLK_TCK)可以获取).


那么这里有个问题:什么是用户态执行时间? 什么是内核态执行时间?

这里参考一篇博客,讲的比较清楚~

void testfork(){
if(0 = = fork()){
printf(“create new process success!\n”);
}
printf(“testfork ok\n”);
}

本来打算提炼一下的,还是原文比较全面,一块粘贴过来了,感谢原作者!

原文地址:http://www.cnblogs.com/viviwind/archive/2012/09/22/2698450.html

这段代码很简单,从功能的角度来看,就是实际执行了一个fork(),生成一个新的进程,从逻辑的角度看,就是判断了如果fork()返回的是0则打印相关语句,然后函数最后再打印一句表示执行完整个testfork()函数。代码的执行逻辑和功能上看就是如此简单,一共四行代码,从上到下一句一句执行而已,完全看不出来哪里有体现出用户态和进程态的概念。

如果说前面两种是静态观察的角度看的话,我们还可以从动态的角度来看这段代码,即它被转换成CPU执行的指令后加载执行的过程,这时这段程序就是一个动态执行的指令序列。而究竟加载了哪些代码,如何加载就是和操作系统密切相关了。

 

2)特权级

熟悉Unix/Linux系统的人都知道,fork的工作实际上是以系统调用的方式完成相应功能的,具体的工作是由sys_fork负责实施。其实无论是不是Unix或者Linux,对于任何操作系统来说,创建一个新的进程都是属于核心功能,因为它要做很多底层细致地工作,消耗系统的物理资源,比如分配物理内存,从父进程拷贝相关信息,拷贝设置页目录页表等等,这些显然不能随便让哪个程序就能去做,于是就自然引出特权级别的概念,显然,最关键性的权力必须由高特权级的程序来执行,这样才可以做到集中管理,减少有限资源的访问和使用冲突。

特权级显然是非常有效的管理和控制程序执行的手段,因此在硬件上对特权级做了很多支持,就Intel x86架构的CPU来说一共有0~3四个特权级,0级最高,3级最低,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查,相关的概念有CPL、DPL和RPL,这里不再过多阐述。硬件已经提供了一套特权级使用的相关机制,软件自然就是好好利用的问题,这属于操作系统要做的事情,对于Unix/Linux来说,只使用了0级特权级和3级特权级。也就是说在Unix/Linux系统中,一条工作在0级特权级的指令具有了CPU能提供的最高权力,而一条工作在3级特权级的指令具有CPU提供的最低或者说最基本权力。

 

3)用户态和内核态

现在我们从特权级的调度来理解用户态和内核态就比较好理解了,当程序运行在3级特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;反之,当程序运行在0级特权级上时,就可以称之为运行在内核态。

虽然用户态下和内核态下工作的程序有很多差别,但最重要的差别就在于特权级的不同,即权力的不同。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序,比如上面例子中的testfork()就不能直接调用sys_fork(),因为前者是工作在用户态,属于用户态程序,而sys_fork()是工作在内核态,属于内核态程序。

当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态,比如testfork()最初运行在用户态进程下,当它调用fork()最终触发sys_fork()的执行时,就切换到了内核态。

 

2. 用户态和内核态的转换

1)用户态切换到内核态的3种方式

a. 系统调用

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

b. 异常

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

c. 外围设备的中断

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

 

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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

墙上时钟时间 ,用户cpu时间 ,系统cpu时间内,核态和用户态的区别 的相关文章

  • yolov3项目实战——基于PyTorch实现的目标检测项目实战(附代码)

    一 数据准备 数据准备见 使用精灵标注助手制作yolov3训练数据集 附解析xml代码 本篇文章为项目实战部分 理论部分简析见 YoLov1 YoLov3演变历程 思维导图 二 项目代码部分 1 cfg py CLASS NUM 10 an
  • 技术可行性

    什么是技术可行性 1 技术可行性是指决策的技术和决策方案的技术不能突破组织所拥有的或有关人员所掌握的技术资源条件的边界 编辑
  • db2锁表后如何解锁_DB2死锁的解决过程全记录

    生产环境里使用的数据库是DB2 但是最近频繁出现一个奇怪的死锁现象 某一个select sql 语句总是会出现死锁 按照以往的经验 通常都是update delete之类的更新sql语句会出现死锁的问题 而且这个 select sql 语句
  • Flutter仿抖音点击进入直播间按钮动画实现

    利用flutter仿抖音点击进入直播间动画效果 效果图 对于这个widget 已经封装成插件 供大家依赖使用 askai animation button last version 组件的一些必选属性 const KaiAnimationB
  • Flink 1.17教程:聚合算子(Aggregation)之按键分区(keyBy)

    聚合算子 Aggregation 计算的结果不仅依赖当前数据 还跟之前的数据有关 相当于要把所有数据聚在一起进行汇总合并 这就是所谓的 聚合 Aggregation 类似于MapReduce中的reduce操作 按键分区 keyBy 对于F
  • 【批处理DOS-CMD命令-汇总和小结】-变量嵌套和命令嵌套

    参考来源 DOS 变量嵌套和命令嵌套 阿飞同学 博客园 bat脚本的基本命令语法 整合侠 博客园 一 什么是变量嵌套 命令嵌套 1 1 介绍一下字符串截取的知识 对于字符串变量A 要截取它的片段 语法是 A1 A m n 例如对于字符串变量
  • uni-app运行到微信开发者工具-没有打印的情况

    前言 到我们进场使用微信开发者工具时 就会发现它经常会有bug 特别是在软件更新 组件库更新之后 最近在更新微信开发者工具之后发现所有打印都不显示了 虽然是小问题 但对于强迫症很烦 以为是代码配置问题 结果是更新之后打印开关开启不打印 查看
  • MCLDownload文件夹转移位置方法

    由于部分玩家电脑C盘容量不是很足 或者由于启动器1 4 0升级的bug 抑或是强迫症所迫等等等等 总之想给 MCLDownload 文件夹路径来个 定制化 所以接下来有两种方法修改 MCLDownload 文件夹的路径 请先退出启动器 gt
  • 【PTA】计算职工工资 (15分)

    给定N个职员的信息 包括姓名 基本工资 浮动工资和支出 要求编写程序顺序输出每位职员的姓名和实发工资 实发工资 基本工资 浮动工资 支出 输入格式 输入在一行中给出正整数N 随后N行 每行给出一位职员的信息 格式为 姓名 基本工资 浮动工资
  • 43岁读博士,无关年龄

    本文来源 西湖大学WestlakeUniversity 2017年 鲍光胜和女儿在英国 这一年他决定读博士 为此他准备了5年 鲍光胜还是被媒体围住了 在西湖大学博士生开学典礼上 他微笑着回答了每一个问题 在视频发布后的评论区 有人说他看上去
  • Idea之单元测试覆盖率

    Idea之单元测试覆盖率 创建接口 参加测试类 点击Run xxx with Coverage 在运行完毕后 就会出现Coverage窗口 在窗口中就能看到关于覆盖率的内容 如果需要达到更高的覆盖率 将if的每一个分支都测试一遍
  • Win7下使用Putty代替超级终端通过COM串口连接开发板方法

    1 如果电脑 笔记本 没有串口接口 则需要使用一个 USB Serial 转换线 这里使用 prolific usb serial USB 串口转换线 首先需要在win7上安装对应的 USB 串口转换线 驱动程序 PL2303 Prolif
  • 《Android 开发艺术探索》笔记5--View工作原理

    View工作原理思维导图 ViewRoot和DecorView MeasureSpec 理解MeasureSpec MeasureSpec和LayoutParams关系 View的工作流程 measure过程 正确获取宽高方法 layout
  • c++(26) 输入输出流、文件操作

    1 cout cin标准输入输出流 cin会创建一个输入缓冲区 键盘向屏幕输入字符的时候 会将数据放进缓冲区 如果缓冲区内没有数据 则会阻塞等待键盘输入 同样的cout也会有自己的缓冲区 在有的linux编译器下 cout lt lt he
  • 2022年最新MySQL安装教程

    Mysql官方提供社区版本和商业版本 这里以mysql 社区版本8 0 26 为例 官方网站 https www mysql com 安装 1 点击官网 点击上面的DOWNLOADS 2 如图 3 这里以windows系统为例 3 打开my
  • qt 如果出现未声明的变量,前提是已经声明过的

    找到你的 cpp h 文件 用记事本打开 然后另存为的时候最下面的编码改成unicode的 最好cpp文件也改成unicode的
  • 责任链(Chain of Responsibility)模式

    行为模式 Behavioral Pattern 是对在不同的对象之间划分责任和算法的抽象化 行为模式不仅仅是关于类和对象的 而且是关于它们之间的相互作用的 行为模式分为类的行为模式和对象的行为模式两种 类的行为模式 类的行为模式使用继承关系
  • 快速傅氏变换之旅(一) 概念简介 1

    FFT Fast Fourier Transformation 即为快速傅氏变换 是离散傅氏变换的快速算法 它是根据离散傅氏变换的奇 偶 虚 实等特性 对离散傅立叶变换的算法进行改进获得的 它对傅氏变换的理论并没有新的发现 但是对于在计算机
  • STM32进入HardFault_Handler处理办法

    思考 使用stm32的时候 有时会出现不明情况的死机 此时可以采用 HardFault Handler 处理方法来跟踪栈 STM32进入HardFault Handler处理办法 HardFault Handler出现的情况一般有两种 一种
  • java 事务 异常_spring事务常见问题、异常分析和解决方法

    1 spring事务超时transaction unexpectedly rolled back maybe due to a timeout nested exception is javax transaction RollbackEx

随机推荐