自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(192)
  • 收藏
  • 关注

转载 赢麻了!全体程序员彻底狂欢吧!这个好消息来得太及时!

是衡量大语言模型“从量变到质变”的关键,是针对特定场景的AI解决方案。是指运行一段具有特定功能的代码块的行为,以增强其处理能力,实现更复杂的任务,使大模型能够集成外部工具和资源,提升交互性和实用性。AI大模型技术实战—— Transformer 架构的 核心原理、应用 Fine-tuning 技术,精准微调AI大模型,制造、医疗、金融等各行业都在加速AI应用落地,未来企业更看重能用AI大模型技术重构业务流的技术人。老师们将大模型技术原理讲透的同时,还将丰富的商业化AI应用项目无偿分享,帮大家快速打通。

2025-06-06 17:04:04 73

原创 C++ | 异步接口 promise, future, packaged_task, async.

在输出deferred模式的future值时会感受到2秒的明显停顿且thread id和主线程相同,而async模式的future值瞬间输出,输出的线程thread id和主线程不同,因为deferred模式下,并没有额外的线程产生,依靠主线程执行了对future的赋值操作,在async模式下,会额外创建一个新的线程异步执行操作。假设我们将p传入到某一个线程,在这个线程内部,调用p的set_value接口,在另一个线程内部,调用f的get接口,就可以实现线程间的异步同步处理。

2025-05-25 17:04:45 977

原创 Verilog | 有限状态机Case

今天尝试将几个有限状态机,转换为Verilog代码,有限状态机(Finite-State Machine,FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。状态机不仅是一种电路的描述工具,而且也是一种思想方法,在电路设计的系统级和 RTL 级有着广泛的应用。以下介绍转载自菜鸟runoob.com状态机类型Verilog 中状态机主要用于同步时序逻辑的设计,能够在...

2024-08-21 17:29:59 1234

原创 <span class=“js_title_inner“>Verilog | 有限状态机Case</span>

今天尝试将几个有限状态机,转换为Verilog代码,有限状态机(Finite-State Machine,FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。状态机不仅是一种电路的描述工具,而且也是一种思想方法,在电路设计的系统级和 RTL 级有着广泛的应用。以下介绍转载自菜鸟runoob.com。

2024-08-21 17:29:59 583

转载 Verilog | Verilog 基础语法(2)

今天继续学习Verilog的语法,参考菜鸟教程runoob.com。assign 关键词assign关键词用于连续赋值语句,连续赋值语句是Verilog数据流建模的基本语句,用于对wire型变量赋值。格式为:assign LHS_target = RHS_expression ;LHS_target 必须是一个标量或者线型向量,而不能是寄存器类型。RHS_expression 的类型...

2024-08-18 16:55:56 306

转载 <span class=“js_title_inner“>Verilog | Verilog 基础语法(2)</span>

命名的块可以通过disable关键字禁用,可以终止命名块的执行,用来从循环中退出及错误处理等,下面的代码中,disable退出了runoob_d2的循环。的(非阻塞赋值除外)。表示,语句执行条件是信号的值发生特定的变化,posedge即上升沿,negedge即下降沿,未指明则默认为双边沿变化。当然,这个顺序执行是基于同一变量而言的,是确保后面使用此变量的值为最新值,不同变量之间该并行还是会并行。assign关键词用于连续赋值语句,连续赋值语句是Verilog数据流建模的基本语句,用于对wire型变量赋值。

2024-08-18 16:55:56 8

转载 Verilog | Verilog基础语法(1)

Verilog HDL(简称 Verilog )是一种硬件描述语言,用于数字电路的系统设计。可对算法级、门级、开关级等多种抽象设计层次进行建模。在能进行软硬件协同设计的场景下,软件开发遇到瓶颈了,硬件优化有可能是解决问题的唯一方法,如何去在类似于FPGA这样的平台上,实现自己的硬件逻辑?这就需要Verilog这样的硬件描述语言了。Verilog 具有很强的电路描述与建模能力,能从多个层次对数字系统...

2024-08-16 21:32:14 650

转载 <span class=“js_title_inner“>Verilog | Verilog基础语法(1)</span>

数字声明时,合法的基本数据格式有4种,包括:十进制('d 或 'D),十六进制('h 或 'H),二进制('b 或 'B),八进制('o 或 'O)。整数的位宽和编译器有关,一般为32bit,integer型变量为有符号数。字符串同样保存在reg类型变量中,每个字符占用一个字节8bit,因此,reg变量的宽度应该足够大,以保证不会溢出,如果溢出存储空间,字符串左边的多余数据会被截去。归约操作符包括:归约与(&),归约与非(~&),归约或(|),归约或非(~|),归约异或(^),归约同或(~^)。

2024-08-16 21:32:14 5

原创 文件系统 | 网络文件系统 NFS

在分布式环境下,有许多客户端机器和一个(或多个)服务器。服务器将数据存储在其磁盘上,客户端通过结构良好的协议消息来请求数据。这样的做法,可以方便各个客户端共享数据,也便于数据的集中管理。但是,要针对以上场景,设计一个网络文件系统,需要考虑哪些方面?哪些地方容易出错?还是有很多值得斟酌之处。如何应对随时可能发生的服务器崩溃?仿照os操作的场景,我们显式调用open操作,向操作系统打开一个文件,并获得...

2024-08-11 20:05:35 442

原创 两行代码告诉我今天是周几??

我现在想要输入一个日期,然后返回对应的日期是周几,如果是你,你会怎么解决,当然这应该难不倒你,但是如果限制了代码只能有两行,阁下又该如何应对?今天我们学习一个非常优雅的星期几计算算法,大名叫做:Tomohiko Sakamoto 算法直接上代码,看得懂的同学就不需要继续往下看了:intdow(inty,intm, int d){ y -= m<3; return(y +...

2024-05-07 15:30:24 853 1

原创 <span class=“js_title_inner“>两行代码告诉我今天是周几??</span>

A3:一年固定为365天,365=52*7+1,因此,下一年一定为(a+1)%7,每过1年,则向后推移一天。解释:由于每个闰年会导致多偏移一天,因此,每4年由于闰年应该多偏移一天,每100年因为不闰又应该把多的一天减去,由于每400年也会有一个特殊闰年,则又该加回,按照以前的分析,每年会向后偏移一天,这得到了上述公式。闰年除了会影响当年首日的推断,还会影响月的推断,因为在闰的当年,实际上1、2月份并不会受闰月影响,而从3月份起,推断月份首日就应该向后推一天,我们可以判断如果是闰年,这也好办,我们“

2024-05-07 15:30:24 329

原创 <span class=“js_title_inner“>两行代码告诉我今天是周几??</span>

A3:一年固定为365天,365=52*7+1,因此,下一年一定为(a+1)%7,每过1年,则向后推移一天。解释:由于每个闰年会导致多偏移一天,因此,每4年由于闰年应该多偏移一天,每100年因为不闰又应该把多的一天减去,由于每400年也会有一个特殊闰年,则又该加回,按照以前的分析,每年会向后偏移一天,这得到了上述公式。闰年除了会影响当年首日的推断,还会影响月的推断,因为在闰的当年,实际上1、2月份并不会受闰月影响,而从3月份起,推断月份首日就应该向后推一天,我们可以判断如果是闰年,这也好办,我们“

2024-05-07 15:30:24 265

原创 论文分享 | FAST'23 阿里云提出的针对SMR优化的存储引擎SMRSTORE

今天分享的一篇最近阅读的论文是FAST'23的SMRstore: A Storage Engine for Cloud Object Storage on HM-SMR Drives。https://www.usenix.org/conference/fast23/presentation/zhou这篇文章是由阿里巴巴公司完成的,在这篇文章中,团队针对SMR的特性提出了一种新的存储引擎SMRSTO...

2024-04-10 17:47:37 1669

原创 什么是SMR硬盘?

知识铺垫:SMR与CMR该部分主要参考知乎https://zhuanlan.zhihu.com/p/393369645SMR与CMR都属于HDD,即机械硬盘,机械硬盘之所以叫机械硬盘,就是因为它内部完全由机械结构制成。一块机械硬盘由磁盘面、马达和磁头构成,通常情况下这些结构都被密封在一个铁盒子里,防止其内部结构与外界接触。磁盘面上有很多小格,在机械硬盘工作时,磁头会悬浮在磁盘面上对磁盘中的小格中...

2024-04-10 17:47:37 5199

原创 <span class=“js_title_inner“>论文分享 | FAST‘23 阿里云提出的针对SMR优化的存储引擎SMRSTORE</span>

上图表示了传统OSS中数据流,我们假设要写入一个Object Foo,首先在KV Server中找到对应的盘古文件及其偏移和大小,然后KV Server联系盘古主服务器,定位对应盘古文件的最后一个chunk的chunkserver,并由这个chunkserver将数据追加写入chunk对应的EXT4文件中,为了数据完整性检验,每个写入被切分为4KB大小,前4048B为数据,后48B为段位置和Checksum的footer,在每个chunkserver中,所有的地址空间都由SMRSTORE管理。

2024-04-10 17:47:37 231

原创 <span class=“js_title_inner“>什么是SMR硬盘?</span>

后来随着科技的发展,磁头的体积不断被缩小,工艺的不断升级让磁盘面上的小格竖起来排列在磁面上,这样磁性的上下两个方向就对应着二进制中的0和1。写磁道A时,可能会修改到磁道B的值,因此在写两个相关的磁道之前,必须先把下一个磁道内容先备份下来,待上一个磁道写完后,再写回下一个磁道,直到写完一个扇区(两个扇区之间的距离足够大不会相互影响)由于SMR这样的设计模式,随机写入成为了相当昂贵的操作,因此,要想SMR的性能看得过去,就应当避免甚至是禁止对SMR扇区的随机写入操作(想想,这是不是和。

2024-04-10 17:47:37 587

原创 C++异常处理机制 try-catch-throw

我们所设计的函数在运行过程中出现异常是一件十分正常的事,有些异常是我们在设计时可以预见并且是可以进行恢复的,由于异常的发生往往比较底层,异常通常不能在当前层次的函数调用中就地恢复,而是需要上报到之前的函数调用中处理,为了实现这个目的,我们在C语言的实践中,往往可以设计一个错误码,将错误码层层上报,直到某层可以处理错误码。在C++中,语言特性为我们设计了一个新的实现路径,那就是C++的异常处理机制。...

2024-02-25 20:06:01 1434

原创 <span class=“js_title_inner“>C++异常处理机制 try-catch-throw</span>

我们所设计的函数在运行过程中出现异常是一件十分正常的事,有些异常是我们在设计时可以预见并且是可以进行恢复的,由于异常的发生往往比较底层,异常通常不能在当前层次的函数调用中就地恢复,而是需要上报到之前的函数调用中处理,为了实现这个目的,我们在C语言的实践中,往往可以设计一个错误码,将错误码层层上报,直到某层可以处理错误码。如果引发的异常的类型是类,它还具有基类(或类),则它可由接受异常类型的基类和对异常类型的基的引用的处理程序捕获。:是异常类型的具体类名。的类型,但 C++ 使您能够引发任何类型的异常。

2024-02-25 20:06:01 555

原创 C++高级特性 | Lambda表达式与智能指针

今天我们来学习两个C++中的高级特性,匿名函数Lambda表达式和便于对象生命周期管理的智能指针。Lambda表达式C++ 中的 Lambda 表达式是一种函数对象的匿名函数,它可以在需要函数的任何地方定义和使用,而无需显式地声明一个函数。Lambda 表达式的语法简洁灵活,使得代码更加清晰和易读。Lambda表达式的基本语法:[capture](parameters) -> return_...

2024-02-22 20:36:29 2018

原创 <span class=“js_title_inner“>C++高级特性 | Lambda表达式与智能指针</span>

unique_ptr 不共享它的指针。通过提供对基础指针的直接访问,你可以使用智能指针管理你自己的代码中的内存,还能将原始指针传递给不支持智能指针的代码。在上述代码第9行,对于原始指针,在堆上声明后,必须进行显式内存释放delete,否则,造成内存泄漏,而对于智能指针,当智能指针被回收时,若已经不再有智能指针引用,会自动回收指针指向的对象。),在11行中,指定了智能指针的指针类型(LargeObject),因为智能指针是一个模板类,第14、17行,就像使用原始指针一样,使用智能指针,因为智能指针重载了。

2024-02-22 20:36:29 569

原创 数据结构 | 手写堆

今天我们来实现一个简单好用的数据结构,堆。要实现一个手写堆,需要实现它的三个功能,我们需要能初始化一个堆,能取出堆顶元素和将一个元素插入堆。在开始实现之前,我们先回顾一下堆的初始化、插入和删除过程。堆的定义① 堆中的每个结点最多有两个子节点。②结点的排列顺序垂直从上到下,水平从左到右。③子节点key必须大于父母结点。堆的数据结构根据堆的定义,堆是一棵完全二叉树,既然是一棵完全二叉树,就可以采用...

2023-12-18 19:38:55 325 1

原创 数据结构 | Log-Structured Merge Tree (LSM Tree)

今天介绍LSM Tree这个数据结构,严格意义上来说,他并不像他的名字一样是一棵树型的数据结构,而更多是一种设计思想。LSM Tree最先在1996年被提出,后来被广泛运用于现代NoSQL(非关系型数据库)系统中,包括BigTable, Dynamo, HBase, Cassandra, LevelDB, RocksDB, and AsterixDB.LSM Tree主要是瞄准了IO操作中,顺序写...

2023-12-14 01:12:52 608

原创 kernel | 不想老是编译内核?sysfs和debugfs了解一下

编译内核是一件让大家都抗拒的事情,因为编译一次内核需要的时间成本比较漫长,而且如果每次代码的微小改动或者想要额外调用某一个函数执行某一个动作就要不断的编译内核的话,就相当于CPU大量的时间都用在了idle,开发效率将会是相当的低。我们总是希望自己能够掌握自己想要调试的程序的一些状态从而来判断程序有没有正常的工作。在简单的场景下,我们仅需要使用printf大法,就可以打印出程序的轨迹,但是在复杂场景...

2023-11-29 22:15:31 1114

原创 C语言一个奇奇怪怪的小细节(定制初始化中的一个坑)

在今天写C代码的过程中,发现了一个奇怪的现象:假设我们有如下数据结构:struct AddressMapping{ u64 lba; union{ u64 addr; u64 addrPage; struct ScatterIter sgiter; }; u64 size;}__attribute__ ((__p...

2023-11-16 17:55:34 266

原创 C/C++语言中的restrict关键字

在C语言中,restrict关键字用于修饰指针(C99标准)。通过加上restrict关键字,编程者可提示编译器:在该指针的生命周期内,其指向的对象不会被别的指针所引用。使用此关键字,将允许编译器预知多个指针之间的相互独立性,从而允许编译器做更加激进的优化。例如[1]:intadd(int*a,int*b){*a = 10;*b = 12;return *a + *b;...

2023-11-08 15:16:38 968

原创 论文分享 | 现代数据中心场景下的分离式RAID

今天分享的这篇文章发表于ASPLOS 2023,标题是Disaggregated RAID Storage in Modern Datacenters,完成单位是北京大学。https://doi.org/10.1145/3582016.3582027 (文末阅读原文可以跳转)摘要RAID(独立磁盘的冗余阵列)几十年来已被广泛采用,因为它提供了超出了单个磁盘可以提供的吞吐量和冗余。今天,由快速数据中...

2023-10-26 17:01:41 588

原创 内核IO栈 | 反弹缓冲区、bio切分、完整性保护和蓄流

line17 ※1 反弹缓冲区blk_queue_bounce函数的作用是,尝试创建一个反弹缓冲区,通常是在bio给定的内存区域在外围设备不可达(例如高端内存上执行DMA)的地址时才需要去创建这么一个特殊的区域,以确保内存区域是外围设备可达的,这是bio能够完成的必要条件。static inline void blk_queue_bounce(struct request_queue *q, st...

2023-10-17 16:20:11 1199

原创 内核IO栈 | IO缓冲区的向下传递过程

最近遇到个这么一个事,查阅SCSI手册,对于READ(10)命令,似乎在采用DMA的情况下,下发的SCSI命令中,并没有内存空间的地址和长度:也就是说,单纯从这一个命令中,我们并不知道将数据从硬盘的LBA+size传输到内存的哪个位置。这似乎和我一开始对整个IO栈的理解是不一样的,这一部分内容的缺省直觉告诉我,SCSI层的底层驱动下发到设备的并不仅仅是一个简单的标准SCSI命令,而是另有其他的东西...

2023-10-17 16:20:11 906

原创 数据结构 | Radix Tree 树

什么是基数树?基数树是一种多叉搜索树,数据位于叶子节点上,每一个节点有固定的2^n个子节点(n为划分的基大小,当n为1时,为二叉树)。什么为划分的基?以一个64位的长整型为例,我们可以将64位的长整数切分为8位一组、4位一组、2位一组甚至1位一组等:基数树的搜索方法是?基数树的搜索方法是将索引的数据切片为若干小段(基),然后一小段一小段地向下查找,在有限的树高度内,一定能完成查找。以上图数据按照8...

2023-07-30 12:26:03 788

原创 C语言中的宏

宏定义又称为宏替换,简称“宏”,在C语言预处理阶段被处理,编译器会根据宏定义进行文本替换。这样做的好处有许多,它可以为程序员在编程时提供方便,并能在一定程度上提高程序的运行效率。本文将通过一部分场景,来学习一些和宏相关的知识。#define采用宏定义一些常用常量,避免在代码中出现magic number:#define PI 3.1415926#define ERROR -1#define N...

2023-07-11 21:22:56 347

原创 数据结构 | 红黑树

在学习红黑树之前,大伙先问问自己,B树、平衡二叉查找树AVL和二叉排序树是啥还记得么记不得的朋友可以跳转此处,先复习一下B树、二叉排序树和平衡二叉查找树是啥。今天我们将用一种我自己研究的新鲜方法,学习红黑树。好,看到这里,我们假设我们心里已经“有B树”,知道了B树、二叉排序树和AVL是啥。那么,有没有一种杂糅的办法,将一棵B树改造成一棵二叉排序树呢?可以采用分裂的办法:于是,依葫芦画瓢,我们将一棵...

2023-04-13 22:35:11 142

原创 文件系统 | 以F2FS为具体操作系统的数据写流程

在前面的学习中,我们已经知道了一个文件的打开和读写时的系统调用过程,但是它们都在VFS层及之前,今天我们尝试以F2FS为具体操作系统,观察它的写入过程并着重观察F2FS冷热分流在其中的作用。这篇文章会比较长。数据写流程整体概览:首先我们要明确的是,在调用了write接口后,write的内容并不会一下子啪的一下就到磁盘上,而是通过操作系统中熟悉的脏页回写机制冲刷到磁盘上(见附推分享),所以,在wri...

2023-04-12 18:48:11 2303

原创 文件系统 | 系统调用之读写文件

打开文件的最基本的目的是为了对文件进行访问,而访问中最基本的操作是读和写。文件的内容被保存在磁盘块,但是这些磁盘块极有可能是不连续的而且往往是动态变化的。而访问文件时我们往往又需要将文件看作一个连续的字节流,要解决这样的矛盾,核心在于地址空间(Address Space)的引入。地址空间的目的就是将其属主对象在磁盘或其他介质中的(可能不连续的)数据以页面为单位连续地呈现出来。根据需要,这些页面可以...

2023-04-10 21:08:35 752

原创 TALK | 将博客搬至CSDN

在我几乎对公众号没有进行宣传的情况下,随着文章逐渐增多以及比较长的曝光时间,公众号还是在各位口口相传之下,达到了540位关注,目前的关注增长速度已达到每两个月100人,原创文章数目达到144篇,公众号内容成为了对我而言十分宝贵的一种知识财富。但随之带来了几个问题,首先,鸡蛋不能放在一个篮子里,由于文章越来越多,账号也越来越珍贵,倘若某一天,微信公众号没了(啪的一下就没了),那我这几年的心血直接白给...

2023-04-09 18:28:26 122

原创 文件系统 | 系统调用之打开文件

我至今都忘不了,曾经有一次,我在打开一个文件时,最终得到的是一个int类型的数字,一个小小的int类型,竟然能描述一个文件?这让我感到十分奇怪。直到对计算机存储的不断了解,我才知道返回的int类型是一个文件句柄。总结(太长不看)打开文件操作的关键在于,分配一个文件描述符file,正确设置f_mapping文件地址空间和f_op文件操作表,在打开文件操作表中找到一个存放它的文件句柄。这样,以后对文件...

2023-04-09 18:28:26 847

原创 C语言__attribute__的运用

在阅读内核源码时,常常可以看到类似于这样子的写法:static char envval[256] __attribute__((aligned(8)));即,在某一个结构体完成定义后,跟上一个__attribute__(xxx),这是GNU C的一个特色机制,使用__attribute__可以用来设置函数属性、变量属性和类型属性。__attribute__的书写特征是在attribute前后都有两...

2023-04-07 15:43:17 1764

原创 Linux | SCSI子系统概述和UFS在其中的位置

SCSI分层Linux SCSI子系统和其他子系统一样,也是一种分层的架构。共分为三层,最底下是低层,代表适用于SCSI的物理接口的实际驱动器,例如各个厂商为设备特定的主机适配器(也被称为主机总线适配器,Host Bus Adapter HBA)开发的驱动。低层驱动主要作用是发现连接到主线适配器上的SCSI设备,在内存中为它们建立好数据结构,并提供消息传递接口,将SCSI命令的接收与发送解释为主机...

2023-03-23 11:50:42 3095

原创 Linux | 一些和内存管理有关的小知识

GFP Flags进行内核编程时,往往会时不时看到 “GFP_KERNEL” 这样的东西,这些东西是什么呢,一起来了解一下。它们实际上被叫做 GFP flags,GFP其实是GetFreePage的缩写,被广泛应用在整个linux系统中,用来指出内存页应该怎样被分配,并不是所有的GFP flag都被所有的内存分配函数所支持,多数用户通常会直接使用GFP_KERNEL,因此很多时候我们往往看到的是...

2023-03-22 15:15:55 862

原创 文件系统 | 虚拟文件系统VFS

概述在文件系统之下,我们看到的磁盘设备是一组线性排列的磁盘块,可以访问其中的任意磁盘块,可以独立地读写磁盘块,如果在磁盘块中写入数据,将被记录下来,并在读操作中返回。文件系统是存储和组织文件(即一系列相关的数据),以便可以方便地进行查找和访问的一种机制,我们要能优雅地访问磁盘上的数据就得用到文件系统。不同的文件系统有不同的文件存储和组织方式。Linux设计人员很早就注意到了如何使Linux支持不同...

2023-03-13 14:15:59 594

原创 论文精读 | ZNS+:支持存储器内区块压缩的高级ZNS接口

论文标题:Advanced Zoned Namespace Interface for Supporting In-Storage ZoneCompaction论文地址:http://nyx.skku.ac.kr/?page_id=2808本系列是对论文的要点笔记。这篇文章针对当前日志文件系统LFS在段压缩方面的高消耗问题,提出了ZNS+以及其对应的文件系统技术,主机可以将数据的复制行为下放到S...

2023-02-22 01:06:17 934

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除