OO第四单元总结
OO第四单元总结第13次作业设计架构类设计MainClass主类,只提供一个主方法,主要去调用其他类提供的方法,此处独立出一个Library类来统一接收响应图书馆的各种操作,主类通过Library提供的一个run()方法完成相应的图书借阅操作。
Library图书馆,主要接收和响应各种操作,与输入输出指令进行交互。
所需属性:bookshelf、borrowReturnOffice、appointmentOffice(三个基本部件,用于承担将指令操作分摊的任务)、HashMap<String, User> users(统计所有出现过的与图书馆进行交互的学生)、HashMap<LibraryBookId, Book> books(用来方便获取查询操作中每本书的去向路径)、date(当前时间)
所需主要方法:run(主要方法)、handle4Queried(处理查询操作,在本类完成)、handle4Borrowed(处理借书操作,下放到Bookshelf类完成)、handle4Ordered(处理预约书操作,下放到AppointmentOffice类完成)、hand ...
lab5实验报告
lab5实验报告思考题Thinking 5.1题面1如果通过 kseg0 读写设备,那么对于设备的写入会缓存到 Cache 中。这是一种错误的行为,在实际编写代码的时候这么做会引发不可预知的问题。请思考:这么做这会引发什么问题?对于不同种类的设备(如我们提到的串口设备和 IDE 磁盘)的操作会有差异吗?可以从缓存的性质和缓存更新的策略来考虑。
回答
缓存只能记录CPU的读写结果,却无法在外设对数据进行修改时及时调整。当外设产生中断信号或更新数据时,此时对应的Cache中此前旧的数据很可能刚刚完成缓存,则完成缓存的这一部分并无法完成相应的更新,将发生错误的行为,总之就是与外设交互是实时性很强的行为,采用缓存到Cache中的方式将引发错误。
对于串口设备而言,读写操作频繁,接发收信号多,在相同时间内发生错误的概率远远高于IDE磁盘。
Thinking 5.2题面1查找代码中的相关定义,试回答一个磁盘块中最多能存储多少个文件控制块?一个目录下最多能有多少个文件?我们的文件系统支持的单个文件最大为多大?
回答1.代码如下:
1234567//user/include/fs.h...#defi ...
lab4实验报告
lab4实验报告思考题Thinking 4.1题面12345思考并回答下面的问题:• 内核在保存现场的时候是如何避免破坏通用寄存器的?• 系统陷入内核调用后可以直接从当时的 $a0-$a3 参数寄存器中得到用户调用 msyscall留下的信息吗?• 我们是怎么做到让 sys 开头的函数“认为”我们提供了和用户调用 msyscall 时同样的参数的?• 内核处理系统调用的过程对 Trapframe 做了哪些更改?这种修改对应的用户态的变化是什么?
回答
内核通过调用SAVE_ALL宏将非重入的下的异常的通用寄存器和其他特殊寄存器的值存储在栈空间的对应地址处。
可以,因为其本身在对应寄存器就有存储值。
通过将参数传入$a-$a3和栈空间中,使得sys开头的函数可以调用msyscall传入的相同参数。
将栈中存储的EPC寄存器值自增4,也就是跳转到下一条指令,因为在系统调用后,接下来将会下一条指令,又因为用户程序需要确保系统调用并不会出现在延迟槽中,因此直接加4即可得到下一条指令地址,作为存储返回值的v0寄存器也可能发生改变。
Thinking 4.2题面1思考 envid2env 函数: ...
OO第三单元总结
OO第三单元总结前言本单元的作业相对前两个单元来说简单,具体需要做的就是根据提供的JML撰写相应的代码,重点来了安全按照规格编写代码只能确保正确性,却不能保证性能。这也充分体现了JML这种契约式编程下,设计与实现相分离的特点,当然这里的分离并非完全分离,实现需要在保证符合设计的要求下尽可能的达到高性能的目标(毕竟没人喜欢低性能的程序吧!)。
虽说简单,但是为了表示严谨而长篇大论的JML在描述某些规格时却异常繁杂,而这也使其成为了本单元与算法设计(因为低性能的算法真的会挂点QAQ)并列唯二的重中之重。
第九次作业作业要求维护一个社交网络,并对其中用户及之间关系进行管理.用户可通过标签管理与自己存在关系的其他用户.
在阅读官方包给定的相应的JML规格后,依据规格 实现相应的Person,Network,Tag类来分别implement相应的接口,需严格满足接口给出的JML规格定义.
阅读关于异常行为的描述,结合官方包给定的异常类的javadoc,体会异常处理的流程.
同时还要在主类中调用官方包的Runner类,载入实现的类来运行程序.实际上就是将接口的JML规格实现成相应的代 ...
OS_lab3
lab3实验报告思考题Thinking 3.1题面1请结合 MOS 中的页目录自映射应用解释代码中 e->env_pgdir[PDX(UVPT)] = PADDR(e->env_pgdir) | PTE_V 的含义。
回答在MOS中,根据自映射机制,将页表和页目录映射到了用户空间中的0x7fc00000-0x80000000(UVPT-ULIM)区域,而由于自映射,所以物理内存上页目录单独占一页,其余二级页表单独占一页,但是在虚空间上某一个二级页表对应的虚拟页和页目录对应的虚拟页实际上重叠的,也就是某个二级页表虚地址同页目录虚地址重合,那么这两者对应的物理页框也应该重合,而页目录的每一个页表项存储的是相应二级页表所在页的基地址,因此在页目录中应该有一个页表项存储的是到页目录这一页本身的物理页框号,也即”自映射页表”。因此,由于按需分配元组,在初始化对应页目录时需要设置映射到页目录自身的页表项,而其在页目录中的索引应该与虚空间上页目录按4KB大小在所有二级页表中的索引以及第一个二级页表按4MB大小在虚空间上的索引,也就是PDX(UVPT),PDX()的作用是取一个32位二进制 ...
OS_lab2
lab2实验报告思考题Thinking 2.1题面1请根据上述说明,回答问题:在编写的 C 程序中,指针变量中存储的地址被视为虚拟地址,还是物理地址?MIPS 汇编程序中 lw 和 sw 指令使用的地址被视为虚拟地址,还是物理地址?
回答答:C程序中指针变量中存储的地址被视为虚拟地址。MIPS汇编程序中lw和sw指令使用的地址被视为虚拟地址。
Thinking 2.2题面123请思考下述两个问题:• 从可重用性的角度,阐述用宏来实现链表的好处。• 查看实验环境中的 /usr/include/sys/queue.h,了解其中单向链表与循环链表的实现,比较它们与本实验中使用的双向链表,分析三者在插入与删除操作上的性能差异。
回答
采用宏定义对链表相关操作进行封装,使得相关操作可复用,减少了每次使用重新再书写的工作量,同时还减小了复杂度,使代码可读性更好,便于维护。
先查看/usr/include/sys/queue.h中单向链表和循环链表的实现:三者在插入与删除操作上有一定的性能差别:1). 对于单向链表,由于所有节点都只维护了一个指向下一个节点的指针,因此在删除时需要遍历链表找到删除节点 ...
OO第二单元总结
OO第二单元总结第五次作业题面先解释若干概念:
目的选层电梯系统:
1.进入电梯前,乘客输入目标楼层(?没进电梯选楼层);
2.电梯系统根据策略指定电梯服务,并告知结果;
3.乘客进入电梯后,无需再按楼层,电梯自动送其至相应楼层。
优先级指数:表示不同类型乘客到达目的楼层急迫程度。
请求调度器:解析读入请求信息后,根据此时电梯运行状态将乘客请求合理分配给某部电梯的调度器,可以理解成指挥电梯运作的大脑。
此外,被分配请求的电梯将经过上下行、开关门、乘客进出电梯等动作,将乘客从起点运送至终点,注意每到一层都需要打印到达的相应楼层的信息。
单部电梯运行策略与电梯系统的调度策略可任意指定,即任意时刻,电梯的操作都可自定义,只要保证在电梯系统运行时间不超过要求时间上限且将所有乘客送至目的地。
一些约束
电梯楼层为B4-B1,F1-F7,11层,初始在F1层;6部电梯,id为1-6;0.4s/层(需要体现在时间戳上,也就是当前一层Arrive后到下一层Arrive之间需要手动间隔0.4s,也就是让电梯线程sleep(400));限载6人;开关门间隔大于等于0.4s。
一些电 ...
OO第一单元总结
BUAA-OO第一单元作业第一次作业训练目标借助对数学意义上的表达式结构进行建模,完成单变量多项式的括号展开,体会层次化设计的思想应用和工程实现。
题面读入一个包含+、-、*、^、()(至多一层括号)的单变量表达式,输出恒等变形展开所有括号后的表达式,即最终表达式中并不含括号。
代码UML图
如UML图所示,除了MainClass主类外,还定义了Lexer词法分析器类、Parser语法分析器类、Expr表达式类、Term项类、Token类、Const常量因子类、Var变量因子类和Factor因子接口等,其中Token类中采用了Type枚举输入input中的一些不同的Token(可以理解为作为运算或符号的 “单元” )(例如ADD(+)、SUB(-)、MUL(*)、LPAREN(()、RPAREN())、POW(^)、NUM、VAR(x)、BLANK( || \t)等)。因此Lexer初始化时做的就是将输入字符串进行词法分析得到相应的Token类别分布并装入动态数组中,此外在lexer类中设置当前语法分析到的位置index和获取当前位置的Token、移动到下一个位置和判断当前是否到Tok ...
OS_lab1
lab1实验报告思考题Thinking 1.1题面1在阅读附录中的编译链接详解以及本章内容后,尝试分别使用实验环境中的原生 x86 工具链(gcc、ld、readelf、objdump 等)和 MIPS 交叉编译工具链(带有mips-linux-gnu- 前缀,如 mips-linux-gnu-gcc、mips-linux-gnu-ld),重复其中的编译和解析过程,观察相应的结果,并解释其中向 objdump 传入的参数的含义。
回答作为GNU binutils工具集中一个重要成员,objdump命令的语法格式为:
1objdump [options] <filename>
其中常用的[options]即参数有-d、-D、-S、-C等:
作用
参数
将目标文件中的机器码反汇编成汇编指令,一般用于查看程序的执行逻辑
-d
与-d选项类似,但反汇编范围更大,-d只反汇编.txet段,但-D反汇编所有段(只要其看起来像包含可执行代码或可被反汇编的)。
-D
混合显示源码和汇编代码,记得该选项需要在编译时使用-g选项生成调试信息。
-S
将Cpp符号名逆 ...
OS理论
OS理论王道刷题重点
进程切换时,需进行上下文切换,完成:1).将当前CPU中各寄存器的内容存到当前进程的PCB中;2).将新进程的现场信息装入CPU各个寄存器;3).将控制转至新进程,即更新程序计数器、用来指明系统内核栈位置的寄存器——栈基址寄存器和指明当前进程顶级页表基地址(这里指的是物理地址)的寄存器——页表基址寄存器。
死锁产生的四个必要条件:互斥条件、请求并保持条件、不可剥夺条件和循环等待条件。
死锁处理策略:死锁预防(破坏必要条件,可以确保不发生死锁现象)、死锁避免(资源动态分配,防止进入死锁状态,银行家算法不能判断系统当前是否处于死锁状态)、死锁检测(允许发生死锁,采取措施解除)
在具有对换功能的OS中,通常将外存分为文件区和对换区,前者存放文件,后者存放从内存换出的进程。抖动现象指刚被换出的页很快又要被访问,而又要被换出其他页,而该页又很快又要被访问,如此频繁地置换页面导致大部分时间花在页面置换上,使系统性能下降。撤销部分进程可减少要用到的页面数,防止抖动。
采用连续分配方式,使很大的一部分内存处于暂时或“永久”的空闲状态,造成内存资源浪费,无法从逻辑上扩大内存容量,因 ...


