首页 > 其他分享 >迁移线程migration

迁移线程migration

时间:2024-10-23 10:45:29浏览次数:5  
标签:thread stop 线程 migration Linux 迁移 cpu

每个处理器有一个迁移线程,线程名称是“migration/<cpu_id>”,属于停机调度类,可以抢占所有其他进程,其他进程不可以抢占它。迁移线程有两个作用。

(1)调度器发出迁移请求,迁移线程处理迁移请求,把进程迁移到目标处理器。

(2)执行主动负载均衡。

如图所示,每个处理器有一个停机工作管理器,成员thread指向迁移线程的进程描述符,成员works是停机工作队列的头节点,每个节点是一个停机工作,数据类型是结构体

cpu_stop_work。内核提供了两个添加停机工作的函数。

stop_one_cpu
--cpu_stop_queue_work
---__cpu_stop_queue_work
----list_add_tail and wake_up_process

在stop_one_cpu中,迁移作业将打包为工作,并调用cpu_stop_queue_work以获取CPU的停止线程。 然后,调用__cpu_stop_queue_work将此工作放入此CPU上的停止线程的工作队列中。 最后,唤醒停止线程进行迁移。 停止器线程在Linux内核中称为迁移线程(请参阅以下源代码)。

504 static struct smp_hotplug_thread cpu_stop_threads = {
505         .store                  = &amp;cpu_stopper.thread,
506         .thread_should_run      = cpu_stop_should_run,
507         .thread_fn              = cpu_stopper_thread,
508         .thread_comm            = "migration/%u",
509         .create                 = cpu_stop_create,
510         .park                   = cpu_stop_park,
511         .selfparking            = true,
512 };
513 
514 static int __init cpu_stop_init(void)
515 {
516         unsigned int cpu;
517 
518         for_each_possible_cpu(cpu) {
519                 struct cpu_stopper *stopper = &amp;per_cpu(cpu_stopper, cpu);
520 
521                 spin_lock_init(&amp;stopper-&gt;lock);
522                 INIT_LIST_HEAD(&amp;stopper-&gt;works);
523         }
524 
525         BUG_ON(smpboot_register_percpu_thread(&amp;cpu_stop_threads));
526         stop_machine_unpark(raw_smp_processor_id());
527         stop_machine_initialized = true;
528         return 0;
529 }
530 early_initcall(cpu_stop_init);

我们发现每个CPU上的Linux Kernel迁移线程都是通过early_initcall初始化的,这是在启动内核时完成的,如下所示。

start_kernel
--rest_init
---kernel_init
----kernel_init_freeable
-----do_pre_smp_initcalls
------do_one_initcall

Linux Kernel迁移线程守护程序是要初始化的early_initcall之一。 Linux内核有许多初始化调用,如下所示。

814 static char *initcall_level_names[] __initdata = {
815         "early",
816         "core",
817         "postcore",
818         "arch",
819         "subsys",
820         "fs",
821         "device",
822         "late",
823 };

到目前为止,我认为一切都已经清楚了,启动内核后,Linux内核中的迁移守护进程线程将被初始化。 一旦完成迁移工作,它就会被唤醒以进行迁移工作(注意:在这里,我只考虑sched_setaffinity的情况,也许Linux内核中还有其他方法可以唤醒迁移线程守护程序)。 此外,对于其他内核线程守护程序(例如softirqd,kworker等),它们具有由Linux Kernel创建的类似方式(例如迁移线程守护程序)。

结论在Linux内核中,每个CPU都有一个迁移线程守护程序来执行资源平衡作业。 如果我们调用sched_setaffinity系统调用将一个线程从源CPU迁移到目标CPU,并且该线程正在运行或处于TASK_WAKING状态,则迁移作业将打包到源CPU的迁移线程的工作队列中,然后,迁移线程将被唤醒以完成迁移工作。

标签:thread,stop,线程,migration,Linux,迁移,cpu
From: https://www.cnblogs.com/linhaostudy/p/18495880

相关文章

  • 【unity】 Loom实现多线程
    ​通常情况下,unity中在子线程中改变变量的值,但是子线程尚未结束时,主线程无法使用该变量。因此使用Loom作为中介,子线程调用并传值给Loom,Loom调用主线程的API。实现步骤创建Loom空物体,并挂载Loom脚本//Loom.csusingSystem;usingSystem.Collections;usingSystem.Collectio......
  • selenium单例模式下 docker-chrome 多线程并发代码
    最近需要写爬虫,在解决docker-standalone-chrome发现只能有一个chrome被执行。所以写了这个多线程并发控制类来管理。当模板记录下。#!/usr/bin/envpython3importthreadingimporttracebackfromloguruimportloggerfromseleniumimportwebdriverfromselenium.comm......
  • 说说进程间通信和线程间通信的几种方式及区别
    进程和线程的区别:进程:是资源分配的基本单位;线程:是程序执行的最小单位进程间的通信方式:管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。有名管道(namedpipe):有名管道也是半双工的通......
  • 微力同步轻量易用的迁移数据和同步数据软件
    微力同步一款高效的数据传输工具,简单易用的多平台文件同步软件,惊人的传输速度是不同于其他产品的最大优势,微力同步的智能P2P技术加速同步,会将文件分割成若干份仅KB的数据同步,而文件都会进行AES加密处理。官网链接:微力同步官网-私有云盘企业文件同步团队文件共享协助......
  • iOS 回到主线程刷新UI
    在iOS里面,项目打开就会运行一个主线程,所有的UI都在主线程里进行.其他网络请求或者耗时操作理论上也可以在主线程运行,但是如果太耗时,那么就会影响主线程其他UI.所以需要开字线程来进行耗时操作,子线程进行完耗时操作之后,如果项目需求有需要刷新UI,或者改变UI,一定得回到主......
  • 操作系统实验之Windows中的线程与线程同步现象
    一、实验目的1.掌握Windows中线程的操作。2.熟悉线程不同步时的现象及环境因素。3.掌握一种同步对象的使用。二、实验理论基础及教材对应关系1.线程和线程不同步的认识。2.线程间的同步和通信。3.本实验内容主要对应于操作系统教材第2章中关于线程的各节。三、实验内容与步......
  • 线程池实现原理及实践
    线程池的总体设计ThreadPoolExecutor实现的顶层接口是Executor,顶层接口Executor提供了一种思想:将任务提交和任务执行进行解耦。用户无需关注如何创建线程,如何调度线程来执行任务,用户只需提供Runnable对象,将任务的运行逻辑提交到执行器(Executor)中,由Executor框架完成线程的调配......
  • 11-案例:多线程版用户聊天程序
    1.多线程版用户群聊程序的_多用户聊天运行结果2.多线程版用户群聊程序的_服务端代码3.多线程版用户群聊程序的_客户端代码4.多线程版用户群聊程序的_双用户聊天运行结果5.多线程版用户群聊程序的_双用户聊天运行服务端代码6.多线程版用户群聊程序的_双用户聊天运行客户端代码......
  • 【Linux线程】Linux多线程实践:深入生产者消费者模型
    ......
  • 迁移学习与fine-tuning有什么区别
    迁移学习与fine-tuning的区别主要体现在:1.目标不同;2.训练策略不同;3.数据量要求不同;4.应用领域不同;5.模型性能的差异。总的来说,迁移学习是一种将在一个任务上学到的知识应用到另一个任务上的方法,而fine-tuning是迁移学习中的一种策略,通常用于调整预训练模型的参数以适应新的任务。......