自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 csapp proxy lab part 1

在计算机网络中,数据被封装成数据包(packet)是为了在网络中进行传输。数据从应用程序发送到传输层。在这个过程中,数据通常被封装为特定应用层协议的数据报文,比如HTTP请求或者SMTP邮件。传输层(通常是TCP或UDP协议)会在应用数据的基础上添加传输层头部信息,包括源端口和目标端口等信息,形成一个传输层数据报文段(segment)。网络层(通常是IP协议)将传输层的数据报文段添加网络层头部信息,包括源IP地址和目标IP地址等信息,形成一个网络层数据报文(packet)。

2024-05-08 23:57:02 957

原创 leetcode 1235

函数对象是指可以像函数一样被调用的对象。在C++中,函数对象可以是函数指针、函数、Lambda 表达式或重载了函数调用运算符operator()的类对象。函数对象可以作为参数传递给标准库中的算法,如std::sort等,用于指定算法的行为。这种方式使得算法更加灵活,可以根据不同的需求使用不同的比较方式或操作方式。函数调用运算符operator():重载了这个运算符的类对象可以像函数一样被调用。当对象被调用时,operator()会被执行。Lambda 表达式。

2024-05-05 23:59:08 752

原创 leetcode 1766

将边的关系,转化为树结构。记录val 对应的id 列表。记录是否遍历过节点。记录id 和对应的深度。使用dfs, 从根开始遍历。

2024-04-11 19:54:45 668

原创 leetcode 1702

首先,需要定义自定义数据结构,可以是一个类或者结构体,包含希望进行迭代访问的元素。接下来,需要实现一个迭代器类,用于访问自定义数据结构中的元素。迭代器类负责追踪当前位置,并提供方法来获取下一个元素、判断是否到达结尾等。在自定义数据结构中提供一个接口,让用户能够获取迭代器的实例。这通常是通过方法或者重载操作符来实现的。在迭代器类中,你需要实现迭代的具体逻辑,例如重载++操作符来获取下一个元素,重载!操作符来判断是否到达结尾等。最后,用户可以使用迭代器来遍历自定义数据结构中的元素。

2024-04-11 10:19:04 1072

原创 leetcode 322

记忆化搜索,使用数组,记录val的最少硬币数量;递归加bfs;

2024-04-10 11:03:41 355

原创 leetcode 2671

使用哈希, unordered_map 是基于hash 实现的key,val 存储。

2024-03-23 15:20:03 385

原创 leetcode 3035

统计字符出现的频次,5个a(字符可以成为回文)。将所有字符放在一起考虑,因为字符是可以任意移动。只要奇数个字符的种类,不要超过字符数组的size就可以。

2024-03-21 17:17:43 196

原创 leetcode 3075

孩子的幸福值最低也是0,所以选择最大的值,被选孩子的幸福值最高。需要使用排序算法。

2024-03-21 10:43:09 199

原创 leetcode 714

使用dp[n][2] 存储最佳利润值,动态规划的思路,重要的是转移方程。

2024-03-20 12:54:16 169

原创 leetcode 303

深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在编程中常用的两个概念,用于描述在复制对象或数据结构时发生的不同方式。以下是它们的区别:浅拷贝(Shallow Copy):浅拷贝是指将一个对象的值复制到另一个对象,但只复制对象本身,而不复制对象引用的内容。因此,新对象和原始对象引用相同的内存地址,如果原始对象中包含指向其他对象的指针或引用,浅拷贝后的对象仍然会共享这些指针或引用。这可能导致多个对象共享相同的资源,当一个对象修改资源时,会影响到其他对象。

2024-03-19 18:53:00 1055

原创 leetcode 3081

最小堆

2024-03-18 15:29:14 954

原创 leetcode 3080

创建数组,数组的顺序是 nums 的key 的排序。

2024-03-17 23:22:28 469

原创 LCR 110

使用dfs便利所有边。

2024-03-16 12:16:21 328

原创 leetcode 399

图作为数据结构, 使用广度遍历搜索。

2024-03-15 12:16:32 868

原创 CSAPP Malloc lab

是一个 C 语言中的语句,它的含义是将一个指针类型的值设置为-1,然后将其转换为void指针类型,并返回。这通常用于表示一个特殊的错误条件或者指示函数执行失败。sizeof函数的单位是byte。ALIGN 找到最小的alignment的倍数。

2024-03-10 00:24:25 1354

原创 outlook 邮箱过期

2024-02-09 18:56:44 330

原创 CSAPP shell lab

Shell中的作业(job)管理是一种用于跟踪和控制正在运行的进程的机制。Shell通常支持前台任务和后台任务,它们之间有以下差别:前台任务是由用户启动并在前台运行的任务。当你在Shell中运行一个命令,它通常会成为前台任务,并且会占用你的终端会话,直到任务完成或被中断。前台任务会接收来自终端的输入,并将其输出显示在终端上。这使得它们非常适合需要与用户交互的任务,例如编辑文本文件或运行交互式程序。要将一个正在运行的前台任务放入后台,你可以使用Ctrl+Z暂停任务,然后使用bg命令将其放入后台运行。

2024-01-29 11:19:04 977

原创 CSAPP 第八章 Exceptional Control Flow 读书笔记 part 1

Operating system subroutine” 是指操作系统中的子程序(subroutine),用于执行特定的操作系统功能。这些子程序通常由操作系统提供,为应用程序和其他系统组件提供服务。文件系统子程序:通过提供文件名和权限,打开文件以便读取或写入。关闭先前打开的文件,释放相关资源。进程控制子程序:在操作系统中创建新的进程。终止正在运行的进程。内存管理子程序:为程序或进程分配内存空间。释放先前分配的内存空间。设备管理子程序:打开并准备使用设备。关闭设备,释放相关资源。

2024-01-21 21:37:13 885

原创 CSAPP 第七章 Linking part2

是dlopen函数中的一个标志,用于指定共享库的全局符号在解析外部符号时应该是可用的。当使用标志时,共享库中的符号将被链接到全局符号表中,使得其他共享库或可执行文件可以访问这些符号。具体来说,使用标志的效果是,共享库中的符号可以被后续加载的共享库或主程序(如果使用了-rdynamic标志编译)引用。这对于在不同的共享库之间共享全局变量或函数非常有用,因为它们可以在整个应用程序的多个模块之间共享状态。举例说明,在使用dlopen打开共享库时,如果使用了。

2024-01-17 10:05:59 984

原创 CSAPP 第七章读书笔记 - Linking part1

ld是GNU Binutils工具集中的一个命令,用于链接目标文件并生成可执行文件。它在编译器生成目标文件之后,将这些目标文件组合在一起,解析符号引用,执行地址重定位,并生成最终的可执行文件。以下是ld目标文件的链接ld的主要任务是将一个或多个目标文件链接在一起,创建一个完整的可执行文件。这些目标文件可以是由编译器生成的,也可以是其他程序员提供的。符号解析ld解析目标文件中的符号引用,确保每个符号都能找到其对应的定义。这通常涉及在不同目标文件之间解决函数和变量的引用关系。地址重定位。

2024-01-15 21:12:22 945

原创 CSAPP cache lab - Optimizing Matrix Transpose

矩阵转置是一种操作,它将矩阵的行和列互换位置,即将原始矩阵的行变为转置矩阵的列,将原始矩阵的列变为转置矩阵的行。转置操作可以通过改变矩阵的布局来方便地进行某些计算和分析。假设有一个m×n的矩阵A,其转置矩阵为n×m的矩阵B。那么B的第i行第j列的元素就是A的第j行第i列的元素,即B[i][j] = A[j][i]。可以看到,B的第一行是A的第一列,B的第二行是A的第二列,以此类推。矩阵转置在很多领域中都有广泛的应用,例如线性代数、图像处理、矩阵运算等。

2024-01-08 22:28:57 1149

原创 使用valgrind 分析缓存命中

使用valgrind 分析缓存命中char transpose_submit_desc[] = "Transpose submission";void transpose_submit(int M, int N, int A[N][M], int B[M][N]){ int i,j,tmp; int bsize = 8; unsigned long long addrA; unsigned long long addrB; unsigned long long s

2024-01-04 21:53:36 1178

原创 cache blocking

缓存的更新通常是以缓存块为单位进行的,而不是以单个元素为单位。当程序访问内存时,它将一个块的数据加载到缓存中,这称为缓存行(cache line)。缓存行是缓存的基本单位,通常包含多个字节或数据项。当某个数据被请求并加载到缓存时,可能会带入其周围的数据,即将整个缓存行加载到缓存中。这是因为在程序中,通常存在着局部性原理,即相邻的数据项很可能也会被近期使用。如果在缓存中的某个块的数据被修改,通常整个缓存块会被标记为“脏”(dirty)。当这个缓存块被替换出缓存时,它的内容会被写回到主内存。

2024-01-02 15:29:42 434

原创 csapp cache lab - Writing a Cache Simulator

定义Cache的结构:首先需要定义一个结构体来表示Cache的属性,如Cache大小、块大小、关联度等。可以使用数组来表示Cache的行和块,每个块包含标记、有效位、数据等信息。实现Cache的初始化函数:编写一个初始化函数,用于初始化Cache的各个属性和数据。可以根据Cache的大小和块大小计算出所需的行数和块数,并分配相应的内存空间。S: Set 数量, E: 每个set的cache line 数量。对cache的操作是基于tracefile的内容(指令和地址两部分组成)

2023-12-25 16:26:25 920

原创 CSAPP 第六章读书笔记 part2

传统内存和关联内存的输入和输出有一些区别。传统内存的输入和输出是通过地址来进行的。当CPU需要读取或写入传统内存中的数据时,它会发送一个地址信号,以指示所需数据的位置。传统内存会根据这个地址信号来读取或写入相应的数据。关联内存的输入和输出则是通过标签来进行的。关联内存中的数据是通过标签进行检索的,而不是通过具体的地址。当CPU需要访问关联内存中的数据时,它会发送一个标签信号,关联内存会根据这个标签信号来查找匹配的数据。

2023-12-18 14:15:51 907

原创 csapp 第六章读书笔记 part1

作为程序员,需要理解内存层次结构,因为它对你的应用程序的性能有很大影响。如果你的程序需要的数据存储在CPU寄存器中,那么它们可以在指令执行期间以0个周期的时间访问。如果存储在缓存中,则需要4到75个周期。如果存储在主内存中,则需要数百个周期。如果存储在磁盘中,则需要数千万个周期!如果你了解系统如何在内存层次结构中传递数据,那么你可以编写应用程序,使其数据项存储在更高的层次,这样CPU可以更快地访问它们。

2023-12-16 13:13:48 96

原创 leetcode 1466

如图 node 4 -> node 0 -> node 1因为节点数是n, 边长数量是n-1。所以如果是从0出发的路线,都需要修改,反之,如果是通向0的节点,例如节点4,则把节点4当作父节点的节点,之间的路线的方向都需修改。两个节点间只有一条方向,所以可以确定如何修改,取决和0节点的关系。如图 node 0 -> node 1 -> node 3

2023-12-08 14:31:54 136

原创 csapp 第五章读书笔记 分析程序指标工具

complier 无论怎样优化代码,都不会替换数据结构和算法。要在基本水平之上调优性能,需要对处理器的微体系结构有一定的了解,描述了处理器实现其指令集体系结构的基本机制。对于乱序处理器的情况,了解一些关于功能单元的操作、能力、延迟和发射时间等方面的知识,可以建立一个基准,用于预测程序的性能。

2023-12-07 14:26:24 308

原创 csapp 第五章读书笔记 part1

Retirement unit” 是一个术语,通常在计算机架构和微处理器设计中使用。在处理器的流水线执行过程中,指令会按照顺序进入流水线的不同阶段进行处理。在执行完最后一个阶段(写回阶段)后,指令就被认为是“退休”了,也就是完成了它的任务并从流水线中移除。在现代处理器中,有一个专门的硬件单元被称为“退休单元”(retirement unit),用于管理指令的退休过程。它负责确保指令按照正确的顺序退休,以保持程序的正确执行。

2023-12-05 18:22:00 859

原创 csapp第四章读书笔记 part3

ret 使用了3个bubble, ret 在write-back 阶段后确定下一条指令。对于jump指令,需要到execute 阶段后,才能确认是否存在mispredicted branch问题。control logic通过插入bubble来取消错误的brach, 同时获取正确的brach。

2023-11-30 15:59:18 86

原创 leetcode 1657

【代码】leetcode 1657。

2023-11-30 10:28:08 152

原创 leetcode 1670

使用2个deque作为类的成员变量。

2023-11-28 12:33:50 280

原创 leetcode 2300

函数在vector中查找符合条件的元素的位置。如果找到了这样的元素,我们将输出它的位置;否则,我们将输出没有找到的消息。如果将double 转为long long, 会损失精度。所以使用upper_bound, 可以得到符合预期的范围。在这个示例中,我们创建了一个包含整数的vector,并使用。函数都用于在有序序列中进行二分查找。

2023-11-28 10:26:50 176

原创 CSAPP 第四章读书笔记 part2

在PIPE-中的一个块,在SEQ+中以完全相同的形式不存在,这个块被标记为“Select A”,位于解码阶段。这些指令中没有一个需要从寄存器文件中读取的值。在SEQ+的各个阶段之间插入了流水线寄存器,并稍微重新排列了信号,得到了PIPE−处理器,其中名称中的“−”表示该处理器的性能略低于我们的最终处理器设计。然后,当新的时钟周期开始时,这些值通过完全相同的逻辑传播,以计算当前指令的PC。在流水线设计中的目标是在每个时钟周期发出一个新指令,这意味着在每个时钟周期,一个新指令进入执行阶段,并最终完成。

2023-11-27 17:50:11 283

原创 csapp archlab part 1

/yas 和 ./yis 是汇编语言编译器和模拟器的命令行工具。./yas 是一个汇编语言编译器,它将汇编语言代码转换为可执行的二进制文件。./yas sum.ys 将sum.ys文件编译成了sum.yo可执行文件。./yis 是一个模拟器,它用于执行和模拟已编译的二进制文件。运行./yis sum.yo 将执行sum.yo文件并输出结果。这两个工具通常用于汇编语言的开发和调试过程中。

2023-11-23 11:01:46 188

原创 csapp 第四章 读书笔记 part1

Y86-64 是一个教学用的指令集架构,用于教授计算机体系结构和汇编语言的课程。它是为了简化教学和理解而设计的,因此它的指令集和功能相对较少。而 x86-64 是一种常见的处理器架构,用于商业计算机系统和服务器。它是由英特尔和AMD等公司开发的,具有复杂的指令集和丰富的功能,可以执行各种复杂的任务和应用程序。因此,Y86-64 和 x86-64 的主要区别在于它们的设计目的和使用范围。Y86-64 用于教学和学术研究,而 x86-64 用于商业和实际的计算机系统。

2023-11-21 20:33:23 292

原创 c++结构体

用于定义一个结构体类型的指针,并为该类型指定一个别名。结构体是一种自定义的数据类型,可以包含多个不同类型的成员。,以便在后续的代码中可以使用这个别名来声明变量。通过指针访问成员时,我们使用箭头运算符。需要注意的是,在使用完指针后,我们需要使用。在上面的示例中,我们定义了一个结构体类型。使用上述定义后,我们可以这样声明一个。类型的对象,并将其地址赋值给。类型的指针定义了一个别名。成员,一个字符串类型的。在上面的示例中,我们使用。成员,以及一个整型的。,它包含了一个整型的。这样,我们就可以通过。

2023-11-16 20:40:45 57

原创 csapp attack lab phase4

每个gadget由一系列指令字节组成,最后一个字节为0xc3,编码为ret指令。举个例子:48 89 c7 是指令 movq %rax, %rdi, 对应的地址是0x400f15 + 0x3 也就是0x400f18, 是开始的指令位置。例如:ret编码为0xc3,nop编码为0x90。0x4019a7 + 0x4 得到地址0x4019ab48 89 c7 对应的汇编指令是 mov %rax, %rdi0x4019c3 + 0x2 得到地址 0x4019c5。

2023-11-16 15:44:48 130

原创 csapp attack lab phase3

通过将touch3函数覆盖test的stack frame, 在40个字符的范围内写入汇编代码,使寄存器执行mov等指令,并跳转到touch3。mov指令不能直接修改rip寄存器的值。因为rip寄存器存储的是指令的地址,它是由处理器自动更新的。

2023-11-15 15:12:42 205

原创 caspp attacker lab

ctarget 会先调用test , test调用getbuf, getbuf调用Get。任务目的是通过缓冲区注入攻击,将函数getbuf返回直接重定向到函数touch1。0x28 是 40 比特,getbuf 下一次执行的指令是401976, rsp对应的汇编文件行数,通过objdump 可以获取地址,40个字符加上touch1的地址,课件的例子1课件的例子2。

2023-11-14 19:52:58 92

空空如也

空空如也

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

TA关注的人

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