Linux:基础IO 文件系统
Linux:基础IO && 文件系统
- 一、系统IO
- (一)系统文件操作接口
- 1、open
- 2、write
- 3、read
- (二)文件描述符
- 1、概念
- 2、标准输入、标准输出、标准错误
- (三)dup系统调用(重定向原理)
- 二、文件缓冲区
- (一)文件缓冲区两个层次
- (二)模拟实现文件缓冲区
- 三、理解文件系统
- (一)虚拟文件系统(一切皆文件)
- (二)文件系统
- 1、磁盘物理构造
- 2、磁盘的逻辑结构
- 3、文件系统结构
- 硬链接/软连接
- 四、动态库和静态库
- (一)静态库
- 1、静态库制作
- 2、静态库链接
- 汇编阶段
- 链接阶段
- (二)动态库
- 1、动态库制作
- 2、动态库链接
- (三)链接原理
- 1、静态链接
- 五、ELF格式
- (一)ELF组成
- 重要的节
- (二)ELF形成可执行
- (三)ELF常用指令
- (四)ELF转化成可执行程序
- 1、逻辑地址,物理地址,虚拟地址
- 2、磁盘加载程序
- 3、动态库如何与可执行程序关联
一、系统IO
(一)系统文件操作接口
我们在C++中用到的各种函数底层都是封装了系统调用接口,通过系统指令实现了用户层到操作系统的交互。
打开文件,对文件进行操作,本质是进程对文件进行操作。
1、open
其中选项有很多最通常使用的有O_RDONLY, O_WRONLY, or O_RDWR,同时控制追加和清空的一组O_TRUNC, O_APPEND.
2、write
此处不用写入末尾的\n,不然导致乱码,此外,这里的msg是按照字节写入,因此上层不管是文本写入或者二进制写入都是调用write.
3、read
读取函数的返回值:如果成功且没有完成sizeof个字节,返回读取到的数量,读取完成返回0;
(二)文件描述符
1、概念
通过前面的学习,我们知道所谓的文件描述符就是一个正数,实际上他是进程结构体中files
指针指向的files_struct
(文件描述符表)这个指针数组的下标。通过指针,我们就能访问到内核中该文件。
实现文件描述符是为了不同平台的可移植性,不同平台的系统调用方式可能有所差距,我们使用条件编译给予不同平台上层不同的 C++/JAVA…代码可以提高语言的跨平台性。
注:此图非原创
2、标准输入、标准输出、标准错误
stdin,stdout.stderr
这FILE*
的指针内部封装了文件描述符0. 1. 2
。
(三)dup系统调用(重定向原理)
我们将自己写的文件将它替换文件描述符表的指针指向,进而实现重定向。其中dup
函数正是实现的关键。
二、文件缓冲区
文件缓冲区有两个一个是用户级缓冲区,另一个则是系统内核级缓冲区。
(一)文件缓冲区两个层次
系统内核级缓冲区:
用户级缓冲区:
在系统中定义了typedef _IO_FILE FILE
,通过这个指针底层封装了用户级缓冲区以及文件描述符。
(二)模拟实现文件缓冲区
#include "mystdio.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>static MyFile *BuyFile(int fd, int flag)
{MyFile *f = (MyFile*)malloc(sizeof(MyFile));if(f == NULL) return NULL;f->bufferlen = 0;f->fileno = fd;f->flag = flag;f->flush_method = LINE_FLUSH;memset(f->outbuffer, 0, sizeof(f->outbuffer));return f;
}MyFile *MyFopen(const char *path, const char *mode)
{int fd = -1;int flag = 0;if(strcmp(mode, "w") == 0){flag = O_CREAT | O_WRONLY | O_TRUNC;fd = open(path, flag, 0666);}else if(strcmp(mode, "a") == 0){flag = O_CREAT | O_WRONLY | O_APPEND;fd = open(path, flag, 0666);}else if(strcmp(mode, "r") == 0){flag = O_RDWR;fd = open(path, flag);}else{//TODO}if(fd < 0) return NULL;return BuyFile(fd, flag);
}
void MyFclose(MyFile *file)
{if(file->fileno < 0) return;MyFFlush(file);close(file->fileno);free(file);
}
int MyFwrite(MyFile *file, void *str, int len)
{// 1. 拷贝memcpy(file->outbuffer+file->bufferlen, str, len);file->bufferlen += len;// 2. 尝试判断是否满足刷新条件!if((file->flush_method & LINE_FLUSH) && file->outbuffer[file->bufferlen-1] == '\n'){MyFFlush(file);}return 0;
}
void MyFFlush(MyFile *file)
{if(file->bufferlen <= 0) return;// 把数据从用户拷贝到内核文件缓冲区中int n = write(file->fileno, file->outbuffer, file->bufferlen);(void)n;fsync(file->fileno);file->bufferlen = 0;
}
三、理解文件系统
(一)虚拟文件系统(一切皆文件)
其中,struct file
文件中的两个指针调用底层硬件的IO
实现了一种类似多态一样的功能。
(二)文件系统
1、磁盘物理构造
物理结构中,扇区的存储类似一个三维数组,此时我们管这种存储方式叫做CHS
寻址。
2、磁盘的逻辑结构
磁盘的储存和磁带类似,我们可以把磁盘存储理解成一个逻辑连续的线性结构,整片存储空间看成一个一维数组,其中每一个扇区的地址叫做LBA
地址。
我们内存中读取一块内存也是以块(4KB)为单位。其中LBA
和CHS
地址是可以互相转化的,其中转化方式不在叙述。
3、文件系统结构
文件系统的载体是分区,每一个对磁盘单独划分的区域都是一个单独的文件系统。
- Block Group :一块
Block Group
的内存大小是4KB,一个inode
的大小是128字节,因此一个块可以存储32个inode
. - inode Table:跨组不跨分区,
inode
里面有inode number
,使用ls -li
可以查看,此外还有一个整形数组用来进行到data Blocks
的映射。
- GDT : 快组描述符,整个分区有多少个块组就有多少个块组描述符,用来描述快组的整体使用情况,记录每个区域的起始位置。
- Super Block :超级块,记录文件系统占用的总空间,文件系统中空闲和已使用的磁盘块数量。描述文件系统中块和inode的大小,记录根目录的
inode
。
文件系统中对待文件和目录是一视同仁的,没有区分,其中目录里面的
data block
存储内容是文件名,我们平时使用文件名查找信息时,先打开当前路径(路径由进程提供),读取目录里面的内容,得到文件名和inode
间的映射关系,接着拿着这个inode
去查找对应的信息。
硬链接/软连接
软连接: 相当于快捷方式,通过文件名字引用另外一个文件,实际上,新的文件和被引用的文件的inode
不同。
使用unlink
取消快捷方式。
将来我们写程序时,如果程序的路径藏得比较深,那么我们可以建立一个软连接,这样我们可以通过软连接直接运行程序。
硬链接: 真正磁盘上找文件并不是找文件名,而是inode
,其实可以让多个文件名对应同一个inode
硬链接的作用是对目标文件进行备份。
四、动态库和静态库
库是现有的成熟的可重复使用的代码,本质上是一种可执行的二进制形式(即
.o
,可被操作系统载入内存运行。
(一)静态库
a
[Linux],lib
[windows]
静态库实质是对.o
文件进行打包,生成.a
的归档文件,使用时直接用gcc, g++
链接即可。
1、静态库制作
ar
将文件进行归档,rc
即replace and create
。
2、静态库链接
汇编阶段
我们在程序中包含的头文件如果不在同一个路径下,系统是找不到的,因此需要使用-I
来指定路径
链接阶段
默认情况下,g++
不会到当前路径去找库,需要添加选项-L
,同时如果是自己写的库,也要注明编译器才会去查找。
或者说我们也可以直接将两个阶段合并成一个。
(二)动态库
so
[Linux]dll
[windows]
1、动态库制作
- 首先在编译时加入无关码选项。
- 生成的动态库也要添加选项,和静态库添加
ar
有所差异。
2、动态库链接
我们直接再像之前静态库一样不能正常运行,此时我们有四种方法可以解决这个问题
- 1、将动态库拷贝到
/lib64/
下。 - 2、制作软链接,指向
lib64/
。 - 3、通过系统的环境变量来指明路径,通常情况下这个环境变量为空,我们需要手动创建。
- 4、在
/etc/ld.so.conf.d/
路径下创建任何一个以.conf
为后缀的文件,文件中的内容存放动态库的路径。
(三)链接原理
1、静态链接
静态链接是程序构建过程中的一个重要环节,它通过将目标文件和库文件合并成一个独立的可执行文件,下面以两份代码来模拟这个过程,以code.c
代表静态库。
code.c
:
#include<stdio.h>void run()
{printf("runing...\n");
}
hello.c
:
#include<stdio.h>void run();int main()
{printf("hello, world!\n");run();return 0;
}
而我们链接将这两个.o
文件合并成一个新的.o
文件后,符号表就会互相填充,不再是UND
未定义。
五、ELF格式
动静态库,可执行程序,可重定位.o
文件都属于ELF
格式的文件。
(一)ELF组成
- ELF header: 描述文件的特征,定位文件其它部分。
- Program header table(程序表头): 表里记录了每个段的开始位置和位移,长度。
- Section header table(节头表): 包含对节的描述。
- Section(节): ELF文件的基本组成单位,包含特定类型数据。如代码节存储可执行代码,数据节存储全局变量和静态变量。
程序头表和节头表作用:
链接视图(Linking view)-对应节头表Section header table
文件结构的粒度更细,将文件按功能模块的差异进行划分, 为了空间布局上的效率,将来在链接目标文件时,链接器会把很多节(section)合并,规整成可执行的段(seqment)、可读写的段、只读段等。合并了后,空间利用率就高了。
执行视图(execution view)-对应程序头表program header table
告诉操作系统,如何加载可执行文件,完成进程内存的初始化。一个可执行程序的格式中,一定有program header table
.
重要的节
- Text 段:存储程序的代码,只读且共享。
当你编写一个简单的函数
int add(int a, int b) { return a + b; },
编译后,这个函数的指令会被存储在 Text 节中。
- Data 段:存储初始化的全局变量和静态变量,可读写。
int global_var = 10; // 这个变量会存储在 Data 段中
static int static_var = 20; // 同样存储在 Data 段
- BSS 段:存储未初始化的全局变量和静态变量,运行时自动初始化为零,节省空间。
int uninitialized_global; // 未初始化的全局变量,存储在 BSS 段
static int uninitialized_static; // 未初始化的静态变量,也存储在 BSS 段
(二)ELF形成可执行
一个ELF会有多种不同的
Section
,在加载到内存的时候,也会进行Section
合并,形segment
合并原则:相同属性,比如:可读,可写,可执行,需要加载时申请空间等。这样,即便是不同的Section,在加载到内存中,可能会以segment的形式,加载到一起,这个合并工作也已经在形成ELF的时候,合并方式已经确定了,具体合并原则被记录在了ELF的 程序头表(Program header table)中
- 1、将多份
c++
代码编译形成.o
文件 + 动静态库(ELF) - 2、将多份
.o
文件section
进行合并
1、Section合并的主要=是为了减少页面碎片,提高内存使用效率。如果不进行合并,假设页面大小为4096字节(内存块基本大小,加载,管理的基本单位),如果.text部分为4097字节,.init部分为512字节,那么它们将占用3个页面,而合并后,它们只需2个页面。
2、操作系统在加载程序时,会将具有相同属性的section
合并成一个大的segment
,这样就可以实现不同的访问权限,从而优化内存管理和权限访问控制。
(三)ELF常用指令
使用size
查看ELF
格式文件的组成。
使用readelf -S
可以用来查看文件的节头表,当前一共 30 个结点,里面标识了起始地址和偏移量。
使用readelf -l
可以用来查看文件的程序头表,将 30 个节打包成指定数量的段segment
使用readelf -h
可以用来查看文件的程序头表
其中Magic
用来判断该ELF
是一个可执行程序,Entry point address
是指程序的入口地址。
使用readelf -s
查看ELF
文件的符号表
(四)ELF转化成可执行程序
1、逻辑地址,物理地址,虚拟地址
程序在开始时,我们都选择从 0 开始,这种编制方式也叫平坦模式。其实函数在编译好之后使用的地址已经是虚拟地址了,对应虚拟地址空间。
在存储时,每一个虚拟地址都对应了磁盘中的一个物理地址。
操作系统读取磁盘时,将磁盘上的物理地址和虚拟地址同时读入内存。
2、磁盘加载程序
cpu
将可执行程序第一条语句的地址到寄存器EIP
中,开始执行程序。
3、动态库如何与可执行程序关联
动态链接实际上将链接的过程推迟到了程序加载的时候。
在C/C++程序中,当程序开始执行时,它首先并不会直接跳转到 main 函数。实际上,程序的入口点是_start这是一个由C运行时库(通常是glibc)或链接器(如Id)提供的特殊函数。
在start函数中,会执行一系列初始化操作,这些操作包括:
- 1.设置堆栈:为程序创建一个初始的堆栈环境。
- 2.初始化数据段:将程序的数据段(如全局变量和静态变量)从初始化数据段复制到相应的内存位置,并清零未初始化的数据段。
- 3.动态链接:这是关键的一步,_start 函数会调用动态链接器的代码来解析和加载程序所依赖的动态库(shared libraries)。动态链接器会处理所有的符号解析和重定位,确保程序中的函数调用和变量访问能够正确地映射到动态库中的实际地址。
- 4.调用 -1ibc_start_main:一旦动态链接完成,_start 函数会调用1ibc_start_main(这是glibc提供的一个函数)。1ibc_start_main 函数负责执行一些额外的初始化工作,比如设置信号处理函数、初始化线程库(如果使用了线程)等。
- 5.调用 main 函数:最后,libc_start_main 函数会调用程序的 main 函数,此时程序的执行控制权才正式交给用户编写的代码。
- 6.处理 main 函数的返回值:当 main 函数返回时,1ibc_start_main 会负责处理这个返回值,并最终调用_exit 函数来终止程序。
相关文章:
Linux:基础IO 文件系统
Linux:基础IO && 文件系统 一、系统IO(一)系统文件操作接口1、open2、write3、read (二)文件描述符1、概念2、标准输入、标准输出、标准错误 (三)dup系统调用(重定向原理) 二…...
近期有哪些断链危机?如何提升供应链风险管理能力?
全球供应链格局正经历深刻变革,其网络架构愈发复杂,涉及多国企业主体且涵盖多个节点与复杂环节,管理难度显著增大。从原材料采购到终端交付,运输、仓储、加工等任一环节均存在潜在风险,单一环节效率滞后易引发系统性连…...
知识科普|褪黑素的发展历程及应用研究进展
睡眠作为维持人体健康的重要生理机制,其节律性受到精密调控。在昼夜节律系统的调控下,人类普遍遵循周期性单次睡眠模式,这一过程涉及复杂的神经-体液调控网络。其中神经元活动、神经递质传导、激素分泌及遗传调控机制共同作用于睡眠觉醒系统&…...
企业如何构建一个全面的Web安全防护体系
企业如何构建一个全面的Web安全防护体系 企业构建全面的Web安全防护体系需融合战略规划、技术防御、持续运营和风险治理四大维度,以下是基于行业最佳实践的系统化方案: 一、顶层设计:治理架构与安全战略 战略规划与合规驱动 制定网络安全愿…...
T8332FN凯钰LED驱动芯片多拓扑车规级AEC-Q100
T8332FN是一款支持多拓扑结构的恒流LED驱动控制芯片,适用于汽车照明及高功率LED应用,具备宽电压输入、高精度调光及多重保护功能。 核心特性 - 输入与拓扑:支持5-60V宽电压输入,适配Boost、Buck、Buck-Boost、SEPIC四种拓扑结构&…...
Redis一些小记录
Redis一些小记录 SpringData Redis:RedisTemplate配置与数据操作 操作String类型数据 String是Redis中最基本的数据类型,可以存储字符串、整数或浮点数。RedisTemplate提供了ValueOperations接口来操作String类型的数据,支持设置值、获取值、…...
Win10安装 P104-100 驱动
安装完之后总结一下, 之前做了不少功课, 在网上搜了很多教程, 视频的文字的, 但是很多已经比较陈旧了. 最后发现的这个 GitHub 项目 NVIDIA-patcher 是最有用的, 因为这是现在这些魔改驱动的来源. NVIDIA-patcher 仓库地址: https://github.com/dartraiden/NVIDIA-patcher 安…...
Android开机动画资源包制作(测试使用)
开机动画资源包需要采用仅存储的方式进行压缩,不能使用压缩软件直接压缩生成。 如果是系统开发人员,可以在源码目录中,采用bootanim程序提供的制作方式进行,下面可供测试人员自行制作。 制作流程 1)基于设备中已有开…...
PWN基础-利用格式化字符串漏洞泄露canary结合栈溢出getshell
测试源码: #include<stdio.h> void exploit() {system("/bin/sh"); } void func() {char str[0x20];read(0, str, 0x50);printf(str);read(0, str, 0x50); } int main() {func();return 0; } 编译,开启 canary 保护,关闭 p…...
Kafka HA集群配置搭建与SpringBoot使用示例总结
Kafka HA集群配置搭建与SpringBoot使用示例总结 一、Kafka高可用(HA)集群搭建 1. 环境准备 至少3台服务器(推荐奇数台,如3、5、7)已安装Java环境(JDK 1.8)下载Kafka二进制包(如kafka_2.13-3.2.1.tgz&…...
MSO-Player:基于vlc的Unity直播流播放器,支持主流RTSP、RTMP、HTTP等常见格式
MSO-Player 基于libVLC的Unity视频播放解决方案 支持2D视频和360度全景视频播放的Unity插件 📑 目录 🎥 MSO-Player 📋 功能概述🚀 快速入门📚 关键组件📝 使用案例🔌 依赖项📋 注意…...
97A6-ASEMI无人机专用功率器件97A6
编辑:ll 97A6-ASEMI无人机专用功率器件97A6 型号:97A6 品牌:ASEMI 封装:SOT-23 批号:最新 引脚数量:3 特性:双向可控硅 工作温度:-40℃~150℃ 97A6双向可控硅:…...
body Param Query 三个 不同的入参 分别是什么意思 在前端 要怎么传 这三种不同的参数
在 NestJS 中,Body()、Param() 和 Query() 用于处理不同类型的请求参数。以下是它们的含义及前端传递方式: Body():请求体参数 • 含义:用于获取请求体中的数据(如 POST/PUT 请求中提交的 JSON、表单数据等)…...
生成式人工智能认证(GAI认证)含金量怎么样?
当生成式人工智能(Generative AI)的浪潮以摧枯拉朽之势重塑职业版图时,一个尖锐的问题正悬在无数人的心头:在技术迭代比眨眼更快的时代,如何证明自己具备驾驭AI的核心能力? 这场认知革命的背后,一张认证证书的价值早已超越了纸面——它既是个人能力的“信用背书”,也是…...
环境DNA宏条形码技术,鱼类检测引物如何选择?
环境DNA(eDNA)宏条形码技术在鱼类多样性调查研究中的优势明显,相比于传统调查方式,eDNA宏条形码技术灵敏度更高,能够更好地揭示鱼类的丰富度,并且具有高时效性。然而,在使用这个技术的过程中&am…...
Scala集合操作与WordCount案例实战总结
集合计算简单函数 1、说明 (1)求和 (2)求乘积 (3)最大值 (4)最小值 (5)排序 2、案例实操 object demo29{ def main(args: Array[String]): Unit { val…...
Spark-Streaming核心编程(四)总结
有状态转化操作 - UpdateStateByKey 功能描述 UpdateStateByKey原语用于在DStream中跨批次维护状态,例如流计算中的累加wordcount。 它允许对一个状态变量进行访问和更新,适用于键值对形式的DStream。 工作原理 给定一个由(键,事…...
关系型数据库PostgreSQL for Mac 保姆级使用教程
第一部分:安装PostgreSQL 方法一:使用Postgres.app(最简单) 访问 Postgres.app官网 下载最新版本,将 Postgres.app 移动到 “Applications” 文件夹。 双击Postgres.app打开应用,点击"Initialize&q…...
新增 29 个专业,科技成为关键赛道!
近日,教育部正式发布《普通高等学校本科专业目录(2025年)》,新增 29 个本科专业,包括区域国别学、碳中和科学与工程、海洋科学与技术、健康与医疗保障、智能分子工程、医疗器械与装备工程、时空信息工程、国际邮轮管理…...
云计算市场的重新分类研究
云计算市场传统分类方式,比如按服务类型分为IaaS、PaaS、SaaS,或者按部署模式分为公有云、私有云、混合云。主要提供计算资源、存储和网络等基础设施。 但随着AI大模型的出现,云计算市场可以分为计算云和智算云,智算云主要是AI模…...
大模型时代的具身智能:从虚拟到现实的智能体进化革命
一、具身智能:重新定义 AI 与物理世界的交互范式 (一)概念解析:从 "离身" 到 "具身" 的认知革命 具身智能(Embodied AI)是融合大模型决策能力与物理实体执行能力的新型智能系统&…...
鸿蒙NEXT开发正则工具类(ArkTs)
import { FormatUtil } from ./FormatUtil;/*** 正则工具类* author CSDN-鸿蒙布道师* since 2025/04/27*/ export class RegexUtil {/*** 英文字母、数字和下划线*/static readonly REG_GENERAL "^\\w$";/*** 数字*/static readonly REG_NUMBERS "^\\d$"…...
Flink维表深度解析
一、维表的概念与作用 维表(Dimension Table) 是数据仓库中的核心概念,通常用于存储静态或缓慢变化的业务实体信息(如用户资料、商品信息、地理位置等)。在实时流处理场景中,维表的作用是为主数据流&#…...
基于ArcGIS的洪水灾害普查、风险评估及淹没制图技术研究
一、洪水普查技术规范解读 1.1 全国水旱灾害风险普查实施方案解读 1.2 洪水风险区划及防治区划编制技术要求解读 1.3 山丘区中小河流洪水淹没图编制技术要求解读 二、ArcGIS介绍及数据管理 2.1 ArcGIS界面及数据加载 2.2 ArcGIS常见数据格式 2.3基于Geodatabase的洪水灾…...
初识数据结构——二叉树从基础概念到实践应用
数据结构专栏 ⬅(click) 初识二叉树:从基础概念到实践应用🌳 一、树型结构基础 1.1 树的基本概念 树是一种非线性的数据结构,由n(n>0)个有限节点组成一个具有层次关系的集合。它看起来像一棵倒挂的树,根朝上而叶朝下。 关键特…...
手搓传染病模型(SEIR)
先看模型 在本模型中,人群有四种自然史状态:易感者(S),暴露者(E),感染者(I)以及康复者(R) 2.模型假设人群分布是同质均匀的,未考虑人群出生、死亡、迁入迁出对疾病传播的影响 3.康复者永久免疫:康复者永久免…...
企业数据赋能 | 应用模板分享:汽车销售仪表板
实时监控销售数据,比较车型、地区业绩~ 今天,小编向大家分享 Tableau 应用分析模板:由 Imran Shaikh 搭建的汽车销售仪表板。借助此仪表板,企业可以实时跟踪销售情况,了解市场趋势,并比较不同车型、地区和销…...
C++?动态内存管理!!!
一、引言 之前我们一起讨论了类和对象的相关知识,接下来我们将继续完善我们的知识体系,为以后继续深入学习C知识添砖加瓦,在本期我们将一起学习C中关于动态内存管理的相关知识,在学习之前将要先回顾C语言中是如何进行动态内存管理…...
MCP协议:AI生态的统一标准
MCP(Model Context Protocol,模型上下文协议)是人工智能领域的革命性协议标准,被广泛类比为“AI世界的USB-C接口”。它通过统一模型、算力和数据的交互方式,解决了AI生态中的碎片化问题,重构了智能协作的技术范式。以下是其核心解析与技术哲学: 一、MCP协议的核心定位与…...
在 UniApp 中实现 App 与 H5 页面的跳转及通信
在移动应用开发中,内嵌 H5 页面或与外部网页交互是常见需求。UniApp 作为跨平台框架,提供了灵活的方式实现 App 与 H5 的跳转和双向通信。本文将详细讲解实现方法,并提供可直接复用的代码示例。 文章目录 一、 App 内嵌 H5 页面(使…...
目标跟踪最新文章阅读列表
AAAI2025 TrackFormer: Multi-Object Tracking with Transformers 论文:https://arxiv.org/abs/2101.02702 代码:https://github.com/timmeinhardt/trackformer AAAI2025 SUTrack 单目标跟踪 论文:https://pan.baidu.com/s/10cR4tQt3lSH5V2RNf7-3gg?pwd=pks2 代码:htt…...
Spark RDD行动算子与共享变量实战:从数据聚合到分布式通信
RDD行动算子: 行动算子就是会触发action的算子,触发action的含义就是真正的计算数据。 1、reduce import org.apache.spark.{SparkConf, SparkContext} object value11 { def main(args: Array[String]): Unit { // 创建 SparkConf 对象并设置应用…...
《2025全球机器学习技术大会:阿里云讲师张玉明深度剖析通义灵码AI程序员》
4 月 18 日 - 19 日,由 CSDN & Boolan 联合举办的 2025 全球机器学习技术大会(ML-Summit)于上海顺利举行。大会聚焦人工智能与机器学习前沿技术,汇聚了来自科技与人工智能领域的数位顶尖专家以及数千名开发者和研究者…...
python+adafruit_pca9685 测试舵机存储当前角度
测试代码如下: # -*- coding: UTF-8 -*- import time from board import SCL, SDA import busio from adafruit_pca9685 import PCA9685 from adafruit_motor import servo 测试控制1块驱动板或者多块 pip install Adafruit-PCA9685 --break-system-packages pip i…...
视觉/深度学习/机器学习相关面经总结(2)(持续更新)
目录 1、跨模态对齐的方案2、位置编码方式1. **正弦和余弦位置编码(Sinusoidal Positional Encoding)**2. **可学习的位置编码(Learnable Positional Encoding)**3. **相对位置编码(Relative Positional Encoding&…...
缓存并发更新的挑战
缓存并发更新的挑战 1. 引言:并发更新的挑战2. 并发场景下的常见“坑”最后写入胜出 (Last-Write-Wins)脏读 (Dirty Read)丢失更新 (Lost Update)不可重复读 (Non-repeatable Read)幻读 (Phantom Read)写偏斜 (Write Skew)缓存与数据库不一致分布式系统中的时序问题…...
LeetCode题解1297. 子串的最大出现次数
(好久没写题解了,忙着学ai去了) 先来看题目 很显然,题目就是要我们在给定的字符串中找到一个满足要求的连续子串。 首先,要求子串中不同字母的数目得小于等于maxLetters,我们可以用一个DifLettsers函数来…...
零基础小白如何上岸数模国奖
零基础小白如何上岸数模国奖 我自己本人第一次参加数模国赛顺利上岸国奖,当然那段经历也是比较痛苦了,差不多也是从当年四月开始接触数学建模,第一次参加妈妈杯成绩并不理想,后面不断参加数模比赛进行模拟,最后顺利上岸…...
Redux-Saga vs Redux-Thunk
Redux-Saga与Redux-Thunk对比 #mermaid-svg-zbDYIbzoVqlMJXiE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zbDYIbzoVqlMJXiE .error-icon{fill:#552222;}#mermaid-svg-zbDYIbzoVqlMJXiE .error-text{fill:#55222…...
Win11 配置 Git 绑定 Github 账号的方法与问题汇总
目录 一、创建 Github 项目库(远程仓库)二、配置安装好的 Git1. 设置用户信息2. 查看已配置的信息3. 建立本地仓库4. Git 常用命令速查表 三、配置 SSH 公钥1. 生成 ssh key出现的问题 2. 启动 ssh-agent 并添加秘钥3. 在 Github 上绑定 ssh 公钥出现的问…...
李臻20242817_安全文件传输系统项目报告_第9周
安全文件传输系统项目报告(第 9 周) 1. 代码链接 Gitee 仓库地址:https://gitee.com/li-zhen1215/homework/tree/master/Secure-file 代码结构说明: project-root/├── src/ # 源代码目录│ ├── main.c # 主程序入口│ ├…...
OceanBase TPCC测试常见报错汇总
OceanBase TPCC测试常见报错汇总 报错1:加载测试数据时创建tablegroup失败报错2:加载测试数据时执行超时报错3:加载测试数据时funcs.sh函数找不到报错4:加载数据时报错超过租户内存上限办法一:增加租户内存办法二:调高转储线程数办法三:调整MemStore内存占比和冻结触发阈…...
文心一言开发指南06——千帆大模型平台新手指南
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 千帆大模型平台为新手用户提供了一个全面的入门指南,以便用户能够快速熟悉平台的操作和功能。千帆大模型平台通过提供详细的新手指南,确保用户能够顺…...
解决SSLError: [SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC] decryption faile的问题
问题描述: 在pip安装第三方库时,出现SSL的问题。 传输层安全性协议(TLS)及其前身安全套接层(SSL)是现在的 HTTPS 协议中的一种安全协议,目的是为互联网通信提供安全及数据完整性保障。而较新版…...
Clang中ext_vector_type和address_space __attribute__的使用
Clang中ext_vector_type和address_space __attribute__的使用 一.背景二. 关键概念详解三.示例代码与验证四. 总结 一.背景 在使用 Clang 编译可执行程序时,遇到类似下面的链接错误: undefined reference to atomic_add(int volatile AS4*, int) undef…...
echarts自定义图表
普通柱状图 自定义柱状图 实现思路 4个图层 背景 边框实体 内部透明地步透明间隙红色柱形数据数据使用自定义字体倾斜柱形上方扁平矩形矩形颜色透明 label字体颜色和背景色相同实现矩形块 上下靠padding实现 向下 paddingBottom使用负数 完整代码 <!DOCTYPE html> <…...
【应用密码学】实验二 分组密码(2)
一、实验要求与目的 1) 学习AES密码算法原理 2) 学习AES密码算法编程实现 二、实验内容与步骤记录(只记录关键步骤与结果,可截图,但注意排版与图片大小) 字符串加解密 运行python程序,输入…...
【深度学习】多头注意力机制的实现|pytorch
博主简介:努力学习的22级计算机科学与技术本科生一枚🌸博主主页: Yaoyao2024往期回顾:【深度学习】注意力机制| 基于“上下文”进行编码,用更聪明的矩阵乘法替代笨重的全连接每日一言🌼: 路漫漫其修远兮,吾…...
OceanBase数据库磁盘空间管理
OceanBase数据库磁盘空间管理 日志盘空间管理日志盘容量参数日志盘空间满应急处理 数据盘空间管理数据盘容量参数数据文件自动扩展数据盘空间满应急处理表占用的磁盘空间 日志盘空间管理 日志盘容量参数 🐯 与日志盘redo_dir相关的四个重要参数: log_…...
自然语言处理之机器翻译:Statistical Machine Translation(SMT)的评估方法解析与创新实践
## 机器翻译与评估的重要性 机器翻译(Machine Translation, MT)作为自然语言处理(NLP)的核心任务之一,旨在通过计算机实现跨语言的信息传递。随着全球化进程加速,机器翻译在商业、科研、社交等领域的应用愈发广泛。然而,翻译质量直接决定了其实际价值,因此**翻译质量…...