1操作系统课程设计报告学院:计算机科学与技术学院班级:13计基地姓名:学号:20130030XXXX2目录一、Nachos综述.........................................................................................................3二、具体试验要求........................................................................................................32.1Project1:建立线程系统............................................................................32.1.1Task1.1实现KThread.join()......................................................32.1.2Task1.2实现条件变量...................................................................52.1.3Task1.3完成Alarm类...................................................................62.1.4Task1.4条件变量实现同步消息...................................................82.1.5Task1.5实现优先级调度.............................................................112.1.6Task1.6条件变量解决过河问题.................................................132.2Project2多道程序设计.............................................................................182.2.1Task2.1实现文件系统调用........................................................182.2.2Task2.2完成对多道程序的支持................................................232.2.3Task2.3实现系统调用................................................................262.2.4Task2.4实现彩票调度................................................................31三、收获与感悟..........................................................................................................341.理解操作系统设计原则..................................................................................342.了解操作系统的模块层次设计......................................................................343.理解调度算法..................................................................................................354.理解进程同步与互斥......................................................................................355.理解文件系统..................................................................................................366.感想..................................................................................................................363一、Nachos综述Nachos是一款教学用的操作系统平台,它的全名叫做NotAnotherCompletelyHeuristicOperatingSystem“,Nachos的运行必须借助于宿主机,它通过软件模拟了各种硬件系统,包括中断系统、存储系统、磁盘文件、网络等。它的运行是可以跟踪的,因此,我们可以一步一步的观察操作系统是如何运行的。Nachos操作系统本身只提供了一套框架,很多地方的实现都需要我们自己来完善,因此我们可以通过修改其源代码,来丰富和增强Nachos操作系统的功能.更可以在完善这些功能的同时,了解操作系统的内部运行机制。二、具体试验要求2.1Project1:建立线程系统2.1.1Task1.1:实现KThread.join()1.题目要求实现ImplementKThread.join()函数。其它的线程不必调用join函数,但是如果join()函数被调用的话,也只能被调用一次。对join()函数第二次调用的执行结果是不被定义的,即使第二次调用的线程与第一次调用的线程不同。无论有没有被join,一个进程都能够正常结束。2.题目分析与实现方案分析:join函数的作用即为等待调用此函数线程运行完毕。当前线程A调用另一个线程(处于就绪状态)B的join函数时,即A执行B.join()时(A和B在Nachos中均为KThread类型对象),A被挂起,直到B运行结束后,join函数返回,A才能继续运行。如果这个线程已经结束,马上返回。且join()函数只能被调用一次,第二次调用不能保证返回,且调用join()函数的线程必须不能是当前线程。join()函数结束时唤醒在等待队列中的所有线程,因此需要实现join()方法和修改finish()方法。方案:(1)KThread的join()中的Lib.assertTrue(this!=currentThread)已经实现线程只能调用一次join()方法,根据要求,在调用join()方法时,让当前运行线程休眠,并将当前运行的线程加入到一个阻塞队列中。(2)在线程结束时,finish()函数循环唤醒所有被阻塞的线程。finish()函数在run()函数返回时自动调用,同样可以被直接调用。但当前唯一运行的线4程不能被finish()函数立即结束,只有当其他线程运行时才可结束。3.关键点与难点由于java派生于抽象类的对象无法实例化,在运行时很可能出现空指针异常。只能直接利用抽象类的对象调用相关方法。4.实现代码publicvoidjoin(){Lib.debug(dbgThread,Joiningtothread:+toString());Lib.assertTrue(this!=currentThread);//判断要调用的进程是否为当前进程booleanintStatus=Machine.interrupt().disable();//系统关中断if(status!=statusFinished){waitForJoin.waitForAccess(currentThread);//调用另一个要调用的进程KThread.sleep();//当前进程睡眠等待被调用进程结束}}publicstaticvoidfinish(){Lib.debug(dbgThread,Finishingthread:+currentThread.toString());Machine.interrupt().disable();//系统关中断Machine.autoGrader().finishingCurrentThread();//当前进程运行结束的标志Lib.assertTrue(toBeDestroyed==null);toBeDestroyed=currentThread;//表示当前进程要结束了currentThread.status=statusFinished;//当前进程的状态被修改为运行结束KThreadwaitThread=currentThread.waitForJoin.nextThread();//调用等待队列上的第一个进程while(waitThread!=null){waitThread.ready();//唤醒等待队列上所有被阻塞的进程}sleep();}52.1.2Task1.2实现条件变量1.题目要求利用中断有效和无效所提供的原子性直接实现条件变量。我们已经提供类似的例子实例实现信号量。你要按此提供类似的条件变量的实现,不能直接利用信号量来实现(你可以使用lock,虽然它间接地调用了信号量)。在你完成时要提供条件变量的两种实现方法。你的第二种条件变量实现要放在nachos.threads.Condition2中。2.题目分析与实现方案分析:条件变量使我们可以睡眠等待某种条件出现,是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待条件变量的条件成立而挂起;另一个线程使条件成立(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。方案:threads.Lock类提供了锁以保证互斥。在临界代码区的两端执行Lock.acquire()和Lock.release()即可保证同时只有一个线程访问临界代码区。条件变量建立在锁之上,由threads.Condition实现,用来保证同步。每一个条件变量拥有一个锁变量。(1)sleep()在条件变量的控制下sleep()函数自动释放相关锁并进入睡眠状态,直到令一个线程用wake()唤醒它,需要在函数的开始和结尾处关或允许中断保证原子性。当前线程必须拥有相关锁,阻塞进程在sleep()函数返回之前线程将会自动再次拥有锁。即调用这个方法的线程将自己挂起到等待队列,阻塞自己的同时将自己拥有的锁交出去,之后等待锁的分配。拿到锁的线程再次拥有权限接受检验。(2)wake()唤醒条件变量队列中第一个线程,在试验中利用从线程队列中取出线程用KThread.ready()实现唤醒,加入就绪队列。(同样要在wake函数利用中断保证原子性)(3)wakeall()函数的实现依赖于wake()。只需不断地wake挂在条件变量上的线程直到队列为空为止。3.关键点与难点题目要求直接实现条件变量,不能直接利用信号量。所以互斥锁必须要有,它是线程们有秩序的接受条件变量检验的保证。等待队列必须要有,不满足条件的线程都要挂在上面。64.实现代码publicvoidsleep(){Lib.assertTrue(conditionLock.isHeldByCurrentThread());booleanintStatus=Machine.interrupt().disable();//系统关中断waitQueue.waitForAccess(KThread.currentThread());//将进程挂到等待队列上去conditionLock.release();//进程将锁释放出去KThread.sleep();conditionLock.acquire();//处于就绪队列的线程获取锁,然后进行操作Machine.interrupt().restore(