I/O多路复用:解锁服务器高性能的钥匙

news2024/12/23 19:50:29

文章目录

  • I/O 多路复用
    • 引言
    • I/O 多路复用:并发处理的艺术
      • 介绍
      • I/O多路复用的意义
      • Linux下的I/O多路复用机制
      • 总结
    • 文件描述符(fd):连接的桥梁
      • 概述
      • 文件描述符的作用
      • 文件描述符的生命周期
      • 特殊的文件描述符
      • 文件描述符与I/O多路复用
    • 套接字(socket):网络通信的基石
      • 定义与作用
      • 套接字的结构
      • 套接字的类型
      • 套接字的生命周期
      • 套接字与I/O多路复用
      • 结论
    • 数据传输流程:从客户端到服务器
      • 应用层:数据的起源
      • 传输层:数据的保护与分段
      • 网络层:数据的路由与寻址
      • 数据链路层:数据的链路级封装
      • 物理层:数据的物理传输
      • 内核处理:数据的接收与解析
      • 应用程序读取:数据的使用
    • DMA技术:加速数据传输
      • DMA的基本工作原理
      • DMA在数据接收过程中的作用
      • DMA技术的优势
      • 结论
    • I/O多路复用的重要性:优化并发处理
      • 理解并发处理的挑战
      • I/O多路复用:解决方案
      • 主流的I/O多路复用技术
      • 性能考量
      • 结论
    • 结论:I/O多路复用的未来
      • 当前趋势与展望
      • 技术迭代与创新
      • 面向未来的设计与开发
      • 结语

I/O 多路复用

引言

在当今高度互联的世界中,服务器面临着前所未有的并发请求挑战。为了应对这种高负载,I/O多路复用技术成为了提升服务器效率和响应能力的关键。本文将深入探讨I/O多路复用的原理,解释其核心组件,以及它是如何在现代服务器架构中发挥重要作用的。

I/O 多路复用:并发处理的艺术

介绍

I/O多路复用是一种关键的并发编程技术,它允许一个线程或进程同时监控多个文件描述符(fd),并在这些描述符变为可读或可写时立即得到通知。这种机制主要在操作系统级别实现,通过内核的支持,为应用程序提供了高效管理I/O事件的能力。在Linux平台,有几种主流的I/O多路复用方法,包括selectpollepoll

I/O多路复用的意义

在没有I/O多路复用的情况下,服务器通常采用“一连接一线程”模型,即为每个客户端连接创建一个新的线程。然而,这种方法在高并发环境下会遇到严重的性能瓶颈,因为线程的创建和上下文切换消耗了大量的CPU资源。此外,操作系统能够支持的线程数量也是有限的,进一步限制了服务器的并发处理能力。

I/O多路复用技术通过允许一个线程同时监控多个文件描述符,有效解决了这些问题。它消除了不必要的线程创建和切换,使得服务器能够以最小的资源消耗处理大量的并发连接,极大提高了系统的吞吐量和响应速度。

Linux下的I/O多路复用机制

Linux操作系统提供了几种不同的I/O多路复用API,每种API都有其特点和适用场景:

  1. select

    • select是最古老的I/O多路复用函数,它可以监控多个文件描述符的读写状态。
    • 使用select时,你需要指定一个时间间隔,如果在这段时间内没有任何描述符就绪,select将返回。
    • select的一个缺点是它有一个固定的文件描述符上限,默认通常是1024,这在高并发场景下可能是一个限制。
    • 另外,每次调用select都会导致内核和用户空间之间进行数据拷贝,这在描述符较多时可能会降低效率。
  2. poll

    • poll克服了select的固定描述符上限问题,理论上可以监控无限数量的文件描述符。
    • poll同样需要指定一个时间间隔,但它不需要像select那样复制描述符集合,因此在大量描述符情况下表现更好。
    • 然而,poll的每次调用都需要遍历整个描述符列表来查找就绪的描述符,这在实际中有一定的开销。
  3. epoll

    • epoll是Linux 2.6内核引入的I/O多路复用接口,它比selectpoll更高效,尤其在高并发场景下。
    • epoll采用事件驱动模型,只需要注册感兴趣的事件,当这些事件发生时,epoll会主动通知应用程序。
    • epoll不会在每次调用时遍历整个描述符列表,而是维护一个活跃的事件列表,这大大减少了CPU的开销。
    • 此外,epoll还支持边缘触发(ET)模式,这可以减少事件的重复通知,进一步提高效率。

总结

I/O多路复用技术是现代服务器架构中不可或缺的一部分,它通过优化I/O事件的处理方式,显著提高了并发处理能力和资源利用率。选择合适的I/O多路复用方法(如selectpollepoll)对于构建高性能的网络应用至关重要,能够确保服务器在面对大量并发连接时依然保持高效和稳定。

文件描述符(fd):连接的桥梁

概述

文件描述符(File Descriptor, 简称fd)是操作系统内部用于标识已打开文件的非负整数,它为应用程序提供了访问文件和设备的抽象接口。在Linux系统中,几乎所有的输入输出资源都可以被视为文件,包括常规文件、目录、设备、管道、网络套接字等,它们都被赋予一个唯一的文件描述符。

文件描述符的作用

文件描述符作为应用程序与操作系统内核之间的桥梁,具有以下关键作用:

  1. 资源定位:每个文件描述符都指向内核中的一个文件表项,该表项包含了关于文件状态的所有信息,如文件的位置、权限、打开模式等。通过文件描述符,应用程序可以访问并操作这些文件资源。

  2. 读写操作:文件描述符允许应用程序执行基本的读写操作。例如,使用read()系统调用来从文件描述符读取数据,或使用write()系统调用来向文件描述符写入数据。

  3. 资源管理:文件描述符还支持其他文件操作,如关闭文件、设置文件位置指针、获取文件状态等。这使得应用程序能够有效地管理和控制对文件资源的访问。

  4. 进程间通信:文件描述符可以用于进程间通信(IPC),比如通过管道(pipe)或套接字(socket)实现进程间的数据传输。

  5. 并发处理:在多线程或多进程环境中,文件描述符支持并发的读写操作,允许多个线程或进程同时访问同一文件资源,只要它们拥有相应的文件描述符。

文件描述符的生命周期

文件描述符的生命周期通常与进程相关联。当一个进程打开一个文件时,操作系统会为该文件分配一个未使用的文件描述符。这个描述符在进程的整个生命周期内保持有效,直到进程显式地关闭它,或者进程终止,此时所有未关闭的文件描述符将自动关闭。

特殊的文件描述符

在Linux中,有几个预定义的文件描述符具有特殊意义:

  • 0(stdin):标准输入,默认指向终端设备。
  • 1(stdout):标准输出,默认指向终端设备。
  • 2(stderr):标准错误输出,通常用于报告错误信息,也默认指向终端设备。

文件描述符与I/O多路复用

文件描述符与I/O多路复用技术紧密相关。I/O多路复用允许一个进程监控多个文件描述符的I/O事件,如可读或可写事件。当任一文件描述符准备好时,进程会收到通知,从而可以立即处理I/O操作。这在处理大量并发连接的网络服务器中尤为重要,可以显著提高资源的利用效率。

总之,文件描述符是操作系统提供给应用程序的重要接口,它不仅简化了对文件和设备的访问,还为实现复杂的输入输出操作和进程间通信提供了基础。

套接字(socket):网络通信的基石

定义与作用

套接字(Socket)是网络编程中的一个核心概念,它提供了一种用于网络通信的抽象接口,使得应用程序可以跨网络发送和接收数据。在TCP/IP协议栈中,套接字充当了应用程序与网络层之间的桥梁,负责数据的封装和解封,以及处理数据的可靠传输。

套接字的结构

在操作系统层面,套接字表现为一个内核对象,其中包含了一系列数据结构和缓冲区,用于存储即将发送的数据和接收到的数据。这些缓冲区是内核中的内存区域,数据在发送前会被临时存放在发送缓冲区中,而在接收时则会先到达接收缓冲区。缓冲区的存在有助于平滑数据流,避免由于网络延迟或带宽波动造成的性能影响。

套接字的类型

套接字主要有三种类型,每种类型适用于不同的通信场景:

  1. 流式套接字(SOCK_STREAM)

    • 基于TCP协议,提供面向连接的、可靠的、全双工的数据流传输。
    • 保证数据按顺序送达,且不会丢失或重复。
  2. 数据报套接字(SOCK_DGRAM)

    • 基于UDP协议,提供无连接的、不可靠的数据报传输。
    • 不保证数据的顺序和完整性,但提供更快的数据传输速度。
  3. 原始套接字(SOCK_RAW)

    • 允许直接访问底层协议,通常用于实现特殊的网络协议或诊断工具。
    • 需要高级别的编程技巧和对网络协议的深刻理解。

套接字的生命周期

  • 创建:应用程序通过调用socket()系统调用来创建一个套接字。
  • 绑定:使用bind()函数将套接字与本地网络地址(IP地址和端口号)关联起来。
  • 监听(仅服务器):服务器使用listen()函数将套接字置于监听状态,等待客户端的连接请求。
  • 连接(客户端):客户端使用connect()函数与服务器的套接字建立连接。
  • 数据传输:通过send()recv()函数发送和接收数据。
  • 关闭:使用close()函数关闭套接字,释放相关资源。

套接字与I/O多路复用

在高并发的网络服务中,套接字与I/O多路复用技术(如selectpollepoll)紧密相连。I/O多路复用允许一个线程监控多个套接字的I/O事件,一旦有套接字准备就绪(可读或可写),即可立即处理,避免了不必要的轮询和线程切换,显著提高了服务器的效率和响应速度。

结论

套接字是网络通信的基础,它通过TCP/IP协议栈中的各种机制,为应用程序提供了网络数据传输的便利。理解和熟练掌握套接字的使用,是开发高性能网络应用程序的关键。无论是客户端还是服务器端的开发,套接字都是不可或缺的工具,它使得网络编程既强大又灵活。

数据传输流程:从客户端到服务器

那数据到达我们的服务器,被用户程序读取到,中间的过程具体是什么样的?
在这里插入图片描述

数据从客户端到服务器的传输是一个复杂而精细的过程,涉及到多个层次的封装和解封,每一层都添加或移除特定的信息,以确保数据能够正确地在网络上传输并最终到达目的地。以下是这一流程的详细分解:

应用层:数据的起源

  1. 数据生成:在客户端的应用程序中,用户操作或程序逻辑产生需要传输的数据,如HTTP请求、FTP文件传输指令等。

  2. 应用层封装:数据被封装成应用层协议的数据单元,例如HTTP请求消息或FTP命令。这个过程可能还包括数据的压缩、加密或格式转换,以便于传输。

传输层:数据的保护与分段

  1. 传输层协议选择:数据被交给传输层,最常用的协议是TCP(传输控制协议)或UDP(用户数据报协议)。TCP提供面向连接、可靠的数据传输,而UDP提供无连接、尽力而为的数据传输。

  2. 数据分段与头部添加:数据在传输层被分割成较小的段,每一段加上TCP或UDP头部,其中包含了源端口、目标端口、序列号、确认号等信息,用于数据的有序传输和错误检测。

网络层:数据的路由与寻址

  1. IP封装:传输层的段被封装进IP数据包中,IP头部包含了源IP地址和目标IP地址,用于确定数据在网络中的路径。

  2. 路由决策:数据包通过路由器进行转发,每跳路由器根据自身的路由表决定下一跳的地址。

数据链路层:数据的链路级封装

  1. 链路层封装:到达物理网络前,数据包被封装进数据链路层的帧中,头部和尾部包含了源MAC地址、目标MAC地址、类型字段和校验码,用于确保数据在链路上的正确传输。

  2. 以太网帧:在以太网中,数据链路层的封装结果是以太网帧,它包含前导码、目的和源MAC地址、类型、数据和FCS(帧校验序列)。

物理层:数据的物理传输

  1. 信号转换:以太网帧被转换成电信号或光信号,通过物理介质(如铜缆或光纤)传输。

  2. DMA技术:在服务器端,网卡利用DMA技术直接将接收到的数据帧写入内核缓冲区,无需CPU参与数据的搬运,从而减少了CPU的负载,提高了数据处理效率。

内核处理:数据的接收与解析

  1. 中断处理:数据到达后,网卡触发中断,通知CPU有数据待处理。

  2. 协议栈解析:内核中的网络协议栈开始解析数据帧,去除链路层、网络层和传输层的封装,最终将数据交付给应用层。

  3. 套接字文件:解析后的数据最终存入与套接字关联的内核缓冲区中,应用程序通过读取套接字文件,即可以从缓冲区中获取数据。

应用程序读取:数据的使用

  1. 数据提取:应用程序调用读取函数(如readrecv),从套接字文件中提取数据。

  2. 数据处理:应用程序对数据进行解密、解压、解析等处理,使之成为可操作的形式,最后进行相应的业务逻辑处理。

通过以上步骤,数据从客户端的生成到服务器的接收和处理,形成了一个完整的数据传输流程。这一过程展示了网络协议栈的层次结构和各层的功能,同时也体现了现代网络通信的复杂性和高效性。

DMA技术:加速数据传输

DMA(Direct Memory Access,直接存储器访问)技术是一种允许硬件子系统与主内存之间直接进行数据传输的技术,而无需CPU介入处理每一个字节的传输。这一特性极大地提升了数据传输的速度和效率,特别是在高带宽、高数据量的场景下,如高速网络接口卡(NICs)、磁盘控制器和其他I/O设备中,DMA发挥了关键作用。

DMA的基本工作原理

  1. 初始化阶段

    • CPU将DMA控制器配置好,包括设置起始内存地址、数据传输方向(读或写)、传输字节数等参数。
    • CPU启动DMA传输,之后可以去执行其他任务。
  2. 数据传输阶段

    • DMA控制器接管总线控制权,开始直接在设备和内存之间传输数据。
    • 在这个过程中,DMA控制器负责数据的读取和写入,不需要CPU的直接参与,大大减轻了CPU的负担。
  3. 结束阶段

    • 当数据传输完成,DMA控制器会释放总线控制权,并向CPU发出中断请求,告知数据传输完毕。
    • CPU响应中断,检查DMA传输的状态,然后继续执行之前的任务或者处理DMA传输的结果。

DMA在数据接收过程中的作用

对于网络接口卡(NICs)而言,DMA技术的应用尤为突出。当NIC接收到数据包时:

  1. DMA触发

    • NIC检测到有效数据包后,通过DMA机制直接将数据包写入预先分配好的内核缓冲区中。
  2. 减少CPU干预

    • 这个过程避免了CPU频繁地从NIC读取数据,节省了CPU资源,使得CPU可以专注于更复杂的计算任务或其他系统管理功能。
  3. 提高数据处理速度

    • 由于数据直接在NIC和内存之间传输,传输速率仅受限于物理层和NIC的性能,因此数据处理速度得到了显著提升。
  4. 中断处理优化

    • 数据传输完成后,NIC会向CPU发送中断信号,但中断处理可以被优化,例如通过批量处理多个数据包的中断(NAPI,New API)来进一步减少CPU开销。

DMA技术的优势

  • 高效率:DMA避免了CPU的瓶颈,数据传输速度接近设备的最大吞吐能力。
  • 低延迟:数据可以直接在设备和内存之间传输,减少了等待CPU调度的时间。
  • 高带宽:适用于大量数据的快速传输,如大文件的读写、数据库操作和网络通信等。
  • 节能:减少了CPU的活跃时间,有助于降低功耗和散热需求。

结论

DMA技术是现代计算机系统中不可或缺的一部分,尤其在高性能计算、大规模数据处理和实时系统中发挥着至关重要的作用。通过DMA,不仅可以显著提升数据传输的效率,还能优化整个系统的资源分配,实现更高效的计算和通信。

I/O多路复用的重要性:优化并发处理

理解并发处理的挑战

在传统的服务器设计中,为每个客户端连接创建独立的线程或进程来处理I/O操作是一种常见做法。然而,这种方法在高并发场景下面临严重的问题。首先,创建和销毁线程或进程需要消耗大量的系统资源,包括内存和CPU时间。其次,线程或进程的上下文切换也会带来额外的开销,尤其是在多核处理器环境下,这可能导致性能瓶颈。

I/O多路复用:解决方案

I/O多路复用技术通过允许一个单一的线程或进程同时监控多个文件描述符(fd),为并发处理提供了一个高效的解决方案。它使得服务器能够以最小的资源消耗持续监测这些fd的状态,如可读、可写或异常情况。一旦有fd的状态发生变化,多路复用器会立即通知应用程序,从而避免了不必要的轮询,显著降低了CPU的利用率和系统的响应时间。

主流的I/O多路复用技术

在Linux平台上,有几种主要的I/O多路复用技术,它们各有优势和局限:

  • select

    • 这是一种较早的多路复用技术,能够同时监控多个fd的读写状态。select的主要限制在于每次调用时需要在用户空间和内核空间之间复制fd集合,这在fd数量庞大时会导致性能下降。另外,select的fd数量受系统限制,通常为1024。
  • poll

    • poll克服了select的部分限制,例如不再有fd数量的硬性上限,理论上可以监控任意数量的fd。但是,poll仍然需要在每次调用时复制fd集合,且每个fd的检查是独立进行的,这意味着即使大多数fd没有状态变化,poll仍然需要遍历整个集合,这在高并发环境下仍然是一个效率问题。
  • epoll

    • epoll是Linux 2.6内核引入的高级I/O多路复用机制,它采用了事件驱动的模型,只关注真正发生变化的fd,从而极大地提高了效率。epoll使用事件回调的方式,当fd状态改变时,内核会主动通知应用程序,无需应用程序主动轮询。此外,epoll还提供了边缘触发(Edge Triggered)模式,使得在事件发生一次后不再重复通知,除非再次发生新的事件,这进一步减少了不必要的通知,提高了性能。

性能考量

在选择适当的I/O多路复用技术时,有几个关键因素需要考虑:

  • 并发水平:在高并发场景下,epoll通常是最优的选择,因为它能够高效地处理大量fd的监控。
  • 系统兼容性selectpoll在大多数系统上都有良好的支持,而epoll则需要至少Linux 2.6内核版本。
  • 性能需求:对于性能敏感的应用,如Web服务器、数据库服务器等,epoll的事件驱动模型能够提供最佳的响应时间和最高的吞吐量。

结论

I/O多路复用技术是现代高并发服务器架构的关键组成部分,它通过最小化资源消耗和最大化处理能力,极大地提升了服务器的性能。选择适合自身应用场景的多路复用技术,对于构建高效、响应迅速的网络服务至关重要。随着技术的进步,如epoll等先进的I/O多路复用机制将继续推动网络服务器性能的边界,满足不断增长的互联网需求。

结论:I/O多路复用的未来

当前趋势与展望

I/O多路复用技术已经证明了其在高并发网络服务中的价值,随着互联网流量的持续爆炸性增长,以及云计算、物联网和边缘计算等新兴领域的快速发展,I/O多路复用技术的未来显得尤为光明。技术的持续进步正推动I/O多路复用向着更高效、更智能、更适应多样化需求的方向演进。

技术迭代与创新

  • 下一代多路复用机制:虽然epoll已经在Linux环境下取得了显著的成功,但研究者和工程师们并未止步于此。新的多路复用机制,如AIO(异步I/O)和IO_URING,正在探索更高效、更低延迟的I/O处理方式,有望进一步提高服务器的并发处理能力和响应速度。

  • 智能化调度:未来的I/O多路复用技术可能融入更多智能化元素,如基于机器学习的预测算法,能够动态调整资源分配和优先级,以更好地适应不同工作负载的特性,实现更精细化的性能优化。

  • 跨平台一致性:虽然epoll在Linux环境下表现出色,但在Windows和其他操作系统中,类似的技术如IOCP(I/O Completion Ports)也有广泛应用。未来的发展趋势可能是朝着跨平台的I/O多路复用技术标准迈进,使得开发者能够更容易地编写可移植的高性能网络应用。

面向未来的设计与开发

对于系统设计者和开发者而言,理解和掌握I/O多路复用不仅是构建高性能网络服务的基础,也是紧跟技术前沿、不断创新的必要条件。以下几点建议值得参考:

  • 持续学习与实践:技术领域日新月异,定期更新知识体系,了解最新的I/O多路复用技术和框架,通过实践项目加深理解。

  • 性能优化意识:在设计系统架构时,将性能优化作为核心考量之一,充分考虑I/O多路复用的适用场景和限制,选择最适合自身应用需求的方案。

  • 模块化与可扩展性:构建系统时采用模块化设计,确保I/O多路复用机制的灵活性和可替换性,便于未来技术迭代时的平滑升级。

结语

I/O多路复用技术是现代网络服务的基石,它的持续发展和创新不仅推动了服务器架构的进步,也为开发者和系统设计者提供了更广阔的空间,以构建更加高效、灵活和响应迅速的网络应用。在这个数据驱动的时代,掌握I/O多路复用的精髓,意味着把握住了网络服务性能优化的关键,为迎接未来的技术挑战做好了准备。


综上所述,I/O多路复用技术不仅是解决当前高并发问题的有效手段,更是未来网络服务架构创新和优化的重要驱动力。随着技术的不断发展和完善,I/O多路复用将继续引领服务器技术的革新,为构建下一代高性能网络基础设施奠定坚实的基础。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构—链式二叉树-C语言

代码位置:test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言: 在现实中搜索二叉树为常用的二叉树之一,今天我们就要通过链表来实现搜索二叉树。实现的操作有:建二叉树、前序遍历、中序遍历、后序遍历、求树的节点个数、求…

路径规划 | 基于DQN深度强化学习算法的路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 DQN路径规划算法 基于深度强化学习算法的路径规划 matlab2023b 栅格环境,走迷宫,可以通过窗口界面方便观察交互过程,代码注释详尽。 程序设计 完整源码和数据私信博主回复基于DQN深…

什么是大数据信用?它的作用有哪些?怎么查询大数据?

在金融行业中,风险管理是至关重要的一环。传统的信用评估方法主要基于借款人的财务状况和信用历史,但这些信息往往无法全面反映借款人的信用状况。大数据信用的出现为金融风控提供了新的解决方案。 首先,大数据信用可以为金融机构提供更全面的…

flutter实现语言的国际化

目录 前言 一、GetX实现国际化(推荐) 1.安装Getx 2.创建国际化的文件 3.使用国际化字符串 4.配置GetMaterialApp 5.更改语言 6.系统语言 ​编辑 7.原生工程配置 1.iOS工程配 1.打开iOS工程,在Project的info里面添加语言 2.创建String File文件 2.andr…

运维管理数智化:数据与智能运维场景实践

本文来自腾讯蓝鲸智云社区用户:CanWay 摘要:笔者根据自身的技术和行业理解,分享嘉为蓝鲸数据与智能运维场景实践。 涉及关键字:一体化运维、平台化运维、数智化运维、AIOps、运维PaaS、运维工具系统、蓝鲸等。 本文作者&#xf…

vue2迁移到vue3注意点

vue2迁移到vue3注意点 1、插槽的修改 使用 #default , 以及加上template 模板 2、 类型的定义,以及路由,vue相关资源(ref, reactive,watch)的引入等 3、类装饰器 1)vue-class-component是vue官方库,作…

ActiveMQ-CVE-2023-46604

Apache ActiveMQ OpenWire 协议反序列化命令执行漏洞 OpenWire协议在ActiveMQ中被用于多语言客户端与服务端通信。在Apache ActvieMQ5.18.2版本以及以前,OpenWire协议通信过程中存在一处反序列化漏洞,该漏洞可以允许具有网络访问权限的远程攻击者通过操作…

网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术

网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术 在当今的大数据时代,网络爬虫技术已经成为获取信息的重要手段之一。Python凭借其强大的库支持,成为了进行网页数据抓取的首选语言。在众多的爬虫库中,BeautifulSoup和Scrap…

1140 分珠

这是一个图的划分问题&#xff0c;可以使用深度优先搜索&#xff08;DFS&#xff09;或广度优先搜索&#xff08;BFS&#xff09;来解决。我们需要找到一种划分方式&#xff0c;使得划分后的两部分总重的差值的绝对值最小。 以下是对应的C代码&#xff1a; #include <iost…

房地产市场2024年展望——深度解读行业趋势

作为一名有十多年经验的地产营销人&#xff0c;对于2024年房地产行业的发展趋势&#xff0c;我认为可以从以下几个方面来探讨&#xff0c;如果觉得对你有帮助&#xff0c;请不吝一个三连&#xff08;赞同喜欢收藏&#xff09; 一、市场调整与分化加剧 在经历了较长时间的市场…

用chatgpt写了个二级导航,我全程一个代码没写,都是复制粘贴

今天心血来潮&#xff0c;让chatgpt给我写个移动端的二级导航菜单&#xff0c;效果如下&#xff1a; 1、两级导航&#xff0c;竖向排列&#xff0c;一级导航默认显示&#xff0c;二级隐藏 2、抽屉伸缩效果&#xff0c;点击一级导航&#xff0c;展开二级导航&#xff0c;再次点…

同步IO、异步IO以及五种网络IO模式

目录 一、同步IO和异步IO 二、五种网络IO模式 1、阻塞IO 2、非阻塞IO 3、IO多路复用 3.1、SELECT 3.2、POLL 3.3、EPOLL 一、同步IO和异步IO 场景1&#xff1a; 小明去打开水&#xff0c;而开水塔此时没有水&#xff0c;小明在现场一直等待开水到来&#xff0c;或者不断…

老牌数据库HRS,三分之二二区以上!| CHARLS等七大老年公共数据库周报(7.10)...

七大老年公共数据库 七大老年公共数据库共涵盖33个国家的数据&#xff0c;包括&#xff1a;美国健康与退休研究 (Health and Retirement Study, HRS)&#xff1b;英国老龄化纵向研究 &#xff08;English Longitudinal Study of Ageing, ELSA&#xff09;&#xff1b;欧洲健康、…

图片转文字的软件,分享3种不同的类型的软件!

在信息爆炸的时代&#xff0c;图片作为一种直观、生动的信息载体&#xff0c;已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;有时候我们可能需要将图片中的文字提取出来&#xff0c;以便于编辑、整理或进一步使用。那么&#xff0c;有哪些实用的图片转文字软件可以…

基于粒子滤波和帧差法的目标跟踪matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 帧差法 4.2 粒子滤波 4.3 粒子滤波与帧差法的结合 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 原重采样方法&#xff1a; 改进重采样方法&#xff1a; 2.算法…

OpenSceneGraph学习笔记

目录 引言第一章&#xff1a;OSG概述一、前言&#xff08;1&#xff09;为什么要学习OSG?&#xff08;2&#xff09;OSG的组成&#xff08;3&#xff09;OSG的智能指针&#xff08;4&#xff09;OSG的安装编译 二、第一个OSG程序&#xff08;1&#xff09;Hello OSG程序&#…

关于升级WIN11后,点击功能面板空白的解决方法

方法一&#xff1a;先试试按下WinX,选择Windows powershell(管理员)&#xff0c;输入sfc /scannow等待系统自动扫描完成后重启系统看看是否修复。 方法二&#xff1a;打开微软Windows11镜像下载官网&#xff1a;Download Windows 11&#xff0c;下载对应版本和语言的ISO系统镜…

人工智能与伦理挑战:多维度应对策略

人工智能技术近年来取得了迅猛发展&#xff0c;广泛应用于医疗诊断、金融分析、教育辅助、自动驾驶等各个领域&#xff0c;极大地提升了生产效率和服务质量&#xff0c;推动了科技进步和商业创新。然而&#xff0c;伴随其普及和应用的泛滥&#xff0c;AI也带来了数据隐私侵犯、…

【银河麒麟操作系统】虚机重启lvs丢失现象分析及处理建议

了解银河麒麟操作系统更多全新产品&#xff0c;请点击访问麒麟软件产品专区&#xff1a;https://product.kylinos.cn 环境及现象描述 40台虚机强制重启后&#xff0c;其中8台虚机找不到逻辑卷导致启动异常&#xff0c;后续通过pvcreate 修复重建pv&#xff0c;激活vg和lv并修复…

基于python的图像去水印

1 代码 import cv2 import numpy as npdef remove_watermark(image_path, output_path):# 读取图片image cv2.imread(image_path)# 转换为灰度图gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用中值滤波去除噪声median_filtered cv2.medianBlur(gray, 5)# 计算图像的梯…