操作系统B实验报告(华北电力大学科技学院)

课程设计报告

( 2011-- 2012年度第1学期)

名称:操作系统原理课程设计B 院系:信息工程系

班级:软件09k2

学号:0919********

学生姓名:闫雪峰

指导教师:郭丰娟张琦

设计周数: 1

成绩:

日期:2011年11 月25日

《操作系统原理课程设计B》课程设计

任务书

一、目的与要求

1. 理解和掌握操作系统的基本概念、基本组成与工作原理;

2. 理解和掌握操作系统中主要功能模块的工作原理及其实现算法;

3. 掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分

析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。

二、主要内容

采用某种程序设计语言,设计与开发一个仿真操作系统,要求具备进程调度、存储器管理、文件及设备管理等基本功能,具体内容包括:

1.模拟单处理器系统的进程调度,加深对进程的概念及进程调度算法的理解;

2.编写一个多线程程序,加深对现代操作系统中线程的理解;

3.编写和调试一个银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体

会和了解死锁和避免死锁的具体实施方法;

4.用可变分区算法模拟主存的分配和回收,加深对存储器管理的理解,熟悉各种主存

分配方法;

5.模拟虚拟存储管理中缺页中断及页面置换算法,加深对虚拟存储器管理的理解,熟

悉各种页面淘汰算法;模拟设备的分配与回收,加深对设备管理的理解;模拟文件

管理的工作过程,从而对各种文件操作命令的实质内容和执行过程有比较深入的了

解;模拟磁盘调度的过程,加深对磁盘存储器管理的理解,熟悉各种磁盘调度算法。

6.综合以上实验的结果,并进行集成与设计,开发出一个小型虚拟操作系统。

对以上课程设计内容,将根据学生的专业与实际情况进行调整,某些题目为选作题目。

三、进度计划

序号设计(实验)内容完成时间备注

1 熟悉开发环境及程序设计语言1天

2 系统的分析、设计2天

3 调试与集成1天

4 验收,提交实验报告1天

四、设计(实验)成果要求

至少完成主要内容中的3项,统一使用课程设计报告书,文字清楚、工整。

五、考核方式

实验结果(60%)+实验报告(30%)+实验过程表现(10%)

学生姓名:

指导教师:

2011年11 月25日

一、课程设计(综合实验)的目的与要求

1. 理解和掌握操作系统的基本概念、基本组成与工作原理;

2. 理解和掌握操作系统中主要功能模块的工作原理及其实现算法;

3. 掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分

析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。

二、设计正文

实验1:单处理器系统的进程调度

1.1实验目的

在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。

1.2实验要求

1.设计一个按时间片轮转法实现处理器调度的程序,每个程序由一个PCB表示。

2.程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。

1.3实验原理和设计

进程控制块PCB的格式为:

进程名

指针

要求运行时间

已运行时间

状态

指针——进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址。

要求运行时间——假设进程需要运行的单位时间数。

已运行时间——假设进程已经运行的单位时间数,初始值为“0”。

状态——有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用0表示。当一个进程运行结束后,它的状态为“结束”,用1表示。

(1) 运行处理器调度程序前,输入进程数并且为每个进程设置所需的服务时间;

(2) 把各个进程按顺序排成循环队列,用指针指出队列连接情况;

(3)由于是模拟程序,在时间片轮转的前提下,每次使得相应进程:执行时间=已执

行时间+1;

(4)输出运行细节。

1.4实验结果

0 5k 10k 14k 26k 32k

实验2:主存储器空间的分配和回收

2.1实验目的

一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实验帮助学生理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。

2.2实验要求

1.在可变分区管理方式下采用最先适应算法实现主存分配和实现主存回收。 2.打印空闲区说明表的初始状态,作业4的申请量以及为作业4分配后的空闲区说明表状态;再依次打印作业3和作业2的归还量以及回收作业3,作业2所占主存后的空闲区说明表。 2.3实验原理和设计

1. 可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。例如:

操作系统 作业1 作业3

空闲区

作业2

空闲区

其中,起址——指出一个空闲区的主存起始地址。

长度——指出从起始地址开始的一个连续空闲的长度。

2.4运行结果

实验3:多线程游戏(贪吃蛇)

3.1实验目的

(1)任何语言,实现多线程游戏,如龟兔赛跑,摇奖机等。

3.2实验原理和设计

(1)vb实现贪吃蛇游戏,用到timer控件实现多线程的控制,实现贪吃蛇的基本功能(2)连接access数据库,将最高分信息存到数据库。

3.2实验结果

三、课程设计(综合实验)总结

通过本次课程综合实验,我对存储器内部进程调度、空间管理和页面置换等相关算法有了更加深刻的理解,同时锻炼了动手能力,为以后更加深入地学习操作系统这门课程打下了良好的基础。

值得一提的是,本次实验对设计多线程游戏有了些许心得,兴趣所致,今后当加强这方面的学习,开发出一些好玩的小游戏。

计算机相关的学科离不开上机实践,只有通过实践,才能更好地掌握知识,自己以后当主动上机实践相关理论知识。

四、参考文献

[1] 《计算机操作系统》,西安电子科技大学出版社,2007年5月第3版;汤小丹梁红兵哲凤屏汤子嬴编著。

[2]https://www.360docs.net/doc/0219468973.html,/游戏开发教程

附录

实验一

// timer.cpp : 定义控制台应用程序的入口点

#include"stdafx.h"

int _tmain(int argc, _TCHAR* argv[])

{

return 0;

}

#include

#include

#include

#define TIME 1

typedef struct procuder

{

int chrName;//进程名字

int intRoundTime;

int intRunningTime;//已经运行时间

char chrFlag;

struct procuder *pointerNext;

} procuder;

int main()

{

int intTotal;//进程总数

int i;

int intCounter=1;//计数标记

procuder *pNew;//新申请的节点

procuder *pPointer;//当前程序指针

procuder *pPrevious;//当前指针的前一个指针

procuder *pPrint;//输出打印的指针

pPointer=(procuder *)malloc(sizeof(procuder));//初始化指针节点

pPrevious=pPointer;//将俩个指针初始化在一起

printf("请输入总数total:");

scanf("%d",&intTotal);

for(i=1;i<=intTotal;i++)//初始化各个进程

{

pNew=(procuder *)malloc(sizeof(procuder));//申请新节点

pPrevious->pointerNext=pNew;//将新申请节点与前一个节点连接起来

pPrevious=pNew;//将指示指针移到新申请的指针

printf("请输入第%d进程名字:",i);

scanf("%d",&(pNew->chrName));

printf("请输入第%d要求运行时间:",i);

scanf("%d",&(pNew->intRoundTime));

pNew->chrFlag='R';

pNew->intRunningTime=0;//初始化标记为和运行时间

}

pPrevious->pointerNext=pPointer->pointerNext;//设成循环队列

pPointer=pPointer->pointerNext;

while(pPointer->pointerNext!=pPointer)//运行完剩一个进程结束

{

pPointer->intRunningTime=pPointer->intRunningTime+TIME;//模拟进程运行

//输出当前的状态,代码自己写把

printf(" 第%d次运行:当前运行的程序为%d\n",intCounter++,pPointer->chrName);

printf("\n 就绪队列情况\n\n 进程名字需要时间运行时间状态\n");

if (pPointer->intRunningTimeintRoundTime)//判断当前进程是否完成未完成

{

pPointer=pPointer->pointerNext;//轮转到下一个时间片

pPrevious=pPrevious->pointerNext;//previous后移

}

else{//完成了将当前节点剔除

pPointer->chrFlag='E';//设置标志位

pPrevious->pointerNext=pPointer->pointerNext;//剔除当前节点

pPointer=pPointer->pointerNext;//运行指针后移

}

pPrint=pPrevious;

while(pPrint->pointerNext!=pPrevious)//输出各个进程的状态

{

printf(" %d %d %d

%c\n",pPrint->chrName,pPrint->intRoundTime,pPrint->intRunningTime,pPrint->chrFlag);

pPrint=pPrint->pointerNext;//后移

}

printf(" %d %d %d

%c\n",pPrint->chrName,pPrint->intRoundTime,pPrint->intRunningTime,pPrint->chrFlag);

printf("\n");//换行

}

while(pPointer->intRunningTimeintRoundTime)

{

pPointer->intRunningTime=pPointer->intRunningTime+TIME;//模拟进程运行

printf(" 第%d次运行:当前运行的程序为%d\n",intCounter++,pPointer->chrName);

printf("\n 就绪队列情况\n\n 进程名字需要时间运行时间状态\n");

printf(" %d %d %d

%c\n\n",pPointer->chrName,pPointer->intRoundTime,pPointer->intRunningTime,pPointer->chrFlag) ;

}

system("pause");

return 0;

}

实验二

// MemoryControl.cpp : 定义控制台应用程序的入口点。

#include"stdafx.h"

int _tmain(int argc, _TCHAR* argv[])

{

return 0;

}

#include

#include

#include

typedef struct memorytable//空间去说明表结构体

{

int intStartAddress;//起始地址

int intLength;//空间长度

int intFlag;//标记为为空表目为未分配

}memorytable;

struct process//进程的属性包括名字所需时间以运行时间

{

int intName;

int iEndFlag;//标记为标记是否已经卸载过

int iSuccessfullyFitMemory;//是否成功分配内存标记

int intStartTime;

int intNeedTime;

int intRoundTime;

int intNeedMemorySize;

int intStartAddress;

struct process *sNext;

};

int PrintMemoryTable(struct memorytable sSubMemoryTable[],struct process *sSubPointer,int intSubTotal)//输出空间说明表的情况

{

int i;

int iCounter=0;//计数器计算总共有多少个自由表项

printf("\n空间说明表:当前内存分区表总大小为%d个表项\n\n",intSubTotal*2);

printf("栏目地址长度状态\n");

for(i=0;i

{

if(sSubMemoryTable[i].intFlag==1) iCounter++;//计数器++有一个自由表项计数器加一

printf("%d %d %d

%d\n",i,sSubMemoryTable[i].intStartAddress,sSubMemoryTable[i].intLength,sSubMemoryTable[i].intFlag );

}

printf("当前共有%d个能分配表目,分别从~%d号内存栏目\n",iCounter,iCounter-1);

return 0;

}

int Crimple(struct memorytable sSubMemoryTable[],struct process *sSubPointer,int intSubTotal)//内存缩紧代码{

int i,j;//计数器

for(i=0;i

{

for(j=i+1;j<2*intSubTotal;j++)

{

if(sSubMemoryTable[i].intFlag==1)//如果i不是空表目

{

if((sSubMemoryTable[j].intFlag==1)&&(sSubMemoryTable[i].intStartAddress>sSubMemoryTable[j].intStar tAddress))//若j不为空表目且j的开始地址小于i的开始地址,交换

{

sSubMemoryTable[2*intSubTotal]=sSubMemoryTable[i];

sSubMemoryTable[i]=sSubMemoryTable[j];

sSubMemoryTable[j]=sSubMemoryTable[2*intSubTotal];

}

}

else//i为空表目,交换i和j的值

{

if(sSubMemoryTable[j].intFlag==1)//且j不是空表目

{

sSubMemoryTable[2*intSubTotal]=sSubMemoryTable[i];

sSubMemoryTable[i]=sSubMemoryTable[j];

sSubMemoryTable[j]=sSubMemoryTable[2*intSubTotal];

}

}

}

}

//打印输出代码

PrintMemoryTable(sSubMemoryTable,sSubPointer,intSubTotal);

return(0);

}

int FitMemory(struct memorytable sSubMemoryTable[],struct process *sSubPointer,int intSubTotal)

{

int i=-1;//计数器

while(++i<(2*intSubTotal))//循环找出满足要求的内存块

{

if(sSubMemoryTable[i].intFlag==1)//判断是否表项为未分配

{

if(sSubMemoryTable[i].intLength>sSubPointer->intNeedMemorySize)//判断当前栏的大小是否能放下进程

{

printf("将%d号内存[起始地址%d,内存大小%d] 分配给%d进程[占用内存大小%d]\n",i,sSubMemoryTable[i].intStartAddress,sSubMemoryTable[i].intLength,sSubPointer->intName,sSubPoin ter->intNeedMemorySize);

sSubPointer->intStartAddress=sSubMemoryTable[i].intStartAddress;

sSubMemoryTable[i].intStartAddress=sSubMemoryTable[i].intStartAddress+sSubPointer->intNeedMemory Size;

sSubMemoryTable[i].intLength=sSubMemoryTable[i].intLength-sSubPointer->intNeedMemorySize;

//输出空间说明表

PrintMemoryTable(sSubMemoryTable,sSubPointer,intSubTotal);

return 1;

}

if(sSubMemoryTable[i].intLength==sSubPointer->intNeedMemorySize)//刚好相等

{

printf("将%d号内存[起始地址%d,内存大小%d] 分配给%d进程[占用内存大小%d]\n",i,sSubMemoryTable[i].intStartAddress,sSubMemoryTable[i].intLength,sSubPointer->intName,sSubPoin ter->intNeedMemorySize);

sSubPointer->intStartAddress=sSubMemoryTable[i].intStartAddress;

sSubMemoryTable[i].intFlag=0;

sSubMemoryTable[i].intStartAddress=0;

sSubMemoryTable[i].intLength=0;

//缩紧分区说明表,输出空间说明表

Crimple(sSubMemoryTable,sSubPointer,intSubTotal);

return 2;

}

}

}

printf("内存分配失败%d号进程:需要内存空间为%d 在内存空闲说明表中无满足要求者\n",sSubPointer->intName,sSubPointer->intNeedMemorySize);//内存分配失败

PrintMemoryTable(sSubMemoryTable,sSubPointer,intSubTotal);

sSubPointer->iSuccessfullyFitMemory=0;//内存分配失败回受时不回收

return 0;

}

int RemoveMemory(struct memorytable sSubMemoryTable[],struct process *sSubPointer,int intSubTotal)//从内存卸载函数

{

int i;//计数器

int j;

int intFlag=0;//标位位

int intStartAddress;

int intLength;//定义起始地址和长度临时变量

intStartAddress=sSubPointer->intStartAddress;

intLength=sSubPointer->intNeedMemorySize;//初始化长度

for(i=intSubTotal*2-1;i>=0;i--)

{

if((sSubMemoryTable[i].intFlag==1)&&(sSubMemoryTable[i].intStartAddress==intStartAddress+intLength ))//如果有与归还区下临的空闲分区表

{

printf("有与%d号进程下邻的空闲分区表%d号内存[起始地址%d,长度%d]\n",sSubPointer->intName,i,sSubMemoryTable[i].intStartAddress,sSubMemoryTable[i].intLength);

intLength+=sSubMemoryTable[i].intLength;

intFlag=1;//设置标记位

for(j=i-1;j>=0;j--)//判断是否有与当前表目上临的空闲去

{

if(sSubMemoryTable[j].intFlag=1)//上临的区域不为空表目

{

if(sSubMemoryTable[j].intStartAddress+sSubMemoryTable[j].intLength==intStartAddress)//有上林空闲区

{

//有上邻空闲区代码,将下邻空闲区置为空表目,修改上邻空闲区的长度

printf("有与%d号进程上邻的空闲分区表%d号内存[起始地址%d,长度%d]\n",sSubPointer->intName,j,sSubMemoryTable[j].intStartAddress,sSubMemoryTable[j].intLength);

sSubMemoryTable[i].intFlag=0;

sSubMemoryTable[i].intLength=0;

sSubMemoryTable[i].intStartAddress=0;//将下邻空闲表目初始化

sSubMemoryTable[j].intLength+=intLength;

Crimple(sSubMemoryTable,sSubPointer,intSubTotal);//缩紧代码

return(1);

}

}

}

//无上邻空闲区代码,修改下邻空闲区的起始地址和长度

printf("无与%d号进程上邻的空闲分区\n",sSubPointer->intName);

sSubMemoryTable[i].intStartAddress=intStartAddress;

sSubMemoryTable[i].intLength=intLength;

Crimple(sSubMemoryTable,sSubPointer,intSubTotal);

return(2);//无上邻空闲区

}

}

//没有有与归还区下临的空闲分区表

if(intFlag==0)

{

printf("无与%d号进程下邻的空闲分区\n",sSubPointer->intName);

for(i=0;i

{

if((sSubMemoryTable[i].intFlag==1)&&(sSubMemoryTable[i].intStartAddress+sSubMemoryTable[i].intLen gth==intStartAddress))//判断是否有与归还区上邻的空闲区

{

printf("有与%d号进程上邻的空闲分区表目%d号内存[起始地址%d,长度%d]\n",sSubPointer->intName,i,sSubMemoryTable[i].intStartAddress,sSubMemoryTable[i].intLength);

sSubMemoryTable[i].intLength+=intLength;

Crimple(sSubMemoryTable,sSubPointer,intSubTotal);//

return(3);//有与归还区上邻的空闲区

}

}

printf("无与%d号进程上邻的空闲分区表目\n",sSubPointer->intName,i);

for(i=intSubTotal*2-1;i>0;i--)//查找表找到一个空表目

{

if(sSubMemoryTable[i].intFlag==0)

{

sSubMemoryTable[i].intFlag=1;

sSubMemoryTable[i].intStartAddress=intStartAddress;

sSubMemoryTable[i].intLength=intLength;

Crimple(sSubMemoryTable,sSubPointer,intSubTotal);

return(4);//没有归还区上邻的空闲区

}

}

}

//回收失败

printf("sorry 回收失败\n");

return(0);

}

int main()

{

int i;//计数器

int intMemorySize;

int intTotal;//内存分成N份

int intStartAddress;//内存起始地址

int intProcessTotal;//进程总数

int intTime=0;

int intEndTime;//结束时间

struct memorytable sMemoryTable[100];//定义空间说明变总共有个空间

struct memorytable *sTemp; //定义变量

struct process *sHead;

struct process *sPointer;//定义进程数据

struct process *sNew;

for (i=0;i<100;i++)//初始化说明表

{

sTemp=(memorytable *)malloc(sizeof(struct memorytable));//申请新空间

if (!sTemp) exit(1);//判断是否申请成功

sMemoryTable[i]=*sTemp;

sMemoryTable[i].intFlag=0;

sMemoryTable[i].intLength=0;

sMemoryTable[i].intStartAddress=0;

}

printf("请输出内存大小*KB:");//输入内存总大小,本程序采用固定分配即将内存等分成n分请让内存大小能整除分区的个数

scanf("%d",&intMemorySize);

printf("请输入将内存等分成多少分:");//内寸等分成n分

scanf("%d",&intTotal);

printf("请输入内存起始地址:");//输入内存起始地址

scanf("%d",&intStartAddress);

printf("请输入共有多少个进程要装入内存:");//输入进程数

scanf("%d",&intProcessTotal);

printf("请输入程序运行的最终结束时间:");//输入运行时间

scanf("%d",&intEndTime);

//初始化内存数组的代码

for(i=0;i

{

sMemoryTable[i].intFlag=1;

sMemoryTable[i].intLength=intMemorySize/intTotal;

sMemoryTable[i].intStartAddress=intStartAddress+i*sMemoryTable[i].intLength;

}

//初始化进程的一些属性,sHead为进程队列的头指针

sHead=(struct process *)malloc(sizeof(struct process));

sPointer=sHead;

for(i=0;i

{

sNew=(struct process *)malloc(sizeof(struct process));//新建一个节点

if(!sNew) exit(1);

sPointer->sNext=sNew;

sPointer=sNew;

sPointer->sNext=NULL;

//以下为初始化进程的属性

printf("请输入进程%d的名字:",i);

scanf("%d",&(sPointer->intName));

printf("请输入进程%d开始装入内存的时间:",i);

scanf("%d",&(sPointer->intStartTime));

printf("请输入进程%d将要运行的时间:",i);

scanf("%d",&(sPointer->intNeedTime));

printf("请输出进程%d需要的内存大小:",i);

scanf("%d",&(sPointer->intNeedMemorySize));

sPointer->intRoundTime=0;

sPointer->iEndFlag=0;

sPointer->iSuccessfullyFitMemory=1;//默认成功分配内存标记为能分配分配失败时置零}

//开始模拟将程序装入内存,注视进程开始时间必须大于

while(++intTime)//运行一次时间加一

{

sPointer=sHead;//初始化队列指针

while((sPointer=sPointer->sNext)!=NULL)

{

if(sPointer->intStartTime==intTime)//如果到了开始时间

{

//装入内存代码

printf("\n 正在装入%d号进程,当前逻辑时间%d\n",sPointer->intName,intTime);

//printf(" %d号进程所需内存大小为%d\n",sPointer->intName,sPointer->intNeedMemorySize);//打印进程信息

FitMemory(sMemoryTable,sPointer,intTotal);

}

if((intTime>=sPointer->intStartTime)&&(sPointer->intRoundTimeintNeedTime))//若程序已经装入,并且为运行完模拟时间加一

{

sPointer->intRoundTime++;//已经运行时间加一

}

if((sPointer->intRoundTime==sPointer->intNeedTime)&&(sPointer->iEndFlag==0))//时间到达从内训卸载

{

//进程从内训卸载代码

printf("\n 正在卸载%d号进程【装入时间%d 需要时间%d 运行时间%d】,当前逻辑时

间%d\n",sPointer->intName,sPointer->intStartTime,sPointer->intNeedTime,sPointer->intRoundTime,intTime);

sPointer->iEndFlag=1;//设置进程完成运行标记位为即运行结束

if(sPointer->iSuccessfullyFitMemory==1)//判断分配内存是否成功,若分配成功才回收

{

printf(" %d号进程从%d地址开始,占用内存大小为%d\n",sPointer->intName,sPointer->intStartAddress,sPointer->intNeedMemorySize);//打印进程信息

RemoveMemory(sMemoryTable,sPointer,intTotal);

}

else

{

printf("%d号进程:需内存空间为%d 分配时未能成功分配此处不回收\n",sPointer->intName,sPointer->intNeedMemorySize);

}

}

}

//此处添加跳出运行代码

if(intTime>intEndTime) break;

}

system("pause");

return 0;//主函数结束

}

实验三

Dim Score As Integer

Dim Speed As Integer

Dim EatTag As Integer

Dim conn As ADODB.Connection

Dim rs As ADODB.Recordset

Dim aspect As Integer

Dim PassTag As Integer

Dim WallTag As Integer

Public Sub CloseAccess()

rs.Close

conn.Close

Set conn = Nothing

Set rs = Nothing

End Sub

Public Sub LinkAccess() '链接数据库过程

Set conn = New ADODB.Connection

conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db3.mdb"

Set rs = New ADODB.Recordset

rs.Open "select * from 排行榜where 标记='" & CboWall.ListIndex & CboPass.ListIndex & "'", conn

End Sub

Public Sub RankPage() '生成最高分过程

Dim Name As String

Call LinkAccess

If Score > rs.Fields("分数") Then

Name = InputBox("恭喜恭喜,请输入姓名", "破纪录啦", , Screen.Width / 2, Screen.Height / 2)

conn.Execute ("update 排行榜set 姓名='" & Name & "',分数='" & Score & "' where 标记='" & CboWall.ListIndex & CboPass.ListIndex & "'")

LblSort.Caption = rs.Fields("姓名") & " " & rs.Fields("分数") & "分" '重新显示最高分End If

Call CloseAccess

End Sub

Public Sub IsWall(WallTagSub As Integer, PassTagSub As Integer)

If WallTagSub = 0 Then '判断是否有围墙

If aspect = 2 And Pic(0).Left + Pic(0).Width > PicRect.ScaleWidth Then

PicHead.Left = 0

ElseIf aspect = 1 And PicHead.Left < 0 Then

PicHead.Left = PicHead.Left + PicRect.Width

ElseIf aspect = 4 And PicHead.Top + Pic(0).Height > PicRect.ScaleHeight Then

PicHead.Top = 0

ElseIf aspect = 3 And PicHead.Top < 0 Then

PicHead.Top = PicHead.Top + PicRect.Height

End If

Else

If PicHead.Left < 250 Or PicHead.Left + PicHead.Width > PicRect.ScaleWidth - 250 Or PicHead.Top < 250 Or PicHead.Top + PicHead.Height > PicRect.ScaleHeight Then '舌头碰到墙壁

Call GameOver

End If

End If

Select Case PassTagSub

Case 1

If (PicHead.Left >= 1500 And PicHead.Left <= 5250) And (PicHead.Top = 1750 Or PicHead.Top = 3250) Then

Call GameOver

End If

End Select

End Sub

Public Sub GameSelect()

Dim ProblemTag As Integer, i As Integer

ProblemTag = CboProblem.ListIndex

If WallTag = 1 Then '判断是否有围墙

For i = 1 To 112 '卸载围墙

Unload PicWall(i)

Next i

End If

WallTag = CboWall.ListIndex '重新赋值围墙标记

If WallTag = 1 Then '判断是否有围墙

For i = 1 To 28 '初始化围墙

Load PicWall(i)

PicWall(i).Visible = True

PicWall(i).Left = (i - 1) * 250 '左上角坐标为00

PicWall(i).Top = 0

Load PicWall(i + 28)

PicWall(i + 28).Visible = True

PicWall(i + 28).Left = (i - 1) * 250

PicWall(i + 28).Top = 4750

Load PicWall(i + 56) '竖向围墙

PicWall(i + 56).Visible = True

PicWall(i + 56).Left = 0

PicWall(i + 56).Top = (i - 1) * 250

Load PicWall(i + 84)

PicWall(i + 84).Visible = True

PicWall(i + 84).Left = 6750

PicWall(i + 84).Top = (i - 1) * 250

Next i

End If

Select Case ProblemTag '选择难度

Case 0

Timer1.Interval = 500

Case 1

Timer1.Interval = 200

Case 2

Timer1.Interval = 100

Case 3

Timer1.Interval = 50

Case 4

Timer1.Interval = 25

End Select

Select Case PassTag '卸载上局迷宫

Case 0

Case 1

For i = 1 To 16

Unload PicWall(i + 112) '先卸载窗体

Unload PicWall(i + 128)

Next i

End Select

PassTag = CboPass.ListIndex '初始化本局迷宫状态Select Case PassTag '加载迷宫

Case 1

For i = 1 To 16

Load PicWall(i + 112)

PicWall(i + 112).Visible = True

PicWall(i + 112).Left = 1250 + i * 250

PicWall(i + 112).Top = 1750

Load PicWall(i + 128)

PicWall(i + 128).Visible = True

PicWall(i + 128).Left = 1250 + i * 250

PicWall(i + 128).Top = 3250

Next i

Case 2

Case 3

End Select

End Sub

Public Sub GameStart()

Dim i As Integer

Speed = 0 '提速标记初始化

EatTag = 0 '显示什么食物标记初始化

aspect = 2

IgeOver.Picture = LoadPicture(App.Path & "\image\GameOver.gif") '初始化结束图标IgeOver.Visible = False '隐藏标志结束

IgeOver.Visible = False '隐藏提示标签

PicOver.Visible = False '隐藏爆炸效果

Score = 0 '初始化分数为0

Call LinkAccess

LblSort.Caption = rs.Fields("姓名") & " " & rs.Fields("分数") & "分" '初始化最高分Call CloseAccess

LblScore.Caption = "分数:" & Score '初始化分数

For i = 4 To Pic.UBound '初始化蛇身

Unload Pic(i)

Next i

PicHead.Left = 1500 '初始化蛇头位置

PicHead.Top = 500

Pic(0).Left = PicHead.Left - 250 '初始化第一节蛇身位置

Pic(0).Top = PicHead.Top

For i = 1 To 3 '初始化初始蛇身位置

Pic(i).Left = Pic(i - 1).Left - 250

Pic(i).Top = Pic(0).Top

Next i

IgeStop.Enabled = True '初始化暂停键

End Sub

Public Sub GameOver()

操作系统B实验报告(华北电力大学科技学院)

课程设计报告 ( 2011-- 2012年度第1学期) 名称:操作系统原理课程设计B 院系:信息工程系 班级:软件09k2 学号:0919******** 学生姓名:闫雪峰 指导教师:郭丰娟张琦 设计周数: 1 成绩: 日期:2011年11 月25日

《操作系统原理课程设计B》课程设计 任务书 一、目的与要求 1. 理解和掌握操作系统的基本概念、基本组成与工作原理; 2. 理解和掌握操作系统中主要功能模块的工作原理及其实现算法; 3. 掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分 析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。 二、主要内容 采用某种程序设计语言,设计与开发一个仿真操作系统,要求具备进程调度、存储器管理、文件及设备管理等基本功能,具体内容包括: 1.模拟单处理器系统的进程调度,加深对进程的概念及进程调度算法的理解; 2.编写一个多线程程序,加深对现代操作系统中线程的理解; 3.编写和调试一个银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体 会和了解死锁和避免死锁的具体实施方法; 4.用可变分区算法模拟主存的分配和回收,加深对存储器管理的理解,熟悉各种主存 分配方法; 5.模拟虚拟存储管理中缺页中断及页面置换算法,加深对虚拟存储器管理的理解,熟 悉各种页面淘汰算法;模拟设备的分配与回收,加深对设备管理的理解;模拟文件 管理的工作过程,从而对各种文件操作命令的实质内容和执行过程有比较深入的了 解;模拟磁盘调度的过程,加深对磁盘存储器管理的理解,熟悉各种磁盘调度算法。 6.综合以上实验的结果,并进行集成与设计,开发出一个小型虚拟操作系统。 对以上课程设计内容,将根据学生的专业与实际情况进行调整,某些题目为选作题目。 三、进度计划 序号设计(实验)内容完成时间备注 1 熟悉开发环境及程序设计语言1天 2 系统的分析、设计2天 3 调试与集成1天 4 验收,提交实验报告1天 四、设计(实验)成果要求

操作系统课程设计实验报告

操作系统 课程设计报告 学院: 班级: 学生姓名: 学号: 指导老师: 提交日期: 一、实验目的

本设计的目的是实现操作系统和相关系统软件的设计,其中涉及进程编程、I/O操作、存储管理、文件系统等操作系统概念。 二、实验要求 在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟Linux 文件系统。具体见附表 三、实验环境 Windows 、VC 三、实验思想 1、整体思路 实验可分为三个大模块:文件组织结构、目录结构、磁盘空间管理。编写时,先定义重要的数据结构,整理好各个模块的思路,列出程序清单。接着编写一些对系统进行基本操作的函数,然后利用这些函数实现各种功能。 2、盘块大概分布(分了128块,每块64字节) 盘块0 1 2 3 4 5 6 (127) 用途FAT表FAT表根目录目录数据数据数据...... 数据 盘块与盘块之间的链接,是利用FAT表项,(使用数组结构),并用它记录了所有盘块的使用信息。 优点:可以利用FAT信息,迅速查找、打开各个目录,进行创建、修改文件。 3、目录组成 为了简单,构思目录时,每个目录只有8字节,每盘存放最多8个目录。其中,目录名、文件名最多只能为3字节,如果是文件的话,类型名也最多为2字节。区分目录名和文件名的方法是:设计一个属性项(1个字节),为8时表示纯目录,为4时表示文件目录。具体分布如下图: 用途目录名或文件名文件类型属性文件起始盘 文件长度 块 大小3(字节) 2 1 1 1 优点:属性可以区分纯目录、文件目录;文件起始盘块可以记录文件的存放位置;文件长度,,在读文件时控制指针,是否到了文件末尾。 缺点:为了简单,对文件名、目录名、类型名都作了限制。最大分别为:3,3,2字节。

操作系统:实验3 进程并发与调度(实验报告)

班级: 姓名: 学号: 3.1 Windows 同步 在本节实验中,通过对事件和互斥体的了解,来加深对Windows 同步的理解。 1) 回顾系统进程、线程的有关概念,加深对Windows 进程、线程的理解。 2) 了解事件和互斥体。 3) 通过分析实验程序,了解管理事件的API 。 4) 了解在进程中如何使用事件。 5) 了解在进程中如何使用互斥体。 6) 了解父进程创建子进程的程序设计方法。 1. 工具/准备工作 在开始本节实验之前,请回顾教科书的相关内容。 需要准备一台运行Windows 系统的计算机,且安装了C/C++编译器。 2. 实验内容与步骤 (1) 事件对象 步骤1:找到“labReportCode ”文件夹并打开源程序3-1.cpp 。 步骤2:对3-1.cpp 进行编译、链接,生成可执行文件3-1.exe 。 操作能否正常进行?__________________________________________________ 步骤3:运行3-1.exe 。 请记录:运行结果(分行书写): 1) __________________________________________________________________ 2) __________________________________________________________________ 3) __________________________________________________________________ 4) __________________________________________________________________ 5) __________________________________________________________________ 6) __________________________________________________________________ 7) __________________________________________________________________ 分析程序3-1,请回答: 实验 3 进程并发与调度

操作系统实验报告

操作系统原理课内实验报告

实验一:用户接口实验 一.实验目的 1.理解面向操作命令的接口Shell。 2.学会简单的shell编码。 3.理解操作系统调用的运行机制。 4.掌握创建系统调用的方法。 二.实验内容 1.控制台命令接口实验 理解面向操作命令的接口shell和进行简单的shell编程。 2.系统调用实验 理解操作系统调用的运行机制 三.实验步骤 添加系统调用 1.Linux-3.0.tar.bz2拷贝到/usr/src目录下——命令:cp linux-3.0.tar.bz2 /usr/src/ 2.打开终端,获得root权限——命令:sudo –s 3.进入/usr/src目录——命令:cd /usr/src 4.解压linux源码——命令:tar xvzf linux-3.0.tar.bz2 5.进入目录linux-3.0.5——命令:cd linux-3.0 6.添加系统调用——:gedit kernel/myservice.c 在文本编辑器中添加 #include #include asmlinkage void sys_mycall() { printk(KERN_INFO "Hello, world!\n"); return; }

7.修改kernel/Makefile添加生成myservice.c添加到Makefile的编译规则中: obj-y += myservice.o 8..修改arch/x86/include/asm/unistd_32.h,添加以下内容: #define __NR_mycall SYS_ID //SYS_ID表示新添加系统调用的调用号 并修改文件中的NR_syscalls,将其值增加1 9..修改arxh/x86/include/asm/syscalls.h添加以下内容: asmlinkage void sys_mycall(); 10.修改arch/x86/kernel/syscall_table_32.S,添加以下内容: .long sys_mycall 11.配置内核(仅仅修改local versions即可)——命令:make menuconfig 12.编译内核——命令:make –j4 bzImage(开4个线程编译) 13.编译内核模块——命令:make –j4 modules 14.安装内核模块——命令:make modules_install 15.安装内核——命令:make install 16.重启系统,在系统选择页面选择进入自己编译的linux-3.0内核 17.在桌面建立测试的C程序test.c程序内容如下: #include int main(int argc, char *argv[]) { syscall(SYS_ID); // SYS_ID表示新添加系统调用的调用号 return 0; } 18.编译程序——gcc test.c –o a.out 19.运行程序——./a.out 20.查看内核日志(printk的输出信息在内核日志中):dmesg

操作系统实验报告

实验二进程调度 1.目的和要求 通过这次实验,理解进程调度的过程,进一步掌握进程状态的转变、进程调度的策略,进一步体会多道程序并发执行的特点,并分析具体的调度算法的特点,掌握对系统性能的评价方法。 2.实验内容 阅读教材《计算机操作系统》第二章和第三章,掌握进程管理及调度相关概念和原理。 编写程序模拟实现进程的轮转法调度过程,模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。假设初始状态为:有n个进程处于就绪状态,有m个进程处于阻塞状态。采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t个时间片系统释放资源,唤醒处于阻塞队列队首的进程。 程序要求如下: 1)输出系统中进程的调度次序; 2)计算CPU利用率。 3.实验环境 Windows操作系统、VC++6.0 C语言

4设计思想: (1)程序中进程可用PCB表示,其类型描述如下: struct PCB_type { int pid ; //进程名 int state ; //进程状态 2——表示“执行”状态 1——表示“就绪”状态 0——表示“阻塞”状态 int cpu_time ; //运行需要的CPU时间(需运行的时间片个数) } 用PCB来模拟进程; (2)设置两个队列,将处于“就绪”状态的进程PCB挂在队列ready中; 将处于“阻塞”状态的进程PCB挂在队列blocked中。队列类型描述如下:struct QueueNode{ struct PCB_type PCB; Struct QueueNode *next; } 并设全程量: struct QueueNode *ready_head=NULL,//ready队列队首指针 *ready_tail=NULL , //ready队列队尾指针 *blocked_head=NULL,//blocked队列队首

操作系统课程实验报告

操作系统课程实验报告 操作系统课程实验报告 一、引言 操作系统是计算机系统中最基础的软件之一,扮演着管理计算机硬件和软件资源的重要角色。为了更好地理解操作系统的工作原理和实践操作系统的相关技术,我们在本学期的操作系统课程中进行了一系列的实验。 二、实验一:进程管理 在本实验中,我们学习了进程管理的基本概念和实现方法。通过编写代码,我们实现了一个简单的进程管理系统。在这个系统中,我们可以创建、销毁和调度进程,并且实现了进程间的通信和同步机制。通过这个实验,我们深入了解了进程的创建、调度和通信机制,以及进程的状态转换和资源管理。 三、实验二:内存管理 内存管理是操作系统中非常重要的一部分。在这个实验中,我们学习了内存管理的基本原理和实现方法。通过编写代码,我们实现了一个简单的内存管理系统。在这个系统中,我们可以分配和释放内存块,并且实现了虚拟内存和页面置换算法。通过这个实验,我们深入了解了内存的分配和释放机制,以及虚拟内存的概念和实现。 四、实验三:文件系统 文件系统是计算机系统中用于管理和组织文件的一种机制。在这个实验中,我们学习了文件系统的基本概念和实现方法。通过编写代码,我们实现了一个简单的文件系统。在这个系统中,我们可以创建、读取和写入文件,并且实现了文件的目录结构和权限控制。通过这个实验,我们深入了解了文件的组织和管

理机制,以及文件的访问和保护机制。 五、实验四:设备管理 设备管理是操作系统中负责管理计算机硬件设备的一部分。在这个实验中,我们学习了设备管理的基本原理和实现方法。通过编写代码,我们实现了一个简单的设备管理系统。在这个系统中,我们可以管理设备的分配和释放,并且实现了设备的互斥和同步机制。通过这个实验,我们深入了解了设备的管理和调度机制,以及设备的并发和互斥机制。 六、实验总结 通过这一系列的实验,我们对操作系统的工作原理和实践操作系统的相关技术有了更深入的了解。我们学习了进程管理、内存管理、文件系统和设备管理的基本概念和实现方法,并且通过编写代码实现了简单的操作系统功能。在实验过程中,我们遇到了许多问题,但通过不断的学习和实践,我们逐渐解决了这些问题,并且对操作系统的理解更加深入和全面。 在未来的学习和工作中,我们将继续深入研究操作系统的相关技术,不断提升自己的能力和水平。操作系统是计算机科学中非常重要的一门课程,它不仅是计算机系统的核心,也是我们理解计算机工作原理和开发高效软件的基石。通过实验的学习,我们对操作系统有了更深入的认识,也为我们今后的学习和研究打下了坚实的基础。 七、结语 操作系统课程的实验让我们更好地理解了操作系统的工作原理和实践操作系统的相关技术。通过实践,我们不仅加深了对操作系统的理解,还提升了自己的编程能力和问题解决能力。在未来的学习和工作中,我们将继续深入研究操作

操作系统实验报告

操作系统实验报告 操作系统是计算机科学中十分重要的一门课程,本次实验是关于操作系统的,通过实验,我们可以更深入地了解操作系统的相关知识和操作。本篇文章将着重介绍本次操作系统实验的内容和实验过程中的收获。 一、实验内容 本次实验内容主要涉及操作系统的进程、线程和进程同步三部分。具体内容包括: 1. 进程的创建和管理 2. 线程的创建和管理 3. 进程同步的实现 在实验过程中,我们将分别使用C语言和Linux操作系统实现上述功能。 二、实验过程

1. 进程的创建和管理 在这一部分实验中,我们要创建多个进程,实现进程的调度和管理功能。我们采用了Linux系统下的fork()函数,用于创建子进程。在程序运行时,首先创建一个父进程,然后使用fork()函数创建四个子进程,每个子进程都有自己的进程号(pid),并在屏幕上输出该进程号以示区分。为了实现进程的调度功能,我们在代码中加入了sleep()函数,用于将进程挂起一段时间,然后再轮流执行其他进程。 2. 线程的创建和管理 在这一部分实验中,我们使用了C语言的POSIX线程库pthread.h,实现多线程的功能。同样地,我们采用了Linux系统下的fork()函数来创建线程。在代码运行时,我们创建了两个线程,并在屏幕上输出线程号(tid)以示区分。为了实现线程的调度和管理功能,我们在代码中加入了pthread_join()函数,用于等待线程的执行完成。 3. 进程同步的实现

在这一部分实验中,我们使用了Linux系统下的进程同步工具——信号量(semaphore)。在代码中,我们使用sem_init()函数创建信号量,使用sem_wait()函数阻塞进程或线程,使用sem_post()函数释放进程或线程。为了更好地理解信号量的工作原理,我们将代码分为生产者和消费者两部分,其中生产者用于向缓冲区添加数据,消费者则用于删除数据。在这个过程中,我们需要使用信号量控制生产者和消费者的数量,避免出现生产过多或消费过多的情况。 三、实验收获 通过这次操作系统实验,我们收获了很多宝贵的经验和知识: 1. 更深入地了解了操作系统的工作原理和相关知识。 2. 掌握了操作系统的进程、线程和进程同步等相关技能。 3. 加强了代码实现和调试的能力。

电大操作系统实验报告

电大操作系统实验报告 电大操作系统实验报告 一、引言 操作系统是计算机系统中的核心软件,它负责管理计算机的硬件和软件资源,为用户提供良好的使用环境。为了更好地理解和掌握操作系统的工作原理,我参加了电大的操作系统实验课程。在这门课程中,我学习了操作系统的基本概念、功能以及常见的操作系统类型。同时,还进行了一系列实验,通过实践来加深对操作系统的理解。本文将对我在实验中所学到的内容进行总结和分析。 二、实验内容 1. 实验一:操作系统的启动过程 在这个实验中,我学习了操作系统的启动过程。操作系统的启动过程包括硬件自检、引导加载程序的执行以及操作系统的初始化。通过实验,我深入了解了计算机开机后,操作系统是如何加载和启动的。 2. 实验二:进程管理 进程是操作系统中最基本的概念之一,它代表了一个正在运行的程序。在这个实验中,我学习了进程的创建、调度和终止等操作。通过实验,我了解了操作系统是如何管理多个进程的运行,并掌握了一些常用的进程管理命令。 3. 实验三:内存管理 内存管理是操作系统的重要功能之一,它负责为进程分配和回收内存空间。在这个实验中,我学习了内存的分段和分页管理方式,并了解了虚拟内存的概念和作用。通过实验,我掌握了一些常用的内存管理命令,并学会了如何检测和解决内存泄漏等问题。

4. 实验四:文件系统 文件系统是操作系统中用于管理和组织文件的一种机制。在这个实验中,我学 习了文件的创建、读写和删除等操作,并了解了文件系统的组织结构和存储方式。通过实验,我掌握了一些常用的文件管理命令,并学会了如何进行文件权 限的管理和保护。 三、实验收获 通过参加这门操作系统实验课程,我收获了很多。 首先,我对操作系统的工作原理有了更深入的理解。通过实验,我亲自操作计 算机,观察和分析操作系统的运行过程。这使我能够更直观地感受到操作系统 是如何管理和调度资源的。 其次,我掌握了一些常用的操作系统命令。在实验中,我不仅学会了如何使用 这些命令,还了解了它们的原理和用途。这为我日后的工作和学习提供了很大 的便利。 最后,我培养了一些实践和解决问题的能力。在实验中,我遇到了各种各样的 问题,如进程死锁、内存泄漏等。通过分析和调试,我学会了如何解决这些问题,并提高了自己的技术能力。 四、实验反思 在参加实验的过程中,我也遇到了一些困难和挑战。 首先,实验设备的限制给我带来了一些不便。由于实验室的计算机资源有限, 我无法在实验中同时进行多个操作。这导致我在实验中的进度受到了一定的限制。 其次,实验中的一些概念和原理对我来说比较抽象和难以理解。在这种情况下,

操作系统实验报告总结

操作系统实验报告总结 操作系统实验报告总结 引言 操作系统是计算机系统中非常重要的一个组成部分,它负责管理计算机硬件和 软件资源,为用户提供一个良好的工作环境。通过操作系统实验,我们深入了 解了操作系统的原理和功能,并通过实践掌握了操作系统的基本操作和管理技巧。本文将对我们在操作系统实验中的学习和收获进行总结。 实验一:操作系统的安装与配置 在本次实验中,我们学习了如何安装和配置操作系统。通过实践,我们了解了 操作系统的安装过程和常见的配置选项。在安装过程中,我们需要选择适合我 们计算机硬件的操作系统版本,并进行相应的设置。通过这个实验,我们对操 作系统的安装和配置有了更深入的了解。 实验二:进程管理 进程是操作系统中的一个重要概念,它代表了一个正在运行的程序。在本次实 验中,我们学习了进程的创建、调度和终止等操作。通过实践,我们掌握了如 何使用操作系统提供的命令和工具来管理进程,如查看进程列表、创建新进程、终止进程等。这些操作对于提高系统的资源利用率和运行效率非常重要。 实验三:内存管理 内存管理是操作系统中的另一个重要概念,它负责管理计算机的内存资源。在 本次实验中,我们学习了内存的分配和释放、虚拟内存的管理等操作。通过实践,我们了解了操作系统如何通过页表、地址映射等技术来管理内存资源。这 些知识对于保证系统的稳定性和性能至关重要。

实验四:文件系统 文件系统是操作系统中用于管理文件和目录的一种机制。在本次实验中,我们学习了文件系统的创建、读写文件等操作。通过实践,我们掌握了如何使用操作系统提供的命令和工具来管理文件和目录,如创建文件、复制文件、删除文件等。这些操作对于有效地组织和管理文件非常重要。 实验五:设备管理 设备管理是操作系统中的另一个重要模块,它负责管理计算机的硬件设备。在本次实验中,我们学习了设备的初始化、打开、关闭等操作。通过实践,我们了解了操作系统如何通过设备驱动程序来管理硬件设备。这些知识对于保证系统的稳定性和性能至关重要。 结论 通过操作系统实验,我们对操作系统的原理和功能有了更深入的了解,并通过实践掌握了操作系统的基本操作和管理技巧。通过这些实验,我们不仅提高了对操作系统的理论认识,还培养了实际操作和解决问题的能力。操作系统是计算机科学中非常重要的一个领域,通过这次实验,我们对操作系统有了更深入的认识和理解,为今后的学习和研究打下了坚实的基础。

华北电力大学科技学院 软件综合实验(实验报告)

综合实验报告 ( 2012 -- 2013 年度第 1学期) 名称:软件设计与实践 题目:网页视频播放器 院系:信息工程 班级: 学号: 学生姓名: 指导教师:田志刚 设计周数: 2 成绩: 日期:2012年1 月11 日

《软件综合实验》 任务书 一、目的与要求 软件综合实验是计算机科学与技术、软件工程、网络工程和信息安全专业学生的必修实践环节,本环节是在第六学期、第七学期设置,主要让学生进一步理解、巩固、加深前面所学的课程,并能综合运用所学课程的知识进行设计,掌握算法设计及实现的理论与方法,为毕业设计和今后的工作打下良好的基础。 课程的基本要求: 1. 熟悉微机的应用环境。 2. 利用所学课程的知识,解决程序设计中的实际问题(实际应用题目,或模拟实际应用的题目),为毕业设计和今后的工作打下良好的基础。 二、主要内容 能熟练地利用微机设计出有实用价值的程序。 1. 熟悉Windows以及其它工具软件系统, 2. 根据所选题目进行算法设计(画出流程图,写出各模块的文档)。 3. 编程。 4. 上机调试。 三、进度计划 四、设计(实验)成果要求 编制一个网页播放视频,要求有两种播放模式,一种是可以操作者播放并控制,另外一种是仅可以播放和暂停,不允许改变视频播放进度。 五、考核方式 实验结果(60%)+实验报告(30%)+实验过程表现(10%) 学生姓名: 指导教师: 年月日

一、课程设计(综合实验)的目的与要求 本次课程设计主要让学生进一步理解、巩固、加深前面所学的课程,并能综合运用所学课程的知识进行设计,掌握算法设计及实现的理论与方法,为毕业设计和今后的工作打下良好的基础。 课程的基本要求: 1. 熟悉微机的应用环境。 2. 利用所学课程的知识,解决程序设计中的实际问题(实际应用题目,或模拟实际应用的题目),为毕业设计和今后的工作打下良好的基础。 二、设计(实验)正文 1、实验内容 编制一个网页播放视频,要求有两种播放模式,一种是可以操作者播放并控制,另外一种是仅可以播放和暂停,不允许改变视频播放进度。 2、系统平台需求: 编程语言:xhtml/html5、javascript、css/css3 操作系统:Windows xp系列 开发工具:Aptana 运行环境:chrome浏览器、firefox浏览器 3、实验运行结果 本视频播放器所实现的功能: 1.可以播放MP4格式的文件。 2.两种播放模式,一种是可以操作者播放并控制,另外一种是仅可以播放和暂停,不允许改变视频播放进度。点击“模式转换”按钮即可在两种模式之间切换。(见图1) 3.操作者可以点击“打开文件”按钮,输入要播放文件的路径或网址来打开想要播放的视频。(见图2)

操作系统原理实验报告

《操作系统原理》 实验报告 班级: : 学号: 指导老师:

目录: 实验题目:实验一线程创建与撤销 (2) 实验题目:实验二线程同步 (6) 实验题目:实验三线程互斥 (11) 实验题目:实验四进程通信 (17) 实验题目:实验五读者-写者问题 (22) 实验题目:实验六进程调度 (38) 实验题目:实验七存储管理之动态库 (52) 实验题目:实验八存储管理之存分配 (57) 实验题目:实验九存储管理之页面置换算法 (70) 实验题目:实验十设备管理 (85) 实验题目:实验十一文件管理之文件读写 (99) 实验题目:实验一线程创建与撤销 完成人:XXX 报告日期:2018年3月31日 一、实验容简要描述 (1)熟悉VC++、Visual Studio开发环境。 (2)使用相关函数创建和撤销线程。 (3)在一个进程中创建3个线程,名字分别为threada、threadb、threadc。 threada输出“hello world! ”。 threadb输出“My name is …”。 threadc输出“Please wait…”,然后sleep 5秒钟,接着输出“I wake up”。 二、程序设计 1、设计思路

该函数创建一个在调用进程的地址空间中执行的线程。 2、主要数据结构 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); VOID ExitThread(DWORD dwExitCode); VOID Sleep(DWORD dwMilliseconds); VOID Sleep(DWORD dwMilliseconds); 三、实验结果 1、基本数据 lpThreadAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。若lpThreadAttributes为NULL,则句柄不能被继承。 在WindowsNT中该结构的lpSecurityDescriptor成员定义了新进程的安全性描述符。若lpThreadAttributes为NULL,则线程获得一个默认的安全性描述符。dwStackSize:定义原始堆栈提交时的大小(按字节计)。系统将该值舍入为最近的页。若该值为0,或小于默认时提交的大小,默认情况是使用与调用线程同样的大小。更多的信息,请看ThreadStackSize。 lpStartAddress:指向一个LPTHREAD_START_ROUTlNE类型的应用定义的函数,该线程执行此函数。该指针还表示溃程进程中线程的起始地址。该函数必须存在于远程进程中。 lpParameter:定义一个传递给该迸程的32位值。

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

操作系统实验报告——实验三:进程管理(一) 实验内容: 1.分别从至少三个虚拟终端登录,以树状形式列出你的系统中当前运行的所有进程及其PID。找出你当前运行进程的所有祖先进程,并说明其各自的作用。分析Linux系统中的进程的家族关系。 ●实验室里: 当前运行进程的所有祖先进程是init进程,init是Linux系统操作中不可缺少的程序之一,是内核启动的用户级进程。 内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。init有许多很重要的任务,比如像启动getty(用于用户登录)、实现运行级别、以及处理孤立进程,用pstree 命令就看到进程之间的关系了,所有进程都是由最开始的init创建的,父进程逐个创建子进程。 ●个人电脑: 所有进程的祖先进程为systemd,其是linux下的一种init软件。Systemd(系统管理守护进程),最开始以GNU GPL协议授权开发,现在已转为使用GNU LGPL协议,它是如今讨论最热烈的引导和服务管理程序。Linux系统配置使用Systemd引导程序,取替了传统的SysV init,启动过程将交给systemd处理。Systemd的一个核心功能是它同时支持SysV init的后开机启动脚本。Systemd引入了并行启动的概念,它会为每个需要启动的守护进程建立一个套接字,这些套接字对于使用它们的进程来说是抽象的,这样它们可以允许不同守护进程之间进行交互。Systemd会创建新进程并为每个进程分配一个控制组(cgroup)。处于不同控制组的进程之间可以通过内核来互相通信。systemd处理开机启动进程的方式非常漂亮,和传统基于init的系统比起来优化了太多。 终端一:tty3 ///在实验室的电脑上操作

操作系统实验报告

技术资料 常州大学 操作系统课程实验报告 姓名 xxx 专业班级计算机科学与技术 学号 xxxxxx 指导老师 xxx 成绩 实验时间2012年4月23日——2012年5月7日

实验一 Windows XP 系统管理 一实验目的 1) 了解和学习Windows系统管理工具及其使用; 2) 熟悉Windows系统工具的内容和应用; 3)熟悉Windows操作系统的应用环境。 二实验环境 需要准备一台运行Windows XP操作系统的计算机。 三背景知识 Windows XP的“管理工具”中集成了许多系统管理工具,利用这些工具,管理员可以方便地实现各种系统维护和管理功能。这些工具都集中在“控制面板”的“管理工具”选项下,用户和管理员可以很容易地对它们操作和使用。在默认情况下,只有一些常用工具——如服务、计算机管理、事件查看器、数据源 (ODBC) 、性能和组件服务等——随Windows XP 系统的安装而安装。 四实验内容与步骤 为了帮助用户管理和监视系统,Windows XP提供了多种系统管理工具,其中最主要的有计算机管理、事件查看器和性能监视等。 步骤1:登录进入Windows XP。 步骤2:在“开始”菜单中单击“设置”-“控制面板”命令,双击“管理工具”图标。 在本地计算机“管理工具”组中,有哪些系统管理工具,基本功能是什么: 1) 本地安全策略:查看和修改本地安全策略,如用户权限和审核策略 2) Internet信息服务:管理 IIS,Internet 和 Intranet 站点的 WEB服务器 3) 服务:启动和停止服务 4)计算机管理:管理磁盘以及使用其他系统工具来管理本地或远程的计算机 5)事件查看器:显示来自于 Windows 和其他程序的监视与排错消息 6)数据源ODBC:添加、删除、以及配置 ODBC 数据源和驱动程序 7)性能:显示系统性能图表以及配置数据日志和警报 8)组件服务:配置和管理 COM+ 应用程序 1. 计算机管理 使用“计算机管理”可通过一个合并的桌面工具来管理本地或远程计算机,它将几个Windows XP管理实用程序合并到一个控制台目录树中,使管理员可以轻松地访问特定计算机的管理属性和工具。 步骤3:在“管理工具”窗口中,双击“计算机管理”图标。 “计算机管理”使用的窗口与“Windows资源管理器”相似。在用于导航和工具选择的控制台目录树中有“系统工具”、“存储”及“服务和应用程序”等节点,窗口右侧“名称”窗格中显示了工具的名称、类型或可用的子工具等。它们是: 1) 系统工具,填入表1-3中。

华北电力大学科技学院 windows实验报告

课程设计(综合实验)报告( 2013 -- 2014 年度第 2 学期) 名称:Windows体系编程 题目:课内综合实验 院系:信息工程系 班级:计算机11K1 学号: 学生姓名: 指导教师:王新颖 实验学时:12学时 成绩: 日期:2014年6月6日

实验一类Windows进程任务管理器实验 一、实验目的 理解Windows编程环境下的进程管理机制,能创建一个完成特定功能的进程,并能对进程进行信息的获取、终止和保护,实现一个类Windows的进程任务管理器。 二、实验要求 程序可为控制台或带界面应用程序,要求有较好的用户体验,完成功能: 1.能够完成创建进程的功能,打印输出新建进程ID。 2.获取当前系统进程信息,列出可选显示进程信息项,根据选择显示输出进程信息。 3.终止任意进程并获取退出代码。 4.具体实现技术不限。 三、实验原理 (1)进程的创建 进程的创建通过CreateProcess()函数来实现,CreateProcess()通过创建一个新的进程及在其地址空间内运行的主线程来启动并运行一个新的程序。具体地,在执行CreateProcess()函数时,首先由操作系统负责创建一个进程内核对象,初始化计数为1,并立即为新进程创建一块虚拟地址空间。随后将可执行文件或其他任何必要的动态链接库文件的代码和数据装载到该地址空间中。在创建主线程时,也是首先由系统负责创建一个线程内核对象,并初始化为1。最后启动主线程并执行进程的入口函数WinMain(),完成对进程和执行线程的创建。 CreateProcess()函数的原型声明如下: BOOL CreateProcess( LPCTSTR lpApplicationName, // 可执行模块名 LPTSTR lpCommandLine, // 命令行字符串 LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程的安全属性 LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程的安全属性 BOOL bInheritHandles, // 句柄继承标志 DWORD dwCreationFlags, // 创建标志 LPVOID lpEnvironment, // 指向新的环境块的指针 LPCTSTR lpCurrentDirectory, // 指向当前目录名的指针 LPSTARTUPINFO lpStartupInfo, // 指向启动信息结构的指针LPPROCESS_INFORMATION lpProcessInformation // 指向进程信息结构的指针

操作系统实验报告11

操作系统实验报告 学院:___________________________ 专业:___________________________ 年级:___________________________ 姓名:___________________________ 学号:___________________________ 提交日期:_______________________

实验二:操作系统环境 2.2 Windows 2000 系统管理 (实验估计时间:60分钟) 背景知识 实验目的 工具/准备工作 实验内容与步骤 实验内容与步骤 1. 计算机管理 2. 事件查看器 3. 性能监视 4. 服务 5. 数据库 (ODBC) 为了帮助用户管理和监视系统,Windows 2000提供了多种系统管理工具,其中最主要的有计算机管理、事件查看器和性能监视等。 步骤1:登录进入Windows 2000 Professional。 步骤2:在“开始”菜单中单击“设置”-“控制面板”命令,双击“管理工具”图标。 在本地计算机“管理工具”组中,有哪些系统管理工具,基本功能是什么: 1) __________________________________________________________________ 2) __________________________________________________________________ 3) __________________________________________________________________ 4) __________________________________________________________________ 5) __________________________________________________________________ 6) __________________________________________________________________ 7) __________________________________________________________________ 8) __________________________________________________________________ 9) __________________________________________________________________ 10) _________________________________________________________________ 1. 计算机管理 使用“计算机管理”可通过一个合并的桌面工具来管理本地或远程计算机,它将几个Windows 2000管理实用程序合并到一个控制台目录树中,使管理员可以轻松地访问特定计算机的管理属性和工具。 步骤3:在“管理工具”窗口中,双击“计算机管理”图标。 “计算机管理”使用的窗口与“Windows资源管理器”相似。在用于导航和工具选择的控制台目录树中有“系统工具”、“存储”及“服务和应用程序”等节点,窗口右侧“名称”窗格中显示了工具的名称、类型或可用的子工具等。它们是: 1) 系统工具,填入表2-3中。

相关文档
最新文档