自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

最佳损友1020的博客

分享记录,交流探讨

  • 博客(133)
  • 资源 (1)
  • 收藏
  • 关注

原创 个人博客搭建记录(不用CSDN了)

个人博客地址:www.jiasun.top主要依据以下这篇博客,注册leancloud账号,将AppID AppKey serverURLs填入valine配置中,不过这博客有点误导人,以为serverURLs是填安全域名呢,实际上应该填REST API 服务器地址。在前端可以通过meta来设置referrer policy(来源策略),referrer设置成no-referrer,发送请求不会带上referrer信息,对方服务器也就无法拦截了。将网站加入百度,必应,谷歌3个网站。

2023-09-22 10:37:55 261

原创 计算机读书笔记

应该在表达式中使用强制类型转换,使操作数均为有符号数或者无符号数,这样就不必由编译器来选择结果的类型。当表达式中存在有符号数和无符号数类型时,所有的操作都自动转换为无符号类型。可见无符号数的运算优先级高于有符号数。无符号数转换为有符号数时,对于小的数将保持原值,对于大的数将转换为负数,相当于原值减去2的n次方。有符号数转换为无符号数时,负数转换为大的正数,相当于在原值上加上2的n次方,而正数保持不变。无符号整数和有符号整数之间进行强制类型转换时,位模式不改变。相邻的字符串常量将会自动合并成一个字符串。

2022-11-11 09:02:30 1630

原创 mit6.824 2022

两年前写过一次6.824,一直卡在2c没过去,就放弃了。当时只看了,对GO也不怎么熟悉,现在看了一遍《Go程序设计语言》后再写一遍这些实验,锻炼一下GO语言能力。这篇博客只是简单记录一些实验过程中遇到的问题与收获,并不具备太多参考性。如何的才能更好地学习 MIT6.824 分布式系统课程?实效Go编程raft可视化Raft Q&ASOFAJRaft 日志复制 - pipeline 实现剖析 | SOFAJRaft 实现原理raft在处理用户请求超时的时候,如何避免重试的请求被多次应用?

2022-10-08 19:52:28 999 16

原创 内核驱动开发记录

推荐阅读:《C和指针》 《C专家编程》 《C陷阱与缺陷》《Linux设备驱动程序》 《linux内核设计与实现》 《深入理解linux内核》《Debug Hacks中文版—深入调试的技术和工具》第一要义:学会放弃第二要义:不要修改代码屎山第三要义:遇到无法解决的问题/BUG,备份代码后重构代码第四要义:若BUG实在无法解决,尝试不同的实现方式,不过于追求简洁与优雅相关驱动:块设备驱动,网卡驱动内核版本:5.4/4.19驱动开发背景:块设备驱动特点:一次只能发送一条指令,需同时实现协议栈

2022-10-01 21:56:28 3446

原创 MIT6.S081 2021

MIT6.S081 Xv6 and Unix utilities system calls page tables traps

2022-04-04 23:14:38 2826

原创 CMU15445 2021

lab地址讲义地址《数据库系统概念》中文版有许多删减和错误,英文版看起来又费劲。数据密集型应用设计Google 开源项目风格指南Effective系列(Effective c++,Effective STL,Effective modern c++)由于刚开始不知道咋注册Gradescope,就只通过了本地的测试用例,做完了3个实验后才开始提交Gradescope。Gradescope的注册邀请码为4PR8G5,学校填Carnegie Mellon University就可以了。

2022-02-21 22:05:34 7278 18

原创 CSDN图库

2023-09-25 18:24:58 146

原创 实习机试代码记录

题目:美团2024届暑期实习第一轮后端笔试详解通过了前三道,花了一堆时间在第四道上,一分没得,第五题都没时间看。题目的设置有点无语,一到四题安排在一起,第五题安排在一起,当时不知道提交后可以继续修改,进了一到四题的项就不敢提交,以为第五题单独放一起肯定很难,最后没时间了看了一下第五题,比较简单。搞不明白为啥要把第五题单独列一个项,要不然怎样都能写出四道来小美有一个由数字字符组成的字符串。现在她想对这个字符串进行一些修改。 具体地,她可以将文个字符串中任意位置字符修改为任意的数字字符。她想知道,至少进行多少

2023-08-15 22:59:58 272

原创 fio下发的请求大小不确定

在使用blk_queue_max_hw_sectors设置最大扇区后,本以为全部搞定了,但用fio测试块设备速度时,却发现速度有时候180MB,有时候700MB,开启驱动打印后发现虽然bs设置为1M,但有时候执行下发的请求大小就不是1M,是一些奇奇怪怪的数字,nlb为3d8,6ef之类的,而且如果刚开始不是7ff,则一直不是7ff,如果刚开始是7ff,则一直是7ff。然后在nvme驱动中插入打印语句,看nvme驱动有没有类似情况,没发现这种情况,倒是结束时会出现一些其他大小的请求。

2023-06-12 10:30:39 796 1

原创 spdk记录

在调用栈需要特别关注的就是bdev_write_blocks_with_md函数,在这个函数中创建了spdk_bdev_io结构体,当一个IO请求完成,都会调用spdk_bdev_free_io释放对应空间。简要看json的解析过程,全局查询json_config_file,找到spdk_subsystem_init_from_json_config函数。猜测rpc_bdev_malloc_create函数与spdk_subsystem_init_from_json_config中的。

2023-05-30 23:10:34 1168

原创 零碎笔记/博客推荐

这也是一本深入浅出的书,讲述概念的来龙去脉而不是卖弄定义,介绍事物发展演化历程而不是事实堆砌,将复杂的概念讲述的浅显易懂,但又直击本质不失深度。本书为数据系统的设计、实现、与评价提供了很好的概念框架。这个项目整合了大家对于高质量公开课程的评价、总结、与建议等等,期望这些评价能对后来的同学在选择、学习课程的时候能有一些帮助。C++: 深度探索C++对象模型,C++沉思录,C++语言的设计与演化。linux内核:linux内核设计与实现,深入理解linux内核。C:C和指针 ,C陷阱与缺陷,C专家编程。

2023-05-29 09:58:44 643

原创 内核调试工具crash使用

在编写内核驱动的过程中,时不时就导致内核崩溃,也没啥好的调试方法,要么dmesg打印内核日志,要么搭建kgdb环境调试,但kgdb比较繁琐,dmesg有时候也不能打印内核堆栈,故调试内核纯看运气,如果是能稳定复现的bug还好调试,最怕的就是测试程序刚开始跑的好好的,突然鼠标动不了了,这个时候就知道糟了。之前的思路是一直时快速刷新dmesg以求能看到内核崩溃时日志打印,但没有成功过。后面有一次面试的时候面试官提到了crash这一内核调试工具,看起来还挺有用,故记录一下使用过程。

2023-05-21 17:39:40 1970

原创 fio引发的一些问题

,加载自己写的模块,加载nvme-core模块时没出现啥问题,加载nvme模块时显示内核地址访问错误,__slab_alloc not-present page,这有可能与模块的签名,小版本不符合之类的问题有关,但懒得研究了,直接源码编译内核然后切换。却发现驱动的请求队列处理函数的请求字节数为130560,也就是255扇区,这是一个莫名其妙的数字,甚至不是4k的倍数,后逐渐增大bs查看下发的请求大小,发现超过128k后扇区数就会成许多个255,例如2个128k会拆分成255+1,

2023-05-20 18:10:52 1052

原创 femu使用记录

自己制作镜像,但失败了,故选择第一种方法,下载femu提供的镜像,下载完成后直接运行run_zns.sh脚本,不需要第二种方法的安装操作系统,修改grub等操作。可使用ssh连接虚拟机,端口号即为hostfwd定义的端口号(8080),vscode连接更方便。以root权限运行nvme list能看到zns ssd,则表示搭建环境成功。这篇博客用于记录femu搭建与使用过程中遇到的问题。首先是搭建环境,刚开始按照博客。

2023-05-09 10:25:13 1705

原创 leveldb自定义env

由于项目需求,需要自定义LevelDB的env,也就是以块接口实现env中各个文件接口,在网上没找到类似的代码,就打算自己参照实现一个简单的demo,等到功能实现差不多的时候,却发现leveldb有一个类似功能的代码,且各方面都写的比我好,所以就只是简要介绍代码了,主要记录实现过程中遇到的问题。// 块大小 const size_t kBlockNumber = 1

2023-05-05 21:35:45 538

原创 《高性能MySQL》读书笔记

服务层用于处理核心服务,如标准的SQL接口、查询解析、SQL优化和统计、全局的和引擎依赖的缓存与缓冲器等等。在该层上,服务器会解析查询并创建相应的内部解析树,并对其完成优化,如确定查询表的顺序,是否利用索引等,最后生成相关的执行操作。MySQL最重要、最与众不同的特性就是它的存储引擎架构,这种架构将:查询处理、其他系统任务、数据的存储与提取 三部分分离。存储引擎层,存储引擎负责实际的MySQL数据的存储与提取,服务器通过API 与 存储引擎进行通信。存储引擎架构分为三层,自上而下,分为第一层:连接层;

2023-04-30 22:39:34 485

原创 spdk环境搭建

本来21年就写了这篇博客,但因为在博客中放了vmware的密钥,违规了,最近正好又要用到spdk,就重新搭建一下spdk,简单改一下博客再发一遍。

2023-04-16 21:24:55 1717 3

原创 博客重载记录

有时候看了一些比较好的文章,过几天就忘了,想想不如自己实现一遍博客代码或按博客结构自己写一遍,加深印象,但把别人的内容改个名字变成自己的博客,有点不太好,故全写在这个博客中,权当个人记录。

2023-03-26 13:49:25 347

原创 企业机试代码记录

动态规划问题,假设已解决n-1与n-2规模时最短时间,可能的方法是:n-1 (最轻的人单独过河把最重的人接过来 fn-1+v0+vn) n-2(最轻的人过去 最重的和第二重的人过去 第二轻的人过来 第一第二轻的人过去 fn-2+v1+vn+v2+v2)数组各数减去第一个数,归并相同特征的数组,使用map记录各数组的出现次数,对每一个map kv,查看map中是否存在相反数组,需对全0数组(相反数组为自身)进行特殊处理,为了避免重复计算,将相反数组出现次数置为-1。超时,过不了,只能使用二分查找解法了。

2023-03-16 18:15:27 632

原创 linux UIO驱动实践

想了想,还是自己写一个简单的demo,加深一下印象。由于没有实际的设备,为了触发驱动的探测函数,就需要借助platform设备与platform驱动。一直以为使用镜像安装的Ubuntu没有内核源码,不能编译驱动,只能由源码编译内核后切换内核才能编译驱动,没想到一安装完就可以编译了,错误的印象。用户态代码首先读取内存数据,而后写入一些数据,驱动在设备移除函数中读取内存数据,验证用户程序是否成功写入。相较于platform的demo,只是加入了一些uio_info相关的代码,函数构成一致。

2023-03-07 22:25:33 1385

原创 NVMe驱动注释(持续更新)

整合了之前文章的一些内容。

2023-03-06 10:26:57 2946

原创 leetcode记录2

快排:以前都只看过双指针格式的代码,看了看leetcode单指针的代码,比较易懂。归并:不怎么喜欢用夹带++i或i++的表达式,总觉得不好看,非递归的实现忘了。给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。代码化简,while循环改成for循环。利用快排的划分函数即可。

2023-03-02 23:29:44 198

原创 leveldb第二幕 代码阅读笔记

而后跳到WriteBatchInternal::InsertInto函数-》WriteBatch::Iterate-》MemTableInserter::Put-》MemTable::Add函数。在MakeRoomForWrite函数中于mem_->ApproximateMemoryUsage()

2023-02-20 12:15:30 196

原创 《C++沉思录》读书笔记

本书中多次强调,C++最基本的设计理念就是用类来表示概念,C++解决复杂性的基本原则是抽象,面向对象思想是C++的手段之一,而不是全部。本书并不是教C++语言本身,而是想告诉你用C++时怎样进行思考,以及如何思考问题并用C++表述解决方案。知识可以通过系统学习获得,智慧则不能。什么事情是C++可以做好而C做不好的。例子:需求1:实现打印消息的功能CC++显然,C语言更加简洁需求2:增加开启关闭输出功能CC++现在C与C++的复杂度类似,但C实现中对同一份状态open进行操作,而C++则可

2023-02-04 16:17:55 746 1

原创 leveldb第一幕 资源推荐

sst_dump工具可用于转存数据,查看分析具体的SST 文件。sst_dump可以对 SST 文件执行多种操作。而后看其他的leveldb系列博客,以其他角度再看一遍代码,这样就能大致了解leveldb的代码框架。简单了解跳表原理后阅读一些实现代码,最后参考LeetCode官方题解,简单实现一个跳表,加深印象。对照一个leveldb系列博客,大致过一遍各个模块的主要代码。不过最后还是重启比较有效,git主打一个运气。将静态库和头文件拷贝至系统目录。

2023-01-14 09:56:23 285

原创 《Go语言并发之道》读书笔记

令人尴尬的并行问题:cpu并行算法和gpu并行_令人尴尬的并行算法介绍Web-Scale IT 我之见!竞争条件当两个或多个操作必须按正确的顺序执行,而程序并未保证这个顺序,就会发生竞争条件。// 循环执行示例程序,记录各个结果出现次数 func main() {i ++ {

2022-12-19 23:37:11 492

原创 《c专家编程》读书笔记

C语言。

2022-12-19 23:33:15 659

原创 mit6.824 2022 lab4

简要地介绍代码结构,我的代码中有许多不必要的约束,但我也懒得去掉这些约束,首先是RPC处理函数在处理客户端请求前判断分区状态,看是否拥有且负责该分区数据。

2022-11-24 08:00:08 475

原创 mit6.824 2022 lab3

推荐博客:如何的才能更好地学习 MIT6.824 分布式系统课程?SOFAJRaft 日志复制 - pipeline 实现剖析 | SOFAJRaft 实现原理raft在处理用户请求超时的时候,如何避免重试的请求被多次应用?

2022-11-23 10:49:27 653

原创 mit6.824 2022 lab2

汇总博客:MIT6.824 2022不论是访问还是修改Raft可变类成员,都需要加锁可以改为2A时就尽可能实现更多功能,而不是仅仅通过测试,中文版论文用来大致了解raft算法,对照英文版论文编写代码。问题:RequestVote RPC中 at least as up-to-date对应于:由于是at least as,还包括相等的情况。votedFor:candidateId that received vote in current term (or null if none)当前任期接受到的

2022-11-22 20:32:59 1401

原创 mit6.824 2022 lab1

例如,切片是一个具有三项内容的描述符,包含一个指向(数组内部)数据的指针、长度以及容量, 在这三项被初始化之前,该切片为 nil。bash与sh是有区别的,两者是不同的命令,且bash是sh的增强版,,而"[[]]"是bash脚本中的命令,因此在执行时,使用sh命令会报错,将sh替换为bash命令即可。也就是说,new(T) 会为类型为 T 的新项分配已置零的内存空间, 并返回它的地址,也就是一个类型为 *T 的值。用Go的术语来说,它返回一个指针, 该指针指向新分配的,类型为 T 的零值。

2022-11-22 20:25:36 831

原创 数组与指针实验

看完汇编代码,可以很容易猜到:p与&p结果不一样,array与&array结果一致。fs:0x28与linux的堆栈保护机制有关,为简化问题,将该机制关掉。再次反汇编,并加上一些注释。生成目标文件并进行反汇编。先简单看一下以下c代码。使用gdb显示相关数据。

2022-11-16 19:16:07 311

原创 天池比赛记录

阶段1. 每个线程分别写入约 12 M个Key大小为 16 Bytes,Value大小为 80-1024 Bytes 的 KV对象,并选择性读取验证;阶段3. 每个线程分别再次写入约 10 M个Key大小为 16 Bytes,Value大小为 80-256 Bytes 的 KV对象;其中75%的读访问具有热点的特征,大部分的读访问集中在少量的Key上面。数据安排如下:本阶段保证任意时刻数据的value部分长度和不超过30G。验证KV操作的正确性(包括加密/解密过程),这部分的耗时不计入运行时间的统计。

2022-11-09 09:03:39 708

原创 CMU15445 2020 B+TREE简单记录

做完了2021的15445,想做一下2020的b+ tree。按照2020 c++ primer assignment步骤一样拉取仓库,安装依赖包,但拉取的代码已经是最新的2021,所以需要将commit回滚到之前的版本。用pro1做测试,回滚到有buffer_pool_manager.cpp的版本。将 build_support中gtest_CMakeLists.txt.in的master改成main。通过课程代码:5VX7JZ添加2020的课程。图中为vscode插件git graph。........

2022-08-31 16:31:46 1702 3

原创 MIT6.S081 2021 locks

另外,许多编译器和CPU会对代码进行指令重排,乱序执行以获取更高的性能,为了不让临界区代码移出临界区,使用内存屏障,告知编译器和CPU不对屏障内部的load store指令进行重排。竞争常常造成丢失更新或读到部分更新问题,竞争的结果取决于CPU的执行顺序,内存操作的再排序,它的结果是很微妙的,调试时一条输出语句就能改变执行顺序,使得bug无法复现。假如数据结构的释放也由其内嵌的锁控制的的话,一旦该数据结构释放,则其他同时请求该锁的线程则会‘失灵’,使用引用计数来解决该问题。.........

2022-08-29 15:36:18 524

原创 MIT6.S081 Multithreading

MIT6.S081 Multithreading阅读xv6 book之前,简要看一下《深入了解linux内核》进程一章(不怎么看得懂),当然xv6 book也看的犯困

2022-08-28 23:05:29 364

原创 MIT6.S081 2021 mmap

在本实验中我定义了两个结构体,struct shared_memory和struct vm_area,其中shared_memory为共享物理页,分配给MAP_SHARED模式的mmap系统调用,vm_area描述文件映射的区域信息。创建一个结构体来描述mmap映射的内存区域,阅读《linux内核设计与实现》第15章进程地址空间,定义一个vm_area_struct类似的结构体,由于不能动态分配内存,故使用静态数组的方式来分配内存区域。找到unmap对应的区域并修改其地址范围,取消相应的映射。.......

2022-08-27 22:02:08 463

原创 MIT6.S081 2021 file system

在follow_link函数实现时我错误地使用了iunlockput方法,使得inode的引用计数变为0了,在sys_open函数ilock的时候就会报ilock错误,实际上我在只需要调用iunlock解锁即可,不需要降低引用计数。此时已经可以使用普通的gdb进行调试,判断错误在follow_link函数后,将该函数设置为断点。bmap函数,仿照一级索引块处理流程即可,二级索引块->一级索引块->数据块。itrunc函数,对索引块先释放buffer再free,数据块则直接free。...

2022-08-21 19:41:06 422

原创 算法分析上机作业

算法实现代码算法测试代码实验二算法实现与测试代码实验三算法实现代码算法测试代码实验四算法实现与测试代码实验报告实验一问题描述给定由n个数组成的集合S,从中找出最接近S的中位数的n/4个元素。请设计一个最坏情况下时间复杂度为O(n)的算法。解决这个问题之前需要先找到线性时间内解决选择问题(在n个数中选择第k个顺序统计量)的算法,而算法导论中已经给出了期望时间为线性的选择算法和最坏情况下为线性的选择算法。在假设已经获得线性选择算法后只需计算集合的中位数,而后计算集合中各元素与中位数

2022-07-16 11:14:43 1214 4

原创 驱动虚拟环境搭建记录

在华为镜像站中下载Ubuntu镜像,第一次我下载的是Ubuntu22,其版本太高,使得我安装deb包时就出现错误,linux-headers-4.19.100-0419100-genericDependslibssl1.1(>=1.1.0)butitisnotinstallable,而系统安装的应该是openssl。由于要求的内核版本是4.19,故基本的思路是使用deb包先将内核版本降到4,而后使用源码编译将内核切换成4.19。安装fish,敲命令更方便。.........

2022-07-16 11:09:54 325

空空如也

空空如也

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

TA关注的人

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