- 博客(34)
- 收藏
- 关注
原创 【Go】并发目录遍历
主线程通过time.Tick创建一个通道,周期性的触发tick事件,输出当前已经遍历的文件大小。通过一个线程,观察waitgroup的线程是否结束,结束则关闭fileSizes通道。版本2利用20个大小的缓冲通道作为信号量,最高打开20个并发遍历目录的线程。版本3,通过增加一个done信号量和一个监控命令行输入的线程,终止程序运行。通过一个线程不断遍历文件目录,传输大小给fileSizes。通过定义fileSizes通道,阻塞主线程,计算大小。各子线程通过done通道来决定是否结束线程。
2023-05-08 18:55:06
382
原创 【Go】爬虫
思路为通过worklist通道传输链接列表,然后通过遍历worklist中的链接,如果未被访问过则通过unsendLinks通道传输给爬虫。定义forEachNode遍历根为n的每个子节点,定义两个函数变量pre和post,表示前序访问子节点或是后序访问子节点。然后定义一个匿名函数visitNode,用来遍历Node中包含的所有超链接,再将链接加入links中,等待后续遍历。通过一个20的循环建立一个20个爬虫线程,爬虫返回的连接再重复上面通道传输过程。另外的一种写法,使用结构体记录链接的深度。
2023-05-08 18:36:07
897
原创 [学习]goroutine & channel
spinner为死循环程序,循环打印-\|/,模拟程序运行通过go 启动一个线程调用spinner函数然后计算fib,输出结果,main函数结束,强制终止所有线程。
2023-05-08 18:02:37
349
原创 【记录】位向量
位向量用来表示元素是否存在,第i位为1则表示第i个元素存在,使用64位无符号整数数组表示。则一个数组元素可表示64个元素是否存在。使用word, bit := x/64, uint(x%64)定位是数组的哪一个元素和第几位。通过(1<<bit)寻找到第i个元素。再使用位操作 操作数组。
2023-05-08 15:41:24
75
原创 【记录】一些Go的奇葩写法
相反,调用squares()()则虽然类似于调用f,但不知道创建的这个squares()地址为多少,所以其中的x也不知道再如何调用,等于重新创建一个函数变量。定义f为squares函数,调用f即调用squares函数,但x的值递增,说明x虽为局部变量,但还存在于f中,main看来x已经返回,但在f中x还未返回。函数squares返回一个另一个函数,调用squares创建一个局部变量x并返回一个匿名函数。变长函数,使用...,调用这个函数的时候可以传递该类型任意数目的参数。
2023-05-08 15:16:58
110
原创 Golang管理包
使用golang编写项目的时候,除了安装自带的包之外,还涉及到引入他人或是自己写的包,这就涉及到了如何正确管理和引入的问题了。
2023-03-28 15:07:56
156
原创 操作系统实验二、进程控制
一、实验内容1.在Windows环境编写ParentProcess.exe程序和ChildProcess.exe程序(1).ParentProcess.exe使用CreateProcess()创建进程并启动程序ChildProcess.exe,并利用GetSystemTime()函数获取子进程开始和结束时间,并计算耗时,精确到ms。(2).ChildProcess.exe打印“Hi,my name is + 你的名字”并延时3s再结束。2.在Linux环境编写Parent...
2022-04-23 10:59:31
1233
原创 GBN-Python
实验内容:采用UDP Socket编程接口作为模拟物理层接口实现帧的发送和接收,协议采用双工方式进行数据通信。假设Host1和Host2分别向对方发送大文件,Host1先发送一帧到Host2,通过数据链路层的帧每次完成数据块的可靠传输,采用GBN协议,差错编码采用CRC-CCITT标准。程序结构:分别调用Server.py开启进程1(Host1)和进程2(Host2),Host1和Host2可选择接收,发送或者关闭。接收则会调用Receiver.py创建接收线程,发送则会调用sender.py创建发送线
2022-03-28 12:43:45
6019
原创 x86汇编游戏——2048
2.1游戏界面绘制游戏界面绘制窗口程序主要有_WinMain和_ProcWinMain两个函数来构成。_WinMain是生成窗口的主函数,主要流程为:(1)得到应用程序句柄(2)注册窗口类(3)建立窗口(4)显示窗口(5)刷新窗口客户区(6)维护消息获取和处理的循环通过GetMessage获取消息TranslateMessage翻译消息DispatchMessage分派消息给回调函数处理通过User32来调用回调函数_ProcWinMain是用来处理消
2022-03-08 16:48:59
8051
3
原创 汇编语言实验——反汇编(矩阵乘法)
3.1 实验内容C语言编写多重循环程序(大于3重),查看其反汇编码,分析各条语句功能(分析情况需要写入实验报告),并采用汇编语言重写相同功能程序。3.2实验环境Microsoft Visual Studio 2017+masm 323.3实验步骤3.3.1 编写c语言代码此处我选择的程序为实现两个矩阵相乘,是一个3重循环的程序。3.3.2 查看反汇编代码并分析1:#include<stdio.h>2:3:intResult[10]...
2022-03-08 14:18:20
1987
1
原创 汇编语言实验——文本比较
2.1实验内容Windows界面风格实现两个文本文件内容的比对。若两文件内容一样,输出相应提示;若两文件不一样,输出对应的行号。2.2实验环境Microsoft Visual Studio 2017+masm 322.3实验思路2.3.1 绘制界面绘制界面上,我们调用WIN32库,首先初始化创建一个主窗口,之后在主窗口接受到WM_CREATE消息时创建3个按钮控件,分别为选择比较的第1个文件,选择比较的第2个文件,和执行比对三个功能。_ProcWinMainprocuses..
2022-03-08 14:14:15
1676
原创 BIT-MiniCC——negen(lab8目标代码生成)
终于来到了最后一步——目标代码生成本次的实验目标是将生成的中间代码四元式翻译成x86汇编语言原理其实就是根据不同的四元式对应不同的语句输出为汇编代码即可根据要求是只需要满足3个测试用例即可,再多只需要继续添加翻译语句就行一、1.由于本次实验提供的测试用例的输入输出函数,Mars_PrintInt,Mars_PrintStr,Mars_GetInt在x86中并未定义。所以需要通过借用对应的c语言函数,又由于x86中对应的printf和scanf的调用处理较为特殊,所以在此处对于这一类函
2022-03-02 14:25:30
3202
2
原创 BIT-MiniCC——semantic+icgen(lab6语义分析6+lab7中间代码生成)
lab6的语义分析要求能够识别出3种C语言错误即可,本次实验选择的是0_var_not_defined,1_var_defined_again,2_break_not_in_loop三种错误。lab7的中间代码生成是将AST树翻译成四元式,对于变量的寄存器分配方法选择的是不进行分配,统一设置为全局变量。实验思路在BITMINICC——lab6+lab7_寒士°、的博客-优快云博客中,本篇给出详细代码,可以结合起来看。1.在BIT-MiniCC-master\src\bit\minisys\mi
2022-02-27 14:59:02
7297
原创 BIT-MiniCC——parser(lab5语法分析器)
本次实验要求生成代码的抽象语法树(AST),具体的算法原理在BITMINICC——利用Antlr的Listener生成AST_寒士°、的博客-优快云博客中有详细的介绍,此处就不再过多介绍了,这篇博客将给出详细代码,参考着看相信能够更加理解。而其中提到的文法再编译原理Antlr教程_寒士°、的博客-优快云博客中也提到了。———————————————————————————————————————————那么现在就开始语法分析器的编写一、1.在BIT-MiniCC-master\src
2022-02-27 12:37:28
4058
1
原创 MIPS-5级流水线CPU
一、流水线CPU流水线CPU就是指将一条分解为多步,在同一周期内进行多条指令的同时执行。MIPS五级流水线就是将指令分为:取指(IF),译码(ID),执行(EX),访存(MEM),写回(WB)五个阶段。举个例子:比如第二条指令lui $t2,0x2100在流水线CPU中执行的就是可以看到在200-300ns的周期里,IF阶段取到0x00400004处的指令,300-400ns,这条指令到了ID阶段,而IF阶段执行下一条指令。400-500ns,执行这条指令,ALU的结果为0x2100
2021-12-31 10:49:14
18966
6
原创 MIPS单周期CPU
一、单周期CPU介绍单周期CPU顾名思义就是一个指令周期内只执行一条指令的CPU。比如下面的指令在单周期CPU中执行的过程,体现为:在每一个周期(时钟上升沿),就执行完一条指令。二、CPU设计CPU是由一个指令存储器(IM,instruction Memory)和数据存储器(DM,DataMemory)还有CPU组成。其架构如下: 模块 功能描述 CPU 信号 .
2021-12-30 10:57:08
8803
6
原创 数据结构——排序
稳定性:设在排序前的序列中记录 Ri 领先于 Rj(即 i<j ),且 Ri、Rj 对应的关键字为 Ki、Kj,如果 Ki=Kj 并且在排序后的序列中 Ri 仍领先于 Rj,称所用方法是稳定的。一、插入排序1.直接插入排序从数组的第二个数据开始比较,由于num[1:i-1]已经有序,若num[i]<num[i-1],则说明num[i]需要插入到前面,反之不用。插入过程为从后往前依次将比num[i]大的元素往后挪,直到num[k]<num[i],则num[k+1]=num[i
2021-11-08 21:45:01
364
原创 数据结构——查找
查找:根据给定的某个值,在表中确定一个关键字等于给定值的记录或数据元素, 若表中存在这样的记录,则称查找成功,查找结果为该记录在查找表中的位置; 否则称为查找失败,查找结果为 0 或 NULL。评价查找:ASL(Average Search Length) :为确定记录在表中的位置,需要与给定值进行比较的关键字的个数的期望值。,Pi为查找第 i 个记录的概率,Ci为查找第 i 个记录所需的比较次数。记录:由若干数据项构成的数据元素。关键字:能标识一个数据元素(或记录)的数据项。主关键字:能唯
2021-11-07 21:54:58
1071
原创 数据结构——图
一、图的基本概念图(Graph)——图G是由两个集合 V(G) 和E(G) 组成的,记为 G=(V,E),其中:V(G) 是顶点的非空有限集,E(G) 是边的有限集合,边是顶点的无序对或有序对。图不能是空图1.图的术语和定义1)有向图若E是有向边的有限集合时,则图G为有向图。弧是顶点的有向对,记为<v,w>,其中v,w∈V,v称为弧尾,w称为弧头,<v,w>称为从v到w的弧2)无向图若E是无向边的有限集合时,则图G为无向图。边是顶点的无向对,记为(v,w.
2021-11-05 21:57:29
2011
原创 数据结构——树
一、树的基本概念1.树的定义树是n个节点的有限集。在任意一棵非空树中应满足:(1)有且仅有一个称为根 root 的结点。(2)当n>1时,其余结点可分为若干个互不相交的集合,且这些集合中的每一集合本身又是一棵树,称为根的子树。从逻辑结构看1)树中只有根结点没有前趋;2)除根外,其余结点有且仅一个前趋3)树中的结点,可以有零个或多个后继;4)除根之外的其它结点,都存在唯一一条从根到该结点的路径; 5)树是一种分支结构。2.基本术语(1)度:树中一个节..
2021-11-04 20:23:56
2766
原创 数据结构——数组和广义表
一、数组1.ADTn个相同类型的数据元素构成的有限序列。每个数据元素成为一个数组元素,每个元素在n给线性关系中的序号成为该元素的下标,下标的取值范围称为数组的维N维数组中的每个元素都受N个线性关系的约束初始化操作 InitArray(&A,n,bound1,…,boundn) 销毁操作 DestroyArray(&A) 读元素操作 Value(A,&e,index1,…,indexn) 写元素操作 Assign(&A,e,index1,…,ind..
2021-11-03 21:04:03
989
原创 数据结构——队列
一、ADT只允许在一端进行插入操作,而在另一端进行删除操作的线性表。InitQueue(&Q)QueueEmpty(Q)EnQueue(&Q,x)DeQueue(&Q,&x)GetHead(Q,&x)二、顺序存储1.顺序队列初始状态:front==rear==0进队操作:队不满时,先送值到队尾,再将rear+1出队操作:队不空时,先取队头元素值,再将front+1(或将后面的元素前移)前者会造成假溢出,改用循环队列。后者
2021-11-03 09:47:52
180
原创 数据结构——栈
一、ADT1.定义栈是只允许在一端进行插入或删除操作的线性表。(后进先出表LIFO)栈顶(Top)线性表允许进行插入删除的那一端栈的数学性质:n个不同元素进栈,出栈元素不同排列的个数为2.基本操作InitStack(&S)StackEmpty(S)Push(&S,x)Pop(&S,&x)GetTop(S,&x)DestoryStack(&S)二、存储结构1.顺序栈#define Maxsize 100.
2021-11-02 21:50:50
123
原创 数据结构——线性表
一、ADT具有相同数据类型的n个数据元素的有限序列。除第一个元素之外每个元素都有唯一的直接前驱,除最后一个元素之外都有唯一的直接后继。L(a1,a2,...,an)操作:InitList(&L)Length(L)LocateElem(L,e)GetElem(L,i)ListInsert(&L,i,e)ListDelete(&L,i,&e)PrintList(L)Empty(L)DestoryList(&L)二、顺序存
2021-11-02 20:38:09
159
原创 BITMINICC——利用Antlr的Listener生成AST
BITMINICC生成AST首先请花一定的时间阅读下面的参考方法,本文是我对下面文章的一个理解和踩坑记录。参考方法:https://zhuanlan.zhihu.com/p/369250644?utm_source=qq&utm_medium=social&utm_oi=7325352049330257921.一个好的文法因为要用Antlr生成Lexer以及Listener,所以一个定义完整的文法是最重要的。因为当你用一个缺陷的文法,重写好了Listener,分析好了上一个实
2021-05-28 00:40:38
4446
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人