Linux——用户级缓存区及模拟实现fopen、fweite、fclose
linux基础io重定向-CSDN博客
文章目录
目录
文章目录
什么是缓冲区
为什么要有缓冲区
二、编写自己的fopen、fwrite、fclose
1.引入函数
2、引入FILE
3.模拟封装
1、fopen
2、fwrite
3、fclose
4、fflush
总结
前言
用快递站讲述缓冲区
收件区(类比输入缓冲区):
快递站的收件区就如同计算机的输入缓冲区。当快递员不断送来包裹(好比计算机从外部设备接收数据),收件区先把这些包裹暂存起来。就像计算机通过输入设备(如键盘输入字符、网络传来数据等)接收到的数据,不会立刻被全部处理,而是先放在输入缓冲区。例如,很多快递在一天内不同时段被送来,收件区堆积着这些待进一步处理的包裹,这类似输入缓冲区存放着源源不断接收到的数据,等待后续的处理步骤。
分拣区(类比处理缓冲区):
这里可比作计算机的处理缓冲区。在快递站分拣区,工作人员会对包裹进行查看、分类(依据目的地等信息),这类似计算机处理缓冲区对暂存的数据进行分析、判断处理方式。比如要确定数据该送往哪个程序或存储区域进行下一步操作,就如同分拣区确定包裹该发往哪个派送点。而且有时候包裹会在分拣区排队等待进一步转运安排,这也如同数据在处理缓冲区可能会因处理资源不足等原因排队等待处理,以确保按正确顺序完成处理。
发件区(类比输出缓冲区):
快递站的发件区就像计算机的输出缓冲区。分拣好准备发往各个派送点的包裹会在发件区暂存(如同计算机处理好的数据在输出缓冲区暂存),等待快递车辆来运走(类似等待合适时机输出到外部设备)。比如一批要发往同一区域的包裹先在发件区集合,就如同一组要输出到显示器显示的数据先在输出缓冲区等待统一发送以便正确显示。同时,发件区工作人员要协调快递车辆到来时间等,保证包裹有序发出,这类似输出缓冲区要协调与外部设备的连接及数据传输时机,确保数据准确输出到目标设备。
总之,快递站的不同区域通过暂存、处理、再暂存并协调输出的流程,很好地模拟了计算机缓冲区在接收、处理、输出数据过程中的作用。
一、缓冲区是什么?
缓冲区是计算机存储体系中的一个特定区域,主要起到暂存数据的作用。
在输入方面:
当外部设备(如键盘、鼠标、网络等)向计算机输入数据时,数据不会立刻被计算机核心部件(如CPU)处理,而是先进入输入缓冲区暂存。比如你通过键盘快速打字,字符数据会先堆积在输入缓冲区,等待后续按合适的速度和顺序被处理,避免因输入速度过快而导致数据丢失或处理混乱。
在输出方面:
当计算机内部处理好的数据要输出到外部设备(如显示器、打印机等)时,也会先暂存到输出缓冲区。例如计算机要在显示器上显示一幅图像,处理好的图像数据会先放在输出缓冲区,然后再按照显示器的刷新频率等要求,适时且有序地将数据传输到显示器进行显示,这样能保证输出的稳定性和连贯性。
在数据处理过程中:
有时数据在不同部件(如CPU和内存之间、不同程序之间等)流转时,也会在中间设置缓冲区来暂存数据,起到协调数据传输速度差异、避免数据冲突等作用。
总之,缓冲区就像是数据流转过程中的一个个“临时仓库”,让数据的输入、输出和处理都能更顺畅、有序地进行。
什么是缓冲区
缓冲区本质上一块内存区域,用来保存临时数据。缓冲区在各种计算任务中都广泛应用,包括输入/输出操作、网络通信、图像处理、音频处理等。
这块内存区域是由谁提供的呢,缓冲区在哪里呢?可以继续向下看.
这里先告诉答案,是C标准库提供的.
为什么要有缓冲区
缓冲区用于解决数据传输速度不匹配或不稳定的问题,并提高数据处理的效率。
当从硬盘读取大量数据时,将数据直接传输到内存中可能会导致读写速度不匹配(内存速度快,而硬盘读取速度慢,这是相对来说的),从而导致性能瓶颈。为了缓解这个问题,可以引入一个缓冲区,先将一部分数据读取到缓冲区中,然后再从缓冲区逐步读取数据到内存中,以平衡数据传输速度。
这里有个很合适的例子来解释:
例如你和你的朋友在两个不同的大学,相差大概500公里,有一天你想送一些书给你的朋友,此时你可以选择骑自行车,亲自骑行去送这些书,礼轻情意重嘛,加上中途休息,然后由于速度慢,花了大概一周的时间才到,送了之后然后又骑回自己的学校,又花了一周的时间,一共过了两周完整的工作才完成,耗时太长。
假设此时你学聪明了,既然那么慢,那么直接坐高铁去送,可来回一共都500多了,这都比这些书的价值多了,即成本太高了.
可以把以上这些书看做资源,这种模式叫做写透模式.
此时你想到,可以寄快递来送这些书啊,价格便宜,而且两三天就到了,这多实惠,于是你把这些书交给了顺丰 快递,过了两三天,你的朋友在手机上给你说,说我收到这些书了,然后这样就成功的把资源交到了对方的手中。这个顺丰快递在这里扮演的角色便是缓冲区.
顺丰 拿到你的快递也不是立马就送,而是等待数量足够多时,再一次性开始运输,这相当于是一种缓冲区的刷新策略.
缓冲区刷新策略
刷新策略主要有以下3种:
1.立即刷新
2.行刷新(行缓冲),遇到\n刷新
3.满刷新(全缓冲),指的是将输入或输出的数据完全存储在缓冲区中,然后再进行传输或处理。
当然也会有一些特殊情况:
1.用户强制刷新(fflush)
2.进程退出
遇到以上两种情况时,必须马上从刷新缓冲区的数据,而不要按照之前的刷新策略继续等待.
所以缓冲策略 = 一般情况 + 特殊情况.
一般而言,行缓冲的设备文件 --- 显示器
全缓冲的设备文件 --- 磁盘文件
但所有的设备,永远倾向于全缓冲 --> 缓冲区满了再刷新 --> 需要更少次数的IO操作 -->更少次数的外设访问(相当于提高了整机效率).
有同学可能有疑问,比如10行数据,每一行有100个字节,虽然10行最后再一起刷新,只进行了一次的外设访问,但是数据量很多啊,1000个字节,而按行刷新虽然刷新了10次,但每次数据量少啊,那为什么外设访问次数越少越好呢?
这是因为和外部设备IO的时候,数据量的大小不是主要矛盾,你和外设预备IO的过程是最耗费时间的.
比如你和别人借钱,往往沟通的过程要耗费很长时间,而转账的过程只需要几秒,这同样的道理.
那我们直接改成全缓冲不就行了吗?这样效率不就高了吗,还要什么行缓冲.
其实这些策略,都是根据实际情况做的妥协:
例如行缓冲就是针对于显示器,是给用户看的,一方面要照顾效率,另一方面也要照顾用户体验.
而平常我们打开的一些文本文件便是全缓冲,等到用户全部写完再一次性进行保存.
有了这些缓冲区和策略,便可以提高数据处理的效率.
二、编写自己的fopen、fwrite、fclose
1.引入函数
这些函数都是3好手册的函数,也就是说这些函数可以有2好手册的系统函数来封装。
2、引入FILE
在之前的语言学习时,我们知道“->"引用通常都是结构体,那么stdin、stdout、stderr这三个流也就是结构体了。
因为IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,访问文件都是通过fd访 问的。
所以C库当中的FILE结构体内部,必定封装了fd。
man 3 stdin,我们可以看到他们的类型。
编辑
那么FILE又是什么类型呢?
打开头文件找到EILE类
3.模拟封装
我们想要实现一个文件的打开,写入和关闭文件操作的函数。
#include"myfile.h"
#define myfile "test.txt"
int main()
{//打开文件_FILE* _fd= _fopen(myfile,"a");if(_fd==NULL)return 1;//读文件const char*ptr="hello linux!!\n";//size_t _fwrite(ptr,strlen(ptr),_fd);int cnt = 10;while(cnt){_fwrite(ptr, strlen(ptr),_fd);// fflush(fp);sleep(1);cnt--;}//写关闭文件_fclose(_fd); return 0;
}
我们现在就来实现这个几个函数内部封装。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>#include <string.h>#define SIZE 1024
#define FILE_MODE 0666
#define FLUSH_NOW 1
#define FLUSH_LINE 2
#define FLUSH_ALL 4typedef struct _FILE_IO
{int fileno;int flag; //char inbuffer[SIZE];//int in_pos;char outbuffer[SIZE]; // 用一下这个int out_pos;
}_FILE;_FILE* _fopen(const char*path,const char* made);
size_t _fwrite(const char*ptr,size_t size,_FILE* _stream);
int _fclose(_FILE*_stream);
1、fopen
_FILE* _fopen(const char*path,const char* made)
{assert(path);assert(made);int fd=-1;int f=0;if(strcmp(made, "w") == 0) {f = (O_CREAT|O_WRONLY|O_TRUNC);fd = open(path, f, FILE_MODE);}else if(strcmp(made, "a") == 0) {f = (O_CREAT|O_WRONLY|O_APPEND);fd = open(path, f, FILE_MODE);}else if(strcmp(made, "r") == 0) {f = O_RDONLY;fd = open(path, f);}else return NULL;if(fd == -1) return NULL;_FILE *fp = (_FILE*)malloc(sizeof(_FILE));if(fp == NULL) return NULL;fp->fileno = fd;//fp->flag = FLUSH_LINE;fp->flag = FLUSH_ALL;fp->out_pos = 0;return fp;
}
2、fwrite
size_t _fwrite(const char*ptr,size_t size,_FILE* _stream)
{memcpy(&_stream->outbuffer[_stream->out_pos], ptr, size); // 没有做异常处理, 也不考虑局部问题_stream->out_pos += size;if(_stream->flag&FLUSH_NOW){write(_stream->fileno, _stream->outbuffer, _stream->out_pos);_stream->out_pos = 0;}else if(_stream->flag&FLUSH_LINE){if(_stream->outbuffer[_stream->out_pos-1] == '\n'){ // 不考虑其他情况write(_stream->fileno, _stream->outbuffer, _stream->out_pos);_stream->out_pos = 0;}}else if(_stream->flag & FLUSH_ALL){if(_stream->out_pos == SIZE){write(_stream->fileno, _stream->outbuffer, _stream->out_pos);_stream->out_pos = 0;}}return size;
}
3、fclose
int _fclose(_FILE*_stream)
{if(_stream == NULL) return -1;int fd=_stream->fileno;_fflush(_stream);close(fd);free(_stream);return fd;}
4、fflush
void _fflush(_FILE *fp)
{if(fp->out_pos > 0){write(fp->fileno, fp->outbuffer, fp->out_pos);fp->out_pos = 0;}
}
完整代码
总结
缓冲区位于用户程序和硬件设备之间,用来缓存数据,目的是让快速的 CPU 不必等待慢速的输入输出设备,同时减少操作硬件的次数。对于 IO 密集型的网络应用程序(如网站、数据库、DNS、CDN 等),缓冲区的设计至关重要,它能十倍甚至一百倍得提高程序性能。
关于缓冲区还有更多的内容,将在 “文件操作” 一章中深入讲解
相关文章:
Linux——用户级缓存区及模拟实现fopen、fweite、fclose
linux基础io重定向-CSDN博客 文章目录 目录 文章目录 什么是缓冲区 为什么要有缓冲区 二、编写自己的fopen、fwrite、fclose 1.引入函数 2、引入FILE 3.模拟封装 1、fopen 2、fwrite 3、fclose 4、fflush 总结 前言 用快递站讲述缓冲区 收件区(类比输…...
CKA认证 | Day2 K8s内部监控与日志
第三章 Kubernetes监控与日志 1、查看集群资源状态 在 Kubernetes 集群中,查看集群资源状态和组件状态是非常重要的操作。以下是一些常用的命令和解释,帮助你更好地管理和监控 Kubernetes 集群。 1.1 查看master组件状态 Kubernetes 的 Master 组件包…...
大模型部署,运维,测试所需掌握的知识点
python环境部署: python3 -m site --user-base 返回用户级别的Python安装基础目录 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1 将python3的默认路径/usr/bin/python3替…...
JDBC编程---Java
目录 一、数据库编程的前置 二、Java的数据库编程----JDBC 1.概念 2.JDBC编程的优点 三.导入MySQL驱动包 四、JDBC编程的实战 1.创造数据源,并设置数据库所在的位置,三条固定写法 2.建立和数据库服务器之间的连接,连接好了后ÿ…...
什么是沙箱(Sandbox)技术
沙箱技术是一种重要的计算机安全机制,主要用于隔离程序运行环境,以防止恶意代码或应用程序对系统和数据造成破坏。通过限制代码的访问权限和行为,沙箱为程序提供了一个受控且隔离的执行环境。 核心特点 隔离性沙箱运行的程序被限制在一个受控…...
TCP socket api详解
文章目录 netstat -nltpaccept简单客户端工具 telnet 指定服务连接connect异常处理version 1 单进程版version 2 多进程版version 3 -- 多线程版本version 4 ---- 线程池版本 创建套接字socket sockaddr_in结构体 bind 之后就和UDP不一样了。 因为TCP是一个面向连接的服务器&…...
Linux——环境变量
环境变量一般指的是在操作系统重用来指定操作系统运行环境的一些参数,这些参数会被bash使用,而bash是被我们用户使用的,也就是说,这些环境变量间接的也是被我们用户使用的。环境变量通常都有某些特殊的用途,它在系统重…...
Windows Pycharm 远程 Spark 开发 PySpark
一、环境版本 环境版本PyCharm2024.1.2 (Professional Edition)Ubuntu Kylin16.04Hadoop3.3.5Hive3.1.3Spark2.4.0 二、Pycharm远程开发 文件-远程-开发 选择 SSH连接,连接虚拟机,选择项目目录即可远程开发...
【es6进阶】vue3中的数据劫持的最新实现方案的proxy的详解
vuejs中实现数据的劫持,v2中使用的是Object.defineProperty()来实现的,在大版本v3中彻底重写了这部分,使用了proxy这个数据代理的方式,来修复了v2中对数组和对象的劫持的遗留问题。 proxy是什么 Proxy 用于修改某些操作的默认行为࿰…...
【Isaac Sim】加载自带模型或示例时报 Isaac Sim is not responding
Isaac Sim对电脑配置要求很高,开机第一次打开 Isaac Sim 时,直接就报 Isaac Sim is not responding 卡死了,这是由于第一次需要加载一些资源,耗时会导致 Isaac Sim 无响应,这里等一会会自动给回复。 加载自带模型或示…...
React (三)
文章目录 项目地址十二、性能优化12.1 使用useMemo避免不必要的计算12.2 使用memo缓存组件,防止过度渲染12.3 useCallBack缓存函数12.4 useCallBack里访问之前的状态(没懂)十三、Styled-Components13.1 安装13.2给普通html元素添加样式13.3 继承和覆盖样式13.4 给react组件添…...
C0031.在Clion中使用mingw编译器来编译opencv的配置方法
mingw编译器编译opencv库的配置方法...
多目标跟踪算法
文章目录 一、传统方法1. 基于卡尔曼滤波器的方法1.1 Kalman Filter(卡尔曼滤波器) 2. 基于数据关联的方法2.1 匈牙利算法 二、深度学习方法1. 基于检测的多目标跟踪1.1 SORT算法1.2 DeepSort1.3 BoT-SORT 2. 基于特征关联和增强的方法2.1 ByteTrack 3. 基于Transformer的方法3…...
【CSS in Depth 2 精译_059】9.2 把 CSS 模块组合成更大的结构
当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第九章 CSS 的模块化与作用域】 ✔️ 9.1 模块的定义 9.1.1 模块和全局样式9.1.2 一个简单的 CSS 模块9.1.3 模块的变体9.1.4 多元素模块 9.2 将模块组合为更大的结构 ✔️ 9.2.1 模块中多个职责的…...
uniapp+vue3+ts H5端使用Quill富文本插件以及解决上传图片反显的问题
uniappvue3ts H5端使用Quill富文本插件以及解决上传图片反显的问题 1.在项目中安装Quill npm i quill1.3.72.需要显示富文本的页面完整代码 <template><view><div ref"quillEditor" style"height: 65vh"></div></view> &…...
shell(二)
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
在使用PCA算法进行数据压缩降维时,如何确定最佳维度是一个关键问题?
一、PCA算法的基本原理 PCA算法的核心思想是通过正交变换,将一组可能相关的变量转换成一组线性不相关的变量,称为主成分。这组主成分能够以最小的信息损失来尽可能多地保留原始数据集的变异性。具体来说,PCA算法包括以下几个步骤:…...
学习嵩山版《Java 开发手册》:编程规约 - 命名风格(P1 ~ P2)
概述 《Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结,他旨在提升开发效率和代码质量 《Java 开发手册》是一本极具价值的 Java 开发规范指南,对于提升开发者的综合素质和代码质量具有重要意义 学习《Java 开发手册》是一个提升 Jav…...
#渗透测试#红蓝攻防#HW#SRC漏洞挖掘01之静态页面渗透
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
开源POC库推荐
声明 学习视频来自 B 站UP主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 ✍🏻作者简介:致…...
深度学习每周学习总结J6(ResNeXt-50 算法实战与解析 - 猴痘识别)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 目录 0. 总结ResNeXt基本介绍 1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数:定义损失函数&…...
用vite下载的react + TS的项目,组件会调用两次
解决方案: 去掉main.tsx文件中的StrictMode...
STM32F4----DCA数字量转换成模拟量
STM32F4----DCA数字量转换成模拟量 基本原理 上一节讲诉了ADC的具体原理与程序搭建https://blog.csdn.net/qq_35970934/article/details/143999874?spm1001.2014.3001.5501。这节讲DAC的原理和程序,在实际应用中,我们经常需要调节电压的输出大小&…...
springboot3如何集成knife4j 4.x版本及如何进行API注解
1. 什么是Knife4j knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案, 取名knife4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍!knife4j的前身是swagger-bootstrap-ui,swagger-bootstrap-ui自1.9.6版本后,正式更名为knife4j为了契合微服务的架构发展,由于原来…...
【Linux网络 (二)】套接字编程
Linux: 网络 一、前言二、端口号 (port)1)port、套接字概念2)端口号 vs 进程id3)端口号和进程关系 三、认识TCP/Udp协议1)连接性解释2)可靠性解释3)面向数据报/字节流解释 四、网络字节序五、struct sockad…...
SQL 语句执行计划中的连接方式
SQL 语句执行计划中的连接方式 join操作 join操作基本分为3大类:外连接(细分为:左连接(Left outer join/ left join)、右连接(right outer join/ right join)、全连接(full outer …...
3、集线器、交换机、路由器、ip的关系。
集线器、交换机、路由器三者的关系 1、集线器2、交换机(每个交换机是不同的广播域,ip地址起到划分广播域的作用)3、 路由器4、ip地址 1、集线器 一开始两台电脑通信就需要网线就可以,但是三台或者更多主机通信时,就需…...
OpenCV相机标定与3D重建(3)校正鱼眼镜头畸变的函数calibrate()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::fisheye::calibrate 函数是 OpenCV 中用于校正鱼眼镜头畸变的一个重要函数。该函数通过一系列棋盘格标定板的图像来计算相机的内参矩阵和畸变…...
【论文笔记】LLaVA-KD: A Framework of Distilling Multimodal Large Language Models
Abstract 大语言模型(Large Language Models, LLM)的成功,使得研究者为了统一视觉和语言的理解去探索多模态大预言模型(Multimodal Large Language Models, MLLM)。 但是MLLM庞大的模型和复杂的计算使其很难应用在资源受限的环境,小型MLLM(s-MLLM)的表现…...
C++内存管理和模板
文章目录 1. C内存管理1.1 new1.1.1 内置类型1.1.2 自定义类型1.1.3 定位new表达式1.1.4 new的优势与不足1.1.5 new的原理 1.2 delete1.2.1 内置类型1.2.2 自定义类1.2.3 delete和free1.2.4 delete原理 1.3 new和delete的对应1.3.1 内置类型1.3.2 自定义类型 2. 模板2.1 函数模…...
Docker 容器化开发 应用
Docker 常用命令 存储 - 目录挂载 存储 卷映射 自定义网络 Docker Compose语法 Dockerfile - 制作镜像 镜像分层机制 完结...
element-plus教程:Input Number 数字输入框
一、基础用法 要使用Input Number数字输入框,只需要在<el-input-number>元素中使用v-model绑定变量即可。例如: <template><el-input-number v-model"value" /> </template><script lang"ts" setup>…...
【Go语言成长之路】编写web应用
文章目录 编写Web应用一、介绍二、创建项目2.1 创建wiki数据结构2.2 介绍net/http包(小插曲)2.3 使用 net/http 提供 wiki 页面2.4 编辑Pages2.5 html/template包2.6 处理不存在的页面2.7 保存页面2.8 错误处理2.9 模板缓存2.10 验证2.11 函数文字和闭包…...
Java 对象头、Mark Word、monitor与synchronized关联关系以及synchronized锁优化
1. 对象在内存中的布局分为三块区域: (1)对象头(Mark Word、元数据指针和数组长度) 对象头:在32位虚拟机中,1个机器码等于4字节,也就是32bit,在64位虚拟机中࿰…...
安宝特分享 | 如何利用AR技术革新医疗实践:从远程急救到多学科协作
AR技术在国内外医院的应用 在现代医疗环境中,患者面临的挑战依然严峻:看病难、看病远、看病急。这些问题不仅影响了患者的治疗效果,也让医务工作者倍感压力。幸运的是,随着增强现实(AR)技术的发展…...
小米note pro一代(leo)线刷、twrp、magisk、TODO: android源码编译
本文主要说android5 整体思路 android 5.1 twrp magisk Zygisk(Riru) Dreamland(xposed) Riru不支持android5.1, 因此只能选择Zygisk : 如果你正在使用 Android 5,你必须使用 Zygisk 因为 Riru 并不支持 Android 5. 基于magisk之上的xposed 其中提到的 作者…...
vue2-基础核心
vue简介 动态构建用户界面的渐进式 JavaScript 框架 vue的特点: 遵循MVVM模式 采用组件化模式,提高代码复用率,让代码更好维护 声明式编码,无需直接操作DOM,提高开发效率,编码简洁、体积小,运行效率高 本…...
使用 前端技术 创建 QR 码生成器 API1
前言 QR码(Quick Response Code)是一种二维码,于1994年开发。它能快速存储和识别数据,包含黑白方块图案,常用于扫描获取信息。QR码具有高容错性和快速读取的优点,广泛应用于广告、支付、物流等领域。通过扫…...
天云数据参编行业标准|《Maas模型服务协议要求》标准正式发布
随着各行业对大模型的应用需求日益增多,模型即服务(MaaS)发展迅速,MaaS将AI模型以服务的方式提供给用户,降低模型使用门槛。当前产业界已推出诸多MaaS产品,并集成和提供了大量模型服务,然而对于…...
观察者模式和订阅模式
观察者模式和订阅模式在概念上是相似的,它们都涉及到一个对象(通常称为“主题”或“发布者”)和多个依赖对象(称为“观察者”或“订阅者”)之间的关系。然而,尽管它们有相似之处,但在某些方面也…...
Mac设置java环境变量
Mac电脑中存在多个jdk版本,如何配置java环境变量为指定版本jdk? 一、查看所有已安装的 JDK 版本 /usr/libexec/java_home -V二、临时设置 export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)三、永久设置 如果需要永久使用指定版...
Sentinel服务保护
Sentinel是阿里巴巴开源的一款服务保护框架,目前已经加入SpringCloudAlibaba中。官方网站: home | Sentinel Sentinel 的使用可以分为两个部分: 核心库(Jar包):不依赖任何框架/库,能够运行于 Java 8 及以…...
Linux内核USB2.0驱动框架分析--USB包
一, 包的组成 每个包都由SOP(包起始域)、SYNC(同步域)、Packet Content(包内容)、EOP(包结束域)四部分组成,其中SOP、SYNC、EOP为所有包共有的域,…...
SpringCloud Gateway转发请求到同一个服务的不同端口
SpringCloud Gateway默认不支持将请求路由到一个服务的多个端口 本文将结合Gateway的处理流程,提供一些解决思路 需求背景 公司有一个IM项目,对外暴露了两个端口8081和8082,8081是springboot启动使用的端口,对外提供一些http接口…...
win10局域网加密共享设置
1、创建共享账户 我的电脑右键选择管理 选择本地用户和组 -> 用户 双击用户 在空白区域右键,新建用户 然后创建用户 点击创建后 2、设置网络 右下角网络右键...
论文阅读——Performance Evaluation of Passive Tag to Tag Communications(一)
文章目录 摘要一、互耦对监听器标签输入阻抗的影响A. 无限细偶极子互阻抗的理论研究B. 电细偶极子的情况:理论与模拟C. 印刷偶极子的情况:电磁模拟与测量 二、T2T 通信系统的性能评估总结 论文来源:https://ieeexplore.ieee.org/document/970…...
Docker Registry(镜像仓库)详解
Docker Registry(镜像仓库)详解 Docker Registry,即Docker镜像仓库,是Docker生态系统中一个至关重要的组件。它负责存储、管理和分发Docker镜像,为Docker容器提供镜像资源。本文将深入探讨Docker Registry的功能、结构…...
17. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--主币种设置
记账模块是我们项目的核心模块,也是用户使用最多的模块,因此这个模块的东西比较多,我们要分为多个部分编写代码。 一、需求 币种设置的需求涉及到了我们前面编写的代码,我们来具体看一下需求。 编号需求说明1主币种设置1. 用户…...
ChatPaper.ai:通过阅读文献高效学习英语的新思路
前言 作为一名学习者,我们常常会遇到这样的困境:想提高英语水平,但单纯背单词缺乏语境;想读专业文献,却被英语障碍所困扰。今天我要分享一个工具 ChatPaper.ai,它让我找到了将英语学习和专业阅读完美结合的…...
.NET9 - 新功能体验(二)
书接上回,我们继续来聊聊.NET9和C#13带来的新变化。 01、新的泛型约束 allows ref struct 这是在 C# 13 中,引入的一项新的泛型约束功能,允许对泛型类型参数应用 ref struct 约束。 可能这样说不够直观,简单来说就是Span、ReadO…...