计算机操作系统实验_创建GeekOS内核线程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

-1-西北工业大学操作系统实验实验报告一、实验目的分析GeekOS中内核代码,掌握内核线程的实现原理二、实验要求1.创建一个线程,实现从键盘接收一个按键,并在屏幕上显示。2.创建两个线程,分别打印输出不同的字符串信息。观察并分析结果。3.自行设计个性化的内核线程,给出运行结果。三、实验过程及结果1.创建一个线程,实现从键盘接收一个按键,并在屏幕上显示。答:代码实现如下:voidprint_key(){Print(ToExithitCtrl+d.\n);Keycodekeycode;while(1){if(Read_Key(&keycode)){if(!((keycode&KEY_SPECIAL_FLAG)||(keycode&KEY_RELEASE_FLAG))){intasciiCode=keycode&0xff;if((keycode&KEY_CTRL_FLAG)==KEY_CTRL_FLAG&&asciiCode=='d'){Print(\n---------BYE!--------\n);Exit(1);}else{Print(%c,(asciiCode=='\r')?'\n':asciiCode);}}}}}在屏幕上输入:weareallinthegutter,butsomeofusarelookingatthestars.-2-结果如图:2.创建两个线程,分别打印输出不同的字符串信息,观察并分析结果。答:创建两个线程,代码如下:voidinput2(){while(true){Print(A);}}voidinput3(){while(true){Print(B);}}两个线程分别输出字符‘A’和字符‘B’,结果如下图。从结果中可以看出,两个线程共享CPU时间,同一时间只能运行一个线程,且运行哪一个线程是随机地。-3-3.自行设计个性化的内核线程,给出运行结果。答:创建两个线程,线程一不停的画一个大的心形,线程二不停的画小的心形,两个线程交替执行,产生“心跳”的动态效果。代码如下:voidoutput4(){while(1){inti,j;Clear_Screen();Put_Cursor(0,0);Print(************\n);Print(********************\n);Print(**************************\n);for(i=0;i3;i++){for(j=0;j29;j++)Print(*);Print(\n);}for(i=0;i7;i++){for(j=0;j2*(i+1)-1;j++)Print();for(j=0;j27-i*4;j++)Print(*);Print(\n);-4-}for(i=0;i14;i++)Print();Print(*\n);Clear_Screen();Put_Cursor(0,0);}}voidoutput5(){while(1){inti,j;Clear_Screen();Put_Cursor(0,0);print(\n);print(\n);print(\n);Print(**********\n);Print(****************\n);i=0;for(i=0;i3;i++){for(j=0;j19;j++)Print(*);Print(\n);}for(i=0;i5;i++){for(j=0;j2*(i+1)-1;j++)Print();for(j=0;j17-i*4;j++)Print(*);Print(\n);}Clear_Screen();Put_Cursor(0,0);}}结果如图:“大心”和“小心”交替出现产生类似于“心脏跳动”的动态效果。-5-四、实验分析关于屏幕显示键盘录入的字符实验:试验中,要使屏幕显示键盘录入的字符,可以使用GeekOS提供的两个接口,一个是boolRead_Key(Keycode*keycode),另一个是Keycode-6-Wait_For_Key(void);对于第一个接口,按键按下和松开都会产生扫描码,同一个按键按下和松开产生的扫描码只有最高位不同。通过对一系列的功能键的处理和判断,最后的到keycode,放入键盘缓存区中。Wait_For_Key也是从缓冲区取数据,如果gotKey为1,说明键盘缓冲区不空,则从缓冲区出一个键盘码。若gotKey为0则调用wait将线程置于等待队列s_waitQueue中。在键盘中断函数中会唤醒此等待队列。综合比较这两个接口,明显Wait_For_Key更适合我们的任务。我们的线程只需要调用Wait_For_Key获取keycode,再显示出来即可。当没有键盘输入的时候,线程自动进入等待队列,当有键盘操作时,线程被自动唤醒。Geekos中的多任务机制分析:1.时钟中断产生线程切换任务A---时钟中断---从通用Handle一Interrupt进入特定中断函数Timer_Interrupt_Handler---加时钟滴答---滴答未到期---返回Handle_lnterrupt恢复堆栈回来运行任务A。任务A---时钟中断---从通用Handle_Interrupt进入特定中断函数Timer_Interrupt_Handler---加时钟滴答---滴答到期,置全局标志g_needReschedule表示需要重新调度---返回Handle_Interrupt调用Get_Next_Runnable将新要运行的线程结构体献给上currentThread,并恢复新线程的堆栈---最后iret返回,运行新进程。2.键盘中断产生线程切换任务A---按了一下键位,产生键盘中断---从通用Handle_Interrupt进入特定中断函数Keyboard_Interrupt_Handler---处理扫描码得到显示字符keycode,并将keycode放入队列,唤醒等待键盘缓冲区的进程之后,直接置全局标志g_needReschedule表示需要重新调度---返回Handle_Interrupt调用Make_Runnable将新要运行的线程结构体赋给g_currentThread并恢复新线程的堆栈---最后iret返回,运行新进程。五、所遇问题及解决方法-7-通过此次实验,我由原来对操作系统只有一个粗浅的概念的认识的水平上升到对操作系统有比较深刻印象和理解的程度。不仅概念得到了进一步的理解,更是对操作系统框架有一个整体的认识。包括深入体会操作系统是怎么实时显示出我们在键盘上敲击的字符,以及操作系统中线程的创建和使用,以及进程调度的相关概念和具体实现。本次试验对于我来说,还是很有困难的,因为GeekOS的了解程度还不够,我对进程和线程的概念掌握的还不是很好,导致在做实验的过程中遇到了一些困难。尤其是在屏幕上显示键盘敲击的字符那个实验,因为之前的确没有深入想过这其中的原理,导致在实验过程中屡次失败,最后在查找了相关资料后才得以解决。之前都没有对操作系统做详细的研究,但克服了相应困难,总是有收获的。在困难中,我学到了很多在课堂上学不到的知识,可以说是受益匪浅。

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功