北大操作系统高级课程-陈向群作业-线程机制实习报告

发布时间:



线程机制实习报告



目录
内容一:总体概述..................................................................................................................3内容二:任务完成情况...........................................................................................................3
任务完成列表(Y/N.....................................................................................................3具体Exercise的完成情况................................................................................................3内容三:遇到的困难以及解决方法.......................................................................................7内容四:收获及感想..............................................................................................................7内容五:对课程的意见和建议...............................................................................................7内容六:参考文献..................................................................................................................8
2


内容一:总体概述
本次lab主要是对线程机制的学习和理解。首先,进程控制块(PCB)是进程存在的标志,系统利用PCB来控制和管理进程,所以PCB是系统感知进程存在的唯一标志。用它来记录进程的外部特征,描述进程的运动变化过程。Exercise1通过对不同系统的进程控制块的调研学习进程控制块在不同系统中的实现方式。
内容二:任务完成情况
任务完成列表(Y/N
完成情况
Exercise1
Y
Exercise2
Y
Exercise3
Y
Exercise4
Y
具体Exercise的完成情况
Exercise1调研
调研LinuxWindows中进程控制块(PCB)的基本实现方式,理解与Nachos的异同。解答:
Linux的进程控制块为一个由结构task_struct所定义的数据结构,task_struct存放在/include/linux/sched.h中,其中包括管理进程所需的各种信息Linux系统的所进程控制块组织成结构数组形式。早期Linux是多可时运行进程的个数由NR_TASK(缺省值512,NR_TASKPCB长度近期版本中的PCB成一个环形结构,系统中实存在的进程数由其定义的全局变量nr_task来动态记录。结构数structtask_struct*task[NR_TASK]={&init_task}来记指向PCB指针该指针定义/kernel/sched.c中。建一个进程系统在内存中申请一个task_struct即空闲PCB块,并填入所需信息。同时将指向该结构的指针填入task[]中。当前处于运行状态进程的PCB指针current_set[]来指出这是因Linux支持多处理机系统系统可能存在个同时运行的进程,current_set定义成指针
Linux系统PCB包括很多参数,PCB约占1KB的内存空间用于PCB的结task_struct简要描如下
structtask_struct{
pid_tpid;//进程ID,用来代表一个进程volatilelongstate;//进程状态
intsigpending;//进程上是否有待处理的信号longcounter;//进程可运行时间量longnice;//进程的基本时间片
structmm_struct*mm;//进程内存管理信息structlist_headrun_list;//指向运行队列的指针unsignedlongsleep_time;//进程的睡眠时间
3


structtask_struct*next_task,*prev_task;//用于将系统中所的进程成一个双向循环…….};
Nachos通过code/threads/thread.cccode/threads/thread.h阅读得知Thread的对象相当于进程的PCB
Exercise2阅读
仔细阅读下,理解Nachos的线程机制。code/threads/main.cccode/threads/threadtest.cccode/threads/thread.hcode/threads/thread.cc
解答:ThreadTest用于创建线程,对线程进测试运行果如下SimpleThread分别循环5打印出每就绪的线程。

thread.h定义thread信息,包括状态,以及变状态的方法,它相当于一个PBCthread.cc初始化线程控制块控制线程。

Exercise3扩展线程的数据结构
增加“ID线程ID”两个数据成Nachos的线程管理机制中增加数据成维护机制。解答:
1.修改thread.h增加userIdthreadId变量
4



2.修改threadtest.ccSimpleTHread方法中设置ThreadIdUserIdThreadIdUserId

3.运行
5




Exercise4增加全局线程管理机制
Nachos增加对线程数制,使Nachos多能存在128个线程解答:
1.增加一个全局变量curCount用来记当前的线程数

2.修改thread.cc中的Fork方法,控制当全局curCount128候直接返回


6


内容三:遇到的困难以及解决方法
困难1
首先,以有用过Linux操作系统,对里面命令、以及Linux系统下码编写、编译、运行等等都没接触。对作业我找了很多和同己也找了很多资料终了几天努力自己安装了Ubuntu系统里边命令习。安装nachos候编译群里帮助安装了g++参考了老师的文正确的解决问题
困难2
java开发的,接触c++nachos里边不少时间c++中的java有很多开发编译不熟悉导致比较慢另外c++很多熟悉,所以作业很多法。想在习中下这习,编写c++熟练提高上来
内容四:收获及感想
通过这阅读修改操作系统源码我学不少os节问题操作系统念层的理解,和考研内存空间大小件大小计算于每个线程究竟是如的,的,是通过nachos源码阅读,和对其中行这exercise里面改写模糊的概念开的具体明朗,其内是如运行的,机理是如在其中发挥的,清楚不少
另外java开发没接触c++Linux操作系统下开发Ubuntu系统nachos候我五和2也没最后跑去组组长帮我把问题解决查询资料专门去书馆借了两希望时间通过自己努力把之东西补在完成作业程中,个同学也量过如解决的问题,在os群里面在解决问题遇到的困难,群里的同学都相帮助且群里反映那些问题基本操作程中遇到问题这种方式交流心的方法。
内容五:对课程的意见和建议
希望在课老师些较好的同编码们平编码遇到的问题一定的另外希望老师能多在课一定的时间,或lib些比较好的同的实一个习机自己
7


内容六:参考文献
1塔嫩鲍姆,现操作系统M].北京:机械工出版2009-7-1.2]谭浩C++M].北京出版2004-7-1.3]陈,现操作系统EB/OL].北京2013-2-29.
4(萨瓦(SarwarS.M.(克雷兹(KoretskyR.LINUX程,[M]出版,2005-6-1
5StanleyB.LippmanBarbaraE.MooJoséeLaJoieC++Primer中文4M].北京人民邮电出版2006-6-1.

8

北大操作系统高级课程-陈向群作业-线程机制实习报告

相关推荐