Linux内核之pid为0和pid为1【转】

2023-11-19

(转自:https://blog.csdn.net/jingyilin2008/article/details/7815508?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159222398219725222455913%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159222398219725222455913&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-3-7815508.first_rank_v2_rank_v25&utm_term=Linux%E5%86%85%E6%A0%B8%E4%B9%8Bpid%E4%B8%BA0%E5%92%8Cpid%E4%B8%BA1

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(®s), 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进程,在调度器发现运行队列为空的时候运行,调入运行。

  小结:

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

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

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

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

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

Linux内核之pid为0和pid为1【转】 的相关文章

  • Linux操作系统原理与应用实验 实验三 实验四 问题总结

    本文是在进行Linux实验三和实验四所遇到的问题或学到的小知识进行总结 以调通程序为内容导向 问题的解决方法或许不难 也都能搜到 但是如果笔者自己总结下来能够节省很多人去搜索解决方法的繁琐步骤 节省大家的时间 实验三 文件操作算法 新版本带
  • 树莓派基于Linux内核驱动开发详解

    目录 一 驱动认知 1 1 为什么要学习写驱动 1 2 文件名与设备号 1 3 open函数打通上层到底层硬件的详细过程 二 基于框架编写驱动代码 2 1 编写上层应用代码 2 2 修改内核驱动框架代码 2 3 部分代码解读 2 3 1 s
  • 内核调试手段

    1 内核调试配置选项 内核拥有多项用于调试的功能 但是这些功能会造成额外的输出并导致性能下降 因此 内核通常都是禁止掉调试功能 内核调试相关的配置项主要集中在内核配置菜单 Kernel hacking 中 在使用下面的调试手段时 先确保内核
  • 内核error: implicit declaration of function 'irq_to_gpio' 解决方法

    第一种方法 文件1 drivers mfd Kconfig 中 删除depends on GENERIC HARDIRQS SPI MASTER 添加depends on GENERIC HARDIRQS SPI MASTER ARCH P
  • Linux 高级进程管理

    1 让出处理器 Linux提供一个系统调用运行进程主动让出执行权 sched yield 进程运行的好好的 为什么需要这个函数呢 有一种情况是用户空间线程的锁定 如果一个线程试图取得另一个线程所持有的锁 则新的线程应该让出处理器知道该锁变为
  • 片内外设、片上外设和片外外设的区别

    片内外设就是片上外设 同一种意思不同说法而已 片内外设和片外外设的区别 片内 外设是两个概念 片内指做成芯片的集成电路内部 简称片内 片外同理显而易见 外设是外部设备的简称 是指集成电路芯片外部的设备 集成电路芯片与外部设备的连接一般需要专
  • 性能测试系列(二)

    性能测试之性能分析命令 1 CPU分析 a cpu基本信息 命令 lscpu Cpu架构 64 位 Cpu 核心数 6 NUMA UMA节点数为 2个 显示值加 1 Cpu的核心频率 说明此服务器为虚拟机 此服务器的 cpu使用的是 使用的
  • Source Insight给Linux内核创建工程

    所有文档请关注公众号 一口Linux 后台回复 ubuntu linux驱动视频同步更新到 https live bilibili com 22719960 一 Source Insight安装 1 预先准备好 Source Insight
  • 嵌入式100题(86):简述处理器在读内存的过程中,CPU核、cache、MMU如何协同工作?画出CPU核、cache、MMU、内存之间的关系示意图加以说明...

    简述处理器在读内存的过程中 CPU核 cache MMU如何协同工作 画出CPU核 cache MMU 内存之间的关系示意图加以说明 现代操作系统普遍采用虚拟内存管理机制 这需要MMU Memory Management Unit 内存管理
  • 【树莓派】Linux内核编译

    树莓派 Linux内核编译 树莓派的Linux内核编译有两种方法 一种是在树莓派上直接编译 另一种是利用交叉编译的方法 一般我们都推荐采用交叉编译的方式进行编译 这是因为通常交叉编译Pi内核的速度比Pi本身编译快得多 性能因素 下面就讲下如
  • F2FS – A New Flash File System for Mobile Devices – ELCE 2012

    本文转载至 http www cnx software com 2013 01 15 f2fs a new flash file system for mobile devices elce 2012 Joo Young Hwang pri
  • printk函数的用法

    printk在内核源码中用来记录日志信息的函数 只能在内核源码范围内使用 用法和printf非常相似 printk函数主要做两件事情 第一件就是将信息记录到log中 而第二件事就是调用控制台驱动来将信息输出 1 日志级别 printk相比p
  • 【buildroot】buildroot使用总结

    文章目录 一 buildroot使用步骤 1 构建图形配置界面 2 配置Target options 3 配置Build options 4 配置Toolchain 5 配置 System configuration 6 配置 Filesy
  • put_user

    Linux设备驱动开发笔记 1 复制链接 0 0 skyily 白手起家 帖子 108 主题 105
  • sel4白皮书翻译

    首发地址 http trialley top pages 53ac44 CSDN地址 https blog csdn net lgfx21 article details 117606097 翻译与转发许可 作者 Gernot Heiser
  • mutex_init() / mutex_lock() / mutex_unlock()

    请求 1 初始化互斥体 mutex init 2 获得互斥体 mutex lock 3 释放互斥体 mutex unlock 1 mutex init 注意mutex使用之前都需要先init void mutex init struct m
  • 嵌入式Linux构建yaffs根文件系统

    嵌入式Linux构建yaffs根文件系统 开发环境说明 ubuntu1404 i686 天嵌光盘里的交叉编译链 版本4 4 3 busybox 1 13 0 下载地址 https busybox net downloads 一 编译busy
  • 工作队列(workqueue)

    转载于 http blog csdn net angle birds article details 8448070 项目需要 在驱动模块里用内核计时器timer list实现了一个状态机 郁闷的是 运行时总报错 Scheduling wh
  • 多线程系列之——事件内核对象

    所有内核对象里面事件内核对象是最简单的一个 它包括一个使用计数 还有两个布尔值 一个布尔值用来表示事件是手动重置事件还是自动重置事件 另一个布尔值表示当前是否处于触发状态 当一个手动重置事件被触发的时候 所有等待该事件的线程都能变成调度状态
  • CentOS7编译内核

    下面记录了我在CentOS7上编译新内核的过程 背景 实验室的一台服务器上装且仅装了CentOS7 内核版本为3 10 0 327 el7 x86 64 我要在当前系统上 编译 安装内核4 1 16 搭建编译环境 sudo yum inst

随机推荐

  • vue-nginx刷新404问题

    文章目录 1 背景介绍 2 问题描述 2 1 问题一 2 2 问题二 3 原因分析 3 1 问题一 3 2 问题二 4 排查问题一原因 5 反思 6 nginx root与alias的使用 7 更优雅地解决vue网页浏览器刷新404 7 1
  • Mongodb——使用Mongodb对字段中字符串内容进行截取,并进行分组统计

    最近忙的厉害 除了发一发之前写的存货只能写一些简单的东西了 这里就简单分享下最近遇见针对数据进行指标统计遇见的问题 针对字段中某部分内容的指标统计 在使用mongodb进行指标统计的时候可能遇见下面的数据结构 1 id ObjectId 5
  • 短信备份到另一个手机android,旧手机的短信怎么转移到新手机上?三种方法总有一种适合你...

    手机短信一直以来都是我们和其他对象传输信息的工具 更是存储了大量重要的信息 如果我们更换手机需要保留下来这些短信该怎么办呢 有没有什么方法可以将这些短信转移到新手机中去 或者导出到电脑上进行保管呢 这里有三种方法 第一种方法用内存卡 可以打
  • C++仿函数

    1 仿函数的定义 仿函数简单说就是在类中定义的特殊函数 没有函数名 或者说函数名统一为 operation 或者可以认为是重载运算符 格式为 返回类型 operator 参数列表 定义了仿函数的对象 可以直接通过下面格式调用仿函数 对象名
  • 异步加载vue组件

    什么时候使用 组件较大 或者不是必用的 通常组件在script标签对中导入 而异步组件在component中使用 例如 components ForData gt import view Fordata
  • J2EE集合框架

    1 UML 二 集合的基本特点 list集合的特点 增删改查 有序 可重复 三 List集合的三种遍历方式 for foreath iterator 四 ArrayList LinkedList 的比较与分析 比较 1 ArrayList
  • 基于Matlab的灰狼算法优化LSTM风电功率预测

    基于Matlab的灰狼算法优化LSTM风电功率预测 随着可再生能源的快速发展 风能作为一种重要的清洁能源形式变得越来越受关注 风电功率预测在风电场的运营和调度中起着关键作用 然而 由于风速的不稳定性和不确定性 精确地预测风电功率仍然具有一定
  • SpringCloud Gateway:status: 503 error: Service Unavailable

    使用SpringCloud Gateway路由请求时 出现如下错误 yml配置如下 可能的一种原因是 yml配置了gateway discovery locator enabled true 此时gateway会使用负载均衡模式路由请求 但
  • Lim接口测试平台-接口测试功能详解

    一 接口测试 项目地址 Gitee Github 接口测试模块是整个Lim平台的核心 左侧是接口的模块树 右侧顶部是用例操作功能区 列表展示接口用例信息 文章目录 一 接口测试 二 维护接口用例 各步骤类型详解 1 执行步骤 1 接口步骤
  • Unity --- 触摸方法,以及灯光与烘培的使用

    触摸方法 1 首先触摸分为两大类 多点触摸和单点触摸 这两种方式的触摸通过下面这个触摸数来进行判断 当其等于1的时候 为单点触摸 当其大于1的时候为多点触摸 2 当我们在调用触摸方法的时候我们首先需要打开对应的多点 单点触摸 上面这个是开启
  • QObject的d_ptr成员——箭头符号的重载

    QObject中的d ptr是这样定义的 QScopedPointer
  • vscode cmake 编译32位程序

    vscode cmake 编译32位程序 为什么要用cmake vscode中的C C 插件直接支持的只是最简单的单文件编译 运行和调试 要管理大的项目 或者生成库 C C 插件不能直接支持 需要开发者利用vscode的task功能 结合脚
  • 【由浅入深】爬虫技术,值得收藏,来了解一下~

    爬虫技术 来了解一下 一 为什么需要爬虫技术 现在的互联网来说 包含着各种海量的信息 无孔不入 包罗万象 出于数据分析或产品需求 我们需要从某些网站 提取出我们感兴趣 有价值的内容 我们需要一种能自动获取网页内容并可以按照指定规则提取相应内
  • 关于两数交换的两种方法

    目录 前言 一 引入变量 这个方法也是最常用的方法 二 通过使用数学的方法相加或者相减从而得到两数运算 这种方法不常见 总结 前言 从键盘输入两个整数 并交换两位数字 这里小编用两种方法告诉大家 注意小编这里用的是VS2019 所以在代码的
  • STM32 --通用定时器输入捕获功能

    问题 开始的时候没有搞清楚 定时器时基 于 定时器溢出中断的概念 导致在计算频率的时候一直有问题 开始并没有怀疑是配置有问题 因为之前接触过定时器输入捕获功能 靠着自己的记忆配置了一下 认为 捕获功能 的定时是通过定时器设置的定时溢出频率来
  • 栈实现队列(继续细起来啊)

    生命不是要等待风暴过去 而是要学会在风暴中跳舞 卡莉尔 吉布朗目录 一 栈实现队列 二 使用两个栈实现队列的功能 1 在队列的结构体中创建两个栈 2 创建一个队列的结构体指针 3 myQueuePush入队列操作 4 myQueuePeek
  • SpringBoot项目实战(一)

    SpringBoot实战之系统架构 1 系统介绍 该实战项目 是一个B2C模式的职业技能在线教育系统 分为前台用户系统和后台运营平台 前台用户系统包括课程 问答 文章三大部分 后台运营平台包括会员管理 讲师管理 课程管理 文章资讯 统计分析
  • Gradle入门(二)尝试理解gralde编译项目

    前言 前面我们了解了如何通过groovy DSL转换为KTS 我也在尝试的证明可以看到源码和有代码提示对于入门的重要性 2022年11月12日 我发现最新的idea 有gradle的代码提示 点击也可以看到源码 学习Gradle还是建议整一
  • .NET框架和发展历史介绍

    NET框架知识 NET 框架是由微软开发的软件开发平台 其最主要的两个组成部分是公共语言运行时 CLR 和框架类库 FCL 基础类库 BCL 是框架类库的一个子集 NET框架的主要结构如下图所示 1 操作系统 最下层的无疑就是操作系统了 2
  • Linux内核之pid为0和pid为1【转】

    转自 https blog csdn net jingyilin2008 article details 7815508 ops request misc 257B 2522request 255Fid 2522 253A 25221592