QEMU内部:整体架构和线程模型

2024-06-07 16:18

本文主要是介绍QEMU内部:整体架构和线程模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


原文地址:http://blog.vmsplice.net/2011/03/qemu-internals-overall-architecture-and.html
全文翻译如下:


1 概述

  这是讲解QEMU内部原理的系列博客的第一篇,主要面向于开发者。旨在分享QEMU如何工作等相关的代码基础知识。
  运行一个客户机涉及到执行客户机代码、处理计时器、处理I/O操作、相应模拟器的命令。并发处理这些工作要求一种安全调节资源的能力,当磁盘I/O或者模拟器命令需要执行很长时间的时候不暂停客户机。现有两个主流的架构可以用于响应来自多个源的事件:
  1. 并行架构:分离工作到可以并行的进程或者线程中执行。
  2. 事件驱动架构:通过执行一个主循环来发送事件到handler以对事件做处理。这一方法通常使用select(2)或者poll(2)系列的系统调用在多个文件描述符上进行等待。
  QEMU实际上使用了一种将事件驱动编程与线程相结合的混合架构。 这样做是有道理的,因为事件循环不能利用多个核心,因为它只有一个执行线程。 此外,有时编写专用线程来装载一个特定任务而不是将其集成到事件驱动架构中更简单。 然而,QEMU的核心是事件驱动的,大多数代码在该环境中执行。

2 QEMU的事件驱动核心

  事件驱动的体系结构以事件循环为中心,该事件循环将事件分派给处理函数。 QEMU的主事件循环是main_loop_wait(),它执行以下任务:
  1. 等待文件描述符变得可读或可写。 文件描述符起着至关重要的作用,因为文件、套接字、管道、各种其他资源都是文件描述符。 可以使用qemu_set_fd_handler()添加文件描述符。
  2. 运行过期的计时器。 可以使用qemu_mod_timer()添加计时器。
  3. 运行下半部分(BHs),就像定时器立即到期一样。 BH用于避免重入和溢出调用堆栈。 可以使用qemu_bh_schedule()添加BH。
  当文件描述符准备就绪、计时器到期、BH被调度时,事件循环将调用响应事件的回调。 回调有两个关于其环境的简单规则:
  1) 没有其他核心代码同时执行,因此不需要同步。 回调相对于其他核心代码按顺序和原子方式执行。 在任何给定时间只有一个控制线程执行核心代码。
  2)不应执行阻塞系统调用或长时间运行的计算。 由于事件循环在继续其他事件之前等待回调返回,因此避免在回调中花费无限量的时间是很重要的。 违反此规则会导致guest虚拟机暂停并且监视器无响应。
  第二条规则有时难以兑现,QEMU中有代码阻塞。 事实上,甚至在qemu_aio_wait()中有一个嵌套的事件循环,它等待顶级事件循环处理的事件的子集。 希望将来通过重组代码来消除这些违规行为。 新代码不可能有合法的理由去阻塞执行,一个解决方案是使用专用的worker threads来卸载长时间运行代码或阻塞代码。

3 卸载特殊的任务到worker threads

  尽管可以通过非阻塞方式执行许多I/O操作,但也存在没有非阻塞效果的系统调用。 此外,有时长时间运行的计算只会占用CPU并且难以分解为回调。 在这些情况下,可以使用专用worker threads小心地将这些任务移出QEMU的核心线程。
  工作线程的一个示例用法是posix-aio-compat.c,一个异步文件I/O实现。 当核心QEMU发出aio请求时,它将被放置在队列中。 worker threads将请求从队列中取出并在核心QEMU之外执行它们。 它们可能会执行阻塞操作,因为它们在自己的线程中执行,所以不会阻塞QEMU的其余部分。 该实现负责在worker threads和核心QEMU之间执行必要的同步和通信。
  另一个例子是ui/vnc-jobs-async.c,它在worker threads中执行计算密集型镜像压缩和编码。
  由于大多数核心QEMU代码不是线程安全的,因此工作线程无法调用核心QEMU代码。 像qemu_malloc()这样的简单实用程序是线程安全的,但这只是例外而不是规则。这给将工作线程事件传递回核心QEMU带来了问题。
  当worker thread需要通知核心QEMU时,一个管道或qemu_eventfd()文件描述符将添加到事件循环中。 worker thread可以写入文件描述符,当文件描述符变得可读时,事件循环将调用回调。 此外,必须使用信号来确保事件循环能够在所有情况下运行。 这种方法由posix-aio-compat.c使用,在理解了客户机代码的执行方式后更有意义(尤其是信号的使用)。

4 执行客户机代码

  到目前为止,我们主要研究了事件循环及其在QEMU中的核心作用。 同样重要的是执行客户机代码的能力,没有这种功能,QEMU可以响应事件但不会非常有用。
  执行访客代码有两种机制:Tiny Code Generator(TCG)和KVM。 TCG使用动态二进制转换(也称为即时(JIT)编译)来模拟客户机。 KVM利用现代Intel和AMD CPU中的硬件虚拟化扩展,直接在主机CPU上安全地执行访客代码。 出于本文的目的,先不关注各自具体技术细节,重要关注的是TCG和KVM都允许我们跳转到客户机代码并执行它。
  跳转到客户机代码会将宿主机的控制权交给客户机。 当一个线程正在运行客户机代码时,它不能同时处于事件循环中,因为客户机具有(安全)CPU控制权。 通常,客户机代码中花费的时间是有限的,因为对模拟设备寄存器的读取和写入以及其他异常导致我们离开客户机并将控制权交还给QEMU。 在极端情况下,客户机可以花费无限的时间而不放弃控制,这将使QEMU无法响应。
  为了解决客户机代码占用的问题,QEMU的控制信号线程用于跳出客户机。 一个UNIX信号从当前的执行流程中转移控制权并调用信号处理函数。 这允许QEMU采取措施来保留客户机代码并返回到QEMU主循环中,在主循环中事件循环可以有机会处理添加的各种事件。
  这样做的结果是,如果QEMU当前在客户机代码中,则可能无法立即检测到新事件。 大多数情况下,QEMU最终会处理事件,但这种额外的延迟本身就是一个性能问题。 因此,定时器、I/O完成、从worker threads到核心QEMU的通知都使用信号来确保事件循环立即运行。
  你可能想知道具有多个vcpus的事件循环与SMP客户机之间的整体概况。 到此为止已经讲述了线程模型和客户机代码,我们可以讨论整体架构。

5 iothread和non-iothread架构

  传统架构是一个QEMU线程,它执行客户机代码和事件循环。 此模型也称为non-iothread或!CONFIG_IOTHREAD,并且是使用./configure && make构建QEMU时的默认模式。 QEMU线程执行客户机代码,直到异常或信号产生要求控制权。 然后它在select(2)中运行事件循环的一次迭代而不阻塞,之后它会重新回到客户机代码并重复以上过程,直到QEMU关闭。
  如果使用-smp 2以多个vcpus启动客户机机,则不会创建其他QEMU线程。 而是单个QEMU线程在两个vcpus执行客户机代码和事件循环之间进行多路复用。 因此,non-iothread架构无法利用多核宿主机,并且可能导致SMP客户机性能低下。
  请注意,尽管只有一个QEMU线程,但可能存在零个或多个worker threads。 这些线程可能是暂时的或永久的。 请记住,他们执行专门的任务,不执行客户机代码或处理事件。 我想强调这一点,因为在模拟客户机并将其解释为vcpu线程时,很容易被worker threads混淆。 请记住,non-iothread架构只有一个QEMU线程。
  较新的体系结构是每个vcpu一个QEMU线程加上一个专用的事件循环线程。 此模型称为iothread架构或CONFIG_IOTHREAD,可以在构建时使用./configure –enable-io-thread启用。 iothread运行事件循环的同时,每个vcpu线程可以并行执行客户机代码,提供真正的SMP支持。 核心QEMU代码永远不会同时运行的规则通过全局互斥锁来维护,该互斥锁在vcpus和iothread之间同步核心QEMU代码。 大多数情况下,vcpus将执行客户机代码,而不需要持有全局互斥锁。 大多数情况下,iothread在select(2)中被阻塞,并且不需要持有全局互斥锁。
  请注意,TCG不是线程安全的,因此即使在iothread模型下,它也会在单个QEMU线程中复用vcpus。 只有KVM可以利用per-vcpu线程。


备注:

  QEMU的主要线程:
  (1)主线程(main_loop),一个
  (2)vCPU线程,一个或者多个
  (3)I/O线程(aio),一个或者多个
  (4)worker thread(VNC/SPICE),一个


这篇关于QEMU内部:整体架构和线程模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039674

相关文章

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

人工和AI大语言模型成本对比 ai语音模型

这里既有AI,又有生活大道理,无数渺小的思考填满了一生。 上一专题搭建了一套GMM-HMM系统,来识别连续0123456789的英文语音。 但若不是仅针对数字,而是所有普通词汇,可能达到十几万个词,解码过程将非常复杂,识别结果组合太多,识别结果不会理想。因此只有声学模型是完全不够的,需要引入语言模型来约束识别结果。让“今天天气很好”的概率高于“今天天汽很好”的概率,得到声学模型概率高,又符合表达

智能客服到个人助理,国内AI大模型如何改变我们的生活?

引言 随着人工智能(AI)技术的高速发展,AI大模型越来越多地出现在我们的日常生活和工作中。国内的AI大模型在过去几年里取得了显著的进展,不少独创的技术点和实际应用令人瞩目。 那么,国内的AI大模型有哪些独创的技术点?它们在实际应用中又有哪些出色表现呢?此外,普通人又该如何利用这些大模型提升工作和生活的质量和效率呢?本文将为你一一解析。 一、国内AI大模型的独创技术点 多模态学习 多

OpenCompass:大模型测评工具

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径:AI代理工作流大模型应用开发实用开源项目汇总大模型问答项目问答性能评估方法大模型数据侧总结大模型token等基本概念及参数和内存的关系大模型应用开发-华为大模型生态规划从零开始的LLaMA-Factor

模型压缩综述

https://www.cnblogs.com/shixiangwan/p/9015010.html

AI赋能天气:微软研究院发布首个大规模大气基础模型Aurora

编者按:气候变化日益加剧,高温、洪水、干旱,频率和强度不断增加的全球极端天气给整个人类社会都带来了难以估计的影响。这给现有的天气预测模型提出了更高的要求——这些模型要更准确地预测极端天气变化,为政府、企业和公众提供更可靠的信息,以便做出及时的准备和响应。为了应对这一挑战,微软研究院开发了首个大规模大气基础模型 Aurora,其超高的预测准确率、效率及计算速度,实现了目前最先进天气预测系统性能的显著

PyTorch模型_trace实战:深入理解与应用

pytorch使用trace模型 1、使用trace生成torchscript模型2、使用trace的模型预测 1、使用trace生成torchscript模型 def save_trace(model, input, save_path):traced_script_model = torch.jit.trace(model, input)<

响应式架构

介绍 响应式架构(Reactive Architecture)是一种面向服务和事件的系统设计方法,旨在提高系统的可扩展性、弹性和容错能力。它适用于构建分布式系统,特别是在云环境和微服务架构中。响应式架构的核心理念是通过事件驱动和数据流来实现各个组件之间的解耦,从而提高整个系统的响应能力和可靠性。 响应式架构的主要特点包括: 响应性:系统能够快速响应外部事件和内部变化,确保在各种负载和故障情