当前位置:文档之家› Nachos 实验报告

Nachos 实验报告

Nachos 实验报告
Nachos 实验报告

四川大学

操作系统课程设计报告

学院:软件学院

专业:软件工程专业

年级:06级

组编号:第25组

组成员:王鑫0643111082

刘世彬0643111

杨斌0643111244

王秀才0643111090

提交时间:2008年6月16日

指导教师评阅意见:

.

. . . .

指导教师评阅成绩:王鑫:

王秀才:

杨斌:

刘世彬:

实验项目一

项目名称:开发Shell程序

试验背景知识

Shell

文字操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell 管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。

shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行。shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。

Shell基本上是一个命令解释器,类似于DOS下的https://www.doczj.com/doc/6c885736.html,。它接收用户命令(如ls等),然后调用相应的应用程序。较为通用的shell有标准的Bourne shell (sh)和C shell (csh)。

交互式shell和非交互式shell

交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。

shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。实验目的:

Shell是一个命令处理器(command processor)——是一个读入并解释你输入的命令的程序,它是介于使用者和操作系统之核心程序(kernel)间的一个接口。它是一个交互性命令解释器。shell 独立于操作系统,这种设计让用户可以灵活选择适合自己的shell。shell 让你在命令行键入命令,经过shell 解释后传送给操作系统(内核)执行。

参与人员及分工:

王鑫:书写代码

王秀才:查资料,组织代码和报告的书写工作

杨斌:书写代码

刘世彬:平台的搭建和调试运行

实验环境:Redhat Enterprise Linux 12.0

NachOS-4.1

>试验环境的搭建:Vmware的安装,linuxd的安装,sin sight的安装

Vmware的安装

Vmware是一个虚拟机软件,它可以在windows平台上虚拟出真实机器的硬件环境的,使得我们可以在不购买新机器的情况下就可以在一个机器上运行多个操作系统。

Vmware的安装和普通的windows应用程序安装没有太大的差别,是一个相当“傻瓜”的过程,只要按照提示,依次点击“下一步”就可顺利地完成vmware的安装了。

虚拟机的创建

i.如果所示,在file中选择new——新虚拟机

ii.然后选择定制创建虚拟机——选择操作系统类型(linux-

redhat linux)——虚拟机名称和虚拟机文件安放的路径—

—虚拟机器模拟内存——网络选择——选择I/O适配器—

—硬盘创建——设置虚拟机器硬盘名称

如果所示:

定制虚拟机器

操作系统类型以及虚拟机名称和虚拟机文件安放的路径

虚拟机器模拟内存

网络选择

选择I/O适配器

硬盘创建

虚拟机器搭建完成以后,然后安装linux.

虚拟机创建完成后vmware 的主窗口就会多出一个标签页,这页的内容正式我们所创建

的虚拟机的信息。(如图1-12)

图1-12 新建虚拟机信息

点击标签页上的“start this virtual machine”就可以启动我们刚刚创建的虚拟机,但是由于我们只是让vmware帮我们模拟出了一个硬件机器,我们还没有向这个机器上安装任何软件,所以我们的机器运行后除了一些BIOS程序的输出外别的什么也没有,也什么都不能干,所以我们需要进行下一步,向虚拟机上安装OS和应用程序。

虚拟机上linux的安装

虚拟机创建好了,vmware只是按照我们的要求模拟出了一个硬件机器,到目前位置这个虚拟机上并没有安装任何软件,也不能做任何事情。这一步的目的就是要向虚拟的硬件机器上安装linux操作系统,进而安装其他应用程序。

在虚拟机上安装linux和在真实机器上由光驱安装linux是相同的过程。

首先需要把安装光盘放到光驱中,双击主界面上的CD-ROM,弹出如图1-13对话框:

图1-13 CD-ROM对话框

如果你有光驱,也有linux的安装光盘就可以选择“Use physical drive”;如果有linux 的ISO映象,就需要选“Use ISO image”,并且指定好映像的位置。安装光盘设置好后我们就可以启动虚拟机器进行安装了。

机器正常从光驱启动就会出现如图1-14的画面:Rat Hat安装界面

nachos用来分析源码,所以随便你放在linux下面的都可以。在windows下面直接用

winrar就可以解压。在linux下面用命令 tar -zvxf nachos-3.4.1.tar.Z解压。重要的是nachos4.1及其交叉编译工具的安装。

1 把nachos4.1下载到/usr/local目录

2 tar -zvxf nachos-4.1.tgz

3 进入解压后的目录,其中有code子目录,再进入其中的build.linux子目录

4 输入 make depend

5 输入 make 看看结束有没有错误,如果没有,那么就成功了。

编译好的nachos系统镜像就在build.linux目录下,运行时直接 . / nachos 就可以了。

如果要到其他目录下运行的话,还要export才行。nachos详细运行参数可以用

. / nachos -u 得到。

交叉编译工具的搭建。

把下载的交叉编译工具放到 / 目录下,即根目录下然后用tar -zvxf 命令解压即可。必须放到根目录下,因为压缩包里面包含了/usr/local的目录层次。

另外还需要编译测试程序转换工具,进入 nachos4.1/code/coff2noff

运行 . / configure

make 即可。

然后在Rat Hat上编译出nachos,其系统结构如下图所示:

Si35Setup.rar的安装

虽然在linux我们可以高效地完成所有开发所需的任务,但是对于刚刚开始接触unix/linux的同学,一下子用熟那么多的工具还是有些困难的。正是基于这一点我们的教学网站上也提供了在windows下用来阅读代码的工具Source Insight,借助于它我们可以加快代码阅读速度。

这个软件的安装是个很简单的过程只要运行setup一路next下去就可以了。

代码阅读时要先建工程,点击project-new project,然后按照要求回答源代码的位置,工程就会顺利的建成。代码阅读时如果需要一些功能比如想要查找某个符号的定义只要在选定的符号上点右键就会弹出菜单,选择相应的命令就可以了。

Nachos的介绍

Nachos的全称是“Not Another Completely Heuristic Operating System”,它是一个可修改和跟踪的操作系统教学软件。它给出了一个支持多线程和虚拟存储的操作系统骨架,可让学生在较短的时间内对操作系统中的基本原理和核心算法有一个全面和完整的了解。

Nachos的目录结构

以上操作系统可以发现在工作目录下生成一个名为nachos-3.4 的目录。该目录中含有:copyright 文件 Nachos 的版权信息

readme 文件 Nachos 的readme 信息

nachos.ps 文件 Nachos 的介绍文档(Postscript 格式)

c++example 目录有关C++介绍和实例

doc 目录 Nachos 各个部分介绍和原有的作业要求

code 目录 Nachos 各个部分的源代码

最主要的部分是Nachos 的源代码部分。它的目录结构是:

Makefile

https://www.doczj.com/doc/6c885736.html,mon

Makefile.dep

文件

文件

文件

Nachos 的Makefile 文件。当Nachos 需要移植到其它系统时,

可以修改Makefile.dep 中的HOST 参数

machine 目录 Nachos 虚拟机模拟部分源代码

threads 目录 Nachos 线程管理部分源代码

filesys 目录 Nachos 文件系统管理部分源代码

userprog 目录 Nachos 用户程序部分源代码

network 目录 Nachos 网络管理部分源代码

vm 目录 Nachos 虚拟内存管理部分源代码

test 目录一些测试用应用程序

bin 目录包含有用户程序目标码变换的程序

三、各个部分的编译运行

Nachos的各个部分都可以独立编译运行,也可以同时编译各个部分。全部编译可以采用如下命令:

~/nachos-3.4$ make

当需要单独编译线程管理部分时,先进入threads 目录,然后采用如下命令:

~/nachos-3.4/threads$ make depend

~/nachos-3.4/threads$ make nachos

实际上,各部分目录下都有一个Makefile 文件,内容大体相同,区别在于一些条件编译的参数。比如在单独编译线程管理部分时,文件管理部分就被屏蔽了,这样读者读者就可以专心于线程管理部分的调试。

四、应用程序的编译

由于Linux 指令集和R2/3000 指令集不同,用户编写的应用程序用Linux 系统中标准gcc 编译后,不能直接在Nachos 虚拟机环境下运行。所以需要采用交叉编译技术。所谓交叉编译技术是在一个操作系统下将源码编译成另一个操作系统的目标码,这里就是在Linux 下通过gcc 交叉编译版本将用户程序的源码编译成R2/3000 指令集的目标码。

在Linux 中,没有缺省的交叉编译工具。读者可以到上海交通大学计算机系FTP 服务器上下载,URL 为:

ftp://https://www.doczj.com/doc/6c885736.html,/linux/cross-compiler.tgz

该文件的解开需要有超级用户的权利,将解开至/usr/local/目录下:

/# gzip -dc cross-compiler.tgz | tar xf -

在编译用户程序时,用交叉编译器将源码编译成R2/3000 指令集的目标代码,再经过一个简单的转换就可以在Nachos 虚拟机上运行。注意,在读者实现虚拟存储之前,有些应用程序可能会因为使用过多的内存而不能运行。

实验内容:

本项目在实践的过程中需要注意以下要点:

Shell项目的要求

一、设计一个简单的命令行shell,满足下面的属性并且可以在指定的UNIX

平台下执行。

1.这个shell支持一下内部命令:

a)cd——把当前默认目录改变为。如果没有

参数,则显示当前目录。如果该目录不存在,会出现

合适的错误信息。

b)cle——清屏。

c)dir——列出目录的内容。

d)environ——列出所有的环境变量。

e)echo——在屏幕上显示并且换行(多个空格和制

表符可能被缩减为一个空格)。

f)help——显示用户手册,并且使用more命令过滤。

g)pause——停止shell操作直到按下回车键。

h)quit——推出shell。

i)shell的环境变量应该包含shell=/myshell,其中

/myshell是可以执行的shell完整路径(及shell的可

执行路径,而不是他在目录下的硬连接路线)。

2.其他的命令行输入被解释为程序的调用,shell创建并执行折个程序,

并作为自己的子进程。程序的执行的环境变量包含在以下条目中:

parent=/shell,其中/myshell已经在1.i)中描

述过了。

3.Shell必须能够从文件中提取命令输入

例如shell使用以下命令行被调用:

programname arg1 arg2 outputfile

这个批处理文件应该包括一组命令集,当到达文件结尾时shell退出。

很明显,如果shell被调用是没有使用参数,他会在屏幕上显示提示符

请求用户输入。

4.Shell必须支持i/o重定向,stdin和stdout,或者其中之一

a)例如命令行:

programname arg1 arg2 outputfile

使用arg1以及arg2执行程序programname,输入文件流被替换为

inputfile,输出文件流被替换为outputfile.

b)stdout重定向应该支持一下的内部命令:

i.dir

ii.environ

iii.echo

iv.help

以上内部命令已在1中有具体解释,本处比在叙述。

使用输出重定向时,如果重定向字符为>,则创建输出文件,如果存在则

覆盖之;如果重定向字符为〉〉,也会创建输出文件,如果存在则添加到

文件尾。

5.shell必须支持后台程序执行。如果在命令行后面添加&字符,在加载

完程序后需要立刻返回命令行的提示符。命令行提示符必须包含当前

路径。

二、写一个关于使用如何使用shell的简单的用户手册,用户手册应该包括足

够的细节以方便UNIX的初学者简单方便的使用这个shell程序。

例如:解释i/o重定向,程序环境以及后台程序执行。用户手册必

须命名为readme,必须为一个可以并准文件编辑器可以打开的简单

的文档。

例如这个描述类型和深度的例子,cah和tcsh的在线帮助(man

csh,man tcsh)。这两个shell明显比我们所谓的shell具有更加强

大功能。所以用用户手册不一定要非常庞大,也不应包括编译指示

——即文件列表和源代码,这个用户手册应该面向操作用户,所以

台应该是一个操作用手册而不是一个程序员手册。

三、源代码必须有很详细得注释,并且要有很好的组织结构以方便非制作人员

的阅读,维护或者修改。结构和注释使程序跟更加易于阅读和理解,并且可以保证批改你的作业的人不用很费劲的去读你的源代码。

四、在提交的源代码文件中,包括:

a)原文件

b)makefile

c)readme

并且这些源代码应该能够编译完成完整的结果。

五、 makefile必须产生二进制未见myshell。

例如一个makefile例子:

#Joe Citizen,s1234567-Operating Systems Project 1

#CompLab1/01 tutor: Fred Bloggs

myshell:myshell.c utility,c myshell.h

gcc-Wall myshell.c utility.c-o myshell

在执行命令符键入make就会产生myshell程序。上述makefile从第4行

必须以制表符开始。

六、根据上述第6点的实例中,提交的目录中应该包含以下文件:

i.makefile

ii.myshell.c

iii.utility.c

iv.myshell.h

v.readme

项目说明:可以通过调用Linux下的/bin/sh来实现该项目shell,主要是实现几个nachos 系统调用:SysWrite,SysRead,SysExec,SysJoin,SysStrncmp 然后就是在https://www.doczj.com/doc/6c885736.html, 中调用这些系统调用

在shell中它们的作用:

SysWrite: 显示提示符与shell的版本信息

SysRead:读取n个字符到缓存buffer

SysExec 与SysJoin:主要是用来执行命令,如dir 等。如果该命令不存在则打印错误信息

SysStrncmp:比较两个字符串的前n个字符,主要用来判断用户是否输入了exit命令以退出shell

Nachos中修改的地方:

1. syscall.h

添加了代码:#define SC_Strncmp 43

int Strncmp(char *buffer,char*str,int size);

2. Ksyscall

添加的代码:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define SHELL "/bin/sh"

int SysWrite(char*buffer ,int size,OpenFileId id) {

return write(id,buffer,(size_t)size);

}

int SysRead(char*buffer ,int size,OpenFileId id) {

return read(id, buffer, (size_t) size);

}

SpaceId SysExec(char* exec_name)

{

pid_t child;

child = vfork();

if(child == 0)

{

execl (SHELL, SHELL, "-c", exec_name, NULL);

_exit (EXIT_FAILURE);

}

else if(child < 0)

return EPERM;

return (SpaceId) child;

}

int SysJoin(SpaceId id)

{

return waitpid((pid_t) id, (int*) 0, 0);

}

int SysStrncmp(char*buffer,char *str,int n)

{

return strncmp(buffer,str,(size_t)n);

}

3. https://www.doczj.com/doc/6c885736.html,

case SC_Write:

DEBUG(dbgSys,"Write from buffer to consoleOutput"<machine->ReadRegister(4)<machine->ReadRegister( 5)<machine->ReadRegister(6)<<"\n");

char wbuffer[60];//the buffer to store information from userprogram int size ;

size=(int)kernel->machine->ReadRegister(5);

OpenFileId printOut;

printOut= (OpenFileId)kernel->machine->ReadRegister(6);

int addressOne;

addressOne=(int)kernel->machine->ReadRegister(4);

int i;

i=0;

do{

kernel->machine->ReadMem(addressOne++,1,(int*)&wbuffer[i++]);

}while(i

int n1;

n1=SysWrite((char*)wbuffer,size,printOut);

kernel->machine->WriteRegister(2,n1);

/* Modify return point */

{

/* set previous programm counter (debugging only)*/

kernel->machine->WriteRegister(PrevPCReg,

kernel->machine->ReadRegister(PCReg));

/* set programm counter to next instruction (all Instructions are 4 byte wide)*/

kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4);

/* set next programm counter for brach execution */

kernel->machine->WriteRegister(NextPCReg,

kernel->machine->ReadRegister(PCReg)+4);

} return;

ASSERTNOTREACHED();

break;

case SC_Read:

DEBUG(dbgSys, "read from buffer" << kernel->machine->ReadRegister(4) << kernel->machine->ReadRegister(5)<< kernel->machine->ReadRegister(6) << "\n");

int rsize ;

rsize=(int)kernel->machine->ReadRegister(5);

OpenFileId enterIn;

enterIn = (OpenFileId)kernel->machine->ReadRegister(6);

char addressTwo;

addressTwo = (char)kernel->machine->ReadRegister(4);

int local ;

local= (int)kernel->machine->ReadRegister(4);;

int n2 ;

n2= SysRead(&addressTwo,rsize,enterIn);

kernel->machine->WriteMem(local,1,(int)addressTwo);

kernel->machine->WriteRegister(2,n2);

/* Modify return point */

{ /* set previous programm counter (debugging only)*/

kernel->machine->WriteRegister(PrevPCReg,

kernel->machine->ReadRegister(PCReg));

/* set programm counter to next instruction (all Instructions are 4 byte wide)*/

kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4);

/* set next programm counter for brach execution */

kernel->machine->WriteRegister(NextPCReg,

kernel->machine->ReadRegister(PCReg)+4);

}

return;

ASSERTNOTREACHED();

break;

case SC_Exec:

DEBUG(dbgSys,"execute a command"<machine->ReadRegister(4)<<"\n");

char ebuffer[60];

int addressThree;

addressThree = kernel->machine->ReadRegister(4);

int c;

c = 0;

do{

kernel->machine->ReadMem(addressThree++,1,(int*)&ebuffer[c++]);

}while(c<60);

kernel->machine->WriteRegister(2,SysExec(ebuffer));

/* Modify return point */

{/* set previous programm counter (debugging only)*/

kernel->machine->WriteRegister(PrevPCReg,

kernel->machine->ReadRegister(PCReg));

/* set programm counter to next instruction (all Instructions are 4 byte wide)*/

kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4);

/* set next programm counter for brach execution */

kernel->machine->WriteRegister(NextPCReg,

kernel->machine->ReadRegister(PCReg)+4);

}

return;

ASSERTNOTREACHED();

break;

case SC_Join:

DEBUG(dbgSys,"jion "<machine->ReadRegister(4)<<"\n");

kernel->machine->WriteRegister(2,SysJoin((SpaceId)kernel->machine->ReadRegister(4)) );

/* Modify return point */

{

/* set previous programm counter (debugging only)*/

kernel->machine->WriteRegister(PrevPCReg,

kernel->machine->ReadRegister(PCReg));

/* set programm counter to next instruction (all Instructions are 4 byte wide)*/

kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4);

/* set next programm counter for brach execution */

kernel->machine->WriteRegister(NextPCReg,

kernel->machine->ReadRegister(PCReg)+4);

}

Return;

ASSERTNOTREACHED();

break;

case SC_Strncmp:

DEBUG(dbgSys, "compare two string " << kernel->machine->ReadRegister(4) <machine->ReadRegister(5) << kernel->machine->ReadRegister(6) << "\n");

int addressFour;

addressFour = kernel->machine->ReadRegister(4);

int addressFive;

addressFive = kernel->machine->ReadRegister(5);

char str1buffer[60];

char str2buffer[60];

int d,e;

d= 0;

e=0;

do{

kernel->machine->ReadMem(addressFour++,1,(int*)&str1buffer[d++]); }while(d<60);

--addressFour;

do{ kernel->machine->ReadMem(addressFive++,1,(int*)&str2buffer[e++]);

}while(e<60);

--addressFive;

int n3;

n=SysStrncmp(str1buffer,str2buffer,kernel->machine->ReadRegister(6));

kernel->machine->WriteRegister(2,n3);

/* Modify return point */

{/* set previous programm counter (debugging only)*/

kernel->machine->WriteRegister(PrevPCReg,

kernel->machine->ReadRegister(PCReg));

/* set programm counter to next instruction (all Instructions are 4 byte wide)*/

kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) +

4);

/* set next programm counter for brach execution */

kernel->machine->WriteRegister(NextPCReg,

kernel->machine->ReadRegister(PCReg)+4);

}

return;

ASSERTNOTREACHED();

break;

4. shell.c

Write( "<-My shell ver 1.0->\n", 21, output);

if(Strncmp(buffer,"exit",4)==0)

{

Halt();

}

5. start.s

.globl Strncmp

.ent Strncmp

Strncmp: addiu $2,$0,SC_Strncmp

syscall j $31

.end Strncmp

.globl Exit

.ent Exit

实验结果:

执行命令 ./nachos –x ../test/shell.noff

Nachos_Project_1_2014-操作系统实验

Nachos实验项目 本实验项目采用纽约大学计算机系相关课程的实验设计。这些实验的内容以及nachos 的完整介绍请参考相关文档。 Nachos实验项目将采用分组方式完成。每4人为一组(个别组除外)。分组确定后,未经特别批准,不得变更。请各组组长在自己的起始目录下创建试验结果提交目录“nachos”(不含引号,均为小写字母)。 每次实验,我们都将指定需要提交的内容和截止时间,第一次试验的提交内容放在起始目录下的“nachos/1”目录内,第二次的放在“nachos/2”内,依次类推。请大家关注,并严格按要求操作。一个小组只要提交一份实验报告即可。对未按实验提交要求操作而造成提交失败的,将被视为实验未完成(提交内容由程序自动收集)。 从第4周起,双周的周二下午2:30~5:30为试验时间并兼做理论课程答疑时间。实验地点在404。 实验一体验Nachos下的并发程序设计 (实验指导:os_lab.ppt) 1内容简述 本次实验的目的在于对nachos进行熟悉,并初步体验nachos下的并发程序设计。实验内容分三部分:安装nachos;用C++实现双向有序链表;在nachos系统中使用你所写的链表程序并演示一些并发错误。 2实验内容(详见英文文档nachos-lab.pdf文档3.1章) 2.1安装nachos 2.2实现双向有序链表(50%) 如对c++不很熟悉,可以参考nachos-3.4/c++example/中的有关实现。 2.3体验nachos线程系统(50%) 需要做的更改有: 1)将dllist.h, https://www.doczj.com/doc/6c885736.html,, https://www.doczj.com/doc/6c885736.html,等文件拷贝到nachos-3.4/code/threads/目录中。 2)修改https://www.doczj.com/doc/6c885736.html,mon中的THREAD_H、THREAD_C、THREAD_O以保证新的文件确 实被编译了。 3)根据实验内容,https://www.doczj.com/doc/6c885736.html,,https://www.doczj.com/doc/6c885736.html,等文件可能需要改动。 3实验结果的提交 本实验应提交的内容: https://www.doczj.com/doc/6c885736.html,mon https://www.doczj.com/doc/6c885736.html, https://www.doczj.com/doc/6c885736.html, dllist.h https://www.doczj.com/doc/6c885736.html,

操作系统实验报告三

课程实验报告 课程名称姓名实验名称实验目的及要求 实验3进程并发与同步 1、加深对进程概念的理解,区分进程并发执行与串行执行; 2、掌握进程并发执行的原理,理解进程并发执行的特点; 3、了解fork()系统调用的返回值,掌握用fork()创建进程的方法;熟悉wait、exit等系统调用; 4、能利用相应的系统调用实现进程树与进程间的同 步。 实 验操作系统:linux Un bu ntu 11.10 环 境实验工具:Vmware 实验内容 1、编写一C语言程序,实现在程序运行时通过系统调用fork()创建两个子进程,使父、子三进程并发执行,父亲进程执行时屏幕显示“I am father ”,儿子进 程执行时屏幕显示“ I am son ",女儿进程执行时屏幕显示“ I am daughter ”。 要求多次连续反复运行这个程序,观察屏幕显示结果的顺序,直至出现不一样的情况为止。要求有运行结果截图与结果分析 2、连续4个fork()的进程家族树,family1-1.c 程序清单如下: #in clude main () { fork(); fork(); fork(); fork(); printf( A\n ”); } 请根据程序运行结果,画出进程家族树,并分析原 因。

3、 修改程序1,在父、子进程中分别使用 wait 、exit 等系统调用“实现”其同 步推进,父进程必须等待儿子进程与女儿进程结束, 才可以输出消息。 写出相应的同 步控制,并分析运行结果。 4、 创建一个子进程,并给它加载程序,其功能是调用键盘命令“ ls -I ”,已知 该键盘命令的路径与文件名为: /bin/ls 。父进程创建子进程, 并加载./child2 程序。 写出相应的程序代码并分析程序运行结果。 1、编写一 C 语言程序,实现在程序运行时通过系统调用 fork()创建两个子进 程,使父、子三进程并发执行,父亲进程执行时屏幕显示“ I am father ”, 儿子进程执行时屏幕显示“ I am son ”,女儿进程执行时屏幕显示“ I am daughter "。并且反复的测试,观察每一次的执行的顺序有什么不同 2、修改程序1,在父、子进程中分别使用 wait 、exit 等系统调用“实现”其同 步推进,父进程必须等待儿子进程与女儿进程结束,才可以输出消息。 4、创建一个子进程,并给它加载程序,其功能是调用键盘命令“ ls -I ”,已知 该键盘命令的路径与文件名为: /bin/ls 。父进程创建子进程, 并加载./child2 程序。 法 描 述 及 实 验 步 骤 调 试过 程及实 验结果

Nachos实验报告9

计算机科学与技术学院实验报告:9 实验题目:设计并实现具有优先级的线程调度策略姓名:李威 日期:2013-12-1 学号:201100300259 班级:11级软件3班Email:sduliwei@https://www.doczj.com/doc/6c885736.html, 实验目的: Nachos系统采用基本的FCFS的线程调度策略,修改成为具有优先级的线程调度策略 硬件环境: 软件环境: linux操作系统,Nachos操作系统 实验步骤: 1.修改Thread类的构造函数,加入优先级priority属性,并且加入getPrioty方法。以便在线程的 等待队列中找到优先级最高的线程。其中,线程优先级的范围从1到7,默认为7,即最低优先级。 修改代码如下:(https://www.doczj.com/doc/6c885736.html,,thread.h) class Thread { …………………………………… public: Thread(char* debugName, int priority=7);// initialize a Thread ………………………………………………… int getPriority(){return this->priority; } Thread::Thread(char* threadName, int p) { if(p<1) priority = 1; else if(p>7) priority = 7; else priority = p; name = threadName; stackTop = NULL; stack = NULL; status = JUST_CREATED; #ifdef USER_PROGRAM space = NULL; #endif } 2,首先,了解Nachos系统原来的线程调度方式。通过读https://www.doczj.com/doc/6c885736.html,,https://www.doczj.com/doc/6c885736.html,,https://www.doczj.com/doc/6c885736.html,文件 中的内容了解线程调度的方式。

六年级科学实验报告

滕州市辰龙希望小学 六年级科学上册实验报告 六年级上册第三课《馒头发霉了》 实验名称:探究霉菌的生长所需要的条件 1 选做 实验目的:探究霉菌的生长所需要的条件。 实验材料:每组准备:放大镜、烧杯、吸管、小刀、水、塑料袋、馒 头 实验步骤: 1.将密封好的两袋馒头,一袋放在温度较高的地方,另一袋放在冰箱里,每天按时观察,看霉菌是否已经出现,把霉菌出现的时间和出现的部位记录在自己提前设计好的记录表里。 2.将密封好的两袋馒头,一袋滴上适量的水,使馒头保持湿润,另一袋不滴水,使馒头保持干燥,将两袋馒头放在相同的环境中,每天按时观察,看霉菌是否已经出现,把霉菌出现的时间和出现的部位记录在自己提前设计好的记录表里。 实验结论: 放在温度较高地方的馒头和滴上水的馒头很快长出了霉菌,而放在冰箱里的馒头和不滴水的馒头却经过较长的时间才长出霉菌。 实验分析: 因为霉菌的生活需要适宜的温度和适量的水份,所以放在温度较高地方的馒头和滴上水的馒头很快长出了霉菌。 六年级上册第二课《馒头发霉了》 实验名称:馒头发霉的对比实验 2 选做

实验目的:比较馒头在什么情况下容易发霉 实验器材:四片馒头(或用其他容易发霉的食物)塑料袋 实验步骤: 1选4片馒头(或用其他容易发霉的食物),分别贴上号码。 2.在1、3号上滴水,将2、4号烤干。 3?将4片馒头分别装入袋中。 4?将1 2号放在朝阳的窗台上(或其他温度较高的地方),3、4号放入冰箱里。 5.几天后,观察4片馒头,看一看发生了什么变化,并记录下来。 实验结论: 1号馒头发霉最早,发霉的面积最大。 2号、3号馒头发霉时间和面积居中。 4号馒头发霉时间晚,发霉面积小。 实验分析:馒头在潮湿,高温的情况下最容易发霉。 六年级上册第五课《蜡烛的变化》 实验名称:蜡烛燃烧的变化实验 1 必做 实验目的:点燃蜡烛,将干玻璃片放在火焰上方看是否会产生新物质。 实验类型:演示 实验材料: 每组准备:蜡烛、火柴、干玻璃片、试管夹 实验过程: 1 .点燃蜡烛,观察现象。

操作系统实验报告三

课程实验报告

3、修改程序1,在父、子进程中分别使用wait、exit等系统调用“实现”其同步推进,父进程必须等待儿子进程与女儿进程结束,才可以输出消息。写出相应的同步控制,并分析运行结果。 4、创建一个子进程,并给它加载程序,其功能是调用键盘命令“ls -l”,已知该键盘命令的路径与文件名为:/bin/ls。父进程创建子进程,并加载./child2程序。写出相应的程序代码并分析程序运行结果。 算法描述及实验步骤 1、编写一C语言程序,实现在程序运行时通过系统调用fork( )创建两个子进 程,使父、子三进程并发执行,父亲进程执行时屏幕显示“I am father”, 儿子进程执行时屏幕显示“I am son”,女儿进程执行时屏幕显示“I am daughter”。并且反复的测试,观察每一次的执行的顺序有什么不同 2、修改程序1,在父、子进程中分别使用wait、exit等系统调用“实现”其同 步推进,父进程必须等待儿子进程与女儿进程结束,才可以输出消息。 4、创建一个子进程,并给它加载程序,其功能是调用键盘命令“ls -l”,已知该键盘命令的路径与文件名为:/bin/ls。父进程创建子进程,并加载./child2程序。 调试过程及实验结果

总结 1、实现在程序运行时通过系统调用fork( )创建两个子进程,使父、子三进程并发执行,父亲进程执行时屏幕显示“I am father”,儿子进程执行时屏幕显示“I am son”,女儿进程执行时屏幕显示“I am daughter”。这一点需要注意。返回结果时,由于每一次的不确定性,所以要想得到比较具有说服性的,就必须经过多次的测试。 2、连续4个fork()的进程家族树在进行实验的时候可能会出现进程输出信息一直一样的情况,需要多次执行输出才有可能会看到输出结果不一样的情况

nachos Lab7实习报告

shell实现实习报告 页脚内容1

目录 内容一:总体概述 (3) 内容二:任务完成情况 (3) 任务完成列表(Y/N) (3) 具体Exercise的完成情况 (4) 内容三:遇到的困难以及解决方法 (19) 内容四:收获及感想 (20) 内容五:对课程的意见和建议 (20) 内容六:参考文献 (20) 页脚内容2

内容一:总体概述 本次实习需要实现用户程序shell。shell是提供使用者使用界面的软件(命令解析器),他接收用户命令,然后调用相应的应用程序。本次shell实现的基础是前面已经完成的相关功能。注意到nachos已经实现简单的shell,我们只需要在此基础上进行相关的修改。 内容二:任务完成情况 任务完成列表(Y/N) 页脚内容3

具体Exercise的完成情况 设计实现一个用户程序shell,通过./nachos -x shell进入用户交互界面中。在该界面中可以查询支持的功能、可以创建删除文件或目录、可以执行另一个用户程序并输出运行结果,类似Linux上跑的bash。你实现的越完善,碰到的问题越多,学到的也会越多。 本实验所修改的代码包括内核和用户程序两部分。 首先,需要解析输入的命令,这部分现有程序已经完成 Write(prompt, 2, output); Read(&buffer[i], 1, input); 因为在Lab6中,我没有考虑标准输入和标准输出的问题,所以需要修改https://www.doczj.com/doc/6c885736.html,处理read系统调用和处理write系统调用的部分 针对处理read系统调用的部分,如果系统调用的第3个参数是0(表示标准输入),那么读取从用户界面输入的字符串存入相应的位置 if(fd == 0){ for (int i = 0; i < count; i++) content[i] = getchar(); } 针对处理write系统调用的部分,如果系统调用的第3个参数是1(表示标准输出),那么输出缓冲区 页脚内容4

数电实验-实验报告-实验六

实验一 TTL与非门的参数测试 一、实验目的 ·掌握用基本逻辑门电路进行组合逻辑电路的设计方法。 ·通过实验,验证设计的正确性。 二、实验原理 1.组合逻辑电路的分析: 所谓组合逻辑电路分析,即通过分析电路,说明电路的逻辑。 通常采用的分析方法是从电路的输入到输出,根据逻辑符号的功能逐级列出逻辑函数表达式,最好得到表示输出与输入之间的关系的逻辑函数式。然后利用卡诺图或公式化简法将得到的函数化简或变换,是逻辑关系简单明了。为了使电路的逻辑功能更加直观,有时还可以把逻辑函数式转化为真值表的形式。 2.逻辑组合电路的设计: 根据给出的实际逻辑问题,求出实现这一逻辑功能的最简单电路,陈伟组合逻辑电路的设计。 3.SSI设计:设计步骤如下: ①逻辑抽象;分析时间的因果关系,确定输入和输出变量。 ②定义逻辑状态的含义:以二值逻辑0、1表示两种状态。 ③列出真值表 ④写出逻辑表达式,并进行化简,根据选定器件进行转换。 ⑤画出逻辑电路的连接图。 ⑥实验仿真,结果验证。 三、实验仪器及器件 数字万用表1台

多功能电路实验箱1台 四、实验内容 1.设计5421BCD 码转换为8421BCD 码(用双输入端与非门实现)。 四位自然二进制码 5421BCD码 B3 B2 B1 B0 D3 D2 D1 D0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 1 0 0 1 1 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 0 1 1 1 1 0 1 0 伪码 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 根据5421BCD 码与8421BCD 码真值表可得 2.设A 、B 、C 、D 代表四位二进制变量,函数X=8A-4B+2C+D ,试设计一个组合逻辑电路,判断当函数值介于4

实验六-实验报告

《数据库原理》实验报告 实验六、视图和图表的定义及使用实验 姓名胡艺敏学号38 系别 女 数计学院 班 级 11计科师 范 主讲教师江凤莲指导教师江凤莲实验日期2013 4-27 专 业 计算机 课程名称数据库原理同组实验者 一、实验目的 使学生掌握利用SQL Server企业管理器的视图创建向导和图表创建向导建立视图表和关系图(图表),加深对视图和图表概念的理解,了解视图和图表的作用。 二、实验要求 1)调出创建视图向导,在图书-读者库中按下列T-SQL描述创建读者视图。 CREATE VIEW 读者_VIEW AS SELECT 图书.*,借阅.* FROM 图书,借阅,读者 WHERE 图书.书号=借阅.书号AND借阅.读者编号=读者.编号; 2)调出向导,按T-SQL描述创建借阅_计算机图书视图。 CREATE VIEW 借阅_计算机图书 AS SELECT 图书.*,借阅.* FROM 图书,借阅 WHERE 图书.书号=借阅.书号AND图书.类别=‘计算机’ 3)调出创建图表向导,完成在图书_读者数据库中建立图书_借阅图表的操作。要求该图表包括图书和借阅两个表,通过“图书.书号=借阅.书号”外码与被参照表之间的关联。 4)查看以上视图和图表的属性,并修改到正确为止。 三、实验类型:验证、设计、综合 四、实验环境

Microsoft SQL Server 2000 五、实验内容: (1)实验代码(可加附页): (1)基本操作实验 1)查看图书-读者库结构信息,根据给定的T-SQL语句确定视图结构信息,如表10所示。 表10 视图结构信息 序号视图名 数据库 名 相关表名列定义元组定义 1 读者_VIEW 图书-读 者 图书,借阅, 读者 图书.*, 借阅.* 图书.书号=借阅.书号 AND 借阅.读者编号=读者. 编号 2 借阅_计算 机图书 图书-读 者 图书,借阅 图书.*, 借阅.* 图书.书号=借阅.书号 AND图书.类别='计算机' 2)查看图书-读者库结构信息,根据题目要求确定图表结构信息,如表11所示。 表11 图表结构信息 图表名数据库名主表名参照表 名 关联定义 读者_VIEW 图书-读 者 借阅图书图书.书号=借阅.书号 (2)实验结果(可加附页):

操作系统实验报告 实验三

昆明理工大学信息工程与自动化学院学生实验报告 (2012 —2013 学年第二学期) 课程名称:操作系统开课实验室:信自楼445 2013 年 5 月 16 日 一、实验要求 对给定的一个页面走向序列,请分别用先进先出算法和二次机会算法,计算淘汰页面的顺序、缺页次数和缺页率,具体的页面走向可参考教材例题或习题。 二、实验目的 存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。通过本次实验,要求学生通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解,通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。 三、实验原理及基本技术路线图(方框原理图) 用C或C++语言模拟实现请求式分页管理。要求实现:页表的数据结构、分页式内存空间的分配及回收(建议采用位图法)、地址重定位、页面置换算法(从FIFO,LRU,NRU中任选一种)。 提示:可先用动态申请的方式申请一大块空间,然后假设该空间为内存区域,对该空间进行

流程图:

数据结构定义: 我提供定义了两个类。第一个类就是页面类,在这类里面包括一些重要的数据成员。

有页号(page_no),页框号(frame_no),页面是否在内存的标志(flag(1表示在内存,0表示不在内存)),访问次数(times)。另一个类是进程控制块类PCB。类的数据成员有id(进程编号),name(进程名),size(进程大小),*p(页类指针)。在本类中,有一些成员函数:构造函数(用来初始化本类的所有数据),displayPCB(输出函数),convert(地址映射函数),allocation(分配函数),restore(回收函数)。另外还有一些类外的函数:initMemorySpace(初始化内存空间的函数),displayMemorySpace(输出内存空间的状态1(表示占用)0(表示空))。 四、所用仪器、材料(设备名称、型号、规格等)。 计算机一台 五、实验方法、步骤 程序代码: #include #include #include using namespace std; const int frame_size=1024;//页框长度,固定为 1k const int page_size=1024;//页面长度,固定为 1k const int memory_size=102400;//内存容量,固定为 100k const int frame_number=memory_size/frame_size;// 100k/1k=100 frames int *memory;//指针变量,用来存内存的状态1还是0。 void initMemorySpace()//初始化内存空间 { int i,ran,times; time_t t;//定义time_t对象 t t=time(0); srand(t);//随机改变每秒 times=0;//变量times初始化为0,变量的功能是检查内存空间是否有一半空了没。 memory=new int[frame_number];//申请内存空间,有frame_number 这么大的空间 for(i=0;i

nachos实验七实验报告

nachos实验报告七 实验题目: Extension of AddrSpace 学号:201200301057 日期:2014-11-29 班级:计软12-3 姓名:高鹏辉 实验目的: 在了解了Nachos 装入并执行单个用户进程的情况后,我们就需要进一步完成用户内存空间的扩充以便多用户程序同时驻留内存,进而使多用户进程并发执行。 硬件环境: Mem:3.9G CPU:Intel? Core?2 Quad CPU Q9500 @ 2.83GHz × 4 Disk:15.5 GB 软件环境: System:ubuntu12.04LST i386 gcc: (Ubuntu 4.6.3-1ubuntu5) 4.6.3 nachos system 实验步骤: 要在Nachos中实现多用户程序同时驻留内存并发执行,首先涉及到Nachos的两个系统调用:Exec()和Exit()。这两个系统调用也是构造父子进程并发执行的基础。假设我们有以下两个用户程序:../test/exec.c和../test/halt.c ../test/halt.c 第65页 用户进程管理设计 1 #include "syscall.h" 2 int 3 main() 4 { 5 Halt() 6 } ../test/exec.c 1 #include "syscall.h" 2 int 3 main() 4 { 5 SpacId pid; 6 pid = Exec("../test/halt.noff");

7 Halt() 8 } 在文件../test/exec.c第5行上的语句Exec是一条Nachos的系统功能调用,它的功能为装入并执行以其参数为名的可执行文件,即创建一个新的用户进程。假设我们先执行../test/exec.noff 程序,则../test/exec.noff 会在它还没有执行结束时又装入并执行另外一个程序halt.noff,并与它同时驻留内存. pageTable[i].physicalPage=usermap-->Find();避免从头开始物理存储覆盖了前一个用户程序的内存内容 利用Nachos在../userprog/bitmap.h 中文件定义的Bitmap类。利用bitmap 记录和申请内存物理帧,使不同的程序装入到不同的物理空间中去,下面是对新的内存分配存储算法,改进了对多个用户程序的同时进驻内存的支持

nachos01

实验一体验Nachos下的并发程序设计 一、小组成员及分工 汪于波(23020078104116):https://www.doczj.com/doc/6c885736.html,的修改、https://www.doczj.com/doc/6c885736.html,的修改和实验报告 潘羽龙(23020078104100):https://www.doczj.com/doc/6c885736.html,的实现 吴道裕(23020078104132):https://www.doczj.com/doc/6c885736.html,的实现和实验报告的完成 谭原(23020078104111):dllist.h的实现和https://www.doczj.com/doc/6c885736.html,mon的修改 二、实验目的 对nachos进行熟悉,并初步体验nachos下的并发程序设计。 三、实验内容 1.安装nachos; 2.用C++实现双向有序链表; 3.在nachos系统中使用你所写的链表程序并演示一些并发错误 四、实验步骤 1.首先明确Nachos各部分的关系 在~/nachos/nachos-3.4/code/下有一个https://www.doczj.com/doc/6c885736.html,mon,在code/的各个子目录下的Makefile都继承这个https://www.doczj.com/doc/6c885736.html,mon。通过阅读https://www.doczj.com/doc/6c885736.html,知道,main函数一旦启动,立即调用Initialize,进行初始化的操作,然后对相应的参数进行处理,之后在分模块进行相应模块下的函数调用,执行相应的功能。 2.编写相应的函数 实验要求利用对双向链表的操作来演示并发程序可能出现的错误,首先需要实现双向链表dllist,包括dllist.h,https://www.doczj.com/doc/6c885736.html,。当DLList类实现后,需要编写链表驱动函数Insert 和Remove来对链表进行驱动。通过改写https://www.doczj.com/doc/6c885736.html,,使得多个线程在没有进行任何互斥操作的情况下对同一数据结构进行操作,在这个过程中就可能出现并发错误。改写https://www.doczj.com/doc/6c885736.html,mon和https://www.doczj.com/doc/6c885736.html,。 3.详细设计 a)dllist.h(~/nachos/nachos-3.4/code/threads/) 类DLList的声明 class DLLElement { public: DLLElement(void *itemPtr,int sortKey);//initialize a list element DLLElement *next;//next element on list DLLElement *prev;//previous element on list int key; void *item; }; class DLList { public: DLList();//initialize the list DLList(int type); ~DLList();//de-allocate the list

六年级科学下册实验报告单

实验报告单

实验通知单 课题 第一单元微小世界 1.放大镜 实验名称 放大镜的构造、作用、用途 实验班级 六年级 实验类别 B 实验组数 10 实验时间 任课教师 实验 准备 分组实验器材:放大镜(最好每个学生都能有一个放大镜,如果只能提供给学生一种放大镜,尽量放大倍数大一点)科学书或报纸上的照片、计算机或电视机屏幕。柱形、球形的透明器皿、塑料薄膜、铁丝、普通玻璃片、平面镜片、水。 教师演示:不同放大倍数的放大镜、图片或课件(如放大镜镜片的结构等)。 规范操作要点 1.正确用放大镜观察物体。 2.比较用肉眼观察和用放大镜观察的不同。 备注 放大镜的作用——放大物体的像(可能学生会说“把物体放大”,提醒学生物体并未变大) 放大镜的用途——我们用放大镜观察校园里的生物、实验中在老师指导下观察花、昆虫等。它是视力不佳者的助视器,还适用于电子产品检验、线路板检验、集邮者欣赏鉴定邮票、

珠宝商鉴定珠宝、公安人员用它观察指纹毛发纤维等、农技人员用它观察花蕊进行人工授粉等、制作微型工艺品的工匠工作时使用… 实验通知单 课题 2.放大镜下的昆虫世界 实验名称 实验班级 六年级 实验类别 B 实验组数 10 实验时间 任课教师 实验 准备 分组实验器材:昆虫或昆虫器官标本、放大镜 教师演示器材:有关昆虫形态构造和生活习性的多媒体课件或图片资料 规范操作要点 提供给学生各种昆虫的标本或昆虫肢体的标本。(因这个寒假的冻灾,估计开学时不会有太多的昆虫,可以利用仪器室原有的标本和蚊蝇蟑螂等常见昆虫及其肢体为观察对象。估计肉眼观察学生的兴趣不会太浓,而且因观察对象小,肉眼的发现可能不会很多。可能的

Windows操作系统实验三实验报告

Windows操作系统C/C++ 程序实验 姓名:___________________ 学号:___________________ 班级:___________________ 院系:___________________ ______________年_____月_____日

实验三Windows 2000/xp线程同步 一、背景知识 二、实验目的 在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000/xp线程同步的理解。 1) 回顾系统进程、线程的有关概念,加深对Windows 2000/xp线程的理解。 2) 了解事件和互斥体对象。 3) 通过分析实验程序,了解管理事件对象的API。 4) 了解在进程中如何使用事件对象。 5) 了解在进程中如何使用互斥体对象。 6) 了解父进程创建子进程的程序设计方法。 三、工具/准备工作 在开始本实验之前,请回顾教科书的相关内容。 您需要做以下准备: 1) 一台运行Windows 2000/xp Professional操作系统的计算机。 2) 计算机中需安装V isual C++ 6.0专业版或企业版。 四、实验内容与步骤 1. 事件对象 清单4-1程序展示了如何在进程间使用事件。父进程启动时,利用CreateEvent() API创建一个命名的、可共享的事件和子进程,然后等待子进程向事件发出信号并终止父进程。在创建时,子进程通过OpenEvent() API打开事件对象,调用SetEvent() API使其转化为已接受信号状态。两个进程在发出信号之后几乎立即终止。 步骤1:登录进入Windows 2000/xp Professional。 步骤2:在“开始”菜单中单击“程序”-“Microsoft V isual Studio 6.0”–“Microsoft V isual C++ 6.0”命令,进入V isual C++窗口。 步骤3:在工具栏单击“打开”按钮,在“打开”对话框中找到并打开实验源程序3-1.cpp。 步骤4:单击“Build”菜单中的“Compile 3-1.cpp”命令,并单击“是”按钮确认。系统

山东大学nachos源码解读

Nachos源码解读 山东大学软件学院 2013级软件工程 哈根

1、从Machine.java开始——Nachos内核启动 (3) 2、Nachos 参数解析、设备创建和Debug方法 (4) 1) Nachos 启动参数解析 (4) 2) Nachos配置文件 (5) 3) Nachos 设备创建 (5) 4) Nachos Debug方法 (5) 3、Nachos 中断简述 (6) 1) PendingIntterrupt 中断处理与Intterupt增加中断调度 (6) 2) Intterupt中断查询 (6) 3) Timer 计时器类 (6) 4) Alarm 类 (7) 4、Nachos 内核线程及调度算法简述 (7) 1) 漫谈TCB (7) 3) ThreadQueue线程队列及调度算法关系 (10) 5、Nachos 文件系统简述 (11) 6、Nachos 用户进程、处理器和指令简述 (12) 1) Nachos 用户程序解析 (12) 2) Nachos 处理器和指令简述 (13) 3) Nachos 系统调用 (14) 7、Nachos 安全管理简述 (14)

1、从Machine.java开始——Nachos内核启动 Nachos的程序执行从Machine.java的main方法开始。主要进行的是处理启动参数、载入配置文件、设置工作目录、安装安全管理器、创建设备、并启动第一块TCB等操作,在TCB启动时会调用AutoGrader的start方法,其中启动了内核。 在AutoGrader的start方法执行时,AutoGrader首先会解析启动命令传入的参数,接着执行初始化操作,然后从配置文件中读取Kernel.kernel的值,构造内核,并且执行内核的初始化方法。紧接着,执行run方法,内含kernel的自检、run方法以及最后的终止。 由于不同project使用的内核不同,所以各个内核 的效果也是不一样的。下面以project1的内核为例 简要说明。 在Kernel抽象类中,会检查Kernel中的静态成员 变量kernel是否为空,并把当前对象赋值给Kernel, 这也决定了内核可以通过Kernel.kernel调用。在构 造器结束后,AutoGrader会执行Kernel的initialize 方法,对于phase1的ThreadedKernel而言,在该 方法中初始化了调度器,文件系统,alarm等。在 执行完initialize方法后,会进入AutoGrader的run 方法,依次执行内核自检、运行、停机操作。 对于phase1的ThreadedKernel而言,run方法 是空的,也就是执行完开机自检后就自动停机了。 开机自检依次KThread、Semaphore以及SynchList 的自检操作。 在phase2中,启动的是UserKernel,由UML图继承关系知,该类继承了ThreadedKernel,在该类的方法体中也多见super关键字,即ThreadedKernel做的事情,UserKernel也做了。初始化过程中,UserKernel还初始化了一个控制台,用来接收屏幕中用户的输入,并且还设置processor的异常处理器(exceptionHandler),用来处理指令周期中中断周期的各类系统调用以及其他中断异常。自检(selfTest)过程中还会接收用户字符,来判断控制台是否正常。run

实验六 一维数组实验报告

*** 软件类实验报告 课程名称:C语言程序设计学号: 姓名: 班级: 指导教师: 开课学期: 学院: ***教务处

⑷一维数组排序。 四、实验过程及内容:(运行结果请抓图到对应题目的下方) 1. 先分析以下程序,写出运行结果,再上机检验。 2.程序填空题。下面程序的功能是9个评委给某个参赛选手打分,去掉一个最高分和一个最低分,求该参赛选手的平均分。填空完成程序。

实验结果: 3. 程序填空题。有数列1,1,2,4,7,13,24…,该数列的规律是从第4项起,每项是它的前三项之和。下列程序的功能是将该数列的前30项存放在一维数组中,输出时每行输出5个数。填空完成程序。 实验结果: 4. 程序改错题。下面程序的功能是将数组中的数按从大到小排序后输出。改正程序中的错误。 实验结果: 5. 程序改错题。某公司从用公用电话传递数据,数据是四位的整数,在传递过程中需要加密,加密规则为每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。改正程序中的错误。

实验结果: 6. 小楚参加了一个研究生考试培训班,共30次课,由于路途较远,每次都是打车去上课,来回的车费分别存储在数组a和b中,其中-1表示未去上课。 编程计算小楚参加培训班共打车花费多少钱?(要求保留1位小数,用循环实现) 输出结果的形式为: s=1234.5 a数组和b数组定义如下: double a[30]={31.0,32.0,30.3,32.8,30.5,30.6,31.0,32.8,-1,31.8,31.9,31.5,32.3,32.3,31.8,32.5 ,31.5,30.3,30.4,32.5,30.2,30.2,30.7,32.1,32.1,31.4,31.9,31.9,-1,30.5}; double b[30]={30.2,30.2,30.3,31.6,32.7,31.5,30.4,32.4,-1,31.0,31.8,32.1,31.6,31.4,32.4,32.1 , 32.5,32.3,32.5,31.4,31.2,30.3,32.3,30.7,31.3,30.2,31.1,30.5,-1,31.9}; 五、实验小结

操作系统实验报告16487

西安邮电大学 (计算机学院) 课实验报告 实验名称:进程管理 专业名称:计算机科学与技术 班级: 学生: 学号(8位): 指导教师: 实验日期:*****年**月**日

一. 实验目的及实验环境 目的:(1)加深对进程概念的理解,明确进程和程序的区别。 (2)进一步认识并发执行的实质。 (3)分析进程竞争资源现象,学习解决进程互斥的方法。 (4)了解Linux系统中进程通信的基本原理。 环境:Linux操作系统环境: 二. 实验容 (1)阅读Linux的sched.h源文件,加深对进程管理概念的理解。 (2)阅读Linux的fork.c源文件,分析进程的创建过程。 三.方案设计 (1)进程的创建 编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察纪录屏幕上的显示结果,并分析原因。(2)进程的控制 修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因。 如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。 (3)①编写一段程序,使其现实进程的软中断通信。 要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child Processll is Killed by Parent! Child Processl2 is Killed by Parent! 父进程等待两个子进程终止后,输出如下的信息后终止 Parent Process is Killed! 程序流程图如下:

小学科学六年级下册实验报告

小学科学六年级下册实验报告 小学科学六年级下册实验报告 作者: 项蔺川 放大镜下的新发现 实验名称: 放大镜下的新发现 实验器材、药品: 放大镜、水、小字体的书、昆虫各种小晶体(盐、糖等) 实验方法和步骤: 1、认识放镜的构造,了解放大镜的应用。 2、用放大镜看书、报纸等(自己的发现) 3、了解其它有方大功能的物体,水滴放大镜。 4、用放大镜观察昆虫,了解放大镜下的昆虫世界。 5、用方、放大镜观察晶体。(盐、 白糖) 实验结论: 在放大镜下看到的物体比实际的大得多。实验评价: 日期: 年月日 年级:六年级 实验者

奇特的身体构造 实验名称:奇特的身体构造 实验器材: 放大镜2 只、 蝇子蟋蟀蝴蝶等动物的标本1 套 步骤: 1、观察昆虫的触角: 发现触角不是一根直的, 而是一节一节的; 2、苍蝇的眼: 发现不是一个, 网格状的分布着几千个小眼; 3、蝴蝶的鳞片: 彩色的鳞片其实是扁平的细毛; 4、蟋蟀的外壳: 光滑的外壳上, 还有许多“小刺”; 5、苍蝇的脚: 脚的底端有“吸盘” ,所以可以在天花板上倒立 结论: 我认为观察的小昆虫和肉眼大不相同,借助放大镜,可以观察到小动物的细微之处

美丽的晶体 实验名称: 美丽的晶体 实验器材:药品: 食盐、白糖、碱面、味精、放大镜、实验方法和步骤 1、用肉眼观察食盐、 白糖、碱面、味精。 2、再用放大镜观察食盐、 白糖、碱面、味精。实验结论: 晶体的形状多种多样,但它们都很有规则。 实验评价:

日期: 年月日 制作晶体 实验名称:制作晶体 实验器材: 放大镜2 只、 食盐20 克、白糖20 克、碱面20 克、味精20 克、滴管4 支、玻璃片 4 片、100ml 烧杯 4 只我的猜测: 小颗粒的晶体形状和大颗粒的形状应该是相同的 步骤: 1、将四只烧杯中分别放入

实验六 实验报告

云南大学软件学院 实验报告 课程:数据库原理与实用技术实验任课教师:包崇明 姓名:匿名学号:2013…….专业:软件工程成绩: 实验6 数据库完整性 实验6-1 完整性约束 1、在学生表上面创建下列CHECK约束 【注】:因为学生表已经存在,所以这里使用添加check约束的方法实现: (1)创建入学日期约束“Enter_University_date_rule”,假定该学校于1923年4月30日创建。要求:入学日期必须大于等于学校创建日期,并且小于等于当前日期 测试语句: 结果(添加的check约束起作用了),如图: (2)创建学生年龄约束“Age_rule”。要求:学生年龄必须在15~30岁之间 测试语句 结果(添加”Age_rule”成功,并且年龄为’2015/4/27’没有违反”Enter_University_date_rule” 约束,进一步说明了(1)中的check约束添加成功,如图:

【注】:考虑到时间关系,下面的部分解答中将会省略测试约束的步骤。 (3)创建学生性别约束“Sex_rule”。要求:性别只能为“男”或“女” (4)创建学生成绩约束“Score_rule”。要求:学生成绩只能在0~100之间 (5)用图形方法查看学生成绩约束“Score_rule”,截图为: 2、删除约束Enter_University_date_rule 测试语句: 结果:(更新成功)

3、创建声明式默认约束:在创建表的过程中创建默认约束 (1)创建表“default_example”,表中包含字段pid、name、sex、age。要求设定sex的默认值为“男”、age的默认值为18。 创建default_example表语句: 采用SQL语句进行插入元祖: 执行结果为:(默认值起作用了!!) (2)插入一条编号为100 的记录,执行结果为: (3)修改默认值 一般先删除老的默认约束,再新建一个默认约束方法如下: 删除约束:alter TABLE default_example drop 约束名 新建默认约束:alter TABLE default_example add constraint df_age default(20) for age ①删除老的默认约束:

操作系统实验报告

操作系统教程实验报告 专业班级 学号 姓名 指导教师

实验一WINDOWS进程初识 1、实验目的 (1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。 (2)掌握WINDOWS API的使用方法。 (3)编写测试程序,理解用户态运行和核心态运行。 2、实验内容和步骤 (1)编写基本的Win32 Consol Application 步骤1:登录进入Windows,启动VC++ 6.0。 步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。创建一个新的控制台应用程序工程。 步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。 步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows “命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:E:\课程\os课\os实验\程序\os11\debug>hello.exe 运行结果 (如果运行不成功,则可能的原因是什么?) : (2)计算进程在核心态运行和用户态运行的时间 步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。 步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。 步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。 E:\课程\os课\os实验\程序\os12\debug>time TEST.exe 步骤4:运行结果 (如果运行不成功,则可能的原因是什么?) : 步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。 屏蔽i循环:

相关主题
文本预览
相关文档 最新文档