DP读书:《openEuler操作系统》(九)从IPC到网卡到卡驱动程序

DP读书:《openEuler操作系统》从IPC到网卡到卡驱动程序)

    • 上章回顾_SPI
    • 上节回顾_TCP
  • 网卡驱动程序
      • 简介
        • 1.设备驱动
        • 2.总线与设备
        • 3.网卡及其抽象
      • 驱动程序的注册与注销
        • 1. 注册
        • 2. 注销
      • 设备初始化
        • 1. 硬件初始化
        • 2. 软件初始化
      • 设备的打开与关闭
        • 1. 设备的打开
        • 2. 设备的关闭

最近几天都在啃openEuler的文档,meta-yocto那里我啃了一下Bitbake构建的相关知识,过两天我发一些相关的内容。

上章回顾_SPI

DP读书:《openEuler操作系统》(七)FSCK与VFS虚拟文件系统
与同一进程中的同线程间通信不同,进程与进程间的通信主要发生在相互独立的地址空间里 与同一进程中的同线程间通信不同,进程与进程间的通信主要发生在相互独立的地址空间里 与同一进程中的同线程间通信不同,进程与进程间的通信主要发生在相互独立的地址空间里

通信机制涉及系统调用,往往速度较慢,也是程序耗时的主要原因之一。进程间通信机制主要包括:信号(Signal)、管道(Pipe)、信号量、共享内存(Shared Memory)、消息队列(Message Queue)、套接字(Socket)。对于 openEuler,线程是一种特殊的共享了地址空间的进程,在此处不需要严格区分。
简单可以通过 锁、信号量 来了解线程间通信;可以从 共享内存、消息传递 来了进程间通信。
SPI具体的关系图
共享信道

上节回顾_TCP

DP读书:《openEuler操作系统》(八)TCP、UDP与跨机器通讯
在跨机器通讯中,多个计算机通过网络互联组成计算集群 在跨机器通讯中,多个计算机通过网络互联组成计算集群 在跨机器通讯中,多个计算机通过网络互联组成计算集群

本节主要以跨机器通讯的基本原理和openEuler上的网络协议栈、网络子系统架构、网络设备驱动、套接字、数据传输的具体流程,上节简单介绍TPC/IP协议栈。
openEuler的技术架构图

在openEuler网络协议栈中,逻辑结构如下:
网络分层模型

软件角度openEuler网络协议栈分为三层:Socket层、TCP/IP层、驱动层。

网卡驱动程序

TCP/IP五层协议栈中的物理层和数据链路层协议通常集成在网卡中,而操作系统只负责实现网络层和传输层协议。


下面是正题:

简介

本节主要介绍网卡、总线及驱动的基本原理,以遵循PCIe总线规范的

1.设备驱动

设备驱动是一种软件程序,用于管理计算机硬件设备与操作系统之间的交互。在计算机系统中,硬件设备(如网卡、显卡、声卡等)通常无法直接与操作系统进行通信,因此需要设备驱动程序作为中间层,将操作系统的指令翻译成硬件设备能够理解的语言,并将硬件设备的状态信息反馈给操作系统。

对于遵循PCIe(Peripheral Component Interconnect Express)总线规范的设备(如网卡),其驱动程序需要特别设计以实现与PCIe总线的兼容。PCIe是一种高速串行计算机扩展总线标准,用于连接各种高速设备,如显卡、网卡、固态硬盘等。

2.总线与设备

在计算机体系结构中,总线(Bus)扮演着至关重要的角色,它是连接各个设备并实现它们之间通信的桥梁。总线可以看作是一条或多条数据通道,允许在多个设备之间传输数据、地址和控制信息。

总线的类型与特点

  1. 内部总线:连接计算机内部各部件,如CPU、内存、I/O设备等。
  2. 外部总线:连接计算机与外部设备,如打印机、显示器等。
  3. 通信总线:用于计算机之间或计算机与外部设备之间的远距离通信。

PCIe(Peripheral Component Interconnect Express)是一种高速串行计算机扩展总线标准。与早期的PCI和PCI-X总线相比,PCIe提供了更高的数据传输速率、更好的扩展性和更低的功耗。PCIe总线使用点对点拓扑结构,每个设备都有自己的专用连接,从而减少了数据冲突和提高了带宽利用率。

设备与总线的交互

设备驱动程序在设备与总线之间的交互中扮演着关键角色。驱动程序需要与总线进行通信,以配置设备、传输数据和处理错误。

  1. 设备初始化:驱动程序会向总线发送指令,初始化连接到总线的设备。这包括设置设备的参数、分配内存和I/O资源等。
  2. 数据传输:设备驱动程序通过总线进行数据的发送和接收。在PCIe总线中,数据以数据包的形式进行传输,驱动程序需要确保数据的正确封装和解析。
  3. 中断处理:当设备遇到错误或需要操作系统的关注时,它会通过总线发送中断信号。驱动程序需要捕获这些中断,并采取相应的处理措施。
发送指令
数据发送/接收
中断信号
设备驱动程序
总线
设备

总结

因此,总线是计算机系统中实现设备间通信的关键组成部分。PCIe总线是一种高速、高效的总线标准,为现代计算机系统提供了强大的连接能力。设备驱动程序通过与总线的交互,确保设备的正确配置、数据的可靠以及系统的稳定。

3.网卡及其抽象

网卡的角色

网卡,也被称为网络接口卡(NIC, Network Interface Card)或网络适配器,是计算机与网络之间的物理连接点。它的主要任务是处理所有进出计算机的数据,确保数据能够正确地在计算机和网络之间传输。

网卡的功能

  1. 数据转换:网卡能够将计算机内部的数据格式转换为网络可以理解的格式,以及将网络上的数据格式转换为计算机内部可以理解的格式。

  2. 数据过滤:网卡根据网络上的MAC地址信息,决定哪些数据应该被接收并传递给计算机,哪些数据应该被忽略。

  3. 物理连接:网卡通过物理介质(如以太网电缆)与外部网络建立连接。

转换为网络格式
转换为计算机格式
决定接收/忽略
建立连接
网卡NIC
数据转换
数据过滤
物理连接
网络
数据
外部网络

网卡的抽象

在操作系统和应用程序的层面上,网卡被抽象为一个或多个虚拟接口,这样软件就可以与网卡进行通信而不需要关心底层的硬件细节。这种抽象通常通过设备驱动程序来实现。

设备驱动程序的作用

  1. 识别和管理硬件资源:驱动程序能够识别网卡的存在,并管理其硬件资源,如寄存器、内存缓冲区等。

  2. 提供统一的接口:驱动程序为操作系统和应用程序提供一个统一的接口,使得它们可以以一致的方式与网卡进行通信。

  3. 处理数据传输:驱动程序负责将数据从计算机的内存缓冲区传输到网卡,以及从网卡接收数据并将其存储到计算机的内存缓冲区中。

  4. 错误处理:驱动程序还能够检测和处理与网卡相关的错误和异常情况。

也就是说

网卡是计算机网络通信的关键组件,它负责处理计算机与网络之间的数据交换。通过设备驱动程序的抽象,操作系统和应用程序可以与网卡进行高效、可靠的通信,而无需关心底层的硬件细节。这种抽象不仅简化了软件的开发和维护,还提高了系统的稳定性和兼容性。

驱动程序的注册与注销

1. 注册

驱动程序的注册是将其加载到内核中,并使其能够管理和控制相应的硬件设备的过程。注册过程通常发生在系统启动或设备插入时。对于PCIe设备(如网卡)的驱动程序,注册过程可能包括以下几个步骤:

  • 探测(Probe):当系统检测到PCIe设备时,会调用驱动程序的探测函数。这个函数负责初始化设备,分配必要的资源(如内存、中断等),并设置设备的数据结构。
  • 设备识别:驱动程序需要识别设备的特定信息,如设备ID、厂商ID等,以确保驱动程序与设备兼容。
  • 资源分配:驱动程序为设备分配必要的硬件资源,如I/O端口、内存地址空间、中断号等。
  • 功能实现:驱动程序实现与设备通信所需的功能,如读/写设备寄存器、处理设备中断等。
  • 接口提供:驱动程序向操作系统提供一组接口,以便上层软件可以与设备进行通信。
2. 注销

注销是驱动程序的相反过程,即将其从内核中卸载,并释放其管理和控制的硬件设备的相关资源。注销过程通常发生在系统关闭、设备移除或驱动程序被替换时。对于PCIe设备的驱动程序,注销过程可能包括以下几个步骤:

  • 资源释放:驱动程序释放之前为设备分配的所有资源,如内存、中断等。这确保了资源可以被其他设备或驱动程序重新使用。
  • 设备关闭:驱动程序关闭与设备的通信通道,并确保设备处于安全状态。这可能涉及关闭设备的电源或将其置于低功耗模式。
  • 数据结构清理:驱动程序清理与设备相关的数据结构,以确保没有内存泄漏或其他潜在问题。
  • 接口移除:驱动程序从操作系统中移除其提供的接口,从而断开上层软件与设备的连接。

驱动程序的注册和注销是确保硬件设备在系统中正确运行和管理的关键过程。注册过程使驱动程序能够识别和管理设备,并为其提供必要的资源;而注销过程则确保资源被正确释放,设备被安全关闭,以及与设备的连接被适当断开。

分配资源
写入值
监控
存储
存储
驱动程序
配置硬件资源
设置设备状态
检测硬件状态
初始化硬件队列
操作系统内核
设备寄存器
设备状态检查
发送队列
接收队列
内存地址 I/O端口 中断号
启动设备 设置工作模式
电源状态 温度 错误指示
待处理数据包
传输完成数据包

设备初始化

设备初始化是设备驱动程序中非常关键的一个环节,它涉及硬件和软件两个方面的准备工作。

1. 硬件初始化

硬件初始化是设备驱动程序中针对硬件设备进行的初始化操作。这通常包括以下几个步骤:

  • 配置硬件资源:驱动程序需要为设备配置所需的硬件资源,如内存地址、I/O端口、中断号等。这通常涉及到与操作系统的内核进行交互,以确保这些资源被正确分配并可以被设备使用。

  • 设置设备状态:在设备启动时,驱动程序需要设置设备的初始状态,如电源状态、工作模式等。这通常涉及到向设备的寄存器写入特定的值,以启动设备或将其置于特定的工作状态。

  • 检测硬件状态:驱动程序需要检测设备的硬件状态,以确保设备正常工作。这可能包括检查设备的电源状态、温度、错误指示等。

  • 初始化硬件队列:对于需要处理数据传输的设备,如网卡,驱动程序需要初始化相关的硬件队列,如发送队列、接收队列等。这些队列用于存储待处理的数据包或传输完成的数据包。

2. 软件初始化

软件初始化是设备驱动程序中与软件相关的初始化操作。这通常包括以下几个步骤:

  • 数据结构初始化:驱动程序需要初始化与设备相关的数据结构,如设备描述符、缓冲区描述符等。这些数据结构用于在软件层面管理设备的状态和数据。

  • 中断处理函数注册:如果设备使用中断来通知驱动程序有事件发生(如数据传输完成、错误发生等),驱动程序需要注册相应的中断处理函数。这样,当设备产生中断时,操作系统可以调用正确的处理函数来处理中断事件。

  • 初始化软件队列:与硬件队列类似,驱动程序可能需要初始化与设备相关的软件队列,用于在软件层面管理待处理的任务或数据。

  • 初始化设备驱动程序接口:驱动程序需要提供一组接口函数,供操作系统或上层软件调用。在软件初始化阶段,这些接口函数需要进行初始化,以便后续可以正确响应外部请求。

也就是说

设备初始化是设备驱动程序中涉及硬件和软件的准备。硬件初始化主要关注硬件资源的配置、设备状态的设置、硬件状态的检测以及硬件队列的初始化。而软件初始化则主要关注数据结构的初始化、中断处理函数的注册、软件队列的初始化以及设备驱动程序接口的初始化。

这些初始化操作对于确保设备能够正常工作以及提高系统的稳定性和可靠性至关重要。 (有用)

设备的打开与关闭

1. 设备的打开

设备的打开通常是指通过特定的操作或命令使设备从关闭或休眠状态变为可用状态。在操作系统和设备驱动的层面上,这通常涉及以下步骤:

  • 识别设备:系统需要识别要打开的设备,这通常通过设备名称、标识符或路径来实现。
  • 检查设备状态:在打开设备之前,系统可能会检查设备的当前状态,例如是否已连接、是否已损坏、是否需要更新驱动程序等。
  • 分配资源:系统为设备分配必要的资源,如内存缓冲区、I/O端口、中断等。这些资源是设备正常工作所必需的。
  • 初始化设备:设备驱动程序执行必要的初始化操作,使设备进入已知和稳定的状态。这可能包括设置设备的配置参数、清空缓冲区等。
  • 提供访问接口:一旦设备被打开并初始化,系统就可以通过设备驱动程序提供的接口来访问设备。这些接口允许上层应用程序与设备进行通信。
2. 设备的关闭

设备的关闭是指将设备从可用状态变为关闭或休眠状态。在操作系统和设备驱动的层面上,关闭设备通常涉及以下步骤:

  • 释放资源:系统释放之前为设备分配的所有资源,以便其他应用程序可以使用这些资源。这包括内存缓冲区、I/O端口、中断等。
  • 停止数据传输:如果设备正在进行数据传输,系统需要确保所有待处理的数据传输都已完成或已取消。这可以防止数据丢失或损坏。
  • 执行关闭操作:设备驱动程序执行必要的关闭操作,使设备进入安全状态。这可能包括关闭设备的电源、断开与设备的连接等。
  • 更新设备状态:系统更新设备的状态信息,以反映设备已关闭。这可以帮助系统和其他应用程序了解设备的当前状态。

总结

设备的打开和关闭是操作系统和设备驱动程序管理设备的基本操作。通过正确地打开和关闭设备,可以确保设备在需要时可用,并在不需要时释放资源。这有助于提高系统的稳定性、可靠性和性能。同时,开发人员和用户在编写和使用与设备相关的代码时,应该遵循正确的打开和关闭设备的流程,以避免潜在的问题和错误。 (有用)

额,,,,这是一个SystemD的有关例子:

假设您需要在一个大型企业环境中管理多个网络设备(如路由器交换机等),以确保网络正常运行和安全。在这种情况下,您可以考虑将系统D用于实现网络设备的监控和管理功能。具体步骤如下:

  1. 安装并启动系统D服务:首先,您需要在系统中安装并启动systemD服务,以便能够监视和控制网络设备。您可以使用以下命令来执行此操作:
sudo systemctl install systemd-networkd && sudo systemctl enable systemd-networkd
  1. 定义网络设备监听配置文件:接下来,您需要创建一个网络设备监听配置文件,其中包含要监视的网络设备和相应的监听规则。例如,对于一个路由器,您可能希望监视其接口和流量统计信息。为此,您可以在/etc/systemd/network目录下创建名为<router_name>.netdev的配置文件,并在.ini文件中添加以下内容:
[Match]
Name=wlan0
[Network]
DNS=yes
Address=static
Gateway=192.168.1.1
[Route]
Destination=0.0.0.0/0
[Device]
MAC=<router_mac>

其中,<router_name>是路由器的名称,<router_mac>是路由器的MAC地址;其他参数根据您的需求进行设置。请注意,这里只是示例配置文件的一部分内容,实际配置应根据具体情况进行调整。
3. 启用网络设备监听功能:在完成网络设备监听配置文件的创建后,您需要启用系统的网络设备监听功能。这可以通过在终端中输入以下命令来完成:

sudo systemctl start systemd-networkd@<router_name>.<netdev>

其中,<router_name>是路由器的名称,是之前创建的配置文件名。这将使系统D开始监视所选网络的流量和状态变化。
4. 设置报警通知:为了及时发现和处理网络故障或异常情况,您可以将报警通知设置为发送电子邮件或其他通知方式。在系统D控制台中,您可以查看并编辑每个网络设备的报警通知设置。具体操作方法为:打开控制台应用程序(通常位于菜单栏中的“应用程序”或“控制中心”选项卡中),然后选择要设置的网络设备并更改相应属性。
5. 使用API进行高级操作:如果您需要对网络设备进行更高级的操作(如修改配置文件、清除日志等),可以使用systemD提供的API函数库进行编程开发。这些函数允许您通过C语言或其他编程语言编写自定义脚本或应用程序来实现特定功能。


在大型企业环境中管理多个网络设备时,使用Systemd(通常称为systemd)是一个很好的选择,因为systemd是一个初始化系统和服务管理器,用于Linux操作系统。它可以用来启动、监视和管理系统进程,包括网络服务。然而,systemd本身并不直接提供网络设备监控和管理的功能;它更多的是一个服务管理器,用于控制其他服务和守护进程。

对于网络设备的监控和管理,通常我们会使用专门的网络管理工具和平台,如NAGIOS、Zabbix、Prometheus、ELK Stack(Elasticsearch、Logstash、Kibana)等。这些工具可以与systemd集成,以便在系统启动时自动运行,并且可以通过配置规则来监控网络设备的状态、性能、流量等。

如果您打算使用systemd来启动和管理网络设备的监控服务,您可能需要做的是:

  1. 安装并配置网络监控工具:选择适合您需求的网络监控工具,并按照其官方文档进行安装和配置。

  2. 创建systemd服务单元文件:创建一个systemd服务单元文件(.service文件),用于定义如何启动、停止和管理您的网络监控工具。

  3. 启用并启动服务:使用systemctl命令启用并启动您的服务。

  4. 配置网络监控规则:在您的网络监控工具中配置相应的规则,以监控目标网络设备的状态、性能和流量。

下面是一个简化的例子,展示了如何为一个网络监控工具创建一个systemd服务单元文件:

# /etc/systemd/system/network-monitoring-tool.service
[Unit]
Description=Network Monitoring Tool
After=network.target[Service]
Type=simple
ExecStart=/path/to/your/network-monitoring-tool --config /path/to/config/file
Restart=on-failure
User=network-monitoring-user
Group=network-monitoring-group[Install]
WantedBy=multi-user.target

在这个例子中,network-monitoring-tool是您选择的网络监控工具的路径,--config参数指向该工具的配置文件。UserGroup是运行该服务所使用的用户和组。

要启用并启动该服务,您可以使用以下命令:

sudo systemctl daemon-reload
sudo systemctl enable network-monitoring-tool.service
sudo systemctl start network-monitoring-tool.service

然后,您可以通过配置网络监控工具来添加对网络设备的监控规则。

请注意,这里提供的信息是一个高级概述,并且具体的步骤和命令将取决于您选择的网络监控工具和您的具体需求。在实施之前,请确保阅读并遵循您所选工具的官方文档。

Systemd
安装网络监控工具
创建systemd服务单元文件
启用并启动服务
配置网络监控规则
监控网络设备
启动systemd服务
网络设备监听
收集数据
分析数据
生成报告
优化网络配置

终于敲完了,一个 SSH稳定监控的例子,使用SystemD,感觉挺有意思的~

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

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

相关文章

阿里云带宽计费模式怎么选?如何收费的?

阿里云服务器带宽计费模式分为“按固定带宽”和“按使用流量”&#xff0c;有什么区别&#xff1f;按固定带宽是指直接购买多少M带宽&#xff0c;比如1M、5M、10M、100M等&#xff0c;阿里云直接分配用户所购买的带宽值&#xff0c;根据带宽大小先付费再使用&#xff1b;按使用…

javascript语法备忘

< noscript>是不支持js的浏览器用来替换script下内容的东西。 chrome清除js缓存 基础 $(document).ready(function(){... }); // 可以简写为&#xff1a; $(function(){...func1(){} });这是在页面DOM加载完成后执行的代码&#xff0c;而windown.onload则需要在页面DOM…

「数据结构」哈希表1:基本概念

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;Java数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 基本概念 &#x1f349;哈希表&#x1f349;哈希冲突&#x1f34c;负载因子调节&#x1f34c;解决哈希冲突&#x1f95d;1. 闭散…

2024年世界听力日活动的主题是什么?

改变思维模式&#xff1a;让所有人的耳和听力保健成为现实&#xff01; Let’s make ear and hearing care a reality for all! 据 世界卫生组织 报道&#xff1a;在全球范围内&#xff0c;超过 80% 的耳和听力保健需求仍未得到满足 &#xff1b; 未得到解决的听力损失每…

Microsoft Word 超链接

Microsoft Word 超链接 1. 取消超链接2. 自动超链接2.1. 选项2.2. 校对 -> 自动更正选项2.3. Internet 及网络路径替换为超链接 References 1. 取消超链接 Ctrl A -> Ctrl Shift F9 2. 自动超链接 2.1. 选项 2.2. 校对 -> 自动更正选项 ​​​ 2.3. Internet…

controller-manager学习三部曲之二:源码学习

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 作为《controller-manager学习三部曲》系列的第二篇&#xff0c;前面通过shell脚本找到了程序的入口&#xff0c;接下来咱们来学习controller-mana…

《21天精通IPv4 to IPv6》第15天:IPv6的扩展技术——如何扩展IPv6?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

文件的操作(下)

1.顺序读写函数 这些函数都是 按照顺序读写的&#xff0c;所谓的按顺序读写就是我么你打开文件后光标是从头开始的&#xff0c;每输入一个数据就会自动往下一格移动。上面说的适面于所有输入流一般指适用于标准输入流和其他输入流&#xff08;如文件输入流&#xff09;&#xf…

Java是如何实现的平台无关?

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是小徐&#x1f947;☁️博客首页&#xff1a;CSDN主页小徐的博客&#x1f304;每日一句&#xff1a;好学而不勤非真好学者 &#x1f4dc; 欢迎大家关注&#xff01; ❤️ 1、什么是平台无关性 平台无关性就是一种语言在…

Pandas深度解析GroupBy函数的妙用技巧【第75篇—GroupBy函数】

Pandas深度解析GroupBy函数的妙用技巧 数据处理和分析中&#xff0c;Pandas是一款非常强大的Python库&#xff0c;提供了丰富的数据结构和功能&#xff0c;使得数据分析变得更加简便高效。其中&#xff0c;GroupBy函数是Pandas中一个重要且常用的功能&#xff0c;通过它我们可…

12.atoi函数

文章目录 函数简介函数原型 代码运行 函数简介 函数原型 int atoi(char const *string);函数把字符转化为正数 代码运行 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h>int main() {int ret 0;char str[20] "112233";ret …

Unity类银河恶魔城学习记录6-2 P66 Clone‘s Attack源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Clone_Skill.cs using System.Collections; using System.Collections.Gen…

【c++基础】阿尔法乘积

说明 计算一个整数的阿尔法乘积。对于一个整数x来说&#xff0c;它的阿尔法乘积是这样来计算的&#xff1a;如果x是一个个位数&#xff0c;那么它的阿尔法乘积就是它本身&#xff1b;否则的话&#xff0c;x的阿 尔法乘积就等于它的各位非0的数字相乘所得到的那个整数的阿尔法乘…

游本昌活佛济公“封神“!你加油了吗?感说出自己的难处吗?——早读

过年了&#xff0c;你赚钱了吗? 引言代码第一篇 中国石化 每升直降0.98元&#xff0c;春节加油有优惠&#xff01;第二篇 人民日报 【夜读】新的一年&#xff0c;让家越来越温馨的6个习惯第三篇 人民日报 游本昌这段话&#xff0c;让全场泪目&#xff01;第六篇&#xff08;跳…

vue3中Pinia

一、pinia的简单使用 vuex和pinia的区别 参考网址&#xff1a;[Vuex] Vuex 5 by kiaking Pull Request #271 vuejs/rfcs GitHub 1.pinia没有mutations&#xff0c;只有&#xff1a;state、getters、actions 2.pinia分模块不需要models&#xff08;之前vuex分模块需要models…

第7讲 全局异常统一处理实现

新建GlobalExceptionHandler类。 package com.java1234.exception;import com.java1234.entity.R; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdv…

【ES】--ES集成热更新自定义词库(字典)

目录 一、问题描述二、具体实施1、Tomcat实现远程扩展字典2、验证生效3、ES配置远程扩展字典4、为何不重启ES能实现热更新 一、问题描述 问题现象: 前面完成了自定义分词器词库集成到ES中。在实际项目中词库是时刻在变更的&#xff0c;但又不希望重启ES&#xff0c;对此我们应…

CSS盒子的概念

盒子模型 盒子的概念 页面中的每一个标签都可以看做是一个“盒子”&#xff0c;通过盒子的视角更方便的进行布局 浏览器在渲染&#xff08;显示&#xff09;网页时&#xff0c;会将网页中的元素看做是一个个的矩形区域&#xff0c;称之为“盒子” 盒子模型 CSS中规定每个盒…

错误的集合(力扣刷题)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 由于作者比较菜&#xff0c;还没学malloc这个函数&#xff0c;因此这个题目只写一些与原题大致的思路。 题目链接&#xff1a;645. 错误的集合 - 力扣…

五(一)java高级-集合-集合与迭代器(二)

5.1.2 Iterator迭代器 1、Iterator 所谓迭代器&#xff1a;就是用于挨个访问集合元素的工具/对象 方法&#xff1a; boolean hasNext():判断当前遍历集合后面是否还有元素可以迭代Object next():取出当前元素&#xff0c;并往后移→noSuchelementExceptionvoid remove():删…