- 博客(261)
- 资源 (2)
- 收藏
- 关注
原创 C++ 面试考点 类成员函数的调用时机
的对象,每当程序开始运行,在主函数 main 接受程序控制权之前,就调用构造函数创建全局对象,整个程序结束时,自动调用全局对象的析构函数。2. 对于。
2025-09-02 21:44:40
703
原创 2. 初识 SSD 的 PCIe协议栈
SSD 已经大跨步迈入 PCIe 时代。PCIe 是 SSD 的一项重要技术,我们有必要对其进行基本的了解。为什么 SSD 要用 PCIe?因为它快,比 SATA 更快。它究竟有多快?我们从 PCIe 的速度开启我们的 PCIe 之旅。PCIe 发展到现在,从 PCIe 1.0、PCIe 2.0,到现在的 PCIe 3.0,速度一代比一代快,如下表所示。这里 x1,x2,x4 等指的是PCIe连接的通道数,PCIe连接可以有多个通道,且它的通信是全双工的。
2025-08-25 15:22:03
889
原创 1. 初识SSD
SSD(Solid State Drive)即固态硬盘,是一种以半导体闪存(NAND Flash)为介质的存储设备。和传统机械硬盘(Hard Disk Drive,HDD)不同,SSD以半导体存储数据,用纯电子电路实现,不含任何机械设备,这就决定了它在性能、功耗、可靠性等方面和HDD有很大不同。其实SSD的概念很早就有了,但它真正成为主流存储设备还是最近10余年的事情。在2008年初,只有几家公司研发SSD,如今已有上百家大大小小的公司参与其中。
2025-08-25 11:13:25
1038
原创 Linux C 进程间高级通信
在之前学习进程间通信时,我们只接触了一些基础的进程间通信知识。例如管道通信、内存映射等,这些通信方式传值时没有任何问题,当时当传送一些特殊的内存指针或是变量就有可能出问题。由于进程之间彼此是内存隔离的,不能直接访问其他进程的内存空间,每个进程都有自己打开的文件对象或是网络套接字。当进程想把自己已经打开的文件对象分享给其他进程使用,仅通过管道传递一个文件描述符肯定是不行的,它只适用于自己。这个时候我们就可以使用一些特殊的进程通信系统调用,使其可以共享进程内的对象。
2025-07-27 15:46:16
982
原创 Linux C 网络基础编程
主机字节序(Host Byte Order)依赖于具体计算机系统的架构。在大多数现代计算机系统(如 x86 和 x86_64 架构的机器)中,主机字节序是小端序(Little-Endian),即低位字节存储在低地址处。在某些系统(如某些 PowerPC 架构的机器)中,主机字节序是大端序(Big-Endian)。网络字节序(Network Byte Order)标准的网络通信协议(如 TCP/IP)使用大端序(Big-Endian),即高位字节存储在低地址处。
2025-07-24 17:23:08
658
原创 Linux C 多线程基本操作
我们已经了解进程的基本概念:进程是正在执行的程序,并且是系统资源分配的基本单位。当用户需要在一台计算机上去完成多个独立的工作任务时,可以使用多进程的方式,为每个独立的工作任务分配一个进程。多进程的管理则由操作系统负责——操作系统调度进程,合理地在多个进程之间分配资源,包括CPU资源、内存、文件等等。除此以外,即便是一个单独的应用,采用多进程的设计也可以提升其,改善其。假如在处理任务的过程中,其中一个进程因为死循环或者等待IO之类的原因无法完成任务时,操作系统可以调度另一个进程来完成任务或者响应用户的请求。
2025-07-21 21:10:53
1128
原创 Linux C 进程间通信基本操作
虚拟CPU和虚拟内存的引入保证了进程的一个重要特性就是隔离,一个进程在执行过程中总是认为自己占用了所有的CPU和内存,但是实际在底层,操作系统和硬件完成了很多工作才实现了隔离的特性(比如内核和时钟设备配合实现进程调度)。在多个进程之间,如果需要进行通信的话,隔离特性会造成一些通信的障碍。所以我们需要一些手段来跨越隔离,实现进程间通信(InterProcess Communication,IPC)。
2025-07-18 17:37:41
939
原创 Linux C 进程基本操作
操作系统最初的原型是一种批处理系统(batch):在最开始我们把正在执行的程序称为作业,操作员将所有的作业放在一起,由批处理系统进行读取并交给计算机执行,当一个作业执行完成以后,批处理系统会自动地取出下一个作业。在批处理系统中,存在的最严重的问题是任务执行的过程,会经常需要等待IO操作,这会导致CPU经常性地空闲。为了充分提高CPU的利用率,一种解决方案是引入多道程序设计,在内存当中划分多个区域,每个区域存储一个作业的指令和数据,当其中一个作业在等待IO操作时,另外一个作业可以使用CPU。
2025-07-17 22:51:07
1283
原创 Linux C IO多路复用
IO多路复用(I/O Multiplexing)是一种同时监控多个文件描述符(socket、管道、文件等)的IO状态的机制。当其中任意一个或多个文件描述符就绪(可读、可写或异常)时,内核会通知应用程序,从而避免阻塞等待单个IO操作。在传统阻塞IO模型中,每个IO操作(如readwrite)会阻塞线程直到完成。若需处理多个连接(如Web服务器),必须为每个连接创建一个线程/进程,导致资源浪费(线程上下文切换、内存占用)。IO多路复用通过单线程监控多个IO事件,实现高并发、低资源消耗。
2025-07-15 21:09:11
807
原创 Linux C 管道文件操作
进程间通信:管道文件是实现进程间通信(IPC)的一种简单而高效的方式。它允许进程之间传递数据,而无需复杂的网络编程。命令行组合:在 Shell 中,管道符号()可以将多个命令组合起来,实现复杂的操作。这里,ls -l的输出被传递给grepgrep的输出再被传递给sort。
2025-07-11 16:27:22
1142
原创 Linux C 文件基本操作
在UNIX系统当中,“万物皆文件”是一种重要的设计思想。在传统的定义当中,我们把存储在磁盘当中的数据集合称为文件。而在UNIX的设计当中,文件这个概念得到了进一步泛化,所有满足速度较慢、容量较大和可以持久化存储中任意一个特征的数据集合都可以称为文件,包括不限于磁盘数据、输入输出设备、用于进程间通信的管道、网络等等都属于文件。文件系统是操作系统用于管理文件的子模块。
2025-07-10 21:59:53
709
原创 Linux C 目录流基本操作
本文介绍了Linux目录操作相关函数及其应用。主要内容包括:1. 目录流的概念和操作函数(opendir/closedir/readdir)的使用方法;2. 目录位置记录的telldir和seekdir函数;3. 文件状态信息获取的stat/fstat/lstat函数;4. 通过实际代码示例演示了如何遍历目录、获取文件详细信息;5. 最后实现了一个模拟ls命令的程序,能够输出文件的类型、权限、所有者、大小和修改时间等信息。文章详细讲解了各函数参数、结构体定义和使用注意事项,为Linux系统编程中的目录和文件
2025-07-09 19:34:31
790
原创 C++ unordered_map 容器总结
基于实现。元素的存储顺序是,取决于哈希函数和哈希表的结构。插入、删除和查找操作的平均时间复杂度为,但在最坏情况下(如大量哈希冲突)可能退化到O(n)。键是,元素的存储和遍历顺序取决于哈希函数和哈希表的结构。如果需要按键值顺序遍历,需要额外排序。内存使用可能比std::map稍高,因为哈希表需要额外的空间来处理哈希冲突(如开放寻址法或链表法)。但可以通过调整负载因子(load factor)来优化内存使用。适用于需要频繁查找、插入和删除的场景,尤其是当数据量较大时。
2025-07-08 19:45:53
1125
原创 使用GDB调试程序方法
写程序难免会遇到 Bug,这时我们就需要 GDB 来对程序进行调试了。调试需要在编译的时候,加上一些调试相关的信息,也就是说,需要指定 -g 选项。如:其中-g选项表示生成调试信息。当你在编译程序时加上-g选项,gcc会在生成的包含额外的调试信息。这些调试信息主要是关于源代码和目标代码之间的映射关系等内容。例如,它会记录变量的名称、类型、位置,函数的入口点等信息。这些调试信息对于使用调试工具(如gdb)来调试程序非常重要。调试工具可以利用这些信息来帮助你查看变量的值、设置断点、单步执行等操作。
2025-06-24 20:54:12
920
原创 计算机史话:Unix&Linux的发展历史
早期的操作系统为批处理操作系统,输入设备只有卡片阅读机,输出设备只有打印机。程序员是在读卡纸上进行编程的,然后通过打孔机进行打孔,打孔表示 1,没打孔表示 0。这样的操作系统有个缺陷:如果计算机需要处理多个任务,那么后面的任务需要排队等待!1960年初,麻省理工 (MIT) 开发了划时代的兼容分时系统 CTSS (Compatible Time-Sharing System),它允许操作系统在多个任务之间来回切换。那时候计算资源非常宝贵,都是通过终端连接主机的形式来共享计算资源的。
2025-06-24 14:05:44
1103
原创 torch.nn 下的常用深度学习函数
Dropout 的主要用途是在训练过程中随机丢弃一部分神经元的输出,从而减少模型对训练数据的过拟合。常用于多分类问题,输入张量通常是模型的输出,目标张量是类别索引。将所有负值置为0,保留正值,是最常用的激活函数之一,能够加速训练过程。计算预测值与真实值之间的绝对值,它对异常值的敏感度较低,适用于回归问题。将输入值映射到(0,1)区间,常用于二分类问题的输出层。:模型的原始输出,形状为 (N,C),其中 N 是样本数,C 是类别数。:用于定义一个顺序模型,可以将多个层按顺序堆叠起来,简化模型的定义过程。
2025-05-10 21:19:56
1221
原创 Python torch.optim.lr_scheduler 常用学习率调度器使用方法
学习率(Learning Rate)是深度学习中一个关键的超参数,它决定了在优化算法(如梯度下降法)更新模型参数时,参数调整的幅度。简单来说,它控制着模型在训练过程中朝着最小化损失函数方向前进的步伐大小。假设我们使用简单的梯度下降法来更新模型的参数,对于损失函数,其更新规则可以表示为:其中,就是学习率。这个公式的意思是,在参数更新时,我们沿着损失函数梯度的反方向(因为梯度方向是函数增长最快的方向,我们要求最小值,所以取反方向)移动,移动的步长由学习率决定。学习率的重要性学习率过大。
2025-04-25 14:58:36
1532
原创 Python torchvision.transforms 下常用图像处理方法
是 PyTorch 用于处理图像数据的一个模块,提供了丰富的图像变换功能。
2025-04-24 21:30:23
1304
原创 Mixup数据增强方法总结
Mixup 通过其核心思想是具体来说,对于两个样本及其对应的独热编码标签,按照一定比例进行加权混合,从而得到一个新的样本和标签。
2025-04-23 14:42:18
2047
原创 深度学习中的“重参数化”总结
深度学习中的重参数化(Reparameterization)是一种数学技巧,主要用于解决模型训练过程中随机性操作(如采样)导致的梯度不可导问题。在涉及概率生成的任务中(如变分自编码器VAE),我们希望从潜在变量的分布中采样,这个分布通常是某种分布(例如高斯分布,参数化为均值。(通常为标准分布,如标准正态分布),将随机性转移到外部,使采样过程变为可导操作。重参数化技巧通过引入一个独立的随机变量来解决这个问题,使得采样过程可导。策略网络输出动作分布的参数,通过重参数化采样动作,使梯度可传回策略网络。
2025-04-22 18:59:46
1484
原创 conda环境独立管理cudatoolkit
在使用工作站跑不同的深度学习项目时,由于项目之间可能需要使用不同版本的python和pytorch,这间接影响了不同版本的pytorch必须兼容工作站上安装的同一个cudatoolkit。然而这很难做到,比如,一个项目可能需要CUDA 10.1,而另一个项目需要CUDA 11.3。如果在全局安装的话,版本冲突会导致问题。后来查阅资料发现,在不同的 Conda 环境中可以安装不同版本的。
2025-04-20 12:13:21
970
原创 信息量、香农熵、交叉熵、KL散度总结
对于一个事件而言,它一般具有三个特征:小概率事件往往具有较大的信息量大概率事件往往具有较小的信息量独立事件的信息量相互可以相加比如我们在买彩票这个事件中,彩票未中奖的概率往往很高,对我们而言一点也不稀奇,给我们带来的信息量很小,彩票中大奖的概率往往非常低,中一次大奖则是非常罕见,给我们带来的信息量很大。如何描述信息量大小呢?有如下定义:其中描述某一事件发生的概率,反映了信息量与发生概率之间成反比,取对数是为了 独立事件的信息量相互可以相加(第三个特征)。
2025-04-19 17:12:01
854
原创 Leetcode 58. 最后一个单词的长度
分析:一道基础的字符串处理问题,只需要从最后开始找第一个有效字符开始到第一个空格这段间隔即可,需要额外考虑没有空格的情况。,由若干单词组成,单词前后用一些空格字符隔开。是指仅由字母组成、不包含任何空格字符的最大子字符串。最后一个单词是长度为 6 的“joyboy”。最后一个单词是“World”,长度为 5。最后一个单词是“moon”,长度为 4。
2025-04-11 16:14:55
278
原创 Leetcode 12. 整数转罗马数字
分析:一道基础的字符串处理问题,先定义一个vector容器存储每一位的键值对,然后把每一位的数字提取出来,逐个翻译即可。罗马数字是通过添加从最高到最低的小数位值的转换而形成的。3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)700 = DCC 由于 500 (D) + 100 (C) + 100 (C)注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位。40 = XL 由于 50 (L) 减 10 (X)给定一个整数,将其转换为罗马数字。
2025-04-11 15:50:15
361
原创 Leetcode 134.加油站
换句话说,如果x到达不了y+1,那么x~y之间的点也不可能到达y+1,因为中间任何一点的油都是拥有前面的余量的,所以下次遍历直接从y+1开始。现在,考虑任意一个位于 x,y 之间的加油站 z(包括 x 和 y),我们现在考察从该加油站出发,能否到达加油站 y 的下一个加油站,也就是要判断。我们此前发现,从加油站 x 出发,每经过一个加油站就加一次油(包括起始加油站),最后一个可以到达的加油站是 y(不妨设 x<y)。你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。
2025-04-11 14:22:50
400
原创 Leetcode 跳跃游戏 II (贪心算法)
可以看到在第一次跳跃范围内(0~2),查找一个下次能跳得更远的点,当在位置1进行第二次跳跃时可以跳三格,这是在0~2范围内起跳可以跳得最远的地方。然后我们再从(2~4)范围内查找下次能跳得更远的点,当在位置4进行第三次跳跃时可以跳四格,这是在2~4范围内起跳可以跳得最远的地方。每进行一次跳跃,次数+1,直到跳的最远距离大于或等于最后的位置。从下标为 0 跳到下标为 1 的位置,跳。向后跳转的最大长度。生成的测试用例可以到达。跳到最后一个位置的最小跳跃数是。步到达数组的最后一个位置。处,你可以跳转到任意。
2025-04-09 22:00:19
745
原创 Leetcode 55.跳跃游戏
无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回。给你一个非负整数数组。
2025-04-09 19:40:30
196
原创 Leetcode Z 字形变换
将一个给定字符串s根据给定的行数numRows,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为行数为3时,排列如下:Y I R。请你实现这个将字符串进行指定行数变换的函数:Y A H RP I"A"',''.'
2025-04-09 14:29:26
371
原创 Ubuntu服务器挂载之前的数据硬盘
这里假设在挂载硬盘之前,您的硬盘从之前的服务器上正确卸载下来。请注意,以下任何操作不当都有可能导致硬盘数据丢失或损坏,如果您的数据非常重要,请及时备份。UUID=<硬盘UUID> <挂载点> <文件系统类型> <挂载选项> <dump> <fsck>通过以上步骤,硬盘将在每次开机时自动挂载。:若硬盘未连接导致系统无法启动,在挂载选项中添加。:若挂载后无法读写,尝试在挂载选项中添加。:硬盘分区的唯一标识符或设备路径。(更稳定,设备名可能变化)。:步骤 2 中创建的目录。(替换为你的用户 ID)。
2025-04-03 21:34:26
699
原创 C++ STL常用算法之常用集合算法
两个集合必须是有序序列,:两个集合必须是有序序列,:两个集合必须是有序序列,// 求两个容器的交集。// 求两个容器的并集。// 求两个容器的差集。:目标容器开始迭代器。:目标容器开始迭代器。:目标容器开始迭代器。
2025-03-30 20:08:14
547
原创 C++ STL常用算法之常用算术生成算法
算术生成算法属于小型算法,使用时包含的头文件为。// 计算容器元素累计总和。计算区间内容器元素累计总和。// 向容器中添加元素。掌握常用的算术生成算法。向容器中填充指定的元素。
2025-03-30 19:45:39
347
原创 C++ STL常用算法之常用拷贝和替换算法
replace_if // 容器内指定范围满足条件的元素替换为新元素。replace // 将容器内指定范围的旧元素修改为新元素。copy // 容器内指定范围的元素拷贝到另一容器中。将区间内满足条件的元素,替换成指定元素。容器内指定范围的元素拷贝到另一容器中。将容器内指定范围的旧元素修改为新元素。swap // 互换两个容器的元素。掌握常用的拷贝和替换算法。
2025-03-30 18:03:40
337
原创 C++ STL常用算法之常用排序算法
掌握常用的排序算法。sort//对容器内元素进行排序//洗牌,指定范围内的元素随机调整次序merge//容器元素合并,并存储到另一容器中reverse//反转指定范围的元素。
2025-03-30 17:09:01
689
原创 C++ STL常用算法之常用查找算法
对于自定义类型的数据统计,需要在自定义类中重载 == ,来告诉 count 函数如何比较相同自定义类型。// 按值查找元素,找到返回指定位置迭代器(第一个符合条件的迭代器),找不到返回结束迭代器位置。查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器。// 查找相邻重复元素,返回相邻元素的第一个位置的迭代器。// 统计元素出现次数,返回 int 类型表示统计次数。// 查找指定的元素,查到返回。// 按条件统计元素出现次数。//按条件统计元素个数。//查找相邻重复元素。,告诉函数的比较方法。
2025-03-30 15:51:35
473
原创 C++ STL常用算法之常用遍历算法
算法主要由头文件<numeric>组成。是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历操作、复制、修改等等。<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数。定义了一些模板类,用以声明函数对象。
2025-03-29 22:45:35
186
数据库实验2.rar
2020-02-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人