自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 protobuf为什么快

Protocol buffer时需要用户自定义自己的结构体,而且结构体中的定义规则要符合。

2025-03-25 22:54:04 902

原创 clang-format安装配置与vscode支持

输入以下命令就会按照llvm的格式在在当前路径下生成.clang-format文件。我们可以在vscode中输入快捷点ctrl+shift+p。件,以下是笔者找到了几篇关于google的编码风格,可参考。),之后在输入框输入clang-format,之后在想要格式化的文件中使用快捷键。文件格式来,接下来我们修改生产的。,其表示按照我们自己定义的。可以看到这里的文件格式是。打开设置面板(或者按下。就可以了格式化文档了。

2025-03-07 11:51:08 667

原创 《操作系统真象还原》第十三章——磁盘驱动程序

另外,来自8259A从片的中断是由8259A主片帮忙向处理器传达的,8259A从片是级联在8259A主片的IRO2接口的,因此为了让处理器也响应来自8259A从片的中断,屏蔽中断寄存器必须也把IRO2打开。如图所示,也就是打开引脚IRQ14和IRQ15(第2个 ata 通道接在 8259A从片的IRQ15 上,该 ata 通道上可支持两个硬盘)它是硬盘寻址的早期方式,用于标识硬盘上的数据存储位置。确认写入创建的分区,注意只有写入之后创建的分区才会创建成功。修改逻辑分区的id号,以区别主分区。

2025-01-11 20:11:09 985

原创 《操作系统真象还原》第十二章(二) —— 完善堆内存管理

上一节,我们完成了用户程序和操作系统之间的接口——系统调用,本节我们在此基础上完善堆内存管理——实现malloc和free之前我们虽然已经实现了内存管理,但之前实现分配的内存都是以 4KB 大小的页框为单位的,当我们仅需要几十字节、几百字节这样的小内存块时,显然无法满足这样的需求了,为此必须实现一种小内存块的管理,可以满足任意内存大小的分配,这就是我们为实现malloc要做的基础工作。本节的主要任务有:实现sys_malloc实现sys_free实现malloc实现free。

2025-01-09 09:15:27 1185

原创 《操作系统真象还原》第十二章(一) —— 系统调用

上一节,我们实现了用户进程的创建,至此,我们成功将操作系统的使用权给用户进行了开放,用户至此可以创建进程然后实现自己的功能,但用户实现的功能最终还是要在操作系统上运行,因此还需要借助操作系统提供的接口服务,这就是本节我们将要实现的——系统调用系统调用(System Call)是操作系统提供给应用程序访问硬件资源和操作系统服务的接口。通过系统调用,程序可以向操作系统请求服务,如文件操作、内存管理、进程控制等。系统调用位于用户态和内核态之间,通常被用来执行用户程序无法直接完成的任务。

2025-01-08 17:50:57 1283

原创 《操作系统真象还原》第十一章 —— 创建用户进程

在上一节中,我们实现了操作系统的“输入”功能,通过编写键盘驱动程序,成功让操作系统接受键盘输入并在屏幕进行打印但是到目前为止,我们所有的程序都是在最高特权级0级下工作,而本节,我们将实现用户使用的用户程序,其特权级为3进程与内核线程最大的区别是进程有单独的4GB空间,当然这指的是虚拟地址。因此,我们需要单独为每个进程维护一个虚拟地址池此外,为了维护每个进程的虚拟内存池与用户物理内存池的映射关系,我们还需要为每个进程创建页目录表最后,每个进程的特权级是3,而此前我们一直在0特权级下工作,因此我们还需要。

2025-01-05 20:09:27 810

原创 《操作系统真象还原》第十章(二)—— 键盘驱动程序的编写与输入系统

在上一节中,我们介绍了操作系统的同步机制互斥锁的内容,并手动实现了互斥锁,同时实现了线程安全的屏幕打印。至此,我们算是基本完成了操作系统的“输出”功能,但目前为止我们的输入仍旧依赖于程序,而不是用户操控的键盘 本节我们将正式完成操作系统的“输入”本节的主要任务有:键盘驱动测试编写键盘驱动程序基于环形缓冲区的键盘驱动程序一个键的状态要么是按下,要么是弹起,因此一个键有两个编码,这两个编码统称扫描码,一个键的扫描码由通码和断码组成。按键被按下时的编码叫通码。

2024-12-27 19:19:43 1431

原创 《操作系统真象还原》第十章(一) —— 同步机制之互斥锁实现与输出系统

在上一节中,我们实现了线程轮转调度,并分别实现了三个线程并发的在终端进行输出打印主线程init_all();/*打开中断,主要是打开时钟中断,以让时间片轮转调度生效*/while (1)return 0;/* 线程执行函数 */while (1)/* 线程执行函数 */while (1)但如果持续输出会发现终端会爆出一个GP异常。

2024-12-23 23:33:07 1290

原创 《操作系统真象还原》第九章(二) —— 多线程轮转调度

上一节,我们成功模拟pthread_create创建了新的线程并成功执行本节我们将介绍如何进行多线程轮转调度本节的主要任务有:创建多线程轮转调度的数据结构——双向链表借时钟中断完成多线程的时间片轮转调度。

2024-12-23 00:33:39 862

原创 《操作系统真象还原》第九章(一) —— 在内核空间中实现线程

上一节,我们初步完成了内核的内存管理部分的内容本节我们将正式开始操作系统进程管理的相关内容本节的主要任务有:创建并初始化PCB模拟pthread_create函数创建线程并执行线程函数如同上一节中的位图,位图是管理内存的数据结构,对于线程或者进程,也需要有一个数据结构对其进行管理,这个数据结构就是PCB。PCB(Process Control Block,进程控制块)是操作系统内部用于存储进程信息的数据结构。操作系统通过PCB来管理和调度进程。PCB 的生命周期进程创建时。

2024-12-21 23:08:52 1213

原创 《操作系统真象还原》第八章(二) —— 内存管理系统

上一节,我们初步构建了管理内存需要的数据结构及其相关操作——位图本节我们将在上一节的基础上正式实现操作系统的内存管理系统,直到malloc函数与free函数的完成本章的主要任务有:内存池的初始化内存分配实现最终实现的效果是内核程序向虚拟内存申请page个虚拟内存页面操作系统在内核虚拟内存中寻找到空闲的连续page个虚拟页面操作系统在内核物理内存池中找到page个物理页面(可能不连续)

2024-12-21 00:09:51 1205

原创 《操作系统真象还原》第八章(一) —— 位图及其实现

上一节,我们成功为我们的内核开启了中断机制,并使用时钟中断进行了测试本节我们将开启操作系统内存管理的相关内容本章的主要任务有:实现ASSERT断言实现字符串处理函数实现管理物理内存的数据结构位图断言(Assertion)可视为一种调试工具,主要用于检测程序在运行时是否满足某个条件。如果断言条件为真,程序继续执行;如果为假,程序通常会停止执行并抛出错误信息,帮助开发者发现潜在的问题。断言语句通常具有以下结构:condition是你期望为真的条件。如果condition为True。

2024-12-20 21:43:23 1327

原创 8086处理器的寻址方式

当处理器执行这条指令时,把数据段寄存器DS的内容左移4位,加上基址寄存器BX的内容,再加上变址寄存器SI的内容,共同形成20位的物理地址。第一条指令中,源操作数使用的是直接寻址方式,当这条指令执行时,处理器将数据段寄存器DS的内容左移4位,加上这里的0x5c0f,形成20位物理地址。这条指令执行时,处理器将栈段寄存器SS的内容左移4位,加上寄存器BP的内容,形成20位的物理地址,并将该地址处的一个字传送到寄存器AX中。寄存器寻址的操作数位于寄存器中,立即寻址的操作数位于指令中,是指令的一部分。

2024-12-11 21:30:11 716

原创 linux命令尾部&、&&、&>、 2>&1 的用法和区别

将正常的信息,重定向到某个文件/设备中(会覆盖文件原有信息>>将正常的信息,重定向到某个文件/设备中(不会覆盖文件原有信息,只会追加&>将正常+异常信息,一并重定向到某个文件/设备中(会覆盖文件原有信息&>>将正常+异常信息,一并重定向到某个文件/设备中(不会覆盖文件原有信息,只会追加2>只输出错误信息到某个文件/设备中。

2024-12-11 15:44:10 1501

原创 linux快捷命令收集

适用于在两个不同的目录之间频繁切换的场景,比如上一次在 /a/work 目录,当前在 /b/work 目录,执行该命令后会跳转到 /a/work,再执行一次会跳转到 /b/work。常见的既保存记录又同步在终端输出的操作办法是先执行 python test.py > a.log,然后在另外一个终端窗口执行 tail -f a.log。,可以使用 top 命令中的 pid 替换上述命令中的 pid,快速定位出 test.py 文件所在目录。:需要把命令中的 pid 替换成你需要查询的 pid,常用于。

2024-12-11 15:15:58 435

原创 文本三剑客——sed命令

sed,即stream editor,是一种流编辑器。

2024-12-09 00:31:45 620

原创 文本三剑客——grep命令

Linux grep (global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式。

2024-12-08 21:50:03 345

原创 和为k的子数组(前缀和)

这可以在遍历 s[j] 的同时,用一个哈希表 pre_sum统计 s[j] 的个数。那么枚举到 s[j] 时,从哈希表中就可以找到有 pre_sum[s[j]−k] 个 s[i],即为元素和等于 k 的子数组个数,加入答案。观察上述代码,我们初始化了pre_sum[0]=1,这主要是因为,当pre_sum[j]等于k时,pre_sum[j]-k等于0,如果不进行该初始化操作,我们就没有办法计算出这个符合要求的子数组。下标从 i 到 j−1 的非空连续子数组的元素和等于 k,即。把上式调整一下就变成了。

2024-12-02 09:58:36 382

原创 二叉树的直径

然后我们遍历每个节点,计算其左子树的最大深度和右子树的最大深度,相加就得到了当前节点的最长路径,依次遍历更新整棵树的最长路径即可。因为后序遍历的过程中,更新整棵树的最大路径长度与计算当前节点的最大深度是不冲突的,即。3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。可以看到,我们完全可以将这两段代码结合起来。是指树中任意两个节点之间最长路径的。给你一棵二叉树的根节点,返回该树的。解法二是在解法一的基础上改进得到的。首先写出计算一棵树的最大深度代码。由它们之间边数表示。

2024-12-01 10:56:26 372

原创 linux基本命令——sort详解

因此,正确的命令应该如下,这条命令是说,

2024-11-29 11:55:18 1711

原创 合并 K 个升序链表(归并)

请你将所有链表合并到一个升序链表中,返回合并后的链表。给你一个链表数组,每个链表都已经按升序排列。将它们合并到一个有序链表中得到。本题是归并排序的思想是一致的。

2024-11-24 16:42:55 312

原创 随机链表的复制

这个 random 指针意味着在复制过程中,除了构建前驱节点和当前节点的引用指向 pre->next ,还要构建前驱节点和其随机节点的引用指向 pre->random。以下是这段代码之间关系的图解,可以看到,由于我们保存了新旧节点直接的映射关系,因此我们可以很方便的构建新节点之间的next指针和ranhdom指针的关系。给定链表的头节点 head ,复制普通链表很简单,只需遍历链表,每轮建立新节点 + 构建前驱节点 pre 和当前节点 node 的引用指向即可。,该指针可以指向链表中的任何节点或空节点。

2024-11-24 11:35:58 712

原创 回文链表(双指针、快慢指针)

请你判断该链表是否为回文链表。给你一个单链表的头节点。

2024-11-24 10:00:51 345

原创 linux安装cyberRT6.0

由于笔者只对cyberRT感兴趣,之前安装的是apollo 9.0,里边包含了所有的代码,包括仿真和pnc等,占据空间较大,因此尝试改用apollo6.0,只安装cyberRT部分有关apollo 9.0部分的安装见官网,没有遇到什么bug但apollo 6.0的安装遇到了一些问题,故而在此记录。

2024-11-23 11:53:00 875

原创 docker镜像加速

这里给出一个长期更新镜像源的博客。

2024-11-23 10:32:35 436

原创 单元测试框架gtest学习(五)—— 运行参数

系统环境变量命令行参数代码中指定FLAG因为提供了三种途径,就会有优先级的问题, 有一个原则是,最后设置的那个会生效。不过总结一下,通常情况下,比较理想的优先级为:命令行参数 > 代码中指定FLAG > 系统环境变量为什么我们编写的测试案例能够处理这些命令行参数呢?是因为我们在main函数中,将命令行参数交给了gtest,由gtest来搞定命令行参数的问题。这样,我们就拥有了接收和响应gtest命令行参数的能力。

2024-11-22 00:08:09 967

原创 单元测试框架gtest学习(四)—— 参数化

在设计测试案例时,经常需要考虑给被测函数传入不同的值的情况。我们之前的做法通常是写一个通用方法,然后编写在测试案例调用它。即使使用了通用方法,这样的工作也是有很多重复性的,程序员都懒,都希望能够少写代码,多复用代码。Google的程序员也一样,他们考虑到了这个问题,并且提供了一个灵活的参数化测试的方案。

2024-11-21 23:55:57 664

原创 设计模式之观察者模式

假如我们现在有这样一个场景:市场上的股票价格不定时变化,而后台监控者和广告想要实时获取股票信息,我们应该怎么做?显然在这个场景里,我们有这样一个设计基于以上想法,我们先写出一版代码出来上述代码显然是可以运行的,当Stock修改价格信息时,Monitor和BillBoard可以接受到Stock发送给它的价格信息但上述代码设计的缺陷很明显。

2024-11-21 23:42:39 1584

原创 K 个一组翻转链表(详细图解)

这样,剩下的操作就是遍历整个链表了,其遍历过程还是比较复杂的,我将整个思路写成了注释。是一个正整数,它的值小于或等于链表的长度。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。本题中,我们使用开区间进行定义,如下图所示,假如k=3,则。问题在于,我们如何定义一组数据,或者说,我们如何定义区间。的整数倍,那么请将最后剩余的节点保持原有顺序。个节点一组进行翻转,请你返回修改后的链表。寻找符合条件的k个节点,作为一组数据。重新将翻转后的链表链接到原链表上。更新翻转后的链表的首尾节点位置。

2024-11-21 11:53:58 1050

原创 单元测试框架gtest学习(三)—— 事件机制

我们直接上代码进行说明,如下我们实现了一个简单的线程安全队列public:// 在此定义默认构造函数// 入队操作// 出队操作if (!// 获取队列容量private:代码写完之后,接下来我们自然想测试一下我们的队列入队操作、出队操作以及队列容量的获取操作这些功能是否符合我们的预期因此,我们会写出以下测试案例i

2024-11-20 23:50:45 1437

原创 单元测试框架gtest学习(二)—— 认识断言

有了以上基本认识,我们再来看官方给出的几种断言宏。

2024-11-20 22:35:52 1298

原创 单元测试框架gtest学习(一)——初始gtest

我们先写一个简单的函数这个函数的功能很简单,就是求两个数的和。

2024-11-20 22:00:53 923 1

原创 基于c++11实现的简易线程池(任意参数任务)

该线程池只是一个简单的线程池模型,只是为了将c++11的多线程编程技术进行应用实战,仅涉及到c++11的多线程编程技术和生产者消费者模型,任务队列和线程池的管理并没有实现。

2024-11-20 10:32:55 302

原创 googletest安装与使用

如果需要编译googtest自带测试样例,则使用cmake -Dgtest_build_samples=ON ../静态库文件默认安装在/usr/local/lib64,头文件在/usr/local/include。

2024-11-18 11:42:52 346

原创 ubuntu安装bazel

【代码】ubuntu安装bazel。

2024-11-18 10:18:41 670

原创 vscode安装配置clang-format插件及使用

如下基于google的风格进行的定制---- foreach$'- Q_UNUSED...---# 缩进宽度# 访问权限说明符(public/private等)的偏移# # 开括号(开圆括号、尖括号、方括号)后的对齐: Align, DontAlign, AlwaysBreak(总是在开括号后换行)# # 连续赋值时,对齐所有等号# # 连续声明时,对齐所有声明的变量名# 反斜杆换行的对齐方式# -- DontAlign - 不进行对齐# -- Left - 反斜杠靠左对齐。

2024-11-16 22:36:05 2414

原创 除自身以外数组的乘积

给你一个整数数组nums,返回 数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。题目数据数组nums之中任意元素的全部前缀元素和后缀的乘积都在整数范围内。请且在O(n)时间复杂度内完成此题。

2024-11-14 19:39:47 227

原创 万字长文详解linux进程间通信

管道是 Linux 中用于进程间通信的一种机制。和。

2024-11-14 09:29:49 918

原创 HuggingFace中from_pretrained函数的加载文件

前者就是1中的配置文件,这和我们的直觉相同,即config和model应该是紧密联系在一起的两个类。后者其实和torch.save()存储得到的文件是相同的,这是因为Model都直接或者间接继承了Pytorch的Module类。这是一个将纯文本转换为编码的过程。注意,Tokenizer并不涉及将词转化为词向量的过程,仅仅是将纯文本分词,添加[MASK]标记、[SEP]、[CLS]标记,并转换为字典索引。也就是各种各样的模型。当然,也可以通过config.json来实例化Config类,这是一个互逆的过程。

2024-11-09 18:16:13 759

原创 滑动窗口最大值

显然,外部使用滑动窗口遍历数组的时间已经达到了O(n),如果我们采取以上方式计算最大值,那么我们最终的算法时间复杂度必然已经达到了O(n^2)当我们将一个序列放进一个大顶堆时,堆会自动调整,将最大值放到堆顶,我们只需要获取堆顶的元素即可。但问题在于如何求滑动窗口中的最大值,因此问题就转换成了如何用最少的时间求一个序列的最大值。而队列pop的过程较为简单,如果发现是需要被pop的元素,直接pop掉即可,如下所示。基于这样的数据结构,于是我们每次只需获取队头元素,即可获取到当前序列的最大值。

2024-11-08 18:42:51 1230

空空如也

空空如也

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

TA关注的人

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