当前位置: 首页 > news >正文

《深入理解Linux网络》笔记

《深入理解Linux网络》笔记

  • 前言
  • 参考

前言

前段时间看了《深入理解Linux网络》这本书,虽然有些地方有以代码充篇幅的嫌疑,但总体来说还是值得一看的。在这里简单记录一下笔记,记录下对网络新的理解。


  • 内核是如果接受网络包的?
    在这里插入图片描述
    如上图所示,整个流程基本如下:
  • 数据包首先从网络中到达主机中的网卡设备
  • 网卡通过DMA把数据帧运到内存中
  • 之后网卡通过触发硬终端(触发电平变化)来通知CPU有网络包到达
  • CPU收到硬中断之后,会调用网络设备注册的中断处理函数。在这个函数中响应中断进行简单的处理,燃弧发出软中断(linux中整个中断过程分为上半部(硬中断)和下半部(软中断))。
  • 内核线程(ksoftirqd线程, 内核启动的时候会专门创建一些软中断内核线程,一般来说,机器上有几个核心就会有几个ksoftirqd内核线程)响应软中断,调用网卡驱动注册的poll函数开始收包。从RingBuffer中(就是之前DMA运输的地方)摘取一个帧,然后交给上层的协议栈进行具体的处理。
  • tcpdump抓包和iptable过滤包的原理大概是什么?
    tcpdump是一个常用的抓包工具,其原理概括来说就是通过类似一个回调的机制,将其挂到网络包传输的路径中。当有网络包到来(或者发送出去)的时候内核会调用将数据包传给tcpdump的回调函数,就可以达到抓包的效果。

    iptable其实本质上也一样,只不过iptable会对经过的包进行过滤、修改。而tcpdump一般只是查看。
    有一点不一样的是,tcpdump是工作在设备层的(所以tcpdump还可以查看数据链路层的一些包信息),而iptable是工作在IP层(ARP层)的。
    如下图所示。
    在这里插入图片描述
    在这里插入图片描述
    ps: netfilter可以理解就是 iptable。
  • top命令中hi,si代表啥意思?
    在这里插入图片描述
    如果了解了linux的中断原理,也就对top命令中hi,si有了更深的理解。hi代表硬中断的开销,si代表软中断的开销
  • 关于系统调用陷入内核态的一些理解
    对于一个程序来说,通过系统调用(比如说write数据到网络中)陷入内核态之后,还依旧执行的是这个程序的活系统还依旧算着这个进程的cpu运行时间),只不过是陷入到了内核态,算是这个程序的内核态线程(并不是新建了一个内核态线程)在执行。这也就是所谓的进程的内核上下文。
  • 如果使用的是普通的同步阻塞网络读写调用,一般来说,会进行至少两次进程的上下文切换(一个是无数据到达时阻塞、另一个是数据到达时唤醒)。一般来说,每一次进程的上下文切换都需要花费3-5微秒的时间,以CPU视角来说,这其实已经不少了,而且上下文的切换并没有干什么实质性的活,所以,很多机制都尽量减少不必要的上下文切换(比如说自旋锁、 epoll等机制。)
  • epoll、poll等多路复用机制高效在什么地方?
    在我看来,多路复用机制高效的本质在于可以同时监听多个套接字,这样就一旦其中有需要读写的事件到来,就可以尽量减少进程的上下文切换(不像同步操作read、write那样进行频繁的阻塞),让进程更专注的处理网络请求。

    整个epoll机制基本如下图所示。
    在这里插入图片描述
    通过epoll_ctl加入需要监听的多个套接字。当某一个套接字对应的网络包从网卡到来之时,通过内核的软硬件中断进行处理,然后将请求放入epoll对象的就绪列表中。

    epoll_wait就是从就绪列表中看是否有事件到达,如果有则取出进行处理。 在高并发的场景中,epoll_wait会一直处理,知道没活的时候才会让出CPU.

    而红黑树只是epoll中用来快速查找、删除socket时用的数据结构,并不是epoll支持高并发的根本原因。
  • 关于tcp分段和ip分片的一些理解
    对于一般的tcp传输来说,下层的mac协议限制的帧的大小,MTU一般是1500字节。如果超过了MTU,mac层将无法传输(应该会丢弃)。对应MTU,ip层也有响应的长度限制MSS,如果超过了这个限制之后,ip层会执行分片,以避免mac层将数据丢弃。但是ip层的分片会导致一些问题:一个是额外的分片开销;另一个是如果一个分片丢失了,上层的整个包都需要重传(对于TCP来说整个包会重传,对于UDP来说,数据包就是丢失了);

    所以,tcp层为了减少ip分片,在tcp层就将数据包进行了分段,使装入ip层数据不大于MSS,这样,ip层就不会进行分片,也不会有一个分片丢失,整个数据包都得重传的尴尬。
  • 如果想通过网络发送一个文件,会涉及到哪些内存拷贝呢?
    一般来说,我们想通过网络发送一个本地的文件,会首先通过read()系统调用将文件读到内存中,然后在write()到远端。这其中涉及到磁盘-内核空间-用户空间的内存拷贝过程
    如下图所示。一共涉及到4次的用户态和内核态的上下文切换和4次的内存拷贝。
    在这里插入图片描述
    仔细分析一下其实知道,如果不需要再用户空间修改文件内容的话,完全不需要将数据拷贝到用户空间。
    所以,一般来说有几种方式可以提高这种场景的内存效率。
    1. 通过 mmap + write
      即通过linux提供的mmap内存映射,将内核缓冲区里的数据映射到用户空间,这样,操作系统内核与用户空间就不需要再进行任何的数据拷贝操作。
      在这里插入图片描述这样需要4次的用户态和内核态的上下文切换,和3次的内存拷贝。
    2. 使用sendfile系统调用
      在 Linux 内核版本 2.1 中,提供了一个专门发送文件的系统调用函数 sendfile()。该系统调用,可以直接把内核缓冲区里的数据拷贝到 socket 缓冲区里,不再拷贝到用户态,这样就只有 2 次上下文切换,和 3 次数据拷贝。
      sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
      在这里插入图片描述
      而且从 Linux 内核 2.4 版本开始起, 对于支持 SG-DMA 技术的网卡,sendfile还可以进一步减少cpu的干预,直接从内存缓存中拷贝到网卡,如下图所示。
      在这里插入图片描述算是真正做到了零拷贝。
      kafka之所以性能突出,一个重要的原因就是利用了这种零拷贝技术。
  • 关于linux路由表
    linux默认情况下会丢掉不属于本机IP的数据包。将net.ipv4.ip_forward设置为1后,会开启路由功能,Linux会像路由器一样对不属于本机的IP数据包进行路由转发。

    linux可以配置多个路由表,默认有三个已有的路由表:
    在这里插入图片描述> 1. local: 处理本地IP和广播地址路由,local路由表只由kernel维护,不能更改和删除
    2. main: 处理所有非策略路由,不指定路由表名时默认使用的路由表
    3. default: 所有其他路由表都没有匹配到的情况下,根据该表中的条目进行处理
  • 关于本机网络
    在这里插入图片描述
    我们使用ifconfig可以看到一个lo的回环设备,这是内核虚拟出来的一个本机网卡设备,所有127.0.0.1的网络IO都直接通过这个lo进行传输,不需要经过实际的网络设备,所以即使拔了网线,也依然可以对127.0.0.1的网络IO进行请求。

    除了127.0.0.1之外,本机ip(如上图中的10.0.20.6)也是一样的,使用本机ip也可以访问本地服务,走的也是lo回环设备。
  • listen系统调用本质上是在干啥?
    对于我们熟知的网络系统调用Listen来说,其一个重要的作用就是在内核中建立并初始化好半队列(用来存储经过第一次握手的socket)和全队列(用来存储已经建立连接的socket, accept 其实就是从这里消费tcp连接的)的数据接口,为接下来TCP的握手连接做好准备。
  • 关于tcp的建立过程的一些细节
    tcp通过三次握手来建立连接。 一般来说,
    1. 客户端通过connect来建立连接,客户端发送SYN 连接握手请求,然后启动定时器
    2. 服务端收到请求之后,内核会发出SYN ACK, 这个时候将请求放入半连接队列。 同时也会启动一个重传定时器(所以如第二次握手发出之后,迟迟收不到第三次握手, 服务端会进行重传第二次握手)。
    3. 然后客户端收到SYN ACK之后,清除重传定时器,将连接置为已连接,然后发送第三次握手ACK。
  1. 服务端收到第三次握手之后,将连接冲半连接队列里删除,然后加入全连接队列。等待accept来消费连接
    整个过程如下图所示。
    在这里插入图片描述
    一般来说,建立一个tcp连接需要1.5个RTT, 根据通信双方的远近一般需要几十到几百毫秒的样子。 (一般来说,同地区的不同机房一般大约是几ms,北京到广东大概30-40ms)
  • 一条空的tcpl连接(只建立连接但是不发送数据)大概需要3-4kb的内存空间。 一条TIME_WAIT状态的连接需要消耗0.4kb的样子。所以机器上如果TIME_WAIT过多一般影响的不是内存而是端口号。
  • 一个机器可以建立多少个连接?
    要理解,一条tcp连接是有(src ip, src port, dst ip, dsp port) 四元组来构成的,所以对于一个客户端来说,说是根据16bit 的port 只能建立65536个连接,这是不正确的。 限制服务器端和客户端连接的最主要的是内存和cpu,如果这些是充足的,一台服务器建立百万连接完全是可能的。

参考

【1】《深入理解Linux网络》
【2】为什么 TCP/IP 协议会拆分数据
【3】Linux 内存拷贝

相关文章:

《深入理解Linux网络》笔记

《深入理解Linux网络》笔记 前言参考 前言 前段时间看了《深入理解Linux网络》这本书,虽然有些地方有以代码充篇幅的嫌疑,但总体来说还是值得一看的。在这里简单记录一下笔记,记录下对网络新的理解。 内核是如果接受网络包的? 如…...

【计算机视觉】优化MVSNet可微分代价体以提高深度估计精度的关键技术

优化MVSNet可微分代价体以提高深度估计精度的关键技术 1. 代价体基础理论与分析1.1 标准代价体构建1.2 关键问题诊断 2. 特征表示优化2.1 多尺度特征融合2.2 注意力增强匹配 3. 代价体构建优化3.1 自适应深度假设采样3.2 可微分聚合操作改进 4. 正则化与优化策略4.1 多尺度代价…...

致远A8V5-9.0安装包(包含信创版)【附百度网盘链接】

A8适用于中大型企业,基于"以人为中心"的产品理念,致力于为企业构建和完善“数字智能”的协同运营体系,以组织模型为基础,连接各项工作和业务,聚合信息、资源和能力,实现组织内和跨组织的高效协同…...

terminal 共享工具ttyd

ttyd 是一个非常轻量的工具,它可以将你的终端(如 bash)通过 Web 页面共享出去,适合教学、演示、远程协作等场景,而且 支持 macOS、ARM64、Linux 等平台。 ⸻ ✅ 一、ttyd 简介 • 将 shell 包装成 WebSocket 服务&am…...

右值引用的剖析

引入:为什么要有右值引用? 右值引用的存在,就是为了解决左值引用解决不了的问题! 左值引用的问题: 我们知道,左值引用在做参数和做返回值都可以提高效率;但是有时候,我们无法用左…...

MIT XV6 - 1.4 Lab: Xv6 and Unix utilities - find

接上文 MIT XV6 - 1.3 Lab: Xv6 and Unix utilities - primes find 继续实验,实验介绍和要求如下 (原文链接 译文链接) : Write a simple version of the UNIX find program for xv6: find all the files in a directory tree with a specific name. Your solution…...

PyTorch API 8 - 工具集、onnx、option、复数、DDP、量化、分布式 RPC、NeMo

文章目录 torch.nn.inittorch.nn.attention工具集子模块 torch.onnx概述基于 TorchDynamo 的 ONNX 导出器基于TorchScript的ONNX导出器贡献与开发 torch.optim如何使用优化器构建优化器每个参数的选项执行优化步骤optimizer.step()optimizer.step(closure) 基类算法如何调整学习…...

解决使用宝塔Linux部署前后端分离项目遇到的问题

问题一:访问域名转圈圈,显示404,403 没有解决跨域问题,在后端yml中设置content:/prod(生产环境),在前端.env文件中将http://127.0.0.1:8080/替换为公网IP,并在vite.conf…...

力扣top100 矩阵置零

开辟数组来标记元素为0的行和列&#xff0c;然后将对应的行和列的元素全部置为0&#xff1b; class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int n matrix.size();int m matrix[0].size();vector<int> l(m),r(n);for(int i …...

JavaScript基础-作用域概述

在学习JavaScript的过程中&#xff0c;理解其作用域&#xff08;Scope&#xff09;机制是至关重要的。它不仅影响变量的生命周期和可见性&#xff0c;还决定了代码执行期间如何查找变量值。本文将深入探讨JavaScript的作用域概念&#xff0c;包括全局作用域、函数作用域、块级作…...

【经验总结】Ubuntu 22.04.5 LTS 将内核从5.15.0-140 升级到6.8.0-60后纽曼无线网卡无法使用解决措施

【经验总结】Ubuntu 22.04.5 LTS 将内核从5.15.0-140 升级到6.8.0-60后纽曼无线网卡无法使用解决措施 问题现象定位过程问题根因解决方案将内核内核从6.8.0-60 降级到5.15.0-140。1、回滚内核版本2、解决重启系统&#xff0c;找不到选择内核版本的菜单问题3、将新版本的kernel卸…...

MQTT协议介绍

一、MQTT定义 MQTT(Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输)是 IBM 开发的一个即时通讯协议&#xff0c;有可能成为物联网的重要组成部分。 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息传输协议&#xff…...

jetson orin nano super AI模型部署之路(五)tensorrt C++ api介绍

我们基于tensorrt-cpp-api这个仓库介绍。这个仓库的代码是一个非常不错的tensorrt的cpp api实现&#xff0c;可基于此开发自己的项目。 我们从src/main.cpp开始按顺序说明。 一、首先是声明我们创建tensorrt model的参数。 // Specify our GPU inference configuration optio…...

excel函数操作案例

需求分析1&#xff1a;学习时间与最终成绩之间的关系 问题&#xff1a;学习时间的长短是否对学生的最终成绩有显著影响&#xff1f; 操作步骤&#xff1a;选择"study_hours"和"final_grade"列完整数据&#xff0c;选择散点图 单击B&#xff0c;按住ctrl键…...

各种音频产品及场景总结

本文记录和总结各种音频产品以及音频场景&#xff0c;比如音箱、耳机、对讲机、录音笔、助听器、声卡等等。 蓝牙耳机 蓝牙耳机现在已经很普及了&#xff0c;主要功能就是连着手机等设备然后播放音频&#xff0c;所以&#xff0c;肯定要有扬声器模块&#xff1b;然后还可以接打…...

Java后端开发day46--多线程(二)

&#xff08;以下内容全部来自上述课程&#xff09; 多线程 1. Lock锁 虽然我们可以理解同步代码块和同步方法的锁对象问题&#xff0c; 但是我们并没有直接看到在哪里加上了锁&#xff0c;在哪里释放了锁&#xff0c; 为了更清晰的表达如何加锁和释放锁&#xff0c;JDK5以…...

U盘制作系统盘(含U盘恢复)

✅ 准备工作 1. 一个至少 8GB 容量的 U 盘 注意&#xff1a;U 盘将被格式化&#xff0c;请提前备份数据。 2. 一台可以联网的 Windows 电脑 &#x1f4e5; 下载官方制作工具&#xff08;推荐&#xff09; 1. 打开微软官网下载页面&#xff1a; &#x1f449; Windows 11 下载…...

如何阅读、学习 Linux 2 内核源代码 ?

学习Linux 2内核源代码是深入理解操作系统工作原理的绝佳途径&#xff0c;但这无疑是一项极具挑战性的任务。下面为你提供一套系统的学习方法和建议&#xff1a; 一、扎实基础知识 操作系统原理 透彻掌握进程管理、内存管理、文件系统、设备驱动等核心概念。推荐阅读《操作系…...

【字符函数和字符串函数】

【字符函数和字符串函数】 字符分类函数字符转换函数函数的使用strcpy的使用strcat的实现strcmp的实现strncpy&#xff0c;strncat,strncmpstrstrstrtok的使用strerror 1.函数的使用 2.部分函数的模拟实现&#xff08;工作原理&#xff09; 字符分类函数 ag1. #include<std…...

[学习]RTKLib详解:rtksvr.c与streamsvr.c

本文是 RTKLlib详解 系列文章的一篇&#xff0c;目前该系列文章还在持续总结写作中&#xff0c;以发表的如下&#xff0c;有兴趣的可以翻阅。 [学习] RTKlib详解&#xff1a;功能、工具与源码结构解析 [学习]RTKLib详解&#xff1a;pntpos.c与postpos.c [学习]RTKLib详解&…...

QMK键盘固件开发全解析:QMK 固件开发的最新架构和规范(2025最新版)

QMK键盘固件开发全解析&#xff1a;QMK 固件开发的最新架构和规范&#xff08;2025最新版&#xff09; &#x1f4da; 前言概述 QMK(Quantum Mechanical Keyboard)作为目前开源键盘固件领域的"扛把子"&#xff0c;凭借其强大的功能和活跃的社区支持&#xff0c;已经…...

c++——二叉树进阶

1. 内容安排说明 二叉树在前面C数据结构阶段已经讲过&#xff0c;本节取名二叉树进阶是因为&#xff1a; 1. map和set特性需要先铺垫二叉搜索树&#xff0c;而二叉搜索树也是一种树形结构 2. 二叉搜索树的特性了解&#xff0c;有助于更好的理解map和set的特性 3. 二叉树中部…...

PyTorch API 3 - mps、xpu、backends、导出

文章目录 torch.mpsMPS 性能分析器MPS 事件 torch.xpu随机数生成器流与事件内存管理 torch.mtia流与事件 torch.mtia.memory元设备元张量操作惯用法 torch.backendstorch.backends.cputorch.backends.cudatorch.backends.cudnntorch.backends.cusparselttorch.backends.mhatorc…...

QTableWidget实现多级表头、表头冻结效果

最终效果&#xff1a; 实现思路&#xff1a;如果只用一个表格的话写起来比较麻烦&#xff0c;可以考虑使用两个QTableWidget组合&#xff0c;把复杂的表头一个用QTableWidget显示&#xff0c;其他内容用另一个QTableWidget。 #include "mainwindow.h" #include &qu…...

比 Mac 便笺更好用更好看的便利贴

在苹果电脑上&#xff0c;有自带的便签软件&#xff0c;但问题这个官方应用已经年久失修&#xff0c;界面跟最新的系统完全不搭。像同步、清单等功能也没有。 最近找到了一款更好看好用的桌面便利贴 - Desktop Note。这款应用在超过26个的效率榜排在前10。以下几个点是我认为做…...

【python】json解析:invalid literal for int() with base 10: ‘\“\“‘“

invalid literal for int() with base 10: ‘“”’" 从提供的 JSON 数据中&#xff0c;我可以看到导致 "invalid literal for int() with base 10: \"\"" 错误的具体情况&#xff1a; 错误分析 在 deal_resp 部分中发现了错误信息&#xff1a; &…...

超详细Kokoro-82M本地部署教程

经测试&#xff0c;Kokoro-82M的语音合成速度相比于其他tts非常的快&#xff0c;本文给出Windows版详细本地部署教程。 这里提供原始仓库进行参考&#xff1a;https://github.com/hexgrad/kokoro 一、依赖安装 1.新建conda环境 conda create --n kokoro python3.12 conda a…...

Day28 -js开发01 -JS三个实例:文件上传 登录验证 购物商城 ---逻辑漏洞复现 及 判断js的payload思路

本篇利用3个实例 来引出前端验证的逻辑漏洞 一、文件上传 实例&#xff1a;利用JS实现 【1】代码实现 js&#xff1a;文件后缀筛选 php&#xff1a;文件保存 00x1 先利用js文件上传 就利用之前php原生写的upload.html的模板&#xff0c;再加上script的后缀过滤。 <!…...

宝塔服务安装使用的保姆级教程

宝塔介绍&#xff1a; 宝塔面板&#xff08;BT Panel&#xff09; 是一款 国产的服务器运维管理面板&#xff0c;主要用于简化 Linux/Windows 服务器的网站、数据库、FTP、防火墙等管理操作。它通过图形化界面&#xff08;Web端&#xff09;和命令行工具&#xff08;bt 命令&a…...

(四)YOLO_World-SAM-GraspNet的mujoco抓取仿真(操作记录)

一、创建虚拟环境 这里直接克隆之前项目的环境 &#xff08;二&#xff09;Graspnet在mujoco的仿真复现&#xff08;操作记录&#xff09;_graspnet仿真-CSDN博客 conda create -n graspnet --clone mujoco_graspnet conda activate graspnet 二、安装额外的环境包 pip in…...

Git Github Tutorial

Git & Github Tutorial 教程地址&#xff1a;Git & GitHub Tutorial | Visualized Git Course for Beginner & Professional Developers in 2024 git自动跟踪每个代码更改&#xff0c;允许多个人无缝处理同一个项目&#xff0c;让成员浏览项目历史纪录 1.检查gi…...

提高工作效率的新选择[特殊字符]——Element Plus UI库

在现代前端开发中&#xff0c;UI库的重要性不言而喻。它们不仅加速开发过程&#xff0c;还提高了应用的可维护性&#xff0c;形成了一致的用户体验。今天我们就来介绍一款由Element团队打造的Vue.js 3 UI库——Element Plus。 一、Element Plus&#xff1a;Vue.js 3的全新UI库…...

深入理解 TCP:重传机制、滑动窗口、流量控制与拥塞控制

TCP&#xff08;Transmission Control Protocol&#xff09;是一个面向连接、可靠传输的协议&#xff0c;支撑着绝大多数互联网通信。在实现可靠性的背后&#xff0c;TCP 引入了多个关键机制&#xff1a;重传机制、滑动窗口、流量控制 和 拥塞控制。这些机制共同协作&#xff0…...

从0开始学习大模型--Day05--理解prompt工程

提示词工程原理 N-gram&#xff1a;通过统计&#xff0c;计算N个词共同出现的概率&#xff0c;从而预测下一个词是什么。 深度学习模型&#xff1a;有多层神经网络组成&#xff0c;可以自动从数据中学习特征&#xff0c;让模型通过不断地自我学习不断成长&#xff0c;直到模型…...

全栈开发实战:FastAPI + React + MongoDB 构建现代Web应用

在Web开发领域&#xff0c;技术栈的选型直接影响着开发效率和系统性能。FARM&#xff08;FastAPI, React, MongoDB&#xff09;技术栈凭借其高性能、灵活架构和简洁语法&#xff0c;逐渐成为全栈开发的热门选择。本文将通过实际项目案例&#xff0c;详解如何从零搭建一个完整的…...

深入解析进程地址空间:从虚拟到物理的奇妙之旅

深入解析进程地址空间&#xff1a;从虚拟到物理的奇妙之旅 前言 各位小伙伴&#xff0c;还记得我们之前探讨的 fork 函数吗&#xff1f;当它返回两次时&#xff0c;父子进程中同名变量却拥有不同值的现象&#xff0c;曾让我们惊叹于进程独立性与写时拷贝的精妙设计。但你是否…...

Python教程(四)——数据结构

目录 1. 列表1.1 用列表实现堆栈1.2 用列表实现队列1.3 列表推导式1.4 嵌套的列表推导式 2. del语句3. 元组和序列4. 集合5. 字典6. 循环的技巧7. 深入条件控制8. 序列和其他类型的比较参考 1. 列表 方法含义list.append(x)在列表末尾添加一项&#xff0c;类似于a[len(a):] […...

Spring Cloud: Nacos

Nacos Nacos是阿里巴巴开源的一个服务发现&#xff0c;配置管理和服务管理平台。只要用于分布式系统中的微服务注册&#xff0c;发现和配置管理&#xff0c;nacos是一个注册中心的组件 官方仓库&#xff1a;https://nacos.io/ Nacos的下载 Releases alibaba/nacos 在官网中…...

基于 Q-learning 的城市场景无人机三维路径规划算法研究,可以自定义地图,提供完整MATLAB代码

一、引言 随着无人机技术的不断发展&#xff0c;其在城市环境中的应用越来越广泛&#xff0c;如物流配送、航拍测绘、交通监控等。然而&#xff0c;城市场景具有复杂的建筑布局、密集的障碍物以及多变的飞行环境&#xff0c;给无人机的路径规划带来了巨大的挑战。传统的路径规…...

Block Styler——字符串控件

字符串控件的应用 参考官方帮助案例&#xff1a;&#xff08;这个方式感觉更好&#xff0c;第二种方式也可以&#xff09;E:\NX1980\UGOPEN\SampleNXOpenApplications\C\BlockStyler\ColoredBlock 普通格式&#xff1a; 读取&#xff1a; //方法一 string0->GetProperti…...

【比赛真题解析】篮球迷

本次给大家分享一道比赛的题目:篮球迷。 洛谷链接:U561543 篮球迷 题目如下: 【题目描述】 众所周知,jimmy是个篮球迷。众所周知,Jimmy非常爱看NBA。 众所周知,Jimmy对NBA冠军球队的获奖年份和队名了如指掌。 所以,Jimmy要告诉你n个冠军球队的名字和获奖年份,并要求你…...

WPF之集合绑定深入

文章目录 引言ObservableCollection<T>基础什么是ObservableCollectionObservableCollection的工作原理基本用法示例ObservableCollection与MVVM模式ObservableCollection的局限性 INotifyCollectionChanged接口深入接口定义与作用NotifyCollectionChangedEventArgs详解自…...

第五天 车载系统安全(入侵检测、OTA安全) 数据加密(TLS/SSL、国密算法)

前言 随着汽车智能化程度不断提升&#xff0c;车载系统安全已成为行业关注焦点。本文将从零开始&#xff0c;带大家系统学习车载系统安全的核心技术&#xff0c;重点解析入侵检测、OTA安全、数据加密三大领域。即使没有安全背景&#xff0c;也能通过本文建立起完整的汽车网络安…...

采用SqlSugarClient创建数据库实例引发的异步调用问题

基于SqlSugar编写的多个WebApi接口&#xff0c;项目初始化时采用单例模式注册SqlSugarClient实例对象&#xff0c;前端页面采用layui布局&#xff0c;并在一个按钮事件中通过Ajax连续调用多个WebApi接口获取数据。实际运行时点击按钮会随机报下面几种错误&#xff1a; Execute…...

unity通过transform找子物体只能找子级

unity通过transform找子物体只能找子级&#xff0c;孙级以及更低级别都找不到&#xff0c;只能找到自己的下一级 如果要获取孙级以下的物体&#xff0c;最快的方法还是直接public挂载...

Dockers部署oscarfonts/geoserver镜像的Geoserver

Dockers部署oscarfonts/geoserver镜像的Geoserver 说实话&#xff0c;最后发现要选择合适的Geoserver镜像才是关键&#xff0c;所以所以所以…&#x1f437; 推荐oscarfonts/geoserver的镜像&#xff01; 一开始用kartoza/geoserver镜像一直提示内存不足&#xff0c;不过还好…...

AtCoder AT_abc405_d ABC405D - Escape Route

前言 BFS 算法在 AtCoder 比赛中还是会考的&#xff0c;因为不常练习导致没想到&#xff0c;不仅错误 TLE 了很多&#xff0c;还影响了心态&#xff0c;3 发罚时后才 AC。 思路 首先&#xff0c;我们把所有位置和出口的距离算出来&#xff08;用 BFS&#xff09;&#xff0c…...

Redis-x64-3.0.500

E:\Workspace_zwf\Redis-x64-3.0.500 redis.windows.conf...

CUDA编程——性能优化基本技巧

本文主要介绍下面三种技巧&#xff1a; 使用 __restrict__ 让编译器放心地优化指针访存想办法让同一个 Warp 中的线程的访存 Pattern 尽可能连续&#xff0c;以利用 Memory coalescing使用 Shared memory 0. 弄清Kernael函数是Compute-bound 还是 Memory-bound 先摆出一个知…...

图像卷积初识

目录 一、卷积的概念 1、常见卷积核示例 二、使用 OpenCV 实现卷积操作 1、代码说明 2、运行说明 一、卷积的概念 在图像处理中&#xff0c;卷积是一种通过滑动窗口&#xff08;卷积核&#xff09;对图像进行局部计算的操作。卷积核是一个小的矩阵&#xff0c;它在图像上…...