Linux idle基础

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 Linux系统越来越受到电脑用户的欢迎,于是很多人开始学习Linux时,学习linux,你可能会遇到linux内核问题,这里将介绍linux内核中idle知识。

  1. idle是什么


  简单的说idle是一个进程,其pid号为 0。其前身是系统创建的第一个进程,也是唯一一个没有通过fork()产生的进程。在smp系统中,每个处理器单元有独立的一个运行队列,而每个运行队列上又有一个idle进程,即有多少处理器单元,就有多少idle进程。系统的空闲时间,其实就是指idle进程的"运行时间"。既然是idle是进程,那我们来看看idle是如何被创建,又具体做了哪些事情?

  2. idle的创建


  我们知道系统是从BIOS加电自检,载入MBR中的引导程序(LILO/GRUB),再加载linux内核开始运行的,一直到指定shell开始运行告一段落,这时用户开始操作Linux。而大致是在vmlinux的入口startup_32(head.S)中为pid号为0的原始进程设置了执行环境,然后原是进程开始执行start_kernel()完成Linux内核的初始化工作。包括初始化页表,初始化中断向量表,初始化系统时间等。继而调用 fork(),创建第一个用户进程:

  kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);

  这个进程就是着名的pid为1的init进程,它会继续完成剩下的初始化工作,然后execve(/sbin/init), 成为系统中的其他所有进程的祖先。关于init我们这次先不研究,回过头来看pid=0的进程,在创建了init进程后,pid=0的进程调用 cpu_idle()演变成了idle进程。

  current_thread_info()->status |= TS_POLLING;

  在 smp系统中,除了上面刚才我们讲的主处理器(执行初始化工作的处理器)上idle进程的创建,还有从处理器(被主处理器activate的处理器)上的 idle进程,他们又是怎么创建的呢?接着看init进程,init在演变成/sbin/init之前,会执行一部分初始化工作,其中一个就是 smp_prepare_cpus(),初始化SMP处理器,在这过程中会在处理每个从处理器时调用

  task = copy_process(CLONE_VM, 0, idle_regs(&regs), 0, NULL, NULL, 0);

  init_idle(task, cpu);

  即从init中复制出一个进程,并把它初始化为idle进程(pid仍然为0)。从处理器上的idle进程会进行一些Activate工作,然后执行cpu_idle()。

  整个过程简单的说就是,原始进程(pid=0)创建init进程(pid=1),然后演化成idle进程(pid=0)。init进程为每个从处理器(运行队列)创建出一个idle进程(pid=0),然后演化成/sbin/init。

  3. idle的运行时机


  idle 进程优先级为MAX_PRIO,即最低优先级。早先版本中,idle是参与调度的,所以将其优先级设为最低,当没有其他进程可以运行时,才会调度执行 idle。而目前的版本中idle并不在运行队列中参与调度,而是在运行队列结构中含idle指针,指向idle进程,在调度器发现运行队列为空的时候运行,调入运行。

  4. idle的workload


  从上面的分析我们可以看出,idle在系统没有其他就绪的进程可执行的时候才会被调度。不管是主处理器,还是从处理器,最后都是执行的cpu_idle()函数。所以我们来看看cpu_idle做了什么事情。

  因为idle进程中并不执行什么有意义的任务,所以通常考虑的是两点:1.节能,2.低退出延迟。

  其核心代码如下:

  void cpu_idle(void) { int cpu = smp_processor_id(); current_thread_info()->status |= TS_POLLING; /* endless idle loop with no priority at all */ while (1) { tick_nohz_stop_sched_tick(1); while (!need_resched()) { check_pgt_cache(); rmb(); if (rcu_pending(cpu)) rcu_check_callbacks(cpu, 0); if (cpu_is_offline(cpu)) play_dead(); local_irq_disable(); __get_cpu_var(irq_stat).idle_timestamp = jiffies; /* Don't trace irqs off for idle */ stop_critical_timings(); pm_idle(); start_critical_timings(); } tick_nohz_restart_sched_tick(); preempt_enable_no_resched(); schedule(); preempt_disable(); } }

  循环判断need_resched以降低退出延迟,用idle()来节能。

  默认的idle实现是hlt指令,hlt指令使CPU处于暂停状态,等待硬件中断发生的时候恢复,从而达到节能的目的。即从处理器C0态变到 C1态(见 ACPI标准)。这也是早些年windows平台上各种"处理器降温"工具的主要手段。当然idle也可以是在别的ACPI或者APM模块中定义的,甚至是自定义的一个idle(比如说nop)。

 5.小结:


  1.idle是一个进程,其pid为0。

  2.主处理器上的idle由原始进程(pid=0)演变而来。从处理器上的idle由init进程fork得到,但是它们的pid都为0。

  3.Idle进程为最低优先级,且不参与调度,只是在运行队列为空的时候才被调度。

  4.Idle循环等待need_resched置位。默认使用hlt节能。

  希望通过本文你能全面了解linux内核中idle知识。

转载于:https://my.oschina.net/dlpinghailinfeng/blog/181659

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

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

相关文章

PowerDesigner版本控制器设置权限

PowerDesigner版本控制权限之前一直在Groups里面设置,一直没有效果,原因终于找出来了,PowerDesigner是要对每个库单独赋权限的,步骤如下: 连接上版本控制,在左侧菜单 Object Browser里面,找到你…

IT运维面试问题总结-运维工具、开源应用(Ansible、Ceph、Docker、Apache、Nginx等)

1、简述Ansible及其优势? Ansible是一款极其简单的开源的自动化运维工具,基于Python开发,集合了众多运维工具(puppet, cfengine, chef, func, fabric)的优点。实现了批量系统配置,批量程序部署,批量运行命令等功能。同…

程序员进阶之路—如何独当一面

今天和大家分享一下,程序员如何独当一面这个话题,这是一个很大的话题,我把他分成三部分来谈:  一、需求转换的能力或者叫理解需求的能力;  二、分配时间的能力;  三、开发质量的问题; 我…

html跨浏览器兼容性问题

之前写代码没注意到,这次学习了。 首先 img的width和height属性在IE浏览器中不起作用,可以设置一个div,让img标签在div块中,div中设置style:overflow:hidden,然后用div的宽和高来定义图片的宽和高。 第二个就是,clear:…

Spring经典面试题

文章目录 Spring概述(10) 什么是spring?Spring框架的设计目标,设计理念,和核心是什么Spring的优缺点是什么?Spring有哪些应用场景Spring由哪些模块组成?Spring 框架中都用到了哪些设计模式?详细…

JDBC 获取被插入数据的主键ID值

除了用存储过程还有以下方法可以获取: static int create() throws SQLException { Connection conn null; PreparedStatement ps null; ResultSet rs null; try { // 2.建立连接 conn JdbcUtils.getConnection(); // …

MySQL 5.6的新特性

MySQL 5.6是一个主要的版本发布,它在性能、可伸缩性、可靠性和可用性方面引入了多项重要改进和新特性。它在2013年发布,相比于它的前身MySQL 5.5,MySQL 5.6带来了以下关键升级: 优化的InnoDB存储引擎:MySQL 5.6中的Inn…

简易数字时钟软件详细制作过程

这是我自己用VS2010制作的简易数字时钟小软件,在制作过程中收获知识不少,希望和初学MFC编程的朋友分享一下。 一、其功能有一下三点: 1.打开软件后,其程序自动获取当前电脑系统的日期、时间和周次,并同步显示在主对 …

关于后台系统自动生成的一点思考

大量实践发现后台管理程序,其实90%的代码都是相同的,当然是在抛弃复杂逻辑业务的情况下,那么如何能高效的节约这些时间呢,那就是接下来我要说的,对于后台系统自动生成的一些思考。 适用情景: 1、表编号id为…

MFC定时器SetTimer函数用法总结

CWnd类的SetTimer成员函数只能在CWnd类或其派生类中调用,而API函数SetTimer则没有这个限制,这是一个很重要的区别。 1、启动定时器。 启动定时器就需要使用CWnd类的成员函数SetTimer。CWnd::SetTimer的原型如下: 参数nIDEvent指定一个非零的…

全网最全的Numpy开发入门教程(详细案例版)

概述 NumPy是一个Python库,每个数据科学专业人员都应该熟悉它这个全面的NumPy教程从头开始介绍NumPy,从基本的数学运算到NumPy如何处理图像数据本文中有大量的Numpy概念和Python代码 介绍 我非常喜欢Python中的NumPy库。在我的数据科学之旅中&#xff…

android开源库收集

1. google valley Android网络通信库 git clone https://android.googlesource.com/platform/frameworks/volley 介绍 http://www.cnblogs.com/bvin/p/3291611.html#2806770 http://liubin.org/2013/05/27/android-volley-at-a-glance/ 2.Afinal是一个android的ioc&#xff…

微信分享JSSDK-invalid signature签名错误的解决方案

核对官方步骤,确认签名算法。 确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?tjsapisign 页面工具进行校验。确认config中nonceStr(js中驼峰标准大写S), timestamp与用以签名中的对应noncestr, timesta…

MFC操作Excel2003的CRange类的Copy函数和Delete函数实现方法

一、CRange类的Copy函数实现方法 具体步骤: 1.实例化一个CRange类对象range1,关联你要拷贝的区域; 2.实例化一个CRange类对象range2,关联你要将要粘贴到的区域; 3.调用前一个range1对象的Copy函数,就可…

Django代码编写规范

1. 编码声明 在 Python 解释器执行代码时,需要告诉解释器代码的编码方式。Python 代码实际上是文本数据,如果代码的编码方式与解释器读取的编码方式不一致,将会因编码错误,代码无法执行。Python 2 解释器读取代码时,默…

Get sdcard directory by adb

解决方案: adb shell echo $EXTERNAL_STORAGE I am making an application, which pulls files(Saved by android app) from the device sdcard by adb. The problem is that different devices, have various sdcard directories i.e: sdcardsdcard/external_sdFi…

VueJs开发笔记—IDE选择和优化、框架特性、数据调用、路由选项及使用

一、IDE的选择: VsCode和WebStorm都是不错的选择,说一下两者的优缺点,调试便捷性来说两者不相上下. WebStorm缺点:性能方面VsCode远好于WebStorm; WebStorm优点:代码引用追踪Ws有VsCode无,控制台…

MFC新建文件夹、打开文件夹的实现方法

一、 MFC新建文件夹到指定路径的实现方法 典例: 二、 MFC保存文件到指定路径的实现方法 典例: 三、 MFC打开指定路径的文件夹的实现方法 典例: 注意:ShellExecute函数还可以打开指定路径的普通文件或者可执行文件。

VueJs生产环境部署

VueJs为客户端语言,所以部署的时候是不需要基于nodejs或其他服务器运行环境,只需要像其他静态站点的方式发布就可以了,下面介绍一下VueJs具体发布的流程还有需要注意的点。 先来看VueJs最终生成的文件目录: 具体的步骤如下&#x…

a20隐藏底部按钮及隐藏状态栏和虚拟按键栏

2019独角兽企业重金招聘Python工程师标准>>> 隐藏RecentButton按钮: 在源码android4.2/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java的makeStatusBarView()方法中添加(这是全志androi…