自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 gin路由组

这行代码调用了方法,返回一个新的路由组对象v1。所有在这个组内定义的路由都会自动加上/v1作为前缀。

2024-07-25 19:51:51 636

原创 有向图BFS

在有向图的bfs中,注意将vis数组设置在for循环中。在无向图中,vis定义在外面。

2024-07-22 13:19:54 133

原创 go recover

在second中发生panic,second中没有defer,故立即退出,panic沿着调用栈传递到first中,first因为调用的second函数发生panic,也应该退出,但是由于first中有recover,故执行defer的recover,捕获了这个panic,使得它不会再沿着调用栈传到main中。但是main随后调用second,又发生panic,panic沿着调用栈传递到main中,导致main退出,不会输出”End of main“

2024-07-17 22:41:01 211

原创 不整理worker和coordinator,越写越乱

6.824lab1,应该整理好worker和coordinator需要掌握哪些信息,需要发送哪些信息?明确具体需求,比如worker到底输出几个文件,整理好,画好流程图,才不会边写边改,越写越乱。

2024-07-16 21:48:06 244

原创 go 匿名递归

【代码】go 匿名递归。

2024-07-12 10:26:35 88

原创 go222

只要一个具体类型bar的方法(method)中实现了Write函数(签名相同),就是实现了Writer接口。那么在一些要求io.Writer类型作为参数的函数中,就可以传入这个具体类型bar。具体类型比如int,type foo struct{},其中foo就是一个具体类型(struct。接口类型只定义这个接口可以做什么,如在io包里的writer。因此,可以通过接口来实现多态。go分具体类型和接口类型。这就是一个接口类型。

2024-06-29 20:25:53 115

原创 go111

go中,数组作为函数参数是值传递,所以在函数中改变数组不能反映到调用者的数组中,如果传数组的slice,则可以改变,因为slice中包含数组的指针。

2024-06-26 15:56:39 234

原创 网络编程1

服务器接收到 FIN 包后,会向客户端发送一个 ACK(Acknowledgment)包,确认已经接收到 FIN。客户端接收到服务器的 FIN 包后,向服务器发送一个 ACK 包,确认已经接收到 FIN。网络编程中,客户端调用close或者shutdown后,操作系统会给服务器发送一个FIN。操作系统会发送一个 FIN 包给服务器,表示客户端不会再发送数据。服务器进入半关闭状态,可以继续向客户端发送数据,但不能再接收数据。当双方都发送并接收到 FIN 和 ACK 包后,连接才完全关闭。

2024-06-21 15:44:22 340

原创 malloc lab

抄书代码,测试结果:

2024-06-09 20:20:25 87

原创 webserver timer

在eventLoop函数中,epoll会监听到该管道的读端有事件发生,而处理该事件的方法是调用deal_signal函数。在eventloop中处理,因为超时事件优先级不高,故先处理完epoll的事件,再处理timeout。处理timeout的函数time_handler中,会调用tick函数,而tick函数会遍历定时器升序链表,查看是否有定时器超时。调用alarm()系统调用,设置好时间,这段时间结束后,alarm会发出sig_alarm信号。webserver项目中,通过信号函数来实现定时。

2024-06-04 09:52:02 200

原创 listen 和 accept

也就是listen会将sockfd标记为一个被动的socket,它将通过accept系统调用接受连接请求。其中,backlog参数指定了sockfd用于pending connection的队列的最大长度。(也就是说listen的具体实现中有队列?总之,accept的第二三个参数是会在调用函数后被赋值的(所以传入的是指针)。accept会从sockfd的队列中拿出第一个连接请求,创建一个新的socket,并返回其fd。

2024-06-03 13:38:55 164

原创 man 7 socket

AF_UNIX)

2024-06-03 10:20:11 196

原创 【无标题】

IO多路复用是通过单个线程记录多个IO流的状态,来起到同时管理多个io流的作用。epoll是如何知道它管理的io流有事件发生?epoll是io多路复用的一种实现。

2024-06-03 10:17:29 407

原创 离散数学 哈密顿图

注意:目前没有找到哈密顿图的简单的充要条件。破坏以上诸条件中的一条,都不是哈密顿图。

2024-06-02 12:40:40 495

原创 ubuntu使用mysql

【04-Ubuntu20.04配置最新的Mysql8.0数据库】 https://www.bilibili.com/video/BV1DV411P7mz/?

2024-06-01 18:27:11 109

原创 upperbound lowerbound

upper_bound的第四个参数是自定义的匿名函数cmp,返回值为bool类型,cmp有两个参数,一个是value,对,你没看错,就是upper_bound的第3个参数value,另一个是element,也就是查找过程中与value比较的那个数。在从小到大的排好序的数组中,在数组的[begin, end)区间中二分查找第一个大于等于value的数,找到返回该数字的地址,没找到则返回end。// 3(value是3,第一个大于等于value的数)// 3(value是3,第一个大于等于value的数)

2024-05-03 18:48:13 602

原创 cs144

基本上,对于服务器端,使用顺序是socket() -> bind() -> listen() -> accept(),而对于客户端,使用顺序是socket() -> connect()。1.创建套接字(Socket):使用socket()函数创建一个套接字,指定地址族(通常是AF_INET或AF_INET6)和套接字类型(SOCK_STREAM用于TCP套接字)。这一步是可选的,但通常在服务器端进行。6.发送和接收数据:一旦连接建立,服务器和客户端都可以使用send()和recv()函数来发送和接收数据。

2024-05-02 14:50:22 17

原创 ecall

而ecall指令会将user mode换为supervisor mode,保存当前pc寄存器的值(因为系统调用结束后我们会回来继续执行),并把trampoline page的首地址送pc寄存器。trampoline的代码是用汇编写的,在kernel/trampoline.S中。2.切换到内核页表,栈指针指向内核栈,准备好执行usertrap代码 3.跳转到usertrap。用户空间下的调用syscall,如read(), write(),fork(),都会被编译成汇编指令。

2024-04-27 16:15:39 138

原创 lazy allocation

在page fault handler中,会检查触发page fault的地址是否合法,是否处于(brk, brk + n)中,如果是,那么就马上分配一页内存,然后将其映射到虚拟内存(即在页表中添加新的页表项)。对于未初始化的全局变量,通常存放在bss段中,但bss段是统一映射到一个全为0的内存页,且这个内存页的PTE_V为0。如果os采用lazy allocation,sbrk的实现将会是只将brk指针的值+n,然后返回brk的旧值。注意,并没有分配内存,因为没有在页表中添加新的页表项。

2024-04-21 11:22:53 106

原创 虚拟内存111

虚拟内存就是页表提供的一种“假象”

2024-04-19 15:56:22 331

原创 syscall

假设我现在要执行另一个系统调用write,相应的流程是类似的,write系统调用不能直接调用内核中的write代码,而是由封装好的系统调用函数执行ECALL指令。所以write函数实际上调用的是ECALL指令,指令的参数是代表了write系统调用的数字。之后控制权到了syscall函数,syscall会实际调用write系统调用。

2024-04-19 15:55:45 71

原创 【无标题】xv6 trap

从user space到kernel:每个进程结构体有一个成员trapframe,它指向一块内存页,这块内存用来保存进程的现场,即所有寄存器的值。同时,trapframe中还存有内核的栈指针和其他内核相关的东西,用于从用户空间切换到内核空间做准备。

2024-04-18 18:48:16 110

原创 c++函数模板

1.如果函数的定义不是inline,那么函数定义时的不能加上默认实参的等号,即。如果函数模板声明中包含默认参数,如。2.如果在声明时就定义了,那没事了。

2024-04-14 18:19:42 101 1

原创 attack lab phase4

phase4需要活用rsp寄存器,通过popq,ret这些会改变rsp的指令来完成。

2024-03-23 20:23:14 85 1

原创 bomb phase_5

401099这句指令,就是以与运算的结果为下标,从这串字符中拿一个字符,存到栈上,起始地址为。这些字符在上面所提的那个数组中的下标为9,15,14,5,6,7。处,已经有了长度为6的字符串。重复上述过程直到我们输入的所有字符都处理完,那么在。也清零了,所以这里将我们输入的第一个字符送到。之前已经将我们输入的字符串的首地址存到了。中存放你输入的字符串的首地址,将其存到。的字符,如相等,则phase5通过。,也是解开这一阶段的关键代码。这就是phase5的密码。打印该地址,可得该字符串为。

2024-03-17 20:51:24 427

原创 bomb phase3

总结一下,输入两个数,第一个数不能大于7。程序会根据第一个数赋值eax寄存器,然后和输入的第二个数相比,相等则解除炸弹。其中,rcx和rdx用于存放sscanf将要读入的数字的地址。phase3的汇编中,查看esi处内存可知,sscanf的格式字符串是。,然后通过gdb单步调试,查看eax的值,得到密码,比如。和我们输入的第二个参数比较,若不等,炸弹爆炸。为基址,加上rax的值乘8为地址。然后将该值赋值到eax寄存器,然后的。这些都是正确的,随便取一个就行。和7比较,若大于7,炸弹爆炸。

2024-03-09 21:09:04 355

原创 bomb phase2

高亮的这句汇编要求输入的第一个数字必须是1(还不知道为什么),否则炸弹爆炸。的指令,是将rsp的下一个数的地址存到rbx,也即rbx现在的值是3的地址。指令的结果则是这6个数之后的内存地址,用来判断循环结束,如。不难看出,正确的第二个数应该是1 + 1,也就是2。取rbx的前一个数到eax,这里即为我们输入的。因此可以推断第二个密码应该是。连着的6个整数正好是输入的。如图可见,我输入的是。

2024-03-08 23:26:37 313

原创 xv6 系统调用

在编译时,会生成如下代码(user/usys.S)是来自于文件名,如果文件不叫sleep.c而是shuijiao.c,那么则输出。在user文件夹下,创建sleep.c。ecall是ricsv提供的特殊指令,用于系统调用进入内核。定义了一个数组,其元素是函数指针,这些函数部分定义在。在数组中得到对应函数并调用,将返回值存到a0寄存器。将sleep的系统调用号传入a7寄存器。这段代码从a7处取得系统调用号,然后通过。可见所有系统调用都会经由这个函数来调用。在函数syscall中。在代码中通过系统调用。

2024-03-04 10:47:20 411 1

原创 cs61b proj2 phase1

room的宽度、高度、在world中的坐标均为随机。在生成时需确保room不超出world的边界,这里使用retry来控制。room类定义了一个宽度、高度、在world中的坐标均为随机的room,并且用WALL包围,内填充FLOOR。在world中放置room时需注意不要重叠。生成hallway连接room,生成方法参考。注意hallway不要像下面这样重叠。

2024-03-02 16:40:33 395

原创 6.s081 lab2 trace

具体说明见课程主页。

2023-10-15 18:05:54 41 1

原创 习题11-7 奇数值结点链表

https://pintia.cn/problem-sets/12/problems/365代码:思路原链表第一个元素为奇(偶)数,则找到第一个偶(奇)数,将偶(奇)数新建节点连成新的链表。struct ListNode *readlist(){ struct ListNode* head = NULL; struct ListNode* last = NULL; int num; while(1) { scanf("%d", &num);

2021-05-17 17:59:43 267

原创 1049 数列的片段和 (20分)

给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列 { 0.1, 0.2, 0.3, 0.4 },我们有 (0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4) (0.4) 这 10 个片段。给定正整数数列,求出全部片段包含的所有的数之和。如本例中 10 个片段总和是 0.1 + 0.3 + 0.6 + 1.0 + 0.2 +

2020-10-08 16:46:34 96

原创 1047 编程团体赛

编程团体赛 (20分)编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员的成绩和;成绩最高的队获胜。现给定所有队员的比赛成绩,请你编写程序找出冠军队。输入格式:输入第一行给出一个正整数 N(≤104),即所有参赛队员总数。随后 N 行,每行给出一位队员的成绩,格式为:队伍编号-队员编号 成绩,其中队伍编号为 1 到 1000 的正整数,队员编号为 1 到 10 的正整数,成绩为 0 到 100 的整数。输出格式:在一行中输出冠军队的编号和总成绩,其间以一个空格

2020-08-28 20:10:26 150

原创 1044 火星数字

火星人是以 13 进制计数的:地球人的 0 被火星人称为 tret。地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。火星人将进位以后的 12 个高位数字分别称为:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou。例如地球人的数字 29 翻译成火星文就是 hel mar;而火星文 elo nov 对应地球数字 115。为

2020-07-15 21:31:25 109

原创 1032 挖掘机技术哪家强

为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。输入格式:输入在第 1 行给出不超过 10​5的正整数 N,即参赛人数。随后 N 行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从 1 开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。输出格式:在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。输入样例:63 652 801 1002 703 403 0输出

2020-07-13 20:49:15 88

原创 1031 查验身份证

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:Z:0 1 2 3 4 5 6 7 8 9 10M:1 0 X 9 8 7 6 5 4 3 2现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。输入格式:输入第一行给出正整数N(≤100)是输入的身份

2020-07-12 19:21:54 144

原创 1010 一元多项式求导

设计函数求一元多项式的导数(注:x​n​​(n为整数)的一阶导数为nx​n−1​​。)输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。输入样例:3 4 -5 2 6 1 -2 0输出样例:12 3 -10 1 6 0难点主要是没有输入长度,这里利用scanf函数的返回值:s

2020-07-11 17:35:46 140

原创 1008 数组元素循环右移问题

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A​0​​A​1​​⋯A​N−1​​)变换为(A​N−M​​⋯A​N−1​​A​0​​A​1​​⋯A​N−M−1​​)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?输入格式:每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。输出格式:在一行中输出循环右移M位以后的整数

2020-07-11 17:32:21 106

原创 1007 素数对猜想

让我们定义dn为:dn=pn+1-pn​​,其中pi是第i个素数。显然有d​1​​=1,且对于n>1有d​n​​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N(N<105 )请计算不超过N的满足猜想的素数对的个数。输入格式:输入在一行给出正整数N。输出格式:在一行中输出不超过N的满足猜想的素数对的个数。输入样例:20输出样例:4主要看求素数的实现方法,一般的实现方法太慢,过不了最大的测试点。主要考察求素数的方法。#include <s

2020-07-11 17:27:06 177

原创 1005 继续(3n+1)猜想

#include <stdio.h>#include <stdlib.h>#include <stdbool.h>typedef struct { int data; bool covered;} str;void Callatz(str* arr, int n, int K);int Find(str* arr, int val, int K);void bubble(int* brr);int main(){ int K, i; i..

2020-07-10 21:58:35 130

空空如也

空空如也

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

TA关注的人

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