由于大家的操作系统设计思想都不一样,直接贴代码也没什么意思,就简单记录下自己的思路吧。

实验一

这个实验就是搭建环境,分析一下源码各个文件的作用。没什么好记录的。

实验二 具有优先级的线程调度

个人感觉这个实验比较简单。

  • 修改thread文件,为线程增加成员优先级以及相应的set、get函数。按照自己的设计来就行
  • 修改scheduler文件, 使得等待队列按照优先级将线程排序,而不是之前的直接插入。
  • 修改ThreadTest文件,按照自己的设计改测试函数

PS:优先级调度分抢占式和非抢占式的。按照上面来只能实现非抢占式的,至于抢占式的的实现,估计还得修改machine下面的Interrupt文件。

实验三 信号量

实验比较简单,信号量的实现已经很明白了,直接拿来用就可。

prodcons++文件里面要改的地方也有英文的代码注释,很清晰。比如:

实验四 扩展文件

实验四和实验五就是有关文件系统的了,难度明显比之前的要大。

这个实验主要改的就是filehdr和openfile。

filehdr文件

这个类相当于inode,记录了文件基本信息。包括大小、占用了几个扇区、内容分别放在哪些扇区中。

openfile文件

用于实现文件的打开、读入等,使用一个filehdr对象。

  • filehdr中就是多了扩充文件大小的函数,为了方便,还加了设置文件长度的函数。
  • openfile中要新加一个inode请求空间函数,还加了WriteBack函数,用于将hdr修会磁盘
  • openfile中要根据以上两步的修改,重写WriteAt函数

实验五 二级索引

这个我是在实验四的基础上就地修改的,只需要改filehdr。这个实现方案能百度到一大堆,我就记录下我的。
引入了一个新的类subhdr,基本成员类似于filehdr。原来的filehdr中的数组留出一个int的大小。数组前面的仍然为一级,最后一个指向的扇区是subhdr对象的扇区。

其实也可以直接最后一个指向filehdr对象,这样就实现了多级索引,就是类似于链表的实现,但是估计很出很多bug,有创新意识的读者可以试下。

这样子确定好思路后,就可以改.cc文件了,可以说是全部重写一遍了,除了FetchFromWriteBackFileLength,所有方法都改了,还需要根据你的设计重新定义宏。但说白了就是按照一级二级的边界划分改就行,就多了几个判断条件多了几种可能的情况罢了。
逻辑理清楚了,改的时候就很简单了,但是一定要仔细,我就是忘了改一个边界条件导致一用到二级的时候就报段错误,核心已转储,还不知道哪里错了,这是最要命的。(就是太菜了,一个bug在眼前就是看不出来。。。)

实验六

这两个实验都是关于内存管理的。

交叉编译环境的注意事项

我在按照实验指导书的步骤来,是获得不了Nachos下的用户可执行程序的,make时报错如下:

所以,我查看了../bin/arch/unknown-i386-linux/bin/这个目录,发现两个可执行文件都是没有可执行权限的:

这样子Permission denied是理所当然的了,所以要先给他们可执行的权限
命令:chmod 764 *。再次make,就OK了。

这个实验考察两个方面,一是内存中要有多个程序驻留,二是系统调用Exec的实现。这两个要求是相辅相成。一是二的基础,二是一实现的证明。
先说要求一,就是重新设计分配内存方案,目录中也有bitmap文件,就明示要用位图来记录,当然位图一个就ok,要么声明称全局变量,要么声明成AddrSpace的静态属性,我选了后者,因为前者要改别的文件,怕改乱了,再牵扯到其他实验。
要求二也很直白了,就是改exception.cc实现Exec的处理,就是要注意文件名的获得和PC的推进。(我就是忽视了这个,之前一直陷入死循环找不出错)。

实验七

我的思想是固定分配 + 局部置换的策略。
看TranslateEntry类中用usedirty,而且注释中也是写明了通过这两个位可以构造虚拟内存,很明显是在提示用二次机会法。不过,用其他的牺牲页面选择方法(比如FIFO、LRU)也是可行的。
(上学期,h老师说二次机会法只需要两次循环,但我总是觉得是三次循环,没怎么想明白,有明白的小伙伴可以在下方留言,万分感谢)
写代码的时候,要注意的倒不是操作系统方面的问题,反倒是C++的语法问题(没办法就是菜。。。)

  1. 在AddrSpace的构造函数中,不仅要通过file = executable;来保存可执行文件,还要在progtest文件中,将delete exectuable注释掉。
  2. 在二次机会法中,是不能将虚拟地址直接作为文件中的位置的。而且要根据数据类型(代码、初始化数据、未初始化数据、堆栈)的不同分别与原始可执行文件或者交换区文件进行页面的换入换出,就是说要修改TranslateEntry进行类型区别。

操作系统Nachos总结相关推荐

  1. 操作系统NACHOS实验(二)具有优先级的线程调度

    操作系统NACHOS实验(二)具有优先级的线程调度 实验思路 关键源代码注释及说明 调试记录 可能会有一些小错误,但是基本思路应该还是没问题的. 实验思路 首先找到控制线程调度的代码 schedule ...

  2. 阿里巴巴2014年实习生校园招聘面经(复试)

    今天参加了阿里巴巴2014实习生校园招聘北京站的复试,也就是传说中的终面.趁还有印象,赶紧记录下来赚点访问量. 今年阿里的校园招聘经历了笔试,初面和复试.一共有两次面试,但是复试一下午进行了两轮. 初 ...

  3. 操作系统课设--NACHOS试验环境准备、安装与MAKEFILE分析

    山东大学操作系统课设lab1 实验一 NACHOS试验环境准备.安装与MAKEFILE分析(lab1) 实验环境: 分析记录: 1. 准备虚拟机下LINUX宿主操作系统环境 2. NACHOS实验代码 ...

  4. 山东大学软件学院操作系统课程设计(2021秋季,nachos)实验1

    〇.前言 这几天翻到自己去年做的课程设计,感觉当时理解得还是挺深的(之前一直没觉得自己写得多认真,现在读起来觉得,嗯,虽然我只负责一半的实验,但给我98分真的不亏/doge),三篇半实验报告写了近一万 ...

  5. 山东大学软件学院操作系统课程设计(2021秋季,nachos)实验6

    一.实验内容 二.源码分析 1. 理解nachos单线程地址映射机制 Machine::Run()中调用Machine::OneInstruction(Instruction *instr)逐条执行可 ...

  6. Nachos操作系统synch(lab3)

    这一篇来讲一下Nachos里面的同步 首先,在synch.h里面,定义了三种与同步有关的类:Semaphore,Lock,Condition,下面来分析一下这三种数据类型 Semaphore 其类型定 ...

  7. nachos操作系统(一)

    今天来了解一下整个系统的构成. nachos-3.4下有一个C++例子文件夹和一个code文件夹,code文件夹下才是程序的源码,总文件夹下的makefile呢,就是进入各个子文件夹,make他们自己 ...

  8. 山东大学软件学院操作系统课程设计(2021秋季,nachos)实验2

    一.实验内容 二.源码分析 1. 概述 与本实验密切相关的有4套.cc和.h文件,其中list文件提供通用的数据结构,在内核线程管理中作队列:thread文件描述TCB,并提供控制线程动作的方法:sc ...

  9. 【nachos】山东大学操作系统课设实验nachos系统(6)系统调用Exec()和Exit()

    实验目的 尝试实现系统调用Exec() 和 Exit() 实验步骤 需要注意,在前三个步骤不需要修改代码. 一.nachos中系统调用的实现机制 观察nachos/machine/machine,mi ...

  10. 操作系统课设--虚拟内存

    山东大学操作系统课设lab7 实验七 虚拟内存(lab7) 实验目的 实验环境 实验思路 关键源代码注释以及程序说明 调试记录 实验七 虚拟内存(lab7) 实验目的 在未实现虚拟内存管理之前,Nac ...

最新文章

  1. 《 面试又翻车了》这次竟然和 Random 有关?
  2. 华中农业大学Kenichi Tsuda团队诚聘植物-微生物互作、生物信息学博士后二名
  3. NUC972的BSP包的使用
  4. mysql忘记密码解决方法
  5. php 字符串的比较大小,PHP如何比较字符串的大小?
  6. the vm session was closed before any attempt to power it on
  7. 汇编学习笔记(4)-伪指令(MASM)
  8. 错误记录:Current request is not a multipart request
  9. ubuntu 16.04 Nginx源码部署安装
  10. 使用echarts3实现散点地图
  11. C++ 字节流与二进制字符串相互转换(一个简单的明文加解密程序)
  12. webgl 包围盒子
  13. kickstart-F
  14. VirtualBox 中的Centos如何安装VBoxGuestAdditions
  15. android Tencent x5webview截长图
  16. React小书没提到但是很有用的基础知识
  17. Docker Desktop安装
  18. ajax上传图片springmvc,springmvc ajax上传图片(jquery)
  19. 笔记本电脑连接加密无线路由器。
  20. flash加载脚本文件导致IE脚本错误 ,行53 ,字符3,缺少对象,代码0 , 怎么解决?

热门文章

  1. Tomcat设置编码方式
  2. awvs12 Server Exception_使用WebSocket搭建服务器server
  3. 【语音识别】基于DTW算法实现0~9数字含Matlab源码
  4. PreferenceActivity和PreferenceFragment对比
  5. windows8 初始界面和功能
  6. 高数 吉米多维奇 785
  7. Excel函数实战技巧精粹(三)常用函数之INDEX与MATCH组合详解
  8. 移动通信原理中信道的分类
  9. win98万能显卡驱动_万能显卡驱动下载
  10. 【基于物理的渲染(PBR)白皮书】(一) 开篇:PBR核心知识体系总结与概览