面向对象u2-pre
OO_u2 pre现在刚好在U1与U2衔接的空档期,笔者正好写完了作业没事干,所以决定看看U2的内容。说实话虽然老早就知道多线程、多进程这样概念,平常写代码需要多线程最多就是直接使用进程池(GPT把关版),这样深入地学习多线程还是第一次。
学习资料
B老师
C老师
D老师
王老师
java多线程
1.多线程是什么在古早时代,面对多个需要执行的程序/作业,计算机无法做到同时运行他们。于是程序只能一个一个地运行,像一个糖葫芦串一样一个接一个(好饿),这是程序的串行。后来科学家们发现某些程序在运行时总是频繁地等待交互响应(一会需要打印机啊、一会需要输入机啊…),占用CPU资源。俗话说占着**不拉*,聪明的科学家想出了一个好办法,趁程序拉*(交互)的时候,剥夺其对CPU的使用权,交由其他程序使用,等到它拉完了又可以继续使用CPU了。由于它们交换CPU使用权又快又频繁,看起来像多个程序在同时运行。这是程序的并发。后来随着资源越来越丰富,科学家想到给一个电脑多装几个CPU,这样程序不就能真正地一起运行了吗。所以发展出了多核CPU,两个/多个程序可以同时占用CPU资源,有不同 ...
面向对象u1
北航2025面向对象第一单元[toc]
第一次作业1.代码架构分析在阅读往届学长的博客(以及尝试使用正则表达式解析嵌套括号)后,最后决定了使用递归下降算法。最最主要的是今年oop中也出现了递归下降方法,课程写的文档挺不错的,通俗易懂。找了一下,发现居然也是一位学长的博客
虽然只学了一年多编程,但是苯人对递归式的函数还是有较深的体会的,主要针对一下两点来写递归函数即可
函数的职责:即明确一个函数返回值或者是函数调用的时机,实际上就是牢记函数初衷(parseExpr就返回表达式,在解析表达式时调用),当描述一个递归函数的递归调用过程中卡壳了,不妨回到这个函数被设计之初的职责,跳出细节才能看到全局。
函数终止的条件:尤其是自调用的递归函数,常常会陷入无限调用的套娃中。使用一个具体的例子往往能够更加好地理解什么时候函数递归到达终点了。
2.流程分析我将整个流程分为四个模块,**预处理 -> 解析 -> 合并项 -> 生成字符串**
虽然在本次作业中,生成和优化字符串同隶属于最后一个模块,随着基项复杂度的增加,二者的分开也是在所难免
i.预处理由于题目给出的原字符串无 ...
Shell脚本(2)
Shell(2)传递参数运行脚本时后续可以用空格传递若干参数
变量
说明
$0
当前文件名
$1~$n
第1~n个参数
$#
参数数量
$*
所有参数,不可迭代
$@
所有参数,可迭代
流程控制for
对于可迭代对象使用for var in iterable; do commanddonefor var in item1 item2 item3 itemN; do commanddone
while
满足循环条件时执行语句while condition; do commanddoneint=1while ((int <= 5)); do echo $int ((int++))done
until
不满足条件时执行语句int=1until [ ! $a -lt 10 ]; do echo $a a=`expr $a + 1`done
if-else
分支控制语句if condition; then commandelif condition; then commandelse commandfi
case
分支控 ...
Shell脚本(1)
Shell(1)变量Bash脚本中变量可以分为字符串、数字、数组等等,较为常用的还是字符串
命名规范
只包含字母、数字和下划线: **变量名可以包含字母(大小写敏感)、数字和下划线 _**,不能包含其他特殊字符。
不能以数字开头: 变量名不能以数字开头,但可以包含数字。
避免使用 Shell 关键字: 不要使用Shell的关键字(例如 if、then、else、fi、for、while 等)作为变量名,以免引起混淆。
使用大写字母表示常量: 习惯上,常量的变量名通常使用大写字母,例如 PI=3.14。
避免使用特殊符号: 尽量避免在变量名中使用特殊符号,因为它们可能与 Shell 的语法产生冲突。
避免使用空格: 变量名中不应该包含空格,因为空格通常用于分隔命令和参数。
定义
# 注意不能有空格# str = "abc"是错误的写法str="abc"str='abc'digit=12declare -i digit=12array=(1 2 3 4 5)declare -A associate_array=([& ...
北航计算机组成P6
北航计算机组成P6前言
不要问我为什么先有P7再有P6,问就是忘了,一直忘到了现在,我真有点不记得课上的指令,反正我记得P6比P5简单来着
课下复习
课上测试
北航计算机组成P7
北航计组组成P7前言
咳咳,更的越来越少了(),最近在致力于把测评机搭得花里胡哨,所以一直没有写博客,现在刚好有点闲所以写一下P7的博客,再不写课上的指令什么的都忘光了
课下搭建注意
欸为什么不写课下的搭建博客。第一,我觉得之前的学长已经写得很好了(反正看懂博客P7就成功一半了,看懂源码P7就成了hhh);第二,我好懒;第三,之前似乎没看到有人写测试的博客,所以我来填一点点坑,希望对以后的同学有用(话说2024以后计组好像要改革了,希望不要删掉P7
搭建博客
flyinglanlord
roife
一些补充的搭建要点
说实话我没看明白为什么要加入eret,似乎返回的EPC并不会触发这个异常()assign pc_error = (|PC[1: 0]) | (PC < 32'h0000_3000) | (PC > 32'h0000_6fff) | !D_eret;
Req和stall的优先级反了,这样会出bug下面同样给出测出bug的代码,或者直接用我的测评机吧() E_PC <= stall ? D_PC : (Req ? 32' ...
北航计算机组成P5
北航计算机组成P5前言
P5工作量确实比P4大了不少,画设计图写文档一天半,搭CPU加测试一天,不过如果课下做好准备过了强测那课上100%能过甚至直接ak走人了
课下
写完P6已经1700行了,主要是我采取了针对指令的译码方式,所以整体代码量会稍微大一点(),主要这样我比较方便debug,所以就没改了
译码方式
集中式译码方式
最大的优点就是方便从P4改过来,其实我选择集中式译码的理由是方便添加一些指令,而且译码行为在D级就可以全完成,所以如果加入一些额外的指令信号不会出现高阻态或者其他的比较抽象的错误(分布式译码课上如果出锅了可能就是这个原因)
最大的缺点就是需要流水的信号实在是太多了,因为所有要用的信号必须在D级就全部生成完毕,所以向E级就会流水各种信号,不过课下认真设计,仔细连线保证没有bug那在课上也没啥,反正课上最多增加两三个新增的端口,反正不会一次写两个寄存器()
分布式译码
最大的优点就是流水的东西少,几乎可以只流水指令,然后每次在接收 ...
北航计算机组成P4
北航计算机组成P4前言
咳咳,最近太忙了作业好多啊,搭完CPU每周还要迭代自己的测评机,原来CO也可以训练我们面向对象的能力
课下
其实P4就是把P3的电路图翻译成代码,整体上没有难度,如果你P3有好好设计你的CPU的话,没有好好设计的话,就照着学长设计好的CPU翻译,总之也是从一个一个的模块开始搭建,这里不赘述了
组合逻辑建模
我啰嗦一两句,最近几年课程组不知道在干什么(明年等我当助教我也要搞得抽象),考试喜欢考一些奇奇怪怪的组合逻辑,所以或许你需要根据你使用的建模逻辑稍微熟练一些Verilog的语法,这样课上的时候或许不会那么慌
两种组合逻辑建模方式对于写CPU的思路还是有略微不同的,而且各有各的好处,见仁见智了
assign
最大的优点就是简洁、代码量很少,而且就是电路连线,从P3转过来会比较方便assign ALU_out = (ALUOp == `ALU_add) ? A + B : (ALUOp == `ALU_sub) ? A - B : (ALUOp == `ALU_or) ? A | B : ...
北航计算机组成单周期数据生成
两种可能的测试数据生成方式unitTest分类
如同java中的单元测试,我们将常规指令(不包含什么lwso、cwp…)分为五个类别
寄存器赋值类型指令(set)
例如lui,能直接通过立即数对寄存器赋值(这里我还加入了ori配对成li),将来可能addi、subi也是这里的一部分
寄存器运算类型指令(arth)
例如add,通过两个寄存器相互运算得到值的指令,更通俗就是R型指令
存取类型指令(store)
例如lw,内存参与的指令
分支类型指令(branch)
例如beq,有条件跳转(有条件跳转并链接)指令
跳转类型指令(jump)
例如jal,无条件跳转(无条件跳转并链接)指令
接下来将我们已有的指令集分类加入,并按照set -> arth/store -> branch -> jump的顺序依次进行测试,已测试的指令将出现在后面的指令测试中测试后续指令,所以测试顺序也是非常重要的
测试思路
set
先测试set类指令,不仅是因为它们不需要依托其他指令的正确性,而且后续所有边界数据的测试都需要提前赋值,测试思路即多次对$0 ~ $31寄 ...
北航计算机组成P3课下
北航计算机组成原理P3课下通过阅读本文,你可以大致了解北京航空航天大学2023级计算机组成原理P3课下的相关内容,希望能对你有所帮助
设计文档总要求
实现指令集{addu、subu、ori、lui、lw、sw、beq、nop}
指令集所有指令的RTL
add(addu)
sub(subu)
ori
lui
lw
sw
beq
nop
特殊,一般可以用sll一起代替,这里因为指令集没有sll所以我们直接使用sll的部分代替nop
数据通路设计草图注:上述的j、jal、jr指令不在指令集中
数据通路详细设计IF
首先我们观察需要设计的CPU,必不可少的一部分就是PC、IM,没有指令谈何执行指令呢,所以我们将这个阶段称为取指(IF)
基于低耦合的原则,我们希望PC永远只是指向当前需要执行的指令,而不需要进行其他的操作,因此,我们在取指阶段多加入一个模块**次地址计算模块(NPC)**,专门用于计算根据PC的值以及执行的指令与结果更新PC的值
至此,IF阶段的所有模块都浮出水面了分别是PC、NPC、IM
PC
取指阶段最最重要的一个模块无疑是PC程序计数器 ...