操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx

上传人:b****1 文档编号:11168676 上传时间:2023-05-29 格式:DOCX 页数:12 大小:125.69KB
下载 相关 举报
操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx_第1页
第1页 / 共12页
操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx_第2页
第2页 / 共12页
操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx_第3页
第3页 / 共12页
操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx_第4页
第4页 / 共12页
操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx_第5页
第5页 / 共12页
操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx_第6页
第6页 / 共12页
操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx_第7页
第7页 / 共12页
操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx_第8页
第8页 / 共12页
操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx_第9页
第9页 / 共12页
操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx_第10页
第10页 / 共12页
操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx_第11页
第11页 / 共12页
操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx

《操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx(12页珍藏版)》请在冰点文库上搜索。

操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告.docx

操作系统接口兼容UnixLinux命令接口合肥工业大学操作系统实验报告

实验1实验环境的使用

一.实验目的

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

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

二.实验内容

1.启动OSLab

2.学习OSLab的基本使用方法

2.1新建Windows控制台应用程序项目

2.2生成项目

2.3执行项目

2.4调试项目

2.4.1使用断点中断执行

2.4.2单步调试

2.4.3查看变量的值

2.4.4调用堆栈

3.EOS内核项目的生成和调试

3.1新建EOS内核项目

3.2生成项目

3.3调试项目

3.4查看软盘镜像文件中的内容

3.5查看EOSSDK(SoftwareDevelopmentKit)文件夹

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

4.1新建EOS应用程序项目

4.2生成项目

4.3调试项目

4.4查看软盘镜像文件中的内容

4.5修改EOS应用程序项目名称

5退出OSLab

6保存EOS内核项目

三.实验结果

本实验主要是熟悉EOS操作系统的基本操作,练习了:

(1)新Windows控制台应用程序项,

1.“文件”菜单中选择“新建”,然后单击“项目”。

2.在“新建项目”对话框中,选择项目模板“控制台应用程序(c)”。

3.在“名称”中输入新项目使用的文件夹名称“oslab”。

4.在“位置”中输入新项目保存在磁盘上的位置“C:

\test”。

新建完毕后,OSLab会自动打开这个新建的项目。

(2)在“生成”菜单中选择“生成项目”。

结果如图

(3)执行项目:

选择“调试”菜单中的“开始执行”

(4)调试项目:

1.右键点击“项目管理器”窗口中的“源文件”文件夹节点,在弹出的快捷菜单中选择“添加”中的“添加新文件”。

2.在弹出的“添加新文件”对话框中选择“C源文件”模板。

3.在“名称”中输入文件名称“func”。

4.点击“添加”按钮,添加并自动打开文件func.c,此时的“项目管理器”窗口会如图:

(5).在func.c文件中添加函数:

intFunc(intn){n=n+1;returnn;}

(6).点击源代码编辑器上方的console.c标签,切换到console.c文件。

将main函数修改为:

intmain(intargc,char*argv[])

{intFunc(intn);//声明Func函数

intn=0;n=Func(10);

printf("HelloWorld!

\n");

return0;}

代码修改完毕后按F7

实验结果为输出:

HelloWorld!

(7).在main函数中定义变量n的代码行

intn=0;上点击鼠标右键,在弹出的快捷菜单中选择“插入/删除断点”,会在此行左侧的空白处显示一个红色圆点,表示已经成功在此行代码添加了一个断点

练习使用“逐过程”,“逐语句”,“跳出”功能

(8).在源代码编辑器中变量n的名称上点击鼠标右键,在弹出的快捷菜单中选择“快速监视”,进行单步测试,观察n结果依次为0,11

(9)调用堆栈,选择“调试”菜单“窗口”中的“调用堆栈”,激活“调用堆栈”窗口。

可以看到当前“调用堆栈”窗口中只有一个main函数(显示的内容还包括了参数值和函数地址)。

按F11(“逐语句”功能的快捷键)调试,直到进入Func函数,其中当前正在调试的Func函数在栈顶位置,main函数在栈底位置。

说明是在main函数中调用了Func函数。

(10)查看软盘镜像文件中的内容,在“项目管理器”窗口中双击软盘镜像文件Floppy.img

四.实验总结

今天第一次进行操作系统这门课的实验,这也是将抽象的理论知识应用到实践的一个很好的机会,同时,我们也学习了使用OSLab的这个实验环境,OSLab的操作界面和MicrosoftVisualStudio2010很像,所以使用起来很快就能上手,对于实验内容,今天主要练习了:

新建Windows控制台应用程序项目、生成项目、执行项目、调试项目以及EOS应用程序项目的生成和调试;设置间断点,并且在它的基础上进行了单步操作;详细观察了通过“快速监视“标记的数的值的变化过程等基本操作,这也为以后实验的顺利进行打下了良好的基础。

 

实验2操作系统的启动

一.实验目的

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

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

二.实验内容

1准备实验

2调试EOS操作系统的启动过程

2.1使用Bochs做为远程目标机

2.2调试BIOS程序

2.3调试软盘引导扇区程序

2.4调试加载程序

2.5调试内核

2.6EOS启动后的状态和行为

三.实验结果

1.新建一个EOSKernel项目。

2.使用Bochs做为远程目标机

(1)在“项目管理器”窗口中,右键点击项目节点,在弹出的快捷菜单中选择“属性”。

(2)在弹出的“属性页”对话框右侧的属性列表中找到“远程目标机”属性,将此属性值修改为“BochsDebug”

(3)点击“确定”按钮关闭“属性页”对话框。

接下来就可以使用Bochs模拟器调试BIOS程序和软盘引导扇区程序了。

3.按F5启动调试,此时会弹出两个Bochs窗口。

标题为“Bochsforwindows-Display”的窗口相当于计算机的显示器,显示操作系统的输出。

标题为“Bochsforwindows-Console”的窗口是Bochs的控制台,用来输入调试命令,输出各种调试信息。

4.启动调试后,Bochs在CPU要执行的第一条指令(即BIOS的第一条指令)处中断。

此时,Display窗口没有显示任何内容,Console窗口显示要执行的BIOS第一条指令的相关信息,并等待用户输入调试命令

5.然后查看CPU在没有执行任何指令之前主要寄存器中的数据,以及内存中的数据

(1)在Console窗口中输入调试命令sreg后按回车,显示当前CPU中各个段寄存器的值

(2)输入调试命令r后按回车,显示当前CPU中各个通用寄存器的值

(3)输入调试命令xp/1024b0x0000,查看开始的1024个字节的物理内存。

在Console中输出的这1K物理内存的值都为0,说明BIOS中断向量表还没有被加载到此处。

(4)输入调试命令xp/512b0x7c00,查看软盘引导扇区应该被加载到的内存位置。

输出的内存值都为0,说明软盘引导扇区还没有被加载到此处。

6.EOS启动后的状态和行为

(1)在控制台中输入命令“ver”后按回车。

结果如图

(2)查看EOS启动后的进程和线程的信息:

在控制台中输入命令“pt”后按回车。

输出的进程和线程信息如图所示

 

四.实验总结

今天的实验在实验一的基础上学习了EOS操作系统的启动、跟踪调试以及EOS在PC机上从加电复位到成功启动的全过程,这让我们对EOS这个平台有了初步的掌握,同时我们也练习了查看了EOS启动后的状态和行为,学会了查看CPU主要寄存器中以及内存中的数据的方法。

 

实验5进程的同步

一.实验目的

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

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

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

二.实验内容

1准备实验

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

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

3.1创建信号量

3.2等待、释放信号量

3.2.1等待信号量(不阻塞)

3.2.2释放信号量(不唤醒)

3.2.3等待信号量(阻塞)

3.2.4释放信号量(唤醒)

4修改EOS的信号量算法

三.实验结果

1.按照下面的步骤查看生产者-消费者同步执行的过程:

(1)使用pc.c文件中的源代码,替换之前创建的EOS应用程序项目中EOSApp.c文件内的源代码。

(2)按F7生成修改后的EOS应用程序项目。

(3)按F5启动调试。

OSLab会首先弹出一个调试异常对话框。

(4)在调试异常对话框中选择“否”,继续执行。

(5)立即激活虚拟机窗口查看生产者-消费者同步执行的过程

(6)待应用程序执行完毕后,结束此次调试。

2.等待、释放信号量

(1)等待信号量(不阻塞)

生产者和消费者刚开始执行时,用来放产品的缓冲区都是空的,所以生产者在第一次调用WaitForSingleObject函数等待Empty信号量时,应该不需要阻塞就可以立即返回。

(2)释放信号量(不唤醒)

生产者线程通过等待Empty信号量使空缓冲区数量减少了1,通过释放Full信号量使满缓冲区数量增加了1,这样就表示生产者线程生产了一个产品并占用了一个缓冲区。

(3)等待信号量(阻塞)

由于开始时生产者线程生产产品的速度较快,而消费者线程消费产品的速度较慢,所以当缓冲池中所有的缓冲区都被产品占用时,生产者在生产新的产品时就会被阻塞

(4)释放信号量(唤醒)

只有当消费者线程从缓冲池中消费了一个产品,从而产生一个空缓冲区后,生产者线程才会被唤醒并继续生产14号产品。

四.实验总结

今天的实验的内容是进程的同步,这也是进程这一概念提出后面临的一个非常大的问题,因为当进程在竞争临界资源时,由于进程的异步性,便会给系统造成混乱,所以能不能让诸多进程之间有效的共享资源和相互合作,就变成了一个很重要的问题。

今天的实验也让我们直接的观察到了EOS操作系统如何通过信号量机制解决进程同步问题,并对程序进行修改,这对我们今后的学习有很大的帮助,但对于解决大量同步操作带来的系统死锁问题,我还是欠缺实践和认识。

 

实验6时间片轮转调度

一.实验目的

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

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

二.实验内容

1准备实验

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

3调试线程调度程序

3.1调试当前线程不被抢先的情况

3.2调试当前线程被抢先的情况

4为EOS添加时间片轮转调度

三.实验结果

1.首先阅读控制台命令“rr”相关的源代码,它新建了20个优先级为8的线程,做为测试时间片轮转调度用的线程。

在新建的线程中,只有正在执行的线程才会在控制台的对应行(第0个线程对应第0行,第1个线程对应第1行)增加其计数,这样就可以很方便的观察到各个线程执行的情况

由于控制台线程的优先级是24,高于新建线程的优先级8,所以只有在控制台线程进入“阻塞”状态后,新建的线程才能执行。

2.观察程序执行效果

(1)按F7生成在本实验3.1中创建的EOSKernel项目。

(2)按F5启动调试。

(3)待EOS启动完毕,在EOS控制台中输入命令“rr”后按回车。

观察到,只有第0个新建的线程在第0行显示其计数在增加,说明只有第0个新建的线程在运行,其它线程都没有运行

原因:

所有20个新建线程的优先级都是8,而此时EOS只实现了基于优先级的抢先式调度,还没有实现时间片轮转调度,所以至始至终都只有第0个线程在运行,而其它具有EOS操作系统实验教程相同优先级的线程都没有机会运行,只能处于“就绪”状态。

(4)设置间断点调试程序。

查看ThreadFunction函数中变量pThreadParameter->Y的值应该为0,说明正在调试的是第0个新建的线程。

在“监视”窗口中添加表达式“ListGetCount(&PspReadyListHeads[8])”,查看优先级为8的就

绪队列中就绪线程的数量,值为19。

说明除了正在执行的第0个新建的线程外,其余19个新建的线程都在优先级为8的就绪队列中

在“监视”窗口中添加表达式“ListGetCount(&PspReadyListHeads[24])”,其值为1,说明优先级为24的就绪队列中只有一个就绪线程。

扫描就绪位图后获得的最高优先级的值HighestPriority也就应该是24。

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

VOID

PspRoundRobin(

VOID

{

//

if(NULL!

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

{

//在此添加代码,实现时间片轮转调度算法。

//

PspCurrentThread->RemainderTicks--;

if(PspCurrentThread->RemainderTicks==0)

{

PspCurrentThread->RemainderTicks=TICKS_OF_TIME_SLICE;

if(BIT_TEST(PspReadyBitmap,PspCurrentThread->Priority==8)==0)

{

PspReadyThread(PspCurrentThread);

}

}

}

return;

}

结果:

看到20个线程轮流运行,实现了时间片轮转

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

观察到轮转的事件的时间发生了变化,TICKS_OF_TIME_SLICE的值越大,轮转就越慢,越小就越快

四.实验总结

今天的实验是对基于时间片的轮转调度算法进行实际操作,就我的理解,在之前上课时,老师讲到:

在分时系统中,为了保证及时响应用户的请求,必须采用基于时间片的轮转式进程调度算法,在时间片轮转法中,系统将所有的就绪进程按先来先服务的原则,排成一个队列,每次调度时把CPU分配给队首进程,并令其执行一个时间片,当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列队尾,然后再把处理机分配给就绪队列中心的队首进程,这样就保证就绪队列中的所有进程均可获得一个时间片的处理机执行时间。

经过本次实验,让我对时间片轮转调度算法有了更深的印象,并通过实际的修改程序操作对算法本身也有了新的认识,但关于时间片轮转调度的相关时间计算,我的理解还不是很到位,还需进一步提高。

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

当前位置:首页 > 人文社科 > 文学研究

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2