实验目的
1.理解操作系统的概念和内在结构。
2.理解操作系统代码的实现。
3.锻炼真实操作系统的设计,提高自己的编程能力。
实验内容
第一部分 进程同步管理(实验3)
这个实验的本质是实现生产者——消费者问题。在进程的同步问题中,生产者——消费者问题是比较简单的一个,主要思想是使用缓冲区的概念,并把信号量的机制用于控制程序对临界区进行操作。Nachos系统要我们实现的是单个环形缓冲区,单生产者多消费者模式,于是需要的信号量有3个,mutex用来控制临界区,nempty和nfull控制缓冲区的空闲与占用情况。以消费者为例,获取资源、写入缓冲区的模式为:
empty->P();
mutex->P();
ring->Put(message);
mutex->V();
nfull->V();
消费者的模式恰好相反,原理上是相同的,只是需要用创建线程的方法产生多个消费者。实验的过程总体比较顺利,只是需要注意的是随机数种子的设定,Nachos提供了随机数的产生方法,但是一开始我没有注意,导致生成的文件总是出现一个文件全是记录,另一个却为空的情况。
第二部分 文件管理(实验4, 5)
实验4主要是用来熟悉Nachos文件系统的常用命令,格式化磁盘,显示文件内容,复制文件等命令的执行比较简单。实验5才是真正考验对文件系统理解的部分。实验指导书给出的问题很简单:让Nachos文件系统具备可扩展性,但是要想实现这个功能需要做的工作很多,因为文件系统是一个多部分协同配合的系统,更改一个地方牵扯很多文件的修改。而且实验的环境是lab5文件夹,而原始文件夹filesys的内容不能全部复制到lab5文件夹中,这就需要确定需要复制哪些文件。一开始我没有什么思路,因为这样的修改任务之前没有遇到过,后来在同学的帮助下逐渐理解了整个Nachos文件系统的结构。
实验指导书提示了我们文件系统各模块的相互依赖关系,于是我开始顺着这个思路去走,打开这几个文件,找出它们所起的真正作用。directory用于管理文件名和扇区的对应关系,filehdr用于管理文件头,filesys用于宏观管理文件系统, openfile用于对文件执行具体操作,synchdisk用于控制磁盘的同步。确定了这些模块的作用后,就可以确定哪些模块是这个实验所必需的了。这个实验需要保证文件头、文件所在扇区以及具体操作,所以synchdisk就不需要复制到lab5文件夹里面了。
接下来的工作便是文件系统的具体修改工作。要使得文件系统具有扩展大小的功能,首先需要让文件头具备扩展功能。于是需要修改filehdr.cc,添加AppendSector方法,大体思想也比较简单,也就是利用bitMap自带函数Find的寻找空闲扇区的方法。让文件真正具有扩展功能的关键是openfile.cc,因为它才是文件系统的执行者。在openfile.cc文件中,OpenFile类中加入用于追加文件的AppFileSize方法。这个方法首先获取空闲的扇区,构造BitMap对象,传给FileHeader类的对象(也就是这个OpenFile的文件头),执行AppendSectors方法,扩大文件的长度。最后添加WriteBack和Append方法即可。
这个实验花费的时间相对较长,却是在我操作系统实验过程中收获最大的一个。依赖关系的处理,多文件的相互制约以及文件系统的管理方式,这些都值得花时间再去领悟一番。
第三部分 内存管理与系统调用(实验6, 7, 8)
实验6与实验4类似,属于体验型实验,对Nachos系统的内存分页机制有一个初步的了解。实验7是对内存管理中对于地址的扩展,要求新的Nachos系统具备多用户程序运行的功能。Nachos不能实现多用户程序的根本原因是AddrSpace在分配内存时是直接从0号内存地址开始分配,所以解决的办法是利用bitmap找到空闲内存分配给所需进程,修改之后内存是用位图的Find函数来寻找空闲的地址,而且让数据和代码以扇区方式存储,这样就避免了新进程占用老进程地址空间的情况。 实验8则是在实验7的基础上加入了异常处理机制,在exception.cc中添加SC_Exec异常,存放要执行的文件的路径的字符串的首地址存放在4号寄存器中,因此可以通过这个方式找到文件的路径,从而使用文件系统提供的方法打开这个文件。整体而言实验8比实验7简单一些,因为实验7中有许多需要注意的细节,比如静态变量的使用,以及交叉编译的思想等等,都需要通过实验来体会。
实验体会
上学期我们学习了操作系统这门课,当时的实验以具体的算法为主;而这学期的课程设计则是一次真正的考验,因为我们接触的是修改已有的操作系统——Nachos,尽管这个系统还比较粗糙。在为期两个多月的实验中,我体会到了操作系统的核心概念和思想,对于进程管理、文件管理、内存管理这些老生常谈的理论有了实践的积累。所有的实验都是基于Linux条件下进行的,这样就更能锻炼我们Linux环境下程序设计与调试的能力。整体而言实验的难度不小,更强调代码的实现而不是算法的设计。在今后的学习中,我会更加清晰地认识操作系统,并把操作系统的知识运用到今后应用的各个领域,同时Linux系统的实践也会让我对项目的开发与维护有全新的认识,帮助我的工作能力的提升。