山东大学操作系统课程设计代码分析及设计实现及测试报告.docx

上传人:b****1 文档编号:445928 上传时间:2022-10-10 格式:DOCX 页数:48 大小:183.69KB
下载 相关 举报
山东大学操作系统课程设计代码分析及设计实现及测试报告.docx_第1页
第1页 / 共48页
山东大学操作系统课程设计代码分析及设计实现及测试报告.docx_第2页
第2页 / 共48页
山东大学操作系统课程设计代码分析及设计实现及测试报告.docx_第3页
第3页 / 共48页
山东大学操作系统课程设计代码分析及设计实现及测试报告.docx_第4页
第4页 / 共48页
山东大学操作系统课程设计代码分析及设计实现及测试报告.docx_第5页
第5页 / 共48页
点击查看更多>>
下载资源
资源描述

山东大学操作系统课程设计代码分析及设计实现及测试报告.docx

《山东大学操作系统课程设计代码分析及设计实现及测试报告.docx》由会员分享,可在线阅读,更多相关《山东大学操作系统课程设计代码分析及设计实现及测试报告.docx(48页珍藏版)》请在冰豆网上搜索。

山东大学操作系统课程设计代码分析及设计实现及测试报告.docx

山东大学操作系统课程设计代码分析及设计实现及测试报告

操作系统课程设计报告

班级:

2012级软件工程8班

团队成员:

杨环

张俊

吴佩瑶

王飞

王梅瑞

目录2

一、前期工作3

1.1平台搭建3

二、代码分工3

三、设计及实现3

3.1Task1.1KThread.join()3

3.1.1要求分析3

3.1.2设计方案4

3.1.3实现代码4

3.1.4测试代码及结果5

3.2Task1.2condition2类7

3.2.1要求分析7

3.2.2设计方案7

3.2.3实现代码7

3.2.4测试代码及结果8

3.3Task1.3alram类11

3.3.1要求分析11

3.3.2设计方案11

3.3.3实现代码11

3.3.4测试代码及结果12

3.4Task1.4communicator类13

3.4.1要求分析13

3.4.2设计方案13

3.4.3实现代码13

3.4.4测试代码及结果14

3.5Task1.5priorityscheduler类17

3.5.1要求分析17

3.5.2设计方案17

3.5.3实现代码17

3.5.4测试代码及结果17

3.6Task1.6boat类23

3.6.1要求分析23

3.6.2设计方案23

3.6.3实现代码23

3.6.4测试代码及结果30

3.7Task2.1系统调用creat,open,read,write,close,unlink30

3.7.1要求分析30

3.7.2设计方案30

3.7.3实现代码31

3.7.4测试代码及结果34

3.8Task2.2多进程内存分配及访问34

3.8.1要求分析34

3.8.2设计方案34

3.8.3实现代码35

3.8.4测试代码及结果38

3.9Task2.3系统调用exec,join,exit40

3.9.1要求分析40

3.9.2设计方案41

3.9.3实现代码41

3.9.4测试代码及结果43

3.10Task2.4LotterySchedule类43

3.10.1要求分析43

3.10.2设计方案44

3.10.3实现代码44

3.10.4测试代码及结果44

总结47

一、前期工作

1.1平台搭建

NachosForJavaphrase1部分:

IDE环境可采用Eclipse。

Phase2及以后阶段:

需要把C程序编译成MIPS二进制文件COFF需要MIPS的C编译器mips-x86.linux-xgcc(ubuntu12.04平台下)。

二、代码分工

三、设计及实现

3.1Task1.1KThread.join()

3.1.1要求分析

Join()方法的含义:

当前线程a在运行,执行b.join(),则a阻塞,直到线程b结束,a继续执行。

Join函数的作用即为等待某线程运行完毕。

当前线程(唯一一个正在运行的线程)A调用另一个线程(处于就绪状态)B的join函数时(A和B在Nachos中均为KThread类型对象),A被挂起,直到B运行结束后,join函数返回,A才能继续运行。

注意在一个KThread对

象上只能调用一次join,且当前线程不能对自身调用join。

3.1.2设计方案

为每个线程创建一个线程队列joinqueue,joinqueue由对本线程调用join方法的其他线程对象构成,可“捐赠”优先级,以及布尔形变量joined,判断本线程是否被其他线程调用过join方法,以及一个判断线程状态方法IsAlive()。

假设当前线程A调用就绪线程B的join函数.在join函数中线程A被添加到线程B的线程队列joinqueue中,将线程A“休眠”,线程B得到执行,在线程B结束时(此时线程B成为当前线程,发生在KThead.finish函数中)选择B的joinqueue的nextThread()执行,A

唤醒并继续.

3.1.3实现代码

在KThread.java中:

privateThreadQueuejoinQueue=null;privatebooleanJoined=false;

publicbooleanIsAlive(){

if(this.status==statusNew||status==statusReady||status==statusRunning||status==statusBlocked)returntrue;

elsereturnfalse;

}

publicvoidjoin(){

//

if(!

this.IsAlive())return;

while(IsAlive()){

//

this.joinQueue.acquire(this);

//

}

this.joinQueue.waitForAccess(KThread.currentThread());KThread.sleep();

//

}

}public

staticvoid

finish(){

///if

(currentThread

.Joined){

currentThread

.joinQueue.nextThread().ready();

}

III

}

3.1.4测试代码及结果

创建AThread和Bthread两个线程,AThread循环打印“AThread循环第..次”语句,Bthread开始打印"B_thread就绪”语句,中间执行AThread。

Join()方法,最后打印"B_thread执行结束”语句。

测试代码:

packagenachos.threads;

importnachos.machine.*;

publicclassKThreadTest{

publicKThreadTest(){

}

publicstaticvoidsimpleJoinTest(){

KThreadA_thread=newKThread(new

KThreadTest.A_thread(5));

KThreadB_thread=newKThread(new

KThreadTest.B_thread(A_thread));

B_thread.fork();

B_thread.join();

}_

publicstaticclassB_threadB_thread(KThreadjoinee){this.joinee=joinee;

}

implementsRunnable{

publicvoidrun(){

System.out.println(

System.out.println(

A_thread...");

this.joinee.fork();this.joinee.join();

System.out.println(

}

"B_thread就绪");"Forkingandjoining

"B_thread执行结束");

privateKThreadjoinee

 

publicstaticA_thread(

this

}

+"次");

//Thisshouldjustkillsomecyclesfor(inti=0;i

System.out.println("A_thread循环第"+i

KThread.currentThread().yield();

}

System.out.println("A_thread执行结束");

}_

privateintnum

}

}

测试结果:

3.2Task1.2condition2类

321要求分析

threads.Lock类提供了锁以保证互斥.在临界代码区的两端执行Lock.acquire()和

Lock.release()即可保证同时只有一个线程访问临界代码区.条件变量建立在锁之上,由

threads.Condition实现,它是用来保证同步的工具.每一个条件变量拥有一个锁变量

(该锁变量亦可被执行acquire和release操作,多个条件变量可共享同一个锁变量).当处

于临界区内的拥有某锁Lock的当前线程对与锁Lock联系的条件变量执行sleep操作时,该

线程失去锁L并被挂起.下一个等待锁L的线程获得锁L(这个过程由调度程序完成)并进入临界区.当拥有锁L的临界区内的当前线程对与锁L联系的条件变量执行wake操作时

(通常调用wake之后紧接着就是Lock.release),等待在该条件变量上的至多一个被挂起的

线程(由调用sleep引起)被重新唤醒并设置为就绪状态.若执行wakeall操作,则等待在

该条件变量上的所有被挂起的线程都被唤醒.threads.condition已经实现了一个条件变量

(采用信号量实现),题目要求用屏蔽/禁止中断的方法再实现一下条件变量(写在

threads.condition2中)

3.2.2设计方案

为每个条件变量添加一个锁conditionLock和一个Kthread对象组成的等待队列waitqueue,

condition.sleep将调用sleep()的线程加入到等待队列,释放锁,并阻塞,以便其他线

程唤醒它,一旦’唤醒’立即要求锁,并在sleep函数开始/结尾处屏蔽/允许中断以保证原

子性;condition.wake中从等待队列中取出线程进行ready()实现唤醒,

(同样要在wake函数开始/结尾处屏蔽/允许中断),wakeall函数的实现依赖于wake.只需

不断地wake直到队列为空为止.

3.2.3实现代码

见threads/condition2.java

privateLockconditionLock;

privateLinkedListwaitQueue;

publicvoidsleep(){

//

waitQueue.add(KThread.currentThread());

conditionLock.release();

KThread.sleep();

conditionLock.acquire。

//

}

publicvoidwake(){

//

waitQueue.remove().ready();

//

}

324测试代码及结果

创建共有条件变量c2test,一个临界资源count和三个线程,threadl,thread2,thread3,初始化三个线程后thread1,thread2调用c2test.sleep()后开始"睡眠”,thread3调用c2test.wakeAII(

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 交规考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1