首页 > 其他分享 >0号线程swapper

0号线程swapper

时间:2024-09-09 14:53:38浏览次数:13  
标签:kernel task swapper init 线程 内核

【Linux内核|进程管理】0号线程swapper简介

  12 人赞同了该文章 ​ 目录 收起 0. 说明 1. 总览 2. 汇编阶段的初始化 3. init_task结构体 4. bootcpu 0号线程的工作 4.1. start_kernel 4.2. 其他cpu的0号线程创建 4.3. 创建1号和2号线程 4.4. schedule_preempt_disabled 4.5. cpu_startup_entry 4.6. do_idle

0. 说明

文章目录汇总:文章目录汇总 - 知乎 (zhihu.com)

内核版本:linux-6.1

个人仓库:

1. 总览

这里以ARM64为例。

在内核的起始阶段,还没有进程和线程的概念,在开启MMU之后,__primary_switched的第一步就是将init_task的地址写到sp_el0,这个时候就可以用get_current()或者curent获取到0号线程的task_struct了。在0号线程的上下文,完成调度器的相关初始化之后,创建1号和2号线程,然后开启调度器,init_task自此进入idle状态。

这里看几个概念:

  • 0号线程:对应init_task结构体,名字为swapper,在多处理器中,名称为swapper/<id>,负责内核的一些基础的初始化工作。
  • 1号线程:由0号线程创建,最初的函数为kernel_init,运行在内核态,kernel_init完成一些初始化工作后,通过kernel_execve进入用户态。具体的名字由用户态程序决定。
  • 2号线程:由0号线程创建,回调函数kthreadd,名字也是kthreadd,所有内核线程的创建都通过2号线程完成。也就是说,所有内核线程的父线程,都是kthreadd。

在kernel_init中,smp_init会为每个处理器核心创建一个的swapper线程,其task_struct结构体,并将其绑定到对应的处理器上。 在kernel_init调用的一些初始化函数中,有些会通过kthread或kworker的接口来创建内核线程,这些都内核线程的创建都由kthreadd接管。 在kernel_init最后,通过kernel_execve进入用户态,用户态的init程序,如busybox或systemd等,再通过fork或者clone等系统调用创建新的进程或者线程。

关于0号线程,在init_task中,设置的名字为swapper,在sched_init时,才会通过init_idle将其设置为swapper/<id>,而这个id时bootcpu的id,大多数情况下,bootcpu的id是0,图中展示的就是这种情况。

2. 汇编阶段的初

标签:kernel,task,swapper,init,线程,内核
From: https://www.cnblogs.com/zxdplay/p/18404555

相关文章

  • C++ 多线程代码性能分析——Oracle Developer Studio工具教程
        最近写项目的时候,为了提升性能,把原来一些单线程的代码改成了并行运行。这里我用到的用于评估性能提升效果的工具是OracleDeveloperStudio,不过刚上手时,发现网上相关的教程和博客较少,有些功能的使用也是摸索着过来的,这一过程可谓是十分痛苦了……如今距离初次接触......
  • 从0开始深入理解并发、线程与等待通知机制
    1、 从0开始深入理解并发、线程与等待通知机制从上面两大互联网公司的招聘需求可以看到,大厂的Java岗的并发编程能力属于标配。而在非大厂的公司,并发编程能力也是面试的极大加分项,而工作时善用并发编程则可以极大提升程序员在公司的技术话语权。为什么开发中需要并发编程?从......
  • 多线程篇(阻塞队列- DelayQueue)(持续更新迭代)
    目录一、简介二、基本原理四、代码示例简单定时调度任务多消费者定时调度任务得出结论四、应用场景一、简介DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到......
  • 多线程篇(阻塞队列- PriorityBlockingQueue)(持续更新迭代)
    目录一、简介二、类图三、源码解析1.字段讲解2.构造方法3.入队方法put浮调整比较器方法的实现入队图解4.出队方法takedequeue下沉调整比较器方法的实现出队图解四、总结一、简介PriorityBlockingQueue队列是JDK1.5的时候出来的一个阻塞队列。但是该队......
  • android中的render线程是什么?
    在Android中,Render线程(也称为渲染线程)是一个专门用于处理UI绘制和动画的线程。它的主要职责是确保用户界面在屏幕上流畅且高效地呈现。这个线程的引入是为了将渲染任务从主线程(UI线程)中分离出来,以避免主线程因过多任务阻塞而导致界面卡顿或无响应的情况。Render线程的主要......
  • Java中的线程安全:从synchronized到Lock的深入理解
    Java中的线程安全:从synchronized到Lock的深入理解大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在多线程编程中,确保线程安全是至关重要的任务。Java提供了多种机制来处理线程安全问题,从基本的synchronized关键字到更复杂的Lock接口。本文将深入......
  • 【Java学习】配置文件&日志&多线程
    一、配置文件1、概述在企业开发过程中,我们习惯把一些需要灵活配置的数据放在一些文本文件中,而不是在Java代码写死。我们把这种存放程序配置信息的文件,统称为配置文件。配置文件一般要求有明确的格式,以方便读写操作。2、PropertiesProperties是一个Map集合(键值对集合),但是一......
  • Java并发编程实战 07 | 如何正确停止线程
    什么时候需要停止一个线程?一个线程被创建并启动之后,大部分情况下都会自然运行至结束,但是也有一些情况需要主动停止线程,比如:用户主动取消执行:用户可能会中止一个正在进行的操作,这时需要停止相关线程。运行时错误或超时:线程可能因为运行时错误或超时而需要被停止,以避免长时......
  • 多线程轮流打印字符
    要求:使用多个线程轮流打印字符方法1。无锁自旋,一般在多核机器并且临界区耗时很短的话可以尝试自旋publicclassprintABC{staticLoggerlog=newLogger(Logger.LogLevel.DEBUG,printABC.class);staticvolatileintcur=0;publicstaticvoidmain(St......
  • 深入理解线程池的运行流程
    序言:这篇文章主要记录了java线程池在一些特殊场景出现的奇怪问题。场景核心线程数量为2,最大线程数量为4,生存时间60s,任务队列大小为4。每次向线程池中提交8个任务执行。那么,这个线程池能否正常运行呢?1demo我们可以根据这个要求写一个demo出来publicclassDemo{stati......