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://www.mzph.cn/news/679198.shtml

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

相关文章

微软和苏黎世联邦理工学院开源SliceGPT创新压缩技术节省大量部署资源;OpenAI成立儿童安全团队,防AI误用

&#x1f989; AI新闻 &#x1f680; 微软和苏黎世联邦理工学院开源SliceGPT创新压缩技术节省大量部署资源 摘要&#xff1a;微软和苏黎世联邦理工学院研究人员开源了SliceGPT&#xff0c;通过对大模型的权重矩阵进行压缩切片&#xff0c;实现了模型紧缩&#xff0c;节省了部…

Leetcode 3033. Modify the Matrix

Leetcode 3033. Modify the Matrix 1. 解题思路2. 代码实现 题目链接&#xff1a;3033. Modify the Matrix 1. 解题思路 这一题是一道easy的题目&#xff0c;整体思路上没啥难度&#xff0c;就是按照题目翻译一下即可&#xff0c;先遍历一下找到每一列的最大元素&#xff0c…

阿里云Redis

1. 请简述阿里云Redis的架构和特点。 阿里云Redis是一种兼容开源Redis协议标准的数据库服务&#xff0c;它具备多种架构类型&#xff0c;以适应不同的业务需求和场景。以下是其架构和主要特点的详细描述&#xff1a; 架构类型&#xff1a; 标准版&#xff1a;这是最基本的架…

Java 中Iterable接口的作用

什么是Iterable接口&#xff1f;它有什么作用&#xff1f; Iterable接口是Java集合框架中的一个核心接口&#xff0c;它定义了一种通用的迭代方式&#xff0c;用于遍历集合中的元素。Iterable接口位于java.lang包下&#xff0c;它只包含一个抽象方法&#xff0c;即iterator()方…

14 OpenGL图元装配和光栅化

图元装配和光栅化 Primitive Assembly and Rasterization From Primitive Assembly&#xff08;图元装配&#xff09;Point Rasterization 、Line Rasterization 、Triangle Rasterization&#xff08;光栅化&#xff09;Pixel Ownership Test&#xff08;像素所有权测试&…

Spring Boot 笔记 002 整合mybatis做数据库读取

概念 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java Objec…

书生谱语-大语言模型测试demo

课程内容简介 1.作业 demo1 demo2 demo3 demo4

【leetcode】206. 反转链表(简单)题解学习

题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 …

QT+OSG/osgEarth编译之八十三:osgdb_ogr+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_ogr)

文章目录 一、osgdb_ogr介绍二、文件分析三、pro文件四、编译实践一、osgdb_ogr介绍 osgDB是OpenSceneGraph(OSG)库中的一个模块,用于加载和保存3D场景数据。osgDB_ogr是osgDB模块中的一个插件,它提供了对OGR(开放地理空间联盟)库的支持。 OGR是一个开源的地理空间数据…

Oracle恢复数据库某张表某一时刻的数据

测试时误删数据&#xff0c;或是需要还原数据反复测试sql&#xff0c;可以用Oracle的闪回功能使数据库恢复到某一时刻。 恢复数据到某一时刻 -- 假设表名为 HOLIDAY-- 开启行移动 ALTER TABLE HOLIDAY ENABLE ROW MOVEMENT; -- 恢复数据到某一时刻 FLASHBACK TABLE HOLIDAY TO…

excel统计分析——成组设计和配对设计

参考资料&#xff1a;生物统计学 单因素两水平实验设计一般可分为两种情况&#xff0c;一是成组设计&#xff08;或非配对设计&#xff09;&#xff0c;二是配对设计。通过两个水平的样本平均数的差异显著性检验&#xff0c;比较两个水平间是否存在显著差异。 1、成组设计 成组…

MacOS 制作 TF 卡/ U 盘镜像

最近有张老的 TF 卡没办法直接拷贝里面的数据&#xff0c;于是打算利用 dd 工具直接全卡拷贝为镜像再分析里面的数据 在终端中&#xff0c;输入以下命令来列出所有磁盘设备&#xff1a; diskutil list这将显示Mac上所有的磁盘设备。你需要找到TF卡对应的设备&#xff0c;它通…

【十五】【C++】list的简单实现

list 的迭代器解引用探究 /*list的迭代器解引用探究*/ #if 1 #include <list> #include <vector> #include <iostream> #include <algorithm> using namespace std;class Date {private:int _year;int _month;int _day;public:Date(): _year(2024), _m…

【CC++】内存管理2:new + delete

前言 今天继续来学new和delete operator new 与operator delete函数 new和delete是用户进行动态内存申请和释放的操作符&#xff0c;operator new 和operator delete是系统提供的全局函数&#xff0c;new在底层调用operator new全局函数来申请空间&#xff0c;delete在底层通…

【开源】基于JAVA+Vue+SpringBoot的二手车交易系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手车档案管理模块2.3 车辆预约管理模块2.4 车辆预定管理模块2.5 车辆留言板管理模块2.6 车辆资讯管理模块 三、系统设计3.1 E-R图设计3.2 可行性分析3.2.1 技术可行性分析3.2.2 操作可行性3.2.3 经济…

打印金字塔

金字塔 思路分析详细代码 思路分析 1.先打印一个矩形 ****** ****** ****** ****** ******2.打印半个金字塔 * //第1层 有1个* ** //第2层 有2个* *** //第3层 有3个* ***** //第4层 有4个* ****** //第5层 有5个*3.打印整个金字塔 * //第1层 有1个* 2*1-1 有4(总…

Java核心设计模式:代理设计模式

一、生活中常见的代理案例 房地产中介&#xff1a;客户手里没有房源信息&#xff0c;找一个中介帮忙商品代购&#xff1a;代理者一般有好的资源渠道&#xff0c;降低购物成本&#xff08;如海外代购&#xff0c;自己不用为了买东西出国&#xff09; 二、为什么要使用代理 对…

AI修复历史人物 图像转真人 绝密档案

修复李白 开启control 不要点爆炸小按钮 权重建议&#xff1a;0.7-1.2 采样&#xff1a;DPM SDE Karras 如果人眼不好&#xff0c;开启高清修复&#xff0c;进行2次尝试 高难度 修复张居正 softhed 1 lineart_真实 1 适当调整lineart进入值。 如果效果不好&#xff…

redmi note 4x(mido) kali nethunter

Kali NetHunter | Kali Linux Documentation RedMi Note 4X Kali NetHunter Vol.02_哔哩哔哩_bilibili 安卓渗透测试平台Kali(Nethunter)搭建教程 - FreeBuf网络安全行业门户 5.0 Installing NetHunter on top of Android Now that you’ve either downloaded a NetHunter…

制作一个简单的html个人网页

创建一个简单的HTML个人网页是一项有趣且容易上手的任务。下面是一个详细的教程&#xff0c;带你逐步创建一个基本的个人网页&#xff1a; 步骤 1&#xff1a;准备工作 在你的计算机上创建一个新的文件夹&#xff0c;用于存放你的网页文件。你可以将这个文件夹命名为“my_web…