首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux下2号进程的kthreadd--Linux进程的管理与调度(七)

2号进程 内核初始化rest_init函数中,由进程 0 (swapper 进程)创建了两个process init 进程 (pid = 1, ppid = 0) kthreadd (pid = 2,...kernel_thread创建的内核线程会被加入到此链表中,因此所有的内核线程都是直接或者间接的以kthreadd为父进程 2号进程的创建 在rest_init函数中创建2号进程的代码如下 pid =...kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); rcu_read_lock(); kthreadd_task = find_task_by_pid_ns...(pid, &init_pid_ns); rcu_read_unlock(); complete(&kthreadd_done); 2号进程的事件循环 int kthreadd(void *unused...或者其他方式创建一个内核线程, 然后kthreadd内核线程被唤醒, 来执行内核线程创建的真正工作,于是这里有三个线程 kthreadd已经光荣完成使命(接手执行真正的创建工作),睡眠 唤醒kthreadd

2.3K20
您找到你想要的搜索结果了吗?
是的
没有找到

Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)【转】

前言 Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) idle进程由系统自动创建, 运行在内核态 idle进程其pid...是系统中所有其它用户进程的祖先进程 Linux中的所有进程都是有init进程创建并运行的。首先Linux内核启动,然后在用户空间中启动init进程,再启动其他系统进程。...我们知道系统是从BIOS加电自检,载入MBR中的引导程序(LILO/GRUB),再加载linux内核开始运行的,一直到指定shell开始运行告一段落,这时用户开始操作Linux。.../init_task.h文件中 init_task是Linux内核中的第一个线程,它贯穿于整个Linux系统的初始化过程中,该进程也是Linux系统中唯一一个没有用kernel_thread()函数创建的内核态进程...关于init其他的信息我们这次先不研究,因为我们这篇旨在探究0号进程的详细过程, 创建kthreadd 在rest_init函数中,内核将通过下面的代码产生第一个kthreadd(pid=2) pid

4.5K30

深入理解Linux内核之内核线程(上)

1.开场白 环境: 处理器架构:arm64 内核源码:linux-5.11 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 在linux系统中, 我们接触最多的莫过于用户空间的任务...,像用户线程或用户进程,因为他们太活跃了,也太耀眼了以至于我们感受不到内核线程的存在,但是内核线程却在背后默默地付出着,如内存回收,脏页回写,处理大量的软中断等,如果没有内核线程那么linux世界是那么的可怕...2.kthreadd的诞生 盘古开天辟地,我们知道linux所有任务的祖先是0号进程,然后0号进程创建了天字第一号的1号init进程,init进程是所有用户任务的祖先,而内核线程同样也有自己的祖先那就是...3. kthreadd内核线程处理流程 上面我们介绍了kthreadd内核线程的创建过程,接下来看一下kthreadd做了哪些事情: 代码路径为:kernel/kthread.c kthreadd函数中设置了线程名字和亲和性属性之后...调用路径如下: include/linux/kthread.h #define kthread_run(threadfn, data, namefmt, ...

2K20

Linux0号进程,1号进程,2号进程

本节我们将从linux启动的第一个进程说起,以及后面第一个进程是如何启动1号进程,然后启动2号进程。...Linux内核的启动 熟悉linux内核的朋友都知道,linux内核的启动 ,一般都是有bootloader来完成装载,bootloader中会做一些硬件的初始化,然后会跳转到linux内核的运行地址上去...通常来说ARM64是先运行EL3,再EL2,然后从EL2就trap到EL1,也就是我们的Linux内核。 我们来看下Linux内核启动的代码。...所以说所有的内核线程的父进程都是2号进程,也就是kthreadd。 总结: linux启动的第一个进程是0号进程,是静态创建的 在0号进程启动后会接连创建两个进程,分别是1号进程和2和进程。...00:00:00 [kthreadd] 上面很清晰的显示:PID=1的进程是init,PID=2的进程是kthreadd。而他们俩的父进程PPID=0,也就是0号进程。

6.4K21

Linux内核线程kernel thread详解--Linux进程的管理与调度(十)

和kthread_run, 同时将内核线程的创建操作延后, 交给一个工作队列workqueue, 参见http://lxr.linux.no/linux+v2.6.13/kernel/kthread.c...具体的信息, 请参见 Linux workqueue工作原理 2号进程kthreadd 但是这种方法依然看起来不够优美, 我们何不把这种创建内核线程的工作交给一个特殊的内核线程来做呢?...于是linux-2.6.22引入了kthreadd进程, 并随后演变为2号进程, 它在系统初始化时同1号进程一起被创建(当然肯定是通过kernel_thread), 参见rest_init函数, 并随后演变为创建内核线程的真正建造师..., 参见kthreaddkthreadd函数, 它会循环的是查询工作链表static LIST_HEAD(kthread_create_list);中是否有需要被创建的内核线程, 而我们的通过kthread_create...有了更好的实现, 那就是 延后内核的创建工作, 将内核线程的创建工作交给一个内核线程来做, 即kthreadd 2号进程 但是在kthreadd还没创建之前, 我们只能通过kernel_thread这种方式去创建

7K51

写一个操作系统_12 linux 原始的几个进程

原始进程 Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) idle进程 由系统自动创建, 运行在内核态 idle进程其...是系统中所有其它用户进程的祖先进程 kthreadd进程 由idle通过kernel_thread创建,并始终运行在内核空间, 负责所有内核线程的调度和管理 它的任务就是管理和调度其他内核线程kernel_thread...该函数的作用就是运行kthread_create_list全局链表中维护的kthread, 当我们调用kernel_thread创建的内核线程会被加入到此链表中,因此所有的内核线程都是直接或者间接的以kthreadd...它们在Windows叫做”服务”(service),在Linux就叫做”守护进程”(daemon)。 init进程的一大任务,就是去运行这些开机启动的程序。...Linux允许为不同的场合,分配不同的开机启动程序,这就叫做”运行级别”(runlevel)。也就是说,启动时根据”运行级别”,确定要运行哪些程序。 Linux预置七种运行级别(0-6)。

83910

手把手教你分析 Linux 启动流程

/ Android系统是基于Linux 内核的,最底层为Linux内核,源码量翻很多倍。...函数调用的最后一个函数,在这里产生了最重要的两个内核进程 kernel_init 和 kthreadd,kernel_init后面会从内核空间跳转到用户空间,变成用户空间的 init 进程,PID=1,...而 kthreadd ,PID=2,是内核进程,专门用来监听创建内核进程的请求,它维护了一个链表,如果有创建内核进程的需求,就会在链表上创建。...linux4.14/init.main.c 上图,400 行创建了 kernel_init 进程,412 行创建了 kthreadd 进程,这两个都是内核进程。...426 行通知 kernel_init 进程 kthreadd 已经创建完毕。也就是说,实际上是 kthreadd 先运行,kernel_init 再运行。

85310

手把手教你分析 Android 系统启动流程

Linux 之上有一个 HAL 层,这一层出现的原因:Linux 是开源的,基于它的修改也必须开源,所以 Andorid 在这里加了一个 HAL 层,这样硬件厂商可以不公布自己的代码。...上一篇文章分析了Linux 系统的启动流程,Android 系统的启动流程和 Linux 相似,只是 init 进程起来后,做了不一样的事情。...3)bootloader 初始化完成后跳转到 Linux 内核的 start_kernel 函数,此函数最后产生了 kernel_init 和 kthreadd,kernel_init 后面会从内核空间跳转到用户空间...,变成用户空间的 init 进程,PID=1,而 kthreadd(PID=2)是内核进程,专门用来监听创建内核进程的请求,它维护了一个链表,如果有创建内核进程的需求,就会在链表上创建。...当然你可以看到图中还有一个swapper(PID=0)进程,它是系统中唯一一个不使用 fork 创建的进程,kernel_init 和 kthreadd 就是由它创建的,swapper 也叫 idle

88810

手把手教你分析 Linux 启动流程

/ Android系统是基于Linux 内核的,最底层为Linux内核,源码量翻很多倍。...函数调用的最后一个函数,在这里产生了最重要的两个内核进程 kernel_init 和 kthreadd,kernel_init后面会从内核空间跳转到用户空间,变成用户空间的 init 进程,PID=1,...而 kthreadd ,PID=2,是内核进程,专门用来监听创建内核进程的请求,它维护了一个链表,如果有创建内核进程的需求,就会在链表上创建。...linux4.14/init.main.c 上图,400 行创建了 kernel_init 进程,412 行创建了 kthreadd 进程,这两个都是内核进程。...426 行通知 kernel_init 进程 kthreadd 已经创建完毕。也就是说,实际上是 kthreadd 先运行,kernel_init 再运行。

1.4K20

Linux进程内存消耗指标解读

了解系统的内存消耗是运维最基本的技能,但是Linux中关于内存消耗的指标很容易让人混淆,本文尝试把诸多概念解释清楚 概念 物理内存和虚拟内存 物理内存:不解释 虚拟内存:进程独享,由操作系统通过地址映射的方式...在32位Linux机器上,每个进程的虚拟内存都是4G。...(这里的虚拟内存与操作系统使用中过程常见的虚拟内存概念不同,不要混淆了,如Linux中swap) 内存耗用指标 VSS – Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) RSS...4128 S 0.0 0.4 0:01.33 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd...S 17:12 0:00 [kthreadd] SMEM命令 smem命令可以得到USS, PSS,更能反映进程的真实内存消耗 $ smem PID User Command

5.8K40
领券