从哈希表到红黑树:探讨 epoll 是如何管理事件的?

揭开pkill的秘密:在Linux中杀死进程的完整指南

  • 一、引言
  • 二、 传统事件管理的局限性
  • 三、epoll 概述
    • 3.1、epoll 的基本概念和工作原理
    • 3.2、epoll 在 Linux 内核中的实现方式
  • 四、哈希表在事件管理中的挑战
  • 五、 红黑树在 epoll 中的应用
  • 六、epoll 中的事件注册与触发
  • 七、红黑树的优势与局限性
  • 总结

博主简介


💡一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。技能涵盖了多个领域,包括C/C++、Linux、Nginx、MySQL、Redis、fastdfs、kafka、Docker、TCP/IP、协程、DPDK等。
👉
🎖️ CSDN实力新星、CSDN博客专家、华为云云享专家、阿里云专家博主
👉


一、引言

在计算机领域,事件通知是一种重要的机制,用于监视和响应各种事件,例如网络连接、文件IO、定时器等。随着计算机应用变得越来越复杂,对于高性能事件通知机制的需求也越来越迫切。传统的事件通知机制可能存在效率低下的问题,因此需要一种更高效的解决方案。
在这里插入图片描述

epoll 是Linux操作系统中引入的一种事件通知机制,它具有出色的性能和扩展性,适用于高并发的应用场景。它的重要性在于它能够显著提高事件处理的效率,降低系统资源的消耗。

epoll 的高性能特性

  • epoll 使用非阻塞I/O,允许一个线程同时管理多个事件,避免了传统阻塞I/O的效率问题。
  • epoll 是事件驱动的,只有在事件发生时才会通知应用程序,避免了轮询的开销。
  • epoll 支持注册大量的文件描述符,适用于高并发环境。
  • epoll 内部使用了红黑树和双链表等高效数据结构来管理事件。

epoll的应用场景:在网络服务器中,epoll可以用于同时管理大量的网络连接,提供高性能的网络服务;在文件系统中,可以用于监控文件变化等。

与传统机制的比较:可以与传统的事件通知机制(如select和poll)进行比较,强调 epoll 的性能优势,包括避免了文件描述符集合的线性扫描等。

epoll作为高性能事件通知机制在现代计算机应用中扮演着重要角色。它通过提供高并发、低延迟、高效能的特性,使得应用能够更好地适应大规模连接和实时通信等需求,从而在事件管理中具有重要的地位。

本文旨在深入探讨epoll如何通过有效的数据结构优化事件管理,从而实现高性能的事件通知机制。通过详细分析epoll的工作原理、内部数据结构以及与其他事件通知机制的比较,本文旨在解释epoll是如何满足现代计算机应用对高并发、低延迟需求的,以及它在实际应用中的重要角色。

二、 传统事件管理的局限性

传统的事件管理方法主要包括阻塞式I/O模型和多路复用I/O模型(如select和poll)。这些方法在处理I/O事件时存在一些局限性,特别是在高并发情况下。

(1)阻塞式I/O模型: 在阻塞式I/O模型中,当程序需要等待某个事件完成时,它会阻塞(即停止执行),直到事件完成为止。这意味着程序在等待事件完成时无法继续执行其他任务,从而降低了程序的并发性能。例如,在网络编程中,如果一个连接没有数据可读取,那么整个程序可能会被阻塞,无法处理其他连接。

局限性:

  1. 低并发处理能力:每个连接都需要独立的线程或进程来处理,这在高并发环境下会导致资源消耗过大。
  2. 性能下降:阻塞式模型在等待事件完成时会浪费CPU时间,降低了系统的性能。
  3. 难以管理多个连接:当连接数量增加时,线程或进程的管理变得复杂,容易造成资源耗尽和上下文切换开销增加。

(2)多路复用I/O模型

  • select: select函数允许程序监视多个文件描述符的状态,当有可读或可写事件发生时通知程序进行处理。但是,select在监视大量文件描述符时性能下降严重,因为它需要线性扫描文件描述符列表。
  • poll: poll函数与select类似,但采用了更有效的数据结构,能够避免select的一些性能问题。然而,poll仍然需要遍历整个文件描述符列表,导致在大规模并发情况下仍然存在性能瓶颈。

局限性:

  1. 线性扫描开销:在大规模文件描述符列表中,需要遍历整个列表来查找有事件发生的文件描述符,导致性能下降。
  2. 额外内存开销:需要维护文件描述符集合,可能会消耗较多的内存空间。
  3. 不适用于高并发:当连接数量增加时,多路复用模型的性能也会逐渐下降。

这些传统事件管理方法在高并发环境下存在性能瓶颈,无法很好地满足现代计算机应用对高性能、低延迟的要求。

哈希表作为一种常见的数据结构,用于存储键值对。但是在高并发环境下,哈希表可能会面临以下性能问题:

  • 哈希冲突: 哈希表使用哈希函数将键映射到索引位置。不同的键可能映射到相同的索引,导致冲突。在高并发环境下,大量的并发插入、查找或删除操作可能导致大量的哈希冲突,从而降低操作的效率。

  • 竞争条件: 当多个线程或进程同时进行哈希表的插入、查找或删除操作时,可能会发生竞争条件。竞争条件可能导致数据一致性问题,甚至破坏哈希表的结构,导致不可预测的行为。

  • 锁竞争: 为了避免竞争条件,很多实现会采用锁机制,如互斥锁,来保护哈希表的操作。然而,在高并发环境下,频繁的锁竞争可能会导致性能下降,因为每个操作都需要等待获取锁。

  • 伸缩性问题: 在高并发情况下,哈希表可能需要频繁地进行扩容或收缩操作,以保持合适的负载因子。这些操作可能涉及重新计算哈希值、重新分配内存等,耗费时间和资源。

  • 缓存一致性: 在分布式环境中,多个节点可能共享同一个哈希表,需要考虑缓存一致性的问题。高并发的读写操作可能导致缓存不一致,需要采取额外的机制来保持数据的正确性。

三、epoll 概述

3.1、epoll 的基本概念和工作原理

epoll 是 Linux 操作系统提供的一种 I/O 事件通知机制,用于高效地管理大量的文件描述符(sockets、文件、设备等)的异步 I/O 操作。它的目的是在高并发的网络应用中提供更好的性能和资源利用率,相较于传统的 I/O 多路复用技术(如 select 和 poll)具有更高的效率。

基本概念: epoll 提供了一种非阻塞的 I/O 操作方式,它允许应用程序同时监视多个文件描述符,并在这些描述符上发生事件时通知应用程序。这些事件可以包括可读、可写、错误等情况。epoll 通过将文件描述符注册到一个特殊的数据结构中来管理,从而可以有效地等待多个事件。

工作原理:

  1. 首先需要通过 epoll_create 系统调用创建一个 epoll 实例,该实例代表了一个文件描述符的集合。
  2. 使用 epoll_ctl 系统调用将文件描述符添加到 epoll 实例中,并指定要监视的事件类型(读、写、错误等)。
  3. 使用 epoll_wait 系统调用等待事件的发生。该调用会阻塞,直到有注册的文件描述符上发生了指定的事件。一旦有事件发生,epoll_wait 返回事件的详细信息,包括触发事件的文件描述符和事件类型。
  4. 根据 epoll_wait 返回的事件信息,执行相应的操作。这可以包括读取数据、写入数据、连接处理等。

epoll 的优点:

  1. epoll 使用了事件就绪通知,避免了传统多路复用方法中需要轮询每个文件描述符的开销。
  2. epoll 可以有效地处理大量的并发连接,因为它不会随着文件描述符数量的增加而降低性能。
  3. epoll 只返回那些已经就绪的文件描述符,减少了应用程序不必要的处理。
  4. epoll 支持 “边缘触发” 模式,可以减少数据从内核到用户空间的拷贝次数。

3.2、epoll 在 Linux 内核中的实现方式

epoll 的实现方式主要涉及数据结构和算法的设计。在 Linux 内核中,epoll 的实现主要包括以下几个关键组件:

  • 红黑树(Red-Black Tree): epoll 使用红黑树来存储注册的文件描述符,这使得在添加、删除和查找文件描述符时的时间复杂度都是 O(log n)。红黑树是一种自平衡的二叉搜索树,能够保持树的相对平衡,从而保证操作的高效性能。

  • 就绪列表(Ready List): 内核会维护一个就绪列表,其中包含已经就绪的文件描述符。当文件描述符就绪时,它会被添加到这个列表中。应用程序可以通过系统调用来获取就绪列表中的文件描述符,从而避免了轮询所有文件描述符的开销。

  • 回调机制: 当文件描述符就绪时,内核会调用注册的回调函数来通知应用程序。这些回调函数是在应用程序代码中定义的,它们会处理实际的 I/O 操作。

  • 事件数据结构: 内核会使用数据结构来表示事件,这些数据结构包括有关文件描述符和事件类型的信息。应用程序通过查询这些数据结构,可以了解文件描述符的状态以及需要执行的操作。

epoll 的实现方式充分利用了数据结构和算法的优势,通过红黑树的高效查找和插入,以及就绪列表的通知机制,实现了在高并发情况下高效地管理和处理大量的 I/O 事件。这种设计使得应用程序能够及时地响应就绪的文件描述符,而不需要耗费大量的 CPU 资源在轮询上。

四、哈希表在事件管理中的挑战

  1. 哈希冲突(Collisions):冲突指的是两个或更多的键映射到了同一个桶(bucket)。在高并发情况下,由于并发写入,冲突可能会更加频繁。
  2. 并发安全性(Concurrency Safety):在大规模并发情况下,多个线程或进程同时对哈希表进行读写操作,可能导致数据一致性问题或竞态条件。
  3. 扩容(Resize):在哈希表中插入或删除大量的键值对时,可能会导致哈希表的负载因子增加,从而影响哈希表的性能。
  4. 在大规模并发情况下,读取性能可能成为一个瓶颈。

在大规模并发情况下需要高效地管理事件,可以选择:

  1. 事件队列:使用队列数据结构可以实现高效的事件管理。每当有新的事件发生时,将其添加到队列的末尾,并可以通过多线程或进程异步处理队列中的事件。这种方式可以避免并发冲突,同时保持高效的插入和删除操作。

  2. 树形数据结构:使用树形数据结构,如B树、红黑树或AVL树,可以实现更快速的查找和检索操作。可以根据事件的某种属性(例如时间戳)进行有序存储,并使用树结构进行快速搜索和范围查询。

  3. 基于乐观并发控制的哈希表:乐观并发控制(Optimistic Concurrency Control)是一种无锁技术,适用于高并发情况下的并发操作。基于乐观并发控制的哈希表可以实现更高的并发性能,通过版本号或时间戳来解决冲突,并保证数据一致性。

  4. 分布式数据结构:如果并发情况非常高,可以考虑使用分布式数据结构来处理事件。例如,将事件分布在多个节点或服务器上,通过分片或分区策略来均衡负载,并使用一致性哈希算法或分布式哈希表来管理事件。

五、 红黑树在 epoll 中的应用

红黑树是一种自平衡的二叉搜索树,它可以用于优化事件管理的性能,红黑树用作存储文件描述符的数据结构,起到了管理和组织文件描述符的作用。

  1. 高效的查找和插入:红黑树作为一种自平衡的二叉搜索树,具有快速的查找和插入操作。在 epoll 中,红黑树可以根据文件描述符的值作为键来存储和查找对应的文件描述符,以实现快速的查找和插入。

  2. 文件描述符的有序管理:红黑树中的节点按照键的有序性进行存储。在 epoll 中,可以根据文件描述符的某些属性(如文件描述符的值)将其有序地插入红黑树中。这样可以实现对文件描述符的有序管理,便于进行范围查询或按照一定顺序访问。

  3. 高效的事件检测和触发:在 epoll 中,红黑树存储的文件描述符通常与特定的事件关联。通过在红黑树上进行遍历,可以快速地检测出就绪的文件描述符(即有事件发生的文件描述符),从而触发相应的操作。

  4. 并发安全性支持:在 epoll 中,红黑树作为存储文件描述符的数据结构,需要支持高并发的访问和操作。为了保证并发安全性,可以使用锁机制(如读写锁或细粒度锁)来保护红黑树的并发访问。

六、epoll 中的事件注册与触发

epoll 使用红黑树(红黑树的一种变种,即事件多路分发的红黑树)来实现事件的注册和触发机制。epoll实现事件管理的过程:

  1. 创建红黑树和事件表:

    • 首先,创建一个红黑树,该红黑树用于存储需要监听的文件描述符(File Descriptor,简称 FD)对象。
    • 创建一个事件表,用于存储发生事件的文件描述符和相应的事件类型(如读、写)。
  2. 注册事件:

    • 将需要监听的文件描述符和感兴趣的事件类型(如 EPOLLIN - 可读事件,EPOLLOUT - 可写事件等)添加到红黑树中。
    • 在红黑树节点中存储文件描述符和相应的事件信息。
  3. 阻塞等待事件触发:

    • 将红黑树中的文件描述符注册到内核事件表中,开始监听事件。
    • 等待事件的发生,这个过程中 epoll 会使线程进入阻塞态。
  4. 事件的触发和处理:

    • 当某个文件描述符上有感兴趣的事件发生时,触发事件,并将该文件描述符加入内核事件表的就绪队列中。
    • epoll 从就绪队列中获取已触发的文件描述符,根据红黑树找到对应的节点,并从节点中获取事件信息。
    • epoll 会将该文件描述符和触发的事件放入一个就绪事件列表中,以等待后续的处理。
  5. 处理就绪的事件:

    • 从就绪事件列表中依次取出就绪的文件描述符和对应的事件类型。
    • 根据事件类型,执行相应的处理操作。
红黑树示意图:5 ()/  \3()    10()就绪事件列表:(FD1, EPOLLIN), (FD2, EPOLLOUT)+--------------+|              |
---- FD1 |    EPOLLIN   ||              |+--------------+|              |
---- FD2 |   EPOLLOUT   ||              |+--------------+

注册事件时将文件描述符添加到红黑树中,等待事件触发并将触发的文件描述符加入就绪队列,最后根据事件类型处理就绪事件。

在 epoll 中,红黑树的有序性对事件触发顺序至关重要。

  1. 事件触发顺序的影响:

    • 在 epoll 中,当多个文件描述符上的事件准备就绪时,触发的顺序可能对应不同的处理逻辑或业务需求。例如,在网络通信中,顺序可能决定了消息接收的顺序,而消息接收的顺序可能对应了业务逻辑的处理顺序。因此,确保正确的事件触发顺序对于满足应用程序的需求非常重要。
  2. 红黑树的有序性:

    • 红黑树是一种自平衡的二叉搜索树,它具有固定的存储和遍历顺序。在 epoll 中,红黑树的有序性保证了插入和删除操作的顺序,从而反映了注册事件的顺序。这对于后续的事件触发和处理非常关键。
  3. 事件触发的顺序保证:

    • epoll 在触发事件时,按照红黑树节点的有序顺序进行处理。具体来说,它会沿着红黑树中的左子树进行遍历,保证触发事件的顺序与节点在红黑树中的顺序一致。这样可以保证事件触发的顺序与注册事件的顺序保持一致。

七、红黑树的优势与局限性

在 epoll 中,红黑树具有以下优势:

  1. 快速的插入和删除操作:红黑树是一种自平衡的二叉搜索树,在插入和删除节点时能够保持树的平衡。插入和删除操作的时间复杂度为O(log n),其中n是红黑树中的节点数量。这使得红黑树能够高效地处理事件的注册和注销。

  2. 快速的查找操作:由于红黑树是按照键的有序性进行组织的,它具有快速的查找操作。查找一个键的时间复杂度也为O(log n),在 epoll 中可以根据文件描述符快速找到相应的事件。

  3. 高效的事件触发顺序:红黑树的有序性保证了事件触发顺序与节点在红黑树中的顺序一致。当多个事件同时准备就绪时,epoll 会按照红黑树节点的顺序依次触发事件,从而满足应用程序的需求。

  4. 数据结构的动态平衡性:红黑树会在插入和删除节点时进行颜色变换和旋转操作,以保持树的平衡性。这个动态平衡性能够使红黑树在面对频繁的插入和删除操作时保持较低的高度,减少了查找操作的时间复杂度。

局限性:

  1. 动态平衡调整的复杂性:红黑树通过颜色变换和旋转操作来保持树的平衡。然而,这些操作在实现和理解上可能比较复杂,特别是在面对复杂的插入和删除操作时。

  2. 内存占用:红黑树相对于其他数据结构来说,会占用更多的内存空间。每个节点除了存储值和指针外还需要存储颜色信息,这增加了每个节点的空间开销。对于大规模数据集或内存受限的系统,红黑树的内存占用可能成为一个问题。

  3. 更新操作的开销:红黑树的动态平衡特性意味着插入和删除节点时需要进行颜色变换和旋转操作,以维持树的平衡。这些操作的开销可能会导致更新操作相对较慢,特别是在频繁插入和删除节点的情况下。

  4. 缓存性能:由于红黑树的节点在内存中不一定是连续存储的,因此在访问节点时可能会遇到缓存不命中的问题,从而影响访问性能。相比之下,其他数据结构如数组或链表在缓存中的局部性可能更好,因此在某些情况下可能具有更好的性能。

总结

  1. 红黑树在 epoll 中的角色:红黑树作为一种高效的数据结构,可以通过快速的查找、有序的存储和动态平衡的特性,优化事件的注册和触发机制。它用于存储注册事件的文件描述符,并确保事件的有序触发。

  2. 红黑树的优势:红黑树具有快速的增删查操作、有序性和动态平衡调整等优势。它能够实现快速的事件管理,支持高并发操作,并提供确定的事件触发顺序。

展望未来,事件管理机制如 epoll 可能会在以下方面继续发展:

  1. 更高的并发性能:随着计算机系统的硬件和软件技术的不断发展,事件管理机制可能会进一步优化,以提供更高的并发性能。这可能涉及到更高效的数据结构和算法设计,以及更好的并发控制机制。

  2. 更灵活的事件过滤和选择:随着应用场景的变化和需求的增长,事件管理机制可能会提供更灵活和精细的事件过滤和选择功能。这将使开发人员能够更细致地控制事件的触发条件和处理方式,并根据具体需求进行定制和优化。

  3. 更高级的异步编程模型:未来事件管理机制可能会与更高级的异步编程模型结合,以提供更强大的异步处理能力。例如,结合协程或异步任务框架,可以实现更好的事件驱动编程模式,提高代码的可读性和可维护性。

  4. 跨平台和跨语言支持:随着跨平台和跨语言开发的需求增加,事件管理机制可能会提供更好的跨平台和跨语言支持。这将使开发人员能够更方便地在不同的操作系统和编程语言之间进行事件管理和交互。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/108685.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

功能强大的网站检测工具Web-Check

什么是 Web-Check ? Web-Check是一款功能强大的一体化工具,用于查找有关网站/主机的信息。目前仪表版上可以显示:IP 信息、SSL 信息、DNS 记录、cookie、请求头、域信息、搜索爬虫规则、页面地图、服务器位置、开放端口、跟踪路由、DNS 安全扩…

自定义Chronometer实现定时器

概述 自定义Chronometer实现定时器,引用方便,操作简单。 详细 前言 在Android开发过程中,计时控件是经常回使用到的,在Android控件库中有一个能快捷实现计时功能的控件,它就是Chronometer,今天我们基于它自定义实现…

DataFrame.set_index()方法--Pandas

1.函数功能 为DataFrame重新设置索引(行标签) 2. 函数语法 DataFrame.set_index(keys, *, dropTrue, appendFalse, inplaceFalse, verify_integrityFalse)3. 函数参数 参数含义keys作为行标签的列名,可以DataFrame中的是单个列或者多列组…

C语言——指针进阶(一)

目录 ​编辑 一.字符指针 1.1 基本概念 1.2 面试题 二.指针数组 三.数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 四.数组参数、指针参数 4.1 一维数组传参 ​编辑 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 ​编辑 五.…

好用的可视化大屏适配方案

1、scale方案 优点&#xff1a;使用scale适配是最快且有效的&#xff08;等比缩放&#xff09; 缺点&#xff1a; 等比缩放时&#xff0c;项目的上下或者左右是肯定会有留白的 实现步骤 <div className"screen-wrapper"><div className"screen"…

点亮一颗LED灯

TOC LED0 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能APB2的外设时钟GPIO_InitTypeDef GPIO_Initstructure;GPIO_Initstructure.GPIO_Mode GPIO_Mode_Out_PP;//通用推挽输出GPIO_Initstructure.GPIO_Pin GPIO_Pin_5;GPIO_Initstructure.GPIO_Speed GPIO_S…

剑指 Offer 19. 正则表达式匹配(C++实现)

剑指 Offer 19. 正则表达式匹配https://leetcode.cn/problems/zheng-ze-biao-da-shi-pi-pei-lcof/ 动态规划&#xff1a;通过dp数组剪枝 只需要对各种情况进行分类处理即可 vector<vector<int>> dp;bool helper(const string& s, const int i, const string&am…

【Go 基础篇】Go语言数组遍历:探索多种遍历数组的方式

数组作为一种基本的数据结构&#xff0c;在Go语言中扮演着重要角色。而数组的遍历是使用数组的基础&#xff0c;它涉及到如何按顺序访问数组中的每个元素。在本文中&#xff0c;我们将深入探讨Go语言中多种数组遍历的方式&#xff0c;为你展示如何高效地处理数组数据。 前言 …

【leetcode 力扣刷题】双指针///原地扩充线性表

双指针///原地扩充线性表 剑指 Offer 05. 替换空格定义一个新字符串扩充字符串&#xff0c;原地替换思考 剑指 Offer 05. 替换空格 题目链接&#xff1a;剑指 Offer 05. 替换空格 题目内容&#xff1a; 这是一道简单题&#xff0c;理解题意&#xff0c;就是将字符串s中的空格…

阿里云机器学习PAI全新推出特征平台 (Feature Store),助力AI建模场景特征数据高效利用

推荐算法与系统在全球范围内已得到广泛应用&#xff0c;为用户提供了更个性化和智能化的产品推荐体验。在推荐系统领域&#xff0c;AI建模中特征数据的复用、一致性等问题严重影响了建模效率。阿里云机器学习平台 PAI 推出特征平台&#xff08;PAI-FeatureStore&#xff09; 。…

政务大厅人员睡岗离岗玩手机识别算法

人员睡岗离岗玩手机识别算法通过pythonyolo系列网络框架算法模型&#xff0c;人员睡岗离岗玩手机识别算法利用图像识别和行为分析&#xff0c;识别出睡岗、离岗和玩手机等不符合规定的行为&#xff0c;并发出告警信号以提醒相关人员。Python是一种由Guido van Rossum开发的通用…

Leetcode77. 组合

给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 回溯剪枝 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution {public List<List<Integer>> combine(int n, i…

框架分析(6)-Ruby on Rails

框架分析&#xff08;6&#xff09;-Ruby on Rails 专栏介绍Ruby on Rails核心概念以及组件讲解MVC架构模式约定优于配置强大的ORM支持自动化测试丰富的插件生态系统RESTful路由安全性总结 优缺点优点快速开发简单易学MVC架构强大的ORM支持大量的插件和Gem支持 缺点性能问题学习…

maven下载不了仓库地址为https的依赖jar,配置参数忽略ssl安全检查

问题原因 私服使用的https地址&#xff0c;然后安全证书过期的或没有&#xff0c;使用maven命令时&#xff0c;可以添加以下参数&#xff0c;忽略安全检查 mvn -Dmaven.wagon.http.ssl.insecuretrue -Dmaven.wagon.http.ssl.allowalltrue -Dmaven.wagon.http.ssl.ignore.vali…

【GoLang】go入门:go语言执行过程分析 常见数据类型(基本数据类型)

1、go语言执行过程分析 【1】执行流程分析 通过 go build 进行编译 运行上一步生成的可执行文件 通过 go run 命令直接运行 【2】上述两种执行流程的区别 在编译时&#xff0c;编译器会将程序运行时依赖的库文件包含在可执行文件中&#xff0c;所以可执行文件会变大很多通过g…

一文1500字从0到1搭建 Jenkins 自动化测试平台

Jenkins 自动化测试平台的作用 自动化构建平台的执行流程&#xff08;目标&#xff09;是&#xff1a; 我们将代码提交到代码托管工具上&#xff0c;如github、gitlab、gitee等。 1、Jenkins要能够检测到我们的提交。 2、Jenkins检测到提交后&#xff0c;要自动拉取代码&#x…

慢SQL调优第一弹——更新中

基础知识 Explain性能分析 通过explain我们可以获得以下信息&#xff1a; 表的读取顺序 数据读取操作的操作类型 哪些索引可以被使用 哪些索引真正被使用 表的直接引用 每张表的有多少行被优化器查询了 1&#xff09;ID字段说明 select查询的序列号&#xff0c;包含一组数…

深度学习技术

深度学习是什么&#xff1f; 深度学习&#xff0c;英文名为Deep Learning&#xff0c;其实就是机器学习的一种高级形式。它的灵感来源于人脑神经网络的工作方式&#xff0c;是一种让机器可以自主地从数据中学习和提取特征的技术。你可以把它想象成一位小侦探&#xff0c;通过不…

C++学习记录——이십팔 C++11(4)

文章目录 包装器1、functional2、绑定 这一篇比较简短&#xff0c;只是因为后要写异常和智能指针&#xff0c;所以就把它单独放在了一篇博客&#xff0c;后面新开几篇博客来写异常和智能指针 包装器 1、functional 包装器是一个类模板&#xff0c;对可调用对象类型进行再封装…

性能测试流程? 怎么做性能测试?

一、前期准备 性能测试虽然是核心功能稳定后才开始压测&#xff0c;但是在需求阶段就应该参与&#xff0c;这样可以深入了解系统业务、重要功能的业务逻辑&#xff0c;为后续做准备。 二、性能需求分析&#xff08;评审&#xff09; 评审时&#xff0c;要明确性能测试范围、目…