- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
北大操作系统nachos实习报告——第一部分线程机制实习
线程机制实习报告
姓名:马亮 学号:1001210767
日期:2011年4月4日
目录
内容一:总体概述 3
内容二:任务完成情况 3
任务完成列表(Y/N) 3
具体Exercise的完成情况 3
内容三:遇到的困难以及解决方法 20
内容四:收获及感想 20
内容五:对课程的意见和建议 20
内容六:参考文献 21
内容一:总体概述
通过为期四周的进程部分的实习,使得我对进程的状态转换、调度、同步和互斥、进程间通信等原理有了更为直观的感受,加深了对于理论的理解。通过动手做的过程,将书本上的理论知识转化为代码的实现,能够很好的巩固这些知识点。
对于之前不甚了解的管程和条件变量等概念,也通过实验和教材阅读有了更好的掌握。重新捡起荒废了多年的C++,实验的过程还能帮助我重新掌握C++编程,受益匪浅。
内容二:任务完成情况
任务完成列表(Y/N)
Exercise1 Exercise2 Exercise3 Exercise4 Exercise5 Exercise6 第一周 Y Y Y 第二周 Y Y Y 第三周 Y 第四周 N N N Y N N
具体Exercise的完成情况
第一周
Exercise1
增加“用户 ID、线程 ID”两个数据成员,同时在 Nachos 现有的线程管理机制中增加对这两个数据成员的维护机制。增加“挂起(suspending) ”状态,即可以将当前线程映像保存在磁盘文件而不是内存中。
设计思想
线程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()
在system.h中声明全局数组变量ThreadID,用来存储线程ID的分配情况:
在system.cc中增加ThreadID的声明:
在Initialize方法中对ThreadID数组进行初始化:
在Thread.cc中的构造函数和析构函数中增加获取线程ID和释放线程ID的代码:
在Thread.cc中增加获取当前线程ID和用户ID的方法getThreadID()、getUserID()
对于用户ID,由于系统中不存在用户的概念,暂且只增加用户ID的声明和获取方法,不实现具体的操作系统用户功能。
对于增加“挂起(suspending) ”状态,只需修改thread.h中的ThreadStatus枚举常量,增加SUSPENDING状态即可,具体的功能实现由于还未涉及到磁盘操作,暂不实现:
运行效果
为了体现进程ID的修改效果,ThreadTest测试类SimpleThread方法中输出线程编号时改为通过currentThread-getThreadID()来获得,而不是通过传入的which来获得:
同时多加几个线程:
运行效果如下:
可看到通过currentThread-getThreadID()可获得正确的ID值。
……
Exercise2
在 Nachos 中增加对线程数量的限制, 使得 Nachos 中最多能够同时存在 128 个用户线程。
设计思想
增加全局变量threadCount,对在运行的线程进行计数,线程Fork时threadCount++,并判断是否超出最大线程数,超出的话直接返回,不执行接下来的分配存储空间等操作。Finish时threadCount--。
修改代码
System.h中增加全局变量
System.cc中初始化
Thread类的Fork函数和Finish函数中对其值进行操作
运行效果
修改MAX_THREAD_COUNT的值为2,运行四个线程:
输出结果如下:
可见线程3、4因为到达系统线程上限而没有运行,达到预期效果。
Exercise3
修改线程调度算法,实现基于优先级的抢占式调度算法。
设计思想
从nachos系统的scheduler.cc文件中可看出Nachos实现了先进先出(FIFO)的调度算法。调度类Scheduler管理这一个就绪队列list,它的成员函数ReadyToRun (Thread *thread)将指定线程插入到队列的队尾。它的另一个成员函数FindNextToRun ()则从list队首摘出一个就绪线程准备运行。
为了实现基于优先
原创力文档


文档评论(0)