欢迎来到天天文库
浏览记录
ID:10580467
大小:1.31 MB
页数:0页
时间:2018-07-07
《北大操作系统nachos实习报告——第一部分线程机制实习》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、线程机制实习报告姓名:马亮学号:1001210767日期:2011年4月4日21目录内容一:总体概述3内容二:任务完成情况3任务完成列表(Y/N)3具体Exercise的完成情况3内容三:遇到的困难以及解决方法20内容四:收获及感想20内容五:对课程的意见和建议20内容六:参考文献2121内容一:总体概述通过为期四周的进程部分的实习,使得我对进程的状态转换、调度、同步和互斥、进程间通信等原理有了更为直观的感受,加深了对于理论的理解。通过动手做的过程,将书本上的理论知识转化为代码的实现,能够很好的巩固这些知识点。对于之前不甚了解的管程和条件变量等概念,也通过实验
2、和教材阅读有了更好的掌握。重新捡起荒废了多年的C++,实验的过程还能帮助我重新掌握C++编程,受益匪浅。内容二:任务完成情况任务完成列表(Y/N)Exercise1Exercise2Exercise3Exercise4Exercise5Exercise6第一周YYY第二周YYY第三周Y第四周NNNYNN具体Exercise的完成情况第一周Exercise1增加“用户ID、线程ID”两个数据成员,同时在Nachos现有的线程管理机制中增加对这两个数据成员的维护机制。增加“挂起(suspending)”状态,即可以将当前线程映像保存在磁盘文件而不是内存中。设计思想
3、线程ID从0开始递增,线程结束后它所使用的ID应该被收回,以便分配给新的线程。为实现上面的设想,用一个整数数组ThreadID来标识线程ID的分配情况,ThreadID[0]为1表示0号线程ID已经分配,否则表示未分配。新线程建立时从下标0开始依次向后遍历数组,找到第一个可使用的线程ID(数组元素值为0的下标),分配此线程ID,并将数组元素值置1。线程结束时需要将它的ID对应下标的值置0,以便将此ID重复利用。修改代码Thread.h中声明private的成员变量uid、tid,声明public的成员方法getThreadID(),getUserID()21在
4、system.h中声明全局数组变量ThreadID,用来存储线程ID的分配情况:在system.cc中增加ThreadID的声明:在Initialize方法中对ThreadID数组进行初始化:在Thread.cc中的构造函数和析构函数中增加获取线程ID和释放线程ID的代码:21在Thread.cc中增加获取当前线程ID和用户ID的方法getThreadID()、getUserID()对于用户ID,由于系统中不存在用户的概念,暂且只增加用户ID的声明和获取方法,不实现具体的操作系统用户功能。对于增加“挂起(suspending)”状态,只需修改thread.h中
5、的ThreadStatus枚举常量,增加SUSPENDING状态即可,具体的功能实现由于还未涉及到磁盘操作,暂不实现:运行效果为了体现进程ID的修改效果,ThreadTest测试类SimpleThread方法中输出线程编号时改为通过currentThread->getThreadID()来获得,而不是通过传入的which来获得:同时多加几个线程:21运行效果如下:可看到通过currentThread->getThreadID()可获得正确的ID值。……Exercise2在Nachos中增加对线程数量的限制,使得Nachos中最多能够同时存在128个用户线程。2
6、1设计思想增加全局变量threadCount,对在运行的线程进行计数,线程Fork时threadCount++,并判断是否超出最大线程数,超出的话直接返回,不执行接下来的分配存储空间等操作。Finish时threadCount--。修改代码System.h中增加全局变量System.cc中初始化Thread类的Fork函数和Finish函数中对其值进行操作21运行效果修改MAX_THREAD_COUNT的值为2,运行四个线程:输出结果如下:可见线程3、4因为到达系统线程上限而没有运行,达到预期效果。Exercise3修改线程调度算法,实现基于优先级的抢占式调度
7、算法。设计思想从nachos系统的scheduler.cc文件中可看出Nachos实现了先进先出(FIFO)的调度算法。调度类Scheduler管理这一个就绪队列list,它的成员函数ReadyToRun(Thread*thread)将指定线程插入到队列的队尾。它的另一个成员函数FindNextToRun()则从list队首摘出一个就绪线程准备运行。21为了实现基于优先级的抢占式调度算法,首先给线程增加priority属性,规定最高优先级为0,最低为10。通过修改Scheduler类的ReadyToRun方法,使得线程按照优先级的顺序插入就绪队列相应的位置。修
8、改Thread类的Yield方法,使得
此文档下载收益归作者所有