Linux 性能优化实战

文章目录

  • 33 | 关于 Linux 网络,你必须知道这些(上)
    • 设计高并发架构需要考虑什么?
    • 如何理解分布式?
    • 如何理解云计算?
    • 如何理解微服务?
    • TCP/IP网络分层模型是什么?每一层的功能是什么?
    • 网络接口层如何实现MAC寻址?
    • 网络接口层如何实现错误侦测?
    • 应用程序在TCP/IP每一层的封装格式是什么?
    • 什么是MTU?
    • Linux内核中的网络栈是什么?
    • 应用程序通过系统调用和套接字进行交互如何实现?
    • Linux网络收发流程是什么?
  • 34 | 关于 Linux 网络,你必须知道这些(下)
    • 哪些指标可以用来衡量 Linux 的网络性能?
  • 35 | 基础篇:C10K 和 C1000K 回顾
    • 如何理解epoll?
    • 如何理解 epoll 通知应用程序文件描述符状态改变的水平模式?
    • 如何理解 epoll 通知应用程序文件描述符状态改变的边缘模式?
    • 如何理解异步IO?
    • 多路IO复用的两种工作模式是什么?
    • 如何理解多队列网卡?
    • 如何理解中断负载均衡?
    • 如何理解CPU 绑定?
    • 如何理解RPS/RFS(软中断负载均衡到多个 CPU 核上)?
    • 如何理解将网络包的处理卸载(Offload)到网络设备(如 TSO/GSO、LRO/GRO、VXLAN OFFLOAD)?
    • 如何解决C1000K问题?
    • 如何用 DPDK 解决C10M问题?
    • 如何理解 DPDK 的大页优化?
    • 如何用 XDP 解决C10M问题?
    • 如何理解IDS(入侵检测系统)?
    • 如何理解DDoS 防御?
    • 如何理解cilium 容器网络插件?
  • 36 | 套路篇:怎么评估系统的网络性能?
    • 如何测试网络层的 PPS?
    • 如何测试传输层 TCP 和 UDP 的性能?
    • 如何测试应用层HTTP的性能?
    • 模拟用户的请求负载测试性能的工具wrk
    • 模拟用户的请求负载测试性能的工具TCPCopy
    • 模拟用户的请求负载测试性能的工具Jmeter
    • 模拟用户的请求负载测试性能的工具 LoadRunner
  • 37 | 案例篇:DNS 解析时快时慢,我该怎么办?
    • 如何理解服务发现?
    • 如何理解分布式数据库?
    • 如何理解DNS为应用提供了动态服务发现?
    • 如何理解DNS为应用提供了全局负载均衡?
    • DNS服务器如何进行域名解析?
    • DNS解析不稳定,可能是由于什么原因导致的?
    • 如何用dnsmasq实现DNS缓存服务?
    • 常见DNS优化方法有哪些?
  • 38 | 案例篇:怎么使用 tcpdump 和 Wireshark 分析网络流量?

33 | 关于 Linux 网络,你必须知道这些(上)

设计高并发架构需要考虑什么?

1.微服务。

  • 应用拆分。
  • 低耦合,服务独立部署、扩展、发布和维护。
  • Docker
  • Kubernetes

2.服务缩扩容。

3.服务无状态设计。

  • 每次请求独立,不相互依赖。
  • 多个相同请求可以发送到任意相同的服务处理。

4.负载均衡。

  • Nginx
  • HAProxy

5.异步编程。
消息队列:RabbitMQ,Kafka。

6.缓存。

  • Redis。
  • Memcached。

7.优化服务性能。
提升数据结构和算法性能,提高请求处理速度。

8.优化数据库。

  • 读写分离。
  • 使用NoSQL。
  • 数据库分片。
  • 索引优化。

9.API网关。

  • 客户端 —API网关 — 服务端。
  • 简化客户端逻辑,为客户端提供统一交互接口。
  • 屏蔽后端服务的复杂性和细节。

10.CDN。

  • 多个地理位置的服务器上缓存,用户访问时选择最近的服务器向用户提供服务。
  • 分布式网络框架

11.限流和熔断。

12.监控,运维与自动化。

如何理解分布式?

相对于单体架构,应用程序拆分为多个服务,服务独立部署、扩展、发布和维护。

如何理解云计算?

通过互联网提供计算资源与服务(包括硬件和软件)。

IaaS:基础设施即服务。

  • 提供虚拟化计算资源(服务器,存储空间,网络,操作系统等),用户无需购买和维护物理硬件,租用这些资源。
  • Amazon EC2 , Google Compute Engine。

PaaS:平台即服务。

  • 提供IaaS + 应用程序开发环境、测试、部署和维护所需的软件环境。
  • Heroku, Google App Engine。

SaaS:软件即服务。

  • 通过互联网提供应用程序作为服务,用户可以直接使用这些应用程序,无需安装或维护任何软件。
  • Google Workspace、Microsoft 365。

如何理解微服务?

应用程序拆分为小型独立的服务。
每个服务处理应用程序的特定业务,支持独立开发、部署和扩展。
通过HTTP、REST或消息队列协同实现应用程序功能。

特点:

  • 单一职责。
  • 独立部署。
  • 技术多样化:不同服务可以使用不同的技术栈。
  • 易于扩展:根据需要扩展特定服务,而不是整个应用程序。
  • 去中心化:每个服务有自己的数据库并独立的组织和管理数据的关系。

优势:

  • 故障隔离。
  • 灵活性和敏捷性:不同服务独立开发、快速迭代和部署。
  • 更好的利用资源:根据需要缩扩容单独服务。

需要解决的问题:

  • 高效可靠的服务间通信。
  • 数据一致性。
  • 分布式系统的复杂性,管理和监控多个独立的服务。

TCP/IP网络分层模型是什么?每一层的功能是什么?

应用层:为用户提供一组应用程序,HTTP,FTP,DNS等。
传输层:应用程序(通过IP + 端口唯一标识)之间的通信,TCP,UDP等。
网络层:物理机(通过IP唯一标识)之间的通信,网络包的封装、寻址和路由。IP,ICMP等。
网络接口层:网络帧在物理链路(网线,网卡,交换机等)上的传输,MAC寻址,错误侦测等。

在这里插入图片描述

网络接口层如何实现MAC寻址?

每个网卡有全球唯一的MAC地址,制造时烧录在硬件中,通常固定不变。

数据链路层封装IP网络包为网络帧,包括帧头和帧尾,帧头包含目的MAC地址和源MAC地址。

目的IP地址在本网络,对应MAC地址未知,进行ARP地址解析协议:

  1. 主机发送ARP请求广播到本地所有设备,询问哪个设备拥有目的IP。
  2. 网络上的所有设备都会接收这个ARP请求,但只有目标IP地址对应的设备会响应这个ARP请求,告诉主机其MAC地址。
  3. 发送方接收到ARP响应后,会将MAC地址存入本地的ARP缓存中,以便将来使用。

知道了目的MAC地址,网络接口层就可以在帧中设置这个地址,并通过物理媒介将帧发送出去。如果设备在同一局域网内,帧直接被目标机器接收。如果设备不在同一局域网内,帧将被发送到网关(通常是路由器),由网关负责进一步的传输。

接收端,网络接口层检查传入帧的目的MAC地址是否与接口卡的MAC地址匹配。如果匹配,帧被接受并向上传递给上层(网络层),否则帧被丢弃。

交换机在数据链路层使用MAC地址转发网络帧。
路由器在网络层使用IP地址转发IP网络包。

局域网中使用MAC地址将帧转发到设备。

网络接口层如何实现错误侦测?

应用程序在TCP/IP每一层的封装格式是什么?

在这里插入图片描述

什么是MTU?

网络层IP包不需要分片时,能够通过物理介质传输的最大字节数。

IP头 + TCP头 + 应用数据 > MTU,则在网络层进行分片。

举例:
MTU为1500字节,IP数据包为2000字节(20字节IP头 + 20字节TCP头 + 1960应用数据)

  • 分片1(共·1500字节):IP头(20字节) + TCP头(20字节) + 应用数据(1460字节)。
  • 分片2(共·520字节):IP头(20字节) + 应用数据 (500字节)。

总结:

  • 第一个分片:IP头(20字节) + TCP头(20字节) + 应用数据(1460字节)。
  • 其他分片:IP头(20字节) + 应用数据。

Linux内核中的网络栈是什么?

在这里插入图片描述

应用程序通过系统调用和套接字进行交互如何实现?

Linux网络收发流程是什么?

在这里插入图片描述

接收流程:

  • 网络帧到达网卡。
  • 网卡通过DMA将网络帧放在收包队列。
  • 硬中断通知中断处理程序收到网络帧,为网络帧分配内核数据结构sk_buff并拷贝到sk_buff缓冲区。
  • 硬中断结束,通知软中断。
  • 软中断通知内核收到了新的网络帧,从sk_buff缓冲区取出网络帧,按照网络协议解析,并最终将应用数据拷贝到Socket接收缓存。
  • 应用程序使用Socket接口读取数据。

发送流程和接收流程相反。

34 | 关于 Linux 网络,你必须知道这些(下)

哪些指标可以用来衡量 Linux 的网络性能?

带宽:链路的最大传输速率,单位通常为 b/s (比特 / 秒)。

吞吐量:

  • 单位时间内成功传输的数据量,单位通常为 b/s(比特 / 秒)或者 B/s(字节 / 秒)。
  • 网络使用率 = 吞吐量 / 带宽。

延时:

  • 从网络请求发出后,一直到收到远端响应,所需要的时间延迟。
  • TCP建立连接所需要的时间。
  • 数据包往返所需要的时间。

PPS:

  • Packet Per Second(包 / 秒)的缩写,表示以IP网络包为单位的传输速率。
  • 用来评估网络转发能力,交换机可以达到理论最大值,Linux服务器容易受包大小影响

并发连接数:TCP连接数。

丢包率:丢包百分比。

重传率:重新传输的网络包比例。

35 | 基础篇:C10K 和 C1000K 回顾

如何理解epoll?

  • 多路复用:监控多个文件描述符(socket、pipes、files)以等待可用的非阻塞IO操作。
  • 高效:事件通知机制,只关注有 I/O 事件发生的文件描述符,不需要轮询扫描整个集合。
  • 用于处理大量并发的socket连接。
  • 使用红黑树,在内核中管理文件描述符集合。

如何理解 epoll 通知应用程序文件描述符状态改变的水平模式?

  • 应用程序可以随时检查文件描述符的状态,
  • 文件描述符可以非阻塞地执行 I/O时,epoll_wait() 返回文件描述符触发通知。
  • 应用程序根据文件描述符的状态,进行 I/O 操作。

问题:应用程序处理数据效率不高,会导致epoll_wait()调用频繁。

如何理解 epoll 通知应用程序文件描述符状态改变的边缘模式?

  • 事件通知:只有在文件描述符的状态发生改变(从不可写变成可写,或从不可读变成可读),才通过epoll_wait() 发送一次通知。如果文件描述符两次epoll_wait()调用之间状态没有发生变化,epoll_wait()不会再次返回。
  • IO操作:应用程序接收到通知后,检查文件描述符状态确定是否可以进行IO操作,应用程序应该尽可能多地读取或写入数据,确保不会错过任何事件,一旦状态变化被通知,除非再次状态变化,否则epoll不会再次通知应用程序。
  • 一次性处理:应用程序通常一次性处理所有可用的数据避免数据丢失,epoll不会重复通知同一状态。

如何理解异步IO?

异步 I/O 允许应用程序同时发起很多 I/O 操作,而不用等待这些操作完成。在 I/O 完成后,系统会用事件通知(比如信号或者回调函数)的方式,告诉应用程序。这时,应用程序才会去查询 I/O 操作的结果。

非阻塞。
事件驱动。
并发性。
效率提供。
复杂度增加。

多路IO复用的两种工作模式是什么?

第一种:主进程 + 多个 worker 子进程。

  • 主进程执行 bind() + listen() 后,创建多个子进程,管理子进程的生命周期。
  • 在每个子进程中负责实际的请求处理,都通过 accept() 或 epoll_wait() ,来处理相同的套接字。
    TUPIAN

主线程 + 多个 worker 子线程。

  • 主线程负责套接字初始化和子线程状态的管理。
  • 子线程则负责实际的请求处理。
  • 可以进一步把 epoll_wait() 都放到主线程中,保证每次事件都只唤醒主线程,而子线程只需要负责后续的请求处理。

在这里插入图片描述

第二种:监听到相同端口的多进程模型。

  • 所有的进程都监听相同的接口,并且开启 SO_REUSEPORT 选项,
  • 由内核负责将请求负载均衡到这些监听进程中去。

在这里插入图片描述
Nginx的实现:
在这里插入图片描述

如何理解多队列网卡?

如何理解中断负载均衡?

如何理解CPU 绑定?

如何理解RPS/RFS(软中断负载均衡到多个 CPU 核上)?

如何理解将网络包的处理卸载(Offload)到网络设备(如 TSO/GSO、LRO/GRO、VXLAN OFFLOAD)?

如何解决C1000K问题?

并发处理100w个客户端连接请求。

  • 构建在 epoll 的非阻塞 I/O 模型上。
  • 从应用程序到 Linux 内核、再到 CPU、内存和网络等各个层次的深度优化。
  • 借助硬件,来卸载那些原来通过软件处理的大量功能。

如何用 DPDK 解决C10M问题?

并发处理1000w个客户端连接请求。

跳过内核协议栈,直接由用户态进程通过轮询的方式,来处理网络接收。

如何理解 DPDK 的大页优化?

如何用 XDP 解决C10M问题?

网络包,在进入内核协议栈之前,就进行处理。
基于 Linux 内核的 eBPF 机制实现的。
在这里插入图片描述

如何理解IDS(入侵检测系统)?

如何理解DDoS 防御?

如何理解cilium 容器网络插件?

36 | 套路篇:怎么评估系统的网络性能?

如何测试网络层的 PPS?

Linux 内核自带的高性能网络测试工具 pktgen。

如何测试传输层 TCP 和 UDP 的性能?

iperf 或者 netperf。

如何测试应用层HTTP的性能?

ab、webbench

模拟用户的请求负载测试性能的工具wrk

模拟用户的请求负载测试性能的工具TCPCopy

模拟用户的请求负载测试性能的工具Jmeter

模拟用户的请求负载测试性能的工具 LoadRunner

37 | 案例篇:DNS 解析时快时慢,我该怎么办?

如何理解服务发现?

微服务架构中,应用程序和服务能够自动发现网络中可用的服务实例及地址的过程。
对于构建可扩展、灵活和自愈的系统至关重要。

如何理解分布式数据库?

将数据存储在物理上分散的多个位置和计算机上。
这些计算机可能位于同一地点(如同一数据中心)或分布在世界各地,它们通过网络互联。

1 . 数据分片:将数据分布到多个服务器,每个服务器存储一部分数据。多个服务器并行操作,提高查询性能。

2 . 复制:将数据副本存储在多个服务器上,提高数据的可用性和读取操作的性能。用户可以从最近的服务器或当前不忙的服务器读取数据,有助于数据备份和故障恢复。

3 . 一致性:所有数据在更新后最终保持一致。
强一致性:更新理解在所有副本上反映。
最终一致性:更新会在一段时间后在所有副本上反映。
中间过程反映。

4 . 分区容错(Partition Tolerance)
分布式数据库必须能够处理网络分区,即网络中断导致数据库的不同部分无法通信。理想的分布式数据库系统能够在保持一定程度的服务水平的同时,处理这种分区。

5 . 可扩展性(Scalability)
分布式数据库非常适合水平扩展,即通过添加更多的服务器来增加数据库的容量和性能。这使得它们非常适合处理大规模的数据和高并发的请求。

6 . 数据一致性模型
分布式数据库通常采用不同的一致性模型来平衡一致性、可用性和分区容忍之间的关系,如CAP定理(一致性、可用性、分区容忍性)和BASE(基本可用、软状态、最终一致性)。

如何理解DNS为应用提供了动态服务发现?

  1. 动态更新:DNS能动态更新记录,保证了应用程序总是能够通过DNS解析找到正确的服务实例。
  2. 负载均衡:通过DNS轮询(一种简单的负载均衡技术),请求可以在多个服务实例之间分发,从而提高了系统的可用性和扩展性。
  3. 服务注册和发现机制:在微服务架构中,服务实例在启动时可以向DNS服务器注册自己的域名和IP地址。当服务实例停止或不可用时,可以更新或删除相应的DNS记录。客户端应用程序通过查询DNS来发现可用的服务实例,实现动态服务发现。
  4. 使用SRV记录: DNS不仅可以解析域名到IP地址,还可以使用SRV记录来提供关于服务的额外信息,如端口号和协议。这让客户端能够发现不仅仅是服务实例的位置,还包括如何与服务实例进行通信的详细信息。

如何理解DNS为应用提供了全局负载均衡?

DNS服务器如何进行域名解析?

最近解析记录缓存命中,直接用缓存中的记录。

最近解析记录未命中,从顶级域名递归解析:
在这里插入图片描述

DNS解析不稳定,可能是由于什么原因导致的?

  • DNS服务器本身有问题,响应慢且不稳定。
  • 客户端到DNS服务器网络延迟比较大。
  • DNS请求或响应包,被链路中的网络设备丢失。

如何用dnsmasq实现DNS缓存服务?

常见DNS优化方法有哪些?

  • 对 DNS 解析的结果进行缓存。
  • 对 DNS 解析的结果进行预取。
  • 使用 HTTPDNS 取代常规的 DNS 解析。
  • 基于 DNS 的全局负载均衡(GSLB)。这不仅为服务提供了负载均衡和高可用的功能,还可以根据用户的位置,返回距离最近的 IP 地址。

38 | 案例篇:怎么使用 tcpdump 和 Wireshark 分析网络流量?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

矩阵练习2

48.旋转图像 规律: 对于矩阵中第 i行的第 j 个元素,在旋转后,它出现在倒数第i 列的第 j 个位置。 matrix[col][n−row−1]matrix[row][col] 可以使用辅助数组,如果不想使用额外的内存,可以用一个临时变量 。 还可以通…

STM32项目分享:智能窗帘系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.c…

基于VLC可见光通信的室内光通信信道信噪比分析matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..................................................................... % 接收功率计算Pr …

使用spark基于出租车GPS数据实现车辆数量统计以及北京每个城区的车辆位置点数分析

使用spark基于出租车GPS数据实现车辆数量统计以及北京每个城区的车辆位置点数分析 本文将介绍如何使用pyspark以及scala实现的spark分析出租车GPS数据,具体来说,我们将计算每个北京城区内的车辆位置点数,以及统计出租车的数量。我们将使用两…

Vue 3与ESLint、Prettier:构建规范化的前端开发环境

title: Vue 3与ESLint、Prettier:构建规范化的前端开发环境 date: 2024/6/11 updated: 2024/6/11 publisher: cmdragon excerpt: 这篇文章介绍了如何在Vue 3项目中配置ESLint和Prettier以统一代码风格,实现代码规范性与可读性的提升。通过设置规则、解…

49、Flink 的数据源的 SplitReader API 详解

SplitReader API a)概述 核心的 SourceReader API 是完全异步的,但实际上,大多数 Sources 都会使用阻塞的操作,例如客户端(如 KafkaConsumer)的 poll() 阻塞调用,或者分布式文件系统&#xff…

商业智能(BI)期末复习

商业智能(BI)期末复习 商业智能(BI)期末复习 2024/06/17 13:30-15:00 1.工作簿包含工作表 2.tableau是一款轻型BI工具 3.敏捷BI成本比较低 因为可以不建立数据仓库 4.敏捷BI的能带来更高的质量系统 是在用户监督下建立起来的 …

Python易错点总结

目录 多分支选择结构 嵌套选择 用match模式识别 match与if的对比 案例:闰年判断 三角形的判断 用whlie循环 高斯求和 死循环 用for循环 ​编辑continue​编辑 whlie与else结合 pass 序列 列表(有序) 元组(有序&…

高仿imtoken钱包源码/获取助记词/获取私钥/自动归集

高仿imtoken钱包/获取助记词/获取私钥/自动归集 带双端,无纯源码 源码下载:https://download.csdn.net/download/m0_66047725/89379118 更多资源下载:关注我。

【免杀】C2远控-APC注入-进程镂空

目录 进程镂空&傀儡进程(主要过内存扫描)代码 傀儡进程演示如何上线上线演示 APC注入&进程欺骗(主要过内存扫描)同步调用与异步调用代码演示 进程镂空&傀儡进程(主要过内存扫描) 进程镂空(Pro…

16.左侧导航菜单制作

左侧导航菜单制作 1. 修改路由&#xff0c;方便查看页面 index.ts import { RouteRecordRaw, createRouter, createWebHistory } from "vue-router"; import Layout from /layout/Index.vueconst routes: Array<RouteRecordRaw> [{path: /,name: home,comp…

记录大三上学期大数据课程设计:基于Hadoop和Spark的中文手写数字实时识别系统

我整理好了两个百度网盘链接&#xff0c;一个是模型文档和数据&#xff0c;一个是镜像&#xff0c;下载、导入虚拟机即可运行。 github地址&#xff1a;Li-Jihong/big-data: 用来记录大三上学期大数据课程设计&#xff1a;基于Hadoop和Spark的中文手写数字实时识别系统 (githu…

服务器如何远程桌面连接不上,服务器远程桌面连接不上解决办法

服务器远程桌面连接不上&#xff0c;是IT运维中常见的挑战之一。针对这一问题&#xff0c;专业的解决方法通常涉及以下几个方面的排查与操作&#xff1a; 首先&#xff0c;我们需要检查网络连接是否正常。远程桌面连接依赖于稳定的网络连接&#xff0c;因此&#xff0c;确认服务…

Rocky Linux 9.4 部署Zabbix 7.0

文章目录 Zabbix基本概念zabbix介绍zabbix特性zabbix结构 安装Zabbix主机名配置配置Zabbix-Server(1)禁用EPEL提供的Zabbix软件包(2)安装Zabbix Server、Web前端、Agent(3)创建初始数据库(4)Zabbix server配置数据库(5)为Zabbix前端配置PHP(6)启动Zabbix server和agent进程(7)放…

【JS重点知识05】正则表达式

目录 一&#xff1a;正则表达式简介 1 什么是正则表达式 2 正则表达式作用 二&#xff1a;语法格式&#xff1a; 1 定义正则表达式 2 检索、判断是否匹配 &#xff08;1&#xff09;test()方法 &#xff08;2&#xff09;exec()方法 三&#xff1a;元字符 普通字符&a…

【C++课程学习】:类和对象(拷贝构造和运算符重载)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 ✍拷贝构造&#xff1a; &#x1f349;特点一&#xff1a; &#x1f349;特点二&#xff1a; &…

消息中间件比较:Redis,Kafka和RabbitMQ

对微服务使用异步通信时&#xff0c;通常使用消息代理。代理确保不同微服务之间的通信可靠且稳定&#xff0c;消息在系统内得到管理和监控&#xff0c;并且消息不会丢失。您可以从几个消息代理中进行选择&#xff0c;它们的规模和数据功能各不相同。这篇博文将比较三种最受欢迎…

基于深度图像的无监督目标跟踪

概要 大致的步骤 深度图像获取:通过深度传感器(例如ToF相机、双目相机等)获取场景的深度图像。深度图转scanscan转pointcloud点云聚类卡尔曼滤波预测匈牙利算法匹配目标ID更新深度图转scan 参考这篇博客 scan转pointcloud

科技云报道:“元年”之后,生成式AI将走向何方?

科技云报道原创。 近两年&#xff0c;以大模型为代表的生成式AI技术&#xff0c;成为引爆数字原生最重要的技术奇点&#xff0c;人们见证了各类文生应用的进展速度。Gartner预测&#xff0c;到2026年&#xff0c;超过80%的企业将使用生成式AI的API或模型&#xff0c;或在生产环…

C++基础(二)

选择结构 选择结构是用来控制程序流程&#xff0c;使得程序可以根据不同的条件执行不同的代码块。 if语句 简单结构 if (表达式) { // 表达式为真时执行的语句。 } else { // 表达式为假时执行的语句。 } #include <iostream> #include <string>using namespace s…