theme update
发现之前 butterfly主题安装在了 node_modules 文件夹下,想要升级 git pull 不了,所以重新安装了主题。
安装 butterfly 主题
git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly# 以后更新仅需在主题目录下,运行 git pull
BUAA OO 课程总结
当开始写这个文档的时候,我真正意识到当我完成它后 OO 就结课啦,内心有些不舍和茫然。非常感谢 OO 课程为我打下了面向对象的基石,接下来的路需要自己去探索啦 ~
unit1——递归下降
架构设计思维
思维上从面向过程进入面向对象阶段。对象是指把逻辑聚合的数据和函数形成物理聚合,这方便了我们按照数据的处理流程、状态变化和处理层次来进行处理。第一单元是利用递归下降算法处理表达式,形式化语言描述让表达式结构一目了然。抽象层次结构利用继承和接口,通过对一组类共性行为的抽取结果使行为设计和行为实现相分离,减少代码冗余性。在第一单元设计中,表达式由项组成,项由因子组成,因子包括常量因子、变量因子等,可建立抽象层次,都实现 factor interface,简化引用并抽象出所有实现共性的接口(向下重用和扩展)。
测试思维
测试主要是通过评测机实现,python库中有 sympy ,正确性比对比较方便。另外按照形式化语言表述,对数据类型进行划分,形成输入划分层次树,做到覆盖性测试;观察数据范围,测试边界情形,逐步增大数据大小,进行压力测试,从而优化时间性能以及找出bug。
unit2——多线程设计
...
Lab5
关键词:文件系统,IDE磁盘,磁盘驱动
实验内容
概览
外部存储设备驱动:实现 IDE 磁盘的用户态驱动程序,该驱动程序将通过系统调用的方式陷入内核,对磁盘镜像进行读写。
文件系统结构:实现模拟磁盘的驱动程序以及磁盘上和操作系统中的文件系统结构,并实现文件系统操作的相关函数。
文件系统的用户接口:为用户提供接口和机制使得用户程序能够使用文件系统,这主要通过一个用户态的文件系统服务来实现。
文件系统
尽管进程运行时可以在它的地址存储空间存储一定量的信息,但存在:(1) 存储容量受虚拟地址空间大小限制,(2) 进程终止后信息丢失,(3) 不能让多个进程并发访问相关信息,等缺陷。而文件是对磁盘的建模,可以实现长期存储信息。
设备,MMIO与操作系统对设备的控制
CPU(程序) 通过读写设备上的寄存器来和设备进行通信
MIPS 体系结构使用 **MMIO(内存映射 IO)**机制访问设备寄存器
MMIO 使用不同的物理内存地址给设备寄存器编址。这种编址方式将一部分对物理内存的访问"重定向"到设备地址空间中, CPU尝试访问这部分物理内存的时候, 实际上最终是访 ...
BUAA OO Unit4 UML模型的验证与测试
StarUML 使用
统一建模语言(UML)是一种提供针对性、分离的结构与行为描述手段而且可以将描述元素整合起来的语言。
UML 可以通过多种描述视角提供语法明确、语义清晰的可视化图示语言,相对成熟。在复杂大型项目中可使用 UML 建立可视化模型来方便开发人员和用户之间的交流及系统维护。
本单元作业要求我们实现图书馆系统设计的类图、状态图和顺序图。以下仅简单描述我在使用 StarUML 完成作业时遇到的问题:
作为初学者使用 StarUML 较为常见的问题:删除某个元素时 delete 表示仅在 diagram 中不显示,完全删除需要 delete from model。
绘制状态图时,在某个 transition 中添加 trigger,需要右击 transition 后 add,并修改 trigger 的 name。
绘制顺序图时,需要在 Lifeline 相应的 role 里修改 type 属性 。
需求分析
实现一个图书馆模拟系统
hw13:
三类借阅和预定规则不同的书籍
图书馆内有五类 staff:借还管理员(负责B类书的借还和书籍损坏丢失的惩罚)、自助机器(查询余 ...
Lab6
Keywords:管道,shell
管道
共享内存和管道都是进程间通信(IPC)的方式。管道分为有名管道(可以在任意两个进程之间通信)和匿名管道(只能在具有公共祖先的进程之间使用,通常是在父子进程之间)。
MOS实验中仅要求实现匿名管道
Unix 中的匿名管道
#include <unistd.h>int pipe(int fd[2]);
在 Unix 中,管道由 int pipe(int fd[2]) 函数创建,成功创建管道返回 0,参数中的 fd用来保存读写端的文件描述符,fd[0] 对应读端,fd[1] 对应写端。通常,调用 pipe 的进程接着调用 fork,这样就创建了从父进程到子进程(或反向)的IPC通道。
匿名管道特点:
数据单向流动,具有固定的读端和写端
只能用于具有公共祖先的进程之间通信,实现依赖于父子进程文件共享
是一种只存在于内存中的文件。父进程调用 pipe函数时,会打开两个新的文件描述符:一个表示只读端,另一个表示只写端,两个描述符都映射到了同一片内存区域。在 fork 的配合下,子进程复制父进程的两个文件描述符,从而在父子进程间形成了四个(父子 ...
Lab4
用户程序启动的流程
user.lds用户程序的链接脚本:加载 .text, .data , .bss 至 0x00400000,设定用户程序的入口为 _start。
entry.S: user\lib,用户程序main函数运行时需要两个参数,跳转至libmain。
libmain: libos.c,设置 env ,使得用户可以访问到当前进程的进程控制块;跳转至 main 主函数;exit 系统调用结束当前进程的运行。
系统调用 - 8号异常
系统调用过程
1. 用户程序使用 syscall_* 接口
用户程序调用 syscall_* 函数接口。
syscall_*将实现系统调用所需的参数作为 msyscall 的传入参数,在调用 msyscall 时,会自动将参数(第一个参数为系统调用号)存入寄存器和用户栈(内核后续可以访问这些参数)。此处的自动理解为存储过程编译器会自动编译为汇编代码,我们只需要在内核中显示地从保存的用户上下文中获取函数的参数
msyscall 中 执行 syscall 指令使 CPU 陷入内核态完成系统调用;在返回用户态继续运行此函数时,执行 jr ra 指令返回 ...
BUAA OO Unit3 基于规格的层次化设计
前言
这是2021级BUAA 面向对象课程第三单元实验——基于规格的层次化设计的博客总结。
架构设计
本单元作业需要根据 JML 规格描述实现一个社交关系模拟系统,需要阅读JML,实现高效图算法以及异常处理。下面主要从各单元图算法实现进行分析。
首先阅读 JML 发现许多方法需要通过 id 得到 person ,容易想到用 HashMap 进行存储。
hw9 —— 查询连通性和三角形关系数
通过阅读 JML 发现在 Network 类的 isCircle 方法查询给定两点的连通性, queryBlockSum 方法查询连通块数量,这显然可以通过并查集实现。为了体现类的封装性,我在 DisjointSet 类内实现了并查集的相关操作。
三角形关系数是指三人互为熟人。如果暴力求解,时间复杂度为 O(N3)O(N^3)O(N3) ,显然会 TLE。实际上这可以通过加边时的动态维护实现:
在每次 addRelation 时,枚举除了 id1 和 id2 的所有人,若他们与二人分别有边,则关系数加1。
我们还可以进一步优化上述 O(N) 的维护算法。我们通过 BitSet 维护每个 Pe ...
Lab3
keywords:进程,异常
进程
一个进程就是一个正在执行程序的实例,包括程序计数器、寄存器和变量的当前值。从概念上说,每个进程拥有它自己的虚拟CPU,实际上真正的CPU在各个进程之间来回切换。
由于没有实现线程,本实验中进程既是基本的分配单元,也是基本的执行单元。
进程控制块(PCB)
进程的三种状态
运行态(该时刻进程实际占用CPU)
就绪态(可运行,但因为其他进程正在运行而暂时停止)
阻塞态(除非某种外部事件发生,否则进程不能运行)
进程控制块 (PCB) 是系统专门设置用来管理进程的数据结构,它可以记录进程的外部特征,描述进程的变化过程。
在 MOS 中,PCB 由一个 Env 结构体实现。
struct Env { struct Trapframe env_tf; // Saved registers // env_tf: Trapframe 在include/trap.h中定义,在发生进程调度或当陷入内核时,会将当时的进程上下文环境(CP0)保存在env_tf变量中 LIST_ENTRY(Env) env_link; // Free list / ...
BUAA OO Unit2 多线程实时电梯系统
基于Pipeline模式的架构设计
Pipeline 模式也称为流水线模式。将一个任务处理分解为若干个处理阶段,其中每个处理阶段的输出作为下一个处理阶段的输入,并且各个处理阶段都有相应的工作者线程去执行相应的计算。
hw5 需求分析
模拟多线程实时电梯系统。系统从标准输入中输入请求信息,程序进行接收和处理,模拟电梯运行,将必要的运行信息通过输出接口进行输出。 具体而言,本次作业电梯系统具有的功能为:上下行,开关门,以及模拟乘客的进出。
输入输出定义:
输入:[时间戳]ID-FROM-x-TO-y:乘客从x层到y层
输出:[时间戳]电梯ID-动作
电梯动作:开门、关门、到达楼层
乘客动作:进入、离开电梯
电梯:
电梯各项参数静态不可变(运行速度、开关门耗时、限乘人数、楼层数、初始位置)
6部电梯
线程的设计。系统获取请求,由调度器进行分配,电梯处理请求。考虑请求输入装置、电梯和调度器是线程的Pipeline 模式的架构设计,以及如何实现线程交互。
电梯调度策略。电梯调度策略是指把请求分配各电梯时采取的策略,需要综合考虑电梯总运行时间、耗电量和最长等待时间 ...
BUAA OS Lab2实验报告
Lab2 实验报告
关键词:物理内存的管理方法(链表法),虚拟内存的管理方法(两级页表法),TLB清除与重填
思考题
2.1 请根据上述说明,回答问题:在编写的 C 程序中,指针变量中存储的地址是虚拟地址,还是物理地址?MIPS 汇编程序中 lw 和 sw 使用的是虚拟地址,还是物理地址?
均为虚拟地址
2.2 请思考下述两个问题:① 从可重用性的角度,阐述用宏来实现链表的好处。②查看实验环境中的 /usr/include/sys/queue.h,了解其中单向链表与循环链表的实现,比较它们与本实验中使用的双向链表,分析三者在插入与删除操作上的性能差异。
① 实现了C语言不支持的泛型。宏函数参数type的使用实现自定义数据类型的链表,通过各种宏定义实现链表的基本操作。
C++ 中可以使用 std::stack 定义一个类型为 T 的栈,Java 中可以使用 HashMap<K,V>
定义一个键类型为 K 且值类型为 V 的哈希表。这种模式称为泛型,C 语言并没有泛型的语法,因
此需要通过宏另辟蹊径来实现泛型。
②
插入操作
删除操作
单向链表
头部插入O( ...