计算机操作系统试验_创建GeekOS内核线程
西北工业大学西北工业大学 操作系统实验操作系统实验 实验报告实验报告 一、实验目的一、实验目的 分析 GeekOS 中内核代码,掌握内核线程的实现原理 二、实验要求二、实验要求 1.创建一个线程,实现从键盘接收一个按键,并在屏幕上显示。 2.创建两个线程,分别打印输出不同的字符串信息。观察并分析结果。 3.自行设计个性化的内核线程,给出运行结果。 三、实验过程及结果三、实验过程及结果 1. 1.创建一个线程,实现从键盘接收一个按键,并在屏幕上显示。创建一个线程,实现从键盘接收一个按键,并在屏幕上显示。 答:代码实现如下:答:代码实现如下: void print_key()void print_key() { { Print(“To Exit hit Ctrl + d.\n“);Print(“To Exit hit Ctrl + d.\n“); Keycode keycode;Keycode keycode; while(1)while(1) { { if( Read_Key(int asciiCode=keycode if((keycodePrint(“\n---------BYE!--------\n“); Exit(1);Exit(1); }else}else { { Print(“%c“,(asciiCode== \r )? \n :asciiCode);Print(“%c“,(asciiCode== \r )? \n :asciiCode); } } } } } } } } } } 在屏幕上输入:we are all in the gutter, but some of us are looking at the stars.we are all in the gutter, but some of us are looking at the stars. -1- 结果如图: 2. 2.创建两个线程,分别打印输出不同的字符串信息,观察并分析结果。创建两个线程,分别打印输出不同的字符串信息,观察并分析结果。 答:创建两个线程,代码如下: void 2()void 2() { { while(true)while(true) { { Print(“A“);Print(“A“); } } } } void 3()void 3() { { while(true)while(true) { { Print(“B“);Print(“B“); } } } } 两个线程分别输出字符‘A’和字符‘B’,结果如下图。 从结果中可以看出,两个线程共享 CPU 时间,同一时间只能运行一个线程, 且运行哪一个线程是随机地。 -2- 3. 3.自行设计个性化的内核线程,给出运行结果。自行设计个性化的内核线程,给出运行结果。 答:创建两个线程,线程一不停的画一个大的心形,线程二不停的画小的心形, 两个线程交替执行,产生“心跳”的动态效果。 代码如下: void output4(){void output4(){ while(1){while(1){ int i,j;int i,j; Clear_Screen();Clear_Screen(); Put_Cursor(0,0);Put_Cursor(0,0); Print(“Print(“******************\n“);******\n“); Print(“Print(“******************************\n“);**********\n“); Print(“ ************* *************\n“);Print(“ ************* *************\n“); for(i=0;i从通用 Handle 一 Interrupt 进入特定中断函数 Timer_Interrupt_Handler-加时钟滴答-滴答未到期-返回 Handle_lnterrupt 恢复堆栈回来运行任务 A。 任务 A-时钟中断-从通用 Handle_Interrupt 进入特定中断函数 Timer_Interrupt_Handler-加时钟滴答-滴答到期,置全局标志 g_need Reschedule 表示需要重新调度-返回 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 返回,运行新进程。 五、所遇问题及解决方法五、所遇问题及解决方法 -6- 通过此次实验, 我由原来对操作系统只有一个粗浅的概念的认识的水平上升 到对操作系统有比较深刻印象和理解的程度。不仅概念得到了进一步的理解,更 是对操作系统框架有一个整体的认识。 包括深入体会操作系统是怎么实时显示出 我们在键盘上敲击的字符,以及操作系统中线程的创建和使用,以及进程调度的 相关概念和具体实现。 本次试验对于我来说,还是很有困难的,因为 GeekOS 的了解程度还不够, 我对进程和线程的概念掌握的还不是很好, 导致在做实验的过程中遇到了一些困 难。 尤其是在屏幕上显示键盘敲击的字符那个实验,因为之前的确没有深入想过 这其中的原理, 导致在实验过程中屡次失败,最后在查找了相关资料后才得以解 决。 之前都没有对操作系统做详细的研究,但克服了相应困难,总是有收获的。 在困难中,我学到了很多在课堂上学不到的知识,可以说是受益匪浅。 -7-