新改操作系统实验报告.docx
《新改操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《新改操作系统实验报告.docx(34页珍藏版)》请在冰豆网上搜索。
新改操作系统实验报告
课程设计(综合实验)报告
(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&&OffsetInsideShortestDistance=Offset;
INpNextRequest=pRequest;
}
else
if
(Offset<0&&-OffsetOutsideShortestDistance=-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&&OffsetInsideShortestDistance=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