新改操作系统实验报告.docx

上传人:b****8 文档编号:9872663 上传时间:2023-02-07 格式:DOCX 页数:34 大小:958.06KB
下载 相关 举报
新改操作系统实验报告.docx_第1页
第1页 / 共34页
新改操作系统实验报告.docx_第2页
第2页 / 共34页
新改操作系统实验报告.docx_第3页
第3页 / 共34页
新改操作系统实验报告.docx_第4页
第4页 / 共34页
新改操作系统实验报告.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

新改操作系统实验报告.docx

《新改操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《新改操作系统实验报告.docx(34页珍藏版)》请在冰豆网上搜索。

新改操作系统实验报告.docx

新改操作系统实验报告

 

课程设计(综合实验)报告

(2015--2016年度第1学期)

 

名称:

操作系统综合实验

题目:

oslab综合实验

院系:

计算机系

班级:

学号:

学生姓名:

指导教师:

设计周数:

分散进行

成绩:

日期:

实验一、实验环境的使用

一、实验目的和要求 

1、实验名称:

实验环境的使用。

 

2、实验目的:

(1)熟悉操作系统集成实验环境OSLab的基本使用方法。

(2)练习编译、调试EOS操作系统内核以及EOS应用程序。

3、实验类型:

验证性实验。

4、实验内容:

启动OSLab。

学习OSLab基本使用方法。

EOS内核项目的生成和调试。

EOS应用程序项目的生成和调试。

退出OSLab。

保存EOS内核项目。

二、实验环境 

使用WINDOWS操作系统和OS Lab集成实验环境,涉及C语言等编程语言。

三、实验过程 

1、设计思路和流程图

(一)对于WINDOWS控制台应用程序:

(二)对于EOS内核项目:

(三)对于EOS应用程序项目:

2、算法实现

验证性实验,无需算法。

3、截图

四、思考与练习

1、练习使用单步调试功能(逐过程、逐语句),体会在哪些情况下应该使用“逐过程”调试,在哪些情况下应该使用“逐语句”调试。

练习使用各种调试工具(包括“监视”窗口、“调用堆栈”窗口等)。

答:

逐语句,就是每次执行一行语句,如果碰到函数调用,它就会进入到函数里面。

 而逐过程,碰到函数时,不进入函数,把函数调用当成一条语句执行。

 因此,在需要进入函数体时用逐语句调试,而不需要进入函数体时用逐过程调试。

2、思考生成 EOS SDK 文件夹的目的和作用。

查看 EOS SDK 文件夹中的内容,明白文件夹的组织结构和各个文件的来源和作用。

查看 EOS 应用程序包含了 SDK 文件夹中的哪些头文件,是如何包含的?

答:

EOS SDK是为应用程序调用系统API提供服务,可作为用户编程中可使用的工具包集合。

 EOS SDK文件夹主要包括INC头文件、LIB文件夹 导入库文件和BIN文件夹 动态链接库,可执行程序,二进制文件。

 EOS SDK包含的头文件有:

eos.h负责导出API函数声明;eosdef.h负责导出函数类型的定义;error.h 负责导出错误码。

五、实验总结

熟悉了OS Lab实验环境,学会了EOS操作系统内核和EOS应用程序的基本调试方法,对EOS相关项目的编程方法增加了了解。

通过这次实验,我锻炼了动手实践的能力,提升了对于操作系统相关知识的兴趣,加深对操作系统理论知识的理解,并能将其应用到实际操作当中。

 

实验二、操作系统的启动

一、实验目的与要求 

1、 实验名称:

操作系统的启动 

2、 实验目的 

(1)跟踪调试EOS在PC机上从加电复位到成功启动的全过程,了解操作系统的启动过程。

 

(2)查看EOS启动后的状态和行为,理解操作系统启动后的工作方式。

 

3、实验类型:

验证性实验 

4、实验内容 

调试EOS操作系统的启动过程包括:

使用Bochs做为远程目标机;

调试BIOS程序;

调试软盘引导扇区程序;

调试加载程序;

调试内核;

查看EOS启动后的状态和行为

二、实验环境 

使用WINDOWS操作系统和OS Lab集成实验环境,涉及C语言等编程语言。

三、实验过程

1、设计思路和流程图:

2、算法实现:

验证性试验,无算法。

3、截图

四、思考与练习

为什么EOS操作系统从软盘启动时要使用boot.bin和loader.bin两个程序?

使用一个可以吗?

它们各自的主要功能是什么?

如果将loader.bin的功能移动到boot.bin文件中,则boot.bin文件的大小是否仍然能保持小于512字节?

 

答:

boot文件夹包含了两个汇编文件boot.asm和loader.asm。

这两个文件生成的二进制文件boot.bin和loader.bin会被写入软盘镜像文件。

操作系统启动时boot.bin和loader.bin引导软盘加载程序,二者缺一不可。

使用Boot.bin的主要功能是引导软盘;loader.bin的主要功能是加载程序。

如果把loader.bin功能移动到boot.bin程序中,必然导致程序规模扩大,可能使其大于512字节。

 五、实验总结

完成了调试Eos在PC机上从加复电位到成功启动的全过程,了解了操作系统的启动过程,对EOS启动后的状态和行为有了深入的了解,理解了操作系统启动后的工作方式。

不过对操作系统还存在着很多的问题,对操作系统的了解还不是很深刻,所以实验后要深入的了解。

实验三、进程的创建

一、实验目的与要求 

1、 实验名称:

进程的创建 

2、 实验目的 

(1)练习使用EOSAPI函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。

 

(2)调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。

3、实验类型:

验证性实验 

4、实验内容 

(1)准备实验

(2)练习使用控制台命令创建EOS应用程序的进程

(3)练习通过编程的方式让应用程序创建另一个应用程序的进程

(4)调试CreateProcess函数

(5)调试PsCreateProcess函数

(6)练习通过编程的方式创建应用程序的多个进程

二、实验环境 

使用WINDOWS操作系统和OS Lab集成实验环境,涉及C语言等编程语言。

三、实验过程

1、算法

算法:

验证性实验,不需算法。

2、截图

四、思考与练习

在源代码文件NewTwoProc.c提供的源代码基础上进行修改,要求使用hello.exe同时创建10个进程。

提示:

可以使用PROCESS_INFORMATION类型定义一个有10个元素的数组,每一个元素对应一个进程。

使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。

答:

使用PROCESS_INFORMATION类型定义一个有10个元素的数组,每一个元素对应一个进程。

五、实验总结

本次实验是验证性实验,通过实验练习创建一个进程,掌握创建进程的方法,对进程和程序的区别有了更深的理解。

调试跟踪CreateProcess函数的执行过程,了解到了进程的创建过程。

同时,本次实验,让我对进程的创建有更深的理解,是我真真切切的理解到进程和程序的本质区别。

学会了如何使用基本命令进行调试和运行程序。

总之这让我受益非浅。

实验四、线程的状态与转换

一、实验目的与要求 

1、 实验名称:

线程的状态与转换 

2、 实验目的 

(1)调试线程在各种状态间的转换过程,熟悉线程的状态和转换。

 

(2)通过为线程增加挂起状态,加深对线程状态的理解。

3、实验类型:

验证性实验 

4、实验内容 

(1)准备实验

(2)调试线程状态的转换过程。

2.1线程由主色状态进入就绪状态。

2.2线程由运行状态进入就绪状态。

2.3线程由就绪状态进入运行状态。

2.4线程由运行状态进入阻塞状态。

(3)为线程增加挂起状态

二、实验环境 

使用WINDOWS操作系统和OS Lab集成实验环境,涉及C语言等编程语言。

三、实验过程

1、算法

算法:

验证性实验,不需算法。

2、截图

四、思考与练习

1、思考一下,在本实验中,当loop线程处于运行状态时,EOS中还有哪些线程,它们分别处于什么状态。

可以使用控制台命令pt查看线程的状态。

2、当loop线程在控制台1中执行,并且在控制台2中执行suspend命令时,为什么控制台1中的loop线程处于就绪状态而不是运行状态?

答:

打开控制台2时,loop线程处于活动就绪状态,此时在控制台2中使用挂起原语Suspend可以将该线程挂起,该线程便会转入静止就绪状态。

处于静止就绪状态的线程,不会再被调度执行,直到使用原语Resume将该线程恢复为活动就绪状态。

五、实验总结

在本次实验过程中我了解到了各个状态之间的转换过程,对状态之间的转换有了更加深入的了解。

了解到进程在就绪、阻塞、运行等状态之间的转换的实际运行,同时线程加入了增加了挂起状态,从而加深了对状态转换的理解,对课堂上的知识有了更加深入的了解。

实验五、进程的同步

一、实验目的与要求 

1、 实验名称:

进程的同步

2、 实验目的 

(1)使用EOS的信号量,编程解决生产者—消费者问题,理解进程同步的意义。

(2)调试跟踪EOS信号量的工作过程,理解进程同步的原理。

(3)修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程。

3、实验类型:

设计并验证性实验 

4、实验内容 

(1)准备实验

(2)使用EOS的信号量解决生产者-消费者问题。

(3)调试EOS信号量的工作过程。

3.1创建信号量

3.2等待、释放信号量

3.2.1等待信号量(不阻塞)

3.2.2释放信号量(不唤醒)

3.2.3等待信号量(阻塞)

3.2.4释放信号量(唤醒)

(4)修改EOS的信号量算法。

二、实验环境 

使用WINDOWS操作系统和OS Lab集成实验环境,涉及C语言等编程语言。

三、实验过程

1、算法

算法:

设计并验证性实验,需算法。

为EOS添加时间片轮转调度

Satus=flag; 

If(Semaphore->Count>0){     Semaphore->Count--; 

    flag=STATUS_SUCCESS; } 

else if(Semaphore->Count==0) 

flag=PspWait(&Semaphore->WaitListHead,Milliseconds); 

if(ReleaseCount>0){ 

Semaphore->Count++; 

While((!

ListIsEmpty(&Semaphore->WaitListHead))&&(ReleaseCount)){        PspWakeThread(&Semaphore->WaitListHead,STATUS_SUCCESS);        PspThreadSchedule();        ReleaseCount--; 

Semaphore->Count=Semaphore->Count+ReleaseCount; flag=STATUS_SUCCESS; } 

else printf(“Error ReleaseCount is negative!

”);

2、截图

四、思考与练习

1、思考在ps/semaphore.c文件内的PsWaitForSemaphore和PsReleaseSemaphore函数中,为什么要使用原子操作?

可以参考本书第2章中的第2.6节。

答:

在执行等待信号量和释放信号量的时候,是不允许cpu响应外部中断的,如果此时cpu响应了外部中断,会产生不可预料的结果,无法正常完成原子操作。

2、绘制ps/semaphore.c文件内PsWaitForSemaphore和PsReleaseSemaphore函数的流程图。

五、实验总结

本次实验是验证类和设计类实验,使用EOS信号量编程解决了生产者消费者问题,对进程的同步有了更深入的了解。

我使用Java代码尝试写了线程的同步,和进程的同步有着很大的相同。

同时对进程同步的原理也有了很深的了解。

后面采用修改EOS的信号量算法,来支持超时唤醒功能。

 

实验六、时间片轮转调度

一、实验目的与要求 

1、 实验名称:

时间片轮转调度

2、 实验目的 

(1)调试EOS的线程调度程序,熟悉基于优先级的抢先式调度。

(2)为EOS添加时间片轮转调度,了解其它常用的调度算法。

3、实验类型:

设计并验证性实验 

4、实验内容 

(1)准备实验

(2)阅读控制台命令“rr”相关的源代码

(3)调试线程调度程序

(4)调试当前线程不被抢先的情况

(5)调试当前线程被抢先的情况

(6)为EOS添加时间片轮转调度

(7)修改线程时间片的大小

二、实验环境 

使用WINDOWS操作系统和OS Lab集成实验环境,涉及C语言等编程语言。

三、实验过程

1、算法以及实现代码:

算法:

存在设计步骤,需算法。

修改ps/sched.c文件中的PspRoundRobin函数(第337行),在其中实现时间片轮转调度算法。

实现代码:

VOIDPspRoundRobin(VOID)

{

if(NULL!

=PspCurrentThread&&Running==PspCurrentThread->State)

{PspCurrentThread->RemainderTicks--;

if(0==PspCurrentThread->RemainderTicks){

PspCurrentThread->RemainderTicks=TICKS_OF_TIME_SLICE;

if(BIT_TEST(PspReadyBitmap,

PspCurrentThread->Priority))

{PspReadyThread(PspCurrentThread);

}

}

}

2、截图

四、思考与练习

结合线程调度执行的时机,说明在ThreadFunction函数中,为什么可以使用“关中断”和“开中断”的方法来保护控制台这种临界资源。

一般情况下,应该使用互斥信号(MUTEX)来保护临界资源,但是在ThreadFunction函数中却不能使用互斥信号量,而只能使用“关中断”和“开中断”的方法,结合线程调度的对象说明这样做的原因。

答:

关中断后CPU就不会响应任何由外部设备发出的硬中断了,也就不会发生线程调度了,从而保证各个线程可以互斥的访问控制台。

这里不能使用互斥信号量保护临界资源的原因:

如果使用互斥信号量,则那些由于访问临界区而被阻塞的线程,就会被放入互斥信号量的等待队列,就不会在相应优先级的就绪列中了,而时间轮转调度算法是对就绪队列的线程进行轮转调度,而不是对这些被阻塞的线程进行调度,也就无法进行实验了。

使用“关中断”和“开中断”进行同步就不会改变线程的状态,可以保证那些没有获得处理器的线程都在处于就绪队列中。

五、实验总结

本次实验调试EOS的线程调度程序,熟悉了基于优先级的抢先式调度,并为EOS添加了时间片轮转调度,了解了其他常用的调度算法。

通过这次实验,我锻炼了动手实践的能力,拓展了知识面,更深度的了解了时间片轮转调度的原理以及实现机制,并能将其应用到实际操作当中。

实验八、分页存储器管理

一、实验目的与要求 

1. 实验名称:

分页存储器管理

2. 实验目的 

(1)学习i386处理器的二级页表硬件机制,理解分页存储器管理原理。

(2)查看EOS应用程序进程和系统进程的二级页表映射信息,理解页目录和页表的管理方式。

(3)编程修改页目录和页表的映射关系,理解分页地址变换原理。

3.实验类型:

验证性实验 

4.实验内容 

(1)准备实验

(2)查看EOS应用程序进程的页目录和页表

(3)查看应用程序进程和系统进程并发时的页目录和页表

(4)查看应用程序进程并发时的页目录和页表

(5)在二级页表中映射新申请的物理页

二、实验环境 

使用WINDOWS操作系统和OS Lab集成实验环境,涉及C语言等编程语言。

三、实验过程

1、算法

算法:

验证性实验,不需算法。

2、截图

四、思考与练习

思考页式存储管理机制的优缺点。

优点:

虚存量大,适合多道程序运行,用户不必担心内存不够的调度操作,动态页式管理提供反了内存与外存图图统一管理的虚存实现方式。

内存利用率高,不常用的页面尽量不留在内存。

不要求作业连续存放,有效的解决了内存碎片问题。

缺点:

要进行页面中断,缺页中断等处理,系统开销较大;

有可能产生“抖动”现象;

址变换机构复杂,一般采用硬件实现,增加了机器成本。

五、实验总结

通过操作系统试验,了解了操作系统的启动过程,运行方式,加深了对计算机操作系统的理解。

更深入的了解了处理器的二级页表硬件机制,理解了分页存储器管理原理。

通过查看进程中的二级页表映射信息,理解页目录和页表的管理方式。

扩展了自己的理论知识更增强了自己的动手能力。

 

实验十、磁盘调度算法

一、实验目的与要求 

1. 实验名称:

磁盘调度算法

2. 实验目的 

(1)通过学习EOS实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机。

(2)观察EOS实现的FCFS、SSTF和SCAN磁盘调度算法,了解常用的磁盘调度算法。

(3)编写CSCAN和N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。

3.实验类型:

设计并验证性实验 

4.实验内容 

(1)准备实验

(2)验证先来先服务(FCFS)磁盘调度算法

(3)验证最短寻道时间优先(SSTF)磁盘调度算法

(4)验证SSTF算法造成的线程“饥饿”现象

(5)验证扫描(SCAN)磁盘调度算法

(6)改写SCAN算法

(7)编写循环扫描(CSCAN)磁盘调度算法

(8)验证SSTF、SCAN及CSAN算法中的“磁臂粘着”现象

(9)编写N-Step-SCAN磁盘调度算法

二、实验环境 

使用WINDOWS操作系统和OS Lab集成实验环境,涉及C语言等编程语言。

三、实验过程

1、算法

算法:

设计并验证性实验,需算法。

(1)改写SCAN算法

BOOLScanInside=TRUE;

PREQUEST

IopDiskSchedule(VOID

{

PLIST_ENTRYpListEntry;

PREQUESTpRequest;

PREQUESTINpNextRequest=NULL;

PREQUESTOUTpNextRequest=NULL;

LONGOffset;

ULONGInsideShortestDistance=0xFFFFFFFF;

ULONGOutsideShortestDistance=0xFFFFFFFF;

PREQUESTpNextRequest=NULL;

for

(pListEntry=RequestListHead.Next;

pListEntry!

=&RequestListHead;

pListEntry=pListEntry->Next){

pRequest=CONTAINING_RECORD(pListEntry,REQUEST,ListEntry);

Offset=pRequest->Cylinder-CurrentCylinder;

if

(0==Offset){

pNextRequest=pRequest;

goto

RETURN;

}

elseif

(Offset>0&&Offset

InsideShortestDistance=Offset;

INpNextRequest=pRequest;

}

else

if

(Offset<0&&-Offset

OutsideShortestDistance=-Offset;

OUTpNextRequest=pRequest;

}

}

if

(ScanInside)

{

if

(INpNextRequest)

{return

INpNextRequest;

}

else

{

ScanInside=!

ScanInside;

return

OUTpNextRequest;

}

}

else

{

if

(OUTpNextRequest)

{return

OUTpNextRequest;

}

else

{

ScanInside=!

ScanInside;

return

INpNextRequest;

}

}

RETURN:

return

pNextRequest;

}

编写循环扫描(CSCAN)磁盘调度算法

PREQUEST

IopDiskSchedule(VOID)

{

PLIST_ENTRYpListEntry;

PREQUESTpRequest;

PREQUESTINpNextRequest=NULL;

PREQUESTOUTpNextRequest=NULL;

LONGOffset;

ULONGInsideShortestDistance=0xFFFFFFFF;

ULONGOutsideShortestDistance=0x00000000;

PREQUESTpNextRequest=NULL;

for

(pListEntry=RequestListHead.Next;

pListEntry!

=&RequestListHead;

pListEntry=pListEntry->Next){

pRequest=CONTAINING_RECORD(pListEntry,REQUEST,ListEntry);

Offset=pRequest->Cylinder-CurrentCylinder;

if(0==Offset){

pNextRequest=pRequest;

gotoRETURN;

}

elseif(Offset>0&&Offset

InsideShortestDistance=Offset;

INpNextRequest=pRequest;

}

else

if(Offset<0&&-Offset>OutsideShortestDistance){

OutsideShortestDistance=-Offset;

OUTpNextRequest=pRequest;}

}

if(INpNextRequest)

{

return

INpNextRequest;

}

else

{

return

OUTpNextRequest;

}

RETURN:

return

pNextRequest;

}

编写N-Step-SCAN磁盘调度算法

PREQUEST

IopDiskSchedule(VOID)

{

PLIST_ENTRYpListEntry;

PREQUESTpRequest

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

当前位置:首页 > 解决方案 > 解决方案

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

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