w16 P NP NPC
e75314b9dbc6140ab4a209cea42560face8c5d9479bd26f86c9fe17f82c4ea18344ddb1330a89278332fd9336d30376966ab3692a0373219083eefe70f5ed8ddf3ed20250455fe04084bc26dc0799a54a22cff2a33f1962c477ec2f169894ab3dc0e3c28cf5c2e32c6e0820ff315c4c2a892f337a34d3222094926598782bceefa95c318ee24fea044574d61ae20c87f519a6aeceed7b14b44dfc69a55cb3cf27dc0dfa141cc5b6298812ef3710d15f051cbe30f499240ed3c307276bd3b1b2628385f4ede1c142ce5807b113293bc814200203843301c7d1ed0f65e26ec48e66931aedcb0a41b07f74e359772751fbd26adf19e1c4a23c6c ...
w12-15图论
e75314b9dbc6140ab4a209cea42560face8c5d9479bd26f86c9fe17f82c4ea18e8990aee530d131a6158fdf6d06393355f19f74feef601d7ffdf7d5acc63ad2f5bda4475380fbdab6a692ac6f868e3e63e97e4c0196d5c6ace092703d5ff5436f58f2e7fbcb33efb50ea07073bb192aef8ccbc85686de23a40e3c96ea095a9a01bb42313056f6ade48553b5fdab8239edca0e1e7ed2e25d2d66eb81d96a32a924761f013a8a1d8752b83a73897e023ac2620707e34279988c6c0e620313dfa262014d6005d9f9a16ede5d83683ac9571be0538838d237839de258fe9f2c28ca046813f1609db04b3947ea0e1ef37f9aaca447449f990899be ...
BUAA_OOP_2024_碎碎念总结
BUAA_OOP_2024_碎碎念总结架构设计学习心得体会类与对象翻出去年的代码,看到下面的杰作,不禁感叹诗人握持啊!
123456//2023_oopreadventure.addBottle(adventure.getBottles(), botId, botName, capacity);public void addBottle(HashMap<Integer, Bottle> bottles, int botId, String botName, int capacity) { //do something}
当时并未理解面向对象中“类”这一概念,按照C语言的想法把所有需要的信息作为函数参数传入类的方法中,忽视属性在类内部的可见性o(~ヘ~o#)
对象管理与容器使用经过OO正课U3的TLE折磨,回看当初的代码略显稚嫩,没有做到容器的高效管理o(~ヘ~o#)
一个典型的用Botname作为键映射的HashMap,也让我用HashSet这么水灵灵的遍历上了
123456789101112131 ...
OO_Unit4
OO_Unit4[TOC]
一、正向建模与开发hw13刚开始并没选择正向建模 本单元理想的正向建模与开发belike:
需求分析:等等党等2天,将指导书、讨论区、微信群的需求整合起来,形成图书管理系统的需求文档
类图建模:根据需求文档,大致划分需要的类,预期类的属性和方法以及类与类之间的关系,并大体粗略绘制类图
顺序图建模:结合类图分析,绘制顺序图以描述对象之间的交互
状态图建模:绘制状态图,梳理对象之间的交互关系,对象之间的消息传递顺序
设计与实现:基于上述模型正向开发,进行代码实现,并对模型图进行调整与修改
验证与测试:通过跑测评机和手搓特殊数据确保代码正确性,通过肉眼反复比对类图和代码是否实现一致
在后续我感受到了正向建模开发的唯一好处,有效减少了开发迭代过程中的工作量,可以通过先在上一单元的UML类图进行修改,然后再实现代码,前后变化一目了然的。
二、第四单元架构设计1.类图
你猜为什么没有顺序图和状态图?(太水了,懒得喷.jpg)(。•̀ᴗ-)✧
2.架构分析数据结构Library 图书馆:储存所有在架书籍,储存所有有过操作的用户,分发请求
BorrowLibrarian ...
OS_Lab5_实验报告
Lab5_实验报告一、思考题Thinking 5.1如果通过 kseg0 读写设备,那么对于设备的写入会缓存到 Cache 中。这是 一种错误的行为,在实际编写代码的时候这么做会引发不可预知的问题。请思考:这么做 这会引发什么问题?对于不同种类的设备(如我们提到的串口设备和 IDE 磁盘)、的操作会 有差异吗?可以从缓存的性质和缓存更新的策略来考虑。
1.访问内核时错误读取到设备内容
2.外设可能随时更新,如果在上一次缓存过后,设备的值已经发生了改变,但系统读取外设时先在 Cache 中查找到设备后返回缓存的值,那么通过缓存会访问到落后内容。
串口设备由于即时性与高使用频率,会比IDE磁盘更容易出现这样的错误
Thinking 5.2查找代码中的相关定义,试回答一个磁盘块中最多能存储多少个文件控制块?一个目录下最多能有多少个文件?我们的文件系统支持的单个文件最大为多大?
123456789101112#define FILE_STRUCT_SIZE 256struct File { char f_name[MAXNAMELEN]; // filename uint32_t ...
OS_Lab4_实验报告
Lab4_实验报告一、思考题Thinking 4.1 内核在保存现场的时候是如何避免破坏通用寄存器的?
内核在kern/entry.S异常入口处使用宏函数SAVE ALL保存通用寄存器和部分CP0寄存器,其中只使用k0和k1寄存器来操作,不会破坏其他通用寄存器
系统陷入内核调用后可以直接从当时的 $a0-$a3 参数寄存器中得到用户调用 msyscall 留下的信息吗?
我觉得需要分类讨论,理由如下:
陷入内核调用时
kern\entry.S在SAVE_ALL生成一个Trapeframe 并把sp 指向 Trapframe 的底部
12345678910exc_gen_entry: SAVE_ALL mfc0 t0, CP0_STATUS and t0, t0, ~(STATUS_UM | STATUS_EXL | STATUS_IE) mtc0 t0, CP0_STATUS/* Exercise 3.9: Your code here. */ mfc0 t0, CP0_CAUSE andi t0, 0x7c lw t0, exception_handler ...
OO_Unit3
一、测试过程1.黑箱测试 黑箱测试是一种基于需求和功能规格的测试方法,测试人员不需要了解系统内部的实现细节,主要关注系统的输入和输出,通过输入数据来检查系统是否按照预期的方式运行,并验证输出是否符合预期。
优点是可以从用户的角度出发,更好地模拟用户实际使用系统的情况。缺点是可能无法覆盖系统的所有代码路径,以及对代码质量的评估不够深入。
2.白箱测试 白箱测试是一种基于代码内部结构和逻辑的测试方法,测试人员需要了解系统的内部实现细节,通过检查代码的逻辑路径、分支覆盖率等指标来评估代码的质量,并进行相应的测试。优点是可以更全面地覆盖代码,发现潜在的逻辑错误。
3.单元测试 单元测试是针对软件中的最小可测试单元进行的测试,旨在验证单个单元(通常是函数、方法或类)的功能是否按照预期工作,并尽可能地覆盖不同的代码路径和边界情况。例如我们写了三次的亲爱的Junit,真的是太实用了 (๑•̀ㅂ•́)و✧
4.功能测试 功能测试是通过模拟用户操作来验证系统功能是否符合需求和规格说明,需要尽可能覆盖整个系统的功能,验证系统的输入与输出是否符合预期。我理解可能是把 ...
OS_Lab3_实验报告
Lab3_实验报告一、思考题Thinking 3.1请结合 MOS 中的页目录自映射应用解释代码中 e->env_pgdir[PDX(UVPT)] = PADDR(e->env_pgdir) | PTE_V 的含义
e->env_pgdir[PDX(UVPT)] = PADDR(e->env_pgdir) | PTE_V
UVPT是用户新建进程页表虚拟地址的起始地址
其表示将页目录中第PDX(UVPT)个页表项映射到页目录本身的物理地址,并设置有效位。
目的旨在在用户内存空间中划分出一部分,使得用户可以通过访问这部分空间得到二级页表以及页目录中的数据
因为在UVPT-ULIM之间的4MB空间的va 它们的PDX(va) = PDX(UVPT) = 0x1ff
如图我访问一级页表的时候 查一级页表得到的二级页表基地址就是页目录的物理地址,进入到的二级页表即页目录本身
通过 PTX(va) 计算二级页表索引,访问了页目录项所对应的二级页表的内容
如果PTX(va) = PDX(va) 那么就会访问页目录本身
Thinking 3.2elf_load_seg 以函数 ...
OO_Unit2
一、架构设计迭代1.hw51.1 类图
1.2 时序图
1.3 架构分析(变不变)深入贯彻落实“今朝有酒今朝醉”的原则,在博览博客之后,发现都说去年LOOK+自由竞争是活少分高的不二选择✧(≖ ◡ ≖✿)
我果断加入LOOK大家庭,结(zhao)合(chao)实验代码,草率搓出了第一版
Main运行InputThread输入线程、Schedule调度器(我其实之前耦合在输入线程里面)、Elevator电梯线程
共享的数据类型只有Pesron记录人员请求信息、RequestTable管理人员请求信息
策略类Strategy,采用LOOK算法
梦幻开局,我还天真的认为:电梯月?就这??(๑>ڡ<)☆
1.4 调度器设计1234567891011121314151617@Overridepublic void run() { while (true) { if (mainRequestTable.isEmpty() && mainRequestTable.isEnd()) { for (Req ...
OS_Lab2_实验报告
Lab2_实验报告一、思考题Thinking 2.1
在编写的 C 程序中,指针变量中存储的地址被视为虚拟地址
MIPS 汇编程序中 lw 和 sw 指令使用的地址被视为虚拟地址
Thinking 2.2
从可重用性的角度,阐述用宏来实现链表的好处
C 语言并没有泛型的语法,用宏来实现含有不同类型结构体的链表,可以提高代码的可重用性,可读性更高
查看实验环境中的 /usr/include/sys/queue.h,了解其中单向链表与循环链表的实现,比较它们与本实验中使用的双向链表,分析三者在插入与删除操作上的性能差异
单向链表
循环链表
双向链表
Add before first node
O(1)
O(1)
O(1)
Add before given node
O(n)
O(n)
O(1)
Add after given node
O(1)
O(1)
O(1)
Add after last node
O(n)
O(1)
O(1)
delet first node
O(1)
O(1)
O(1)
delet given node
O( ...
OS_Lab1_实验报告
Lab1_实验报告一、思考题Thinking 1.1
尝试分别使用实验环境中的原生 x86 工具链和 MIPS 交叉编译工具链,重复其中的编译和解析过程,观察相应的结果
(1)原生 x86 工具链
1.只进行预处理gcc -E hello.c,这 里一阶段并没有 printf 这一函数的定义
12345678/* 保留部分输出 */extern int printf (const char *__restrict __format, ...);# 2 "hello.c"int main(){printf("Hello World!\n");return 0;}
2.只编译而不链接 gcc -c hello.c 并进行反汇编 objdump -DS hello.o,printf 的具体实现依然不在我们的程序中
123456789100000000000000000 <main>: 0: f3 0f 1e fa endbr64 4: 55 ...
OO_Unit1
一、架构设计迭代1.hw11.1 UML类图
1.2 架构分析海量阅读往年优秀博客后(◔‸◔)后,我的架构主要仿照Unit1_training的提示以及oolens递归下降的代码仓库,如下处理:
表达式预处理
Predeal类中对输入字符串一键replaceAll
去除空白项
去除冗余++/—/+-/-+
去除冗余+(*+ /^+)
表达式解析
递归下降法构建Lexer类和Paser类
PaserExpr()、PaserTerm()、PaserFactor()层层深入
解析得到表达式类Expr、项类Term、因子Fatcor
因子统一接口Factor 实现类
VarFactor幂函数因子 ,定义为x^a
ExprFactor表达式因子 ,定义为(expression)^a
NumberFactor常数因子
这里我解析Term的时候没有为其加入符号属性,而是直接遇到负号就为term加入一个值为-1的NumberFactor
基本单元定义
单项式类Mono、多项式类Poly定义如下:
Mono = a*x^b\\
Poly = ArrayList为Expr、Term、Fatcor ...