资源描述
课程设计(论文)任务书
软件 学 院 软件工程 专 业 2007-1 班
一、课程设计(论文)题目 假脱机技术模拟
二、课程设计(论文)工作自 2010年 1月 4 日起至 2010年 1月 8 日止。
三、课程设计(论文) 地点:
四、课程设计(论文)内容要求:
1.本课程设计的目的
(1)通过课程设计,使学生理论联系实际,在程序设计实践中进一步了解操作系统的原理和算法的实现,了解设计系统时应考虑的因素。
(2)了解C应用程序编写。
(3)培养学生分析、解决问题的能力,提高学生的论文写作能力。
2.课程设计的任务及要求
1)基本要求:
(1)熟悉C语言的运用,掌握和理解操作系统中的原理和算法;
(2)结合操作系统的基本原理,进行程序设计;
(3)对操作系统的设计和实现有进一步认识和理解。
2)创新要求:
用C编程利用软件程序模拟外围控制机对输入输出设备的在线控制,
即假脱机技术。试利用所编的程序模拟实现对独占设备的改造,使之成为可
以共享的虚拟设备。
3)课程设计论文编写要求
(1)要按照书稿的规格打印与写课程设计论文
(2)论文包括目录、设计思路、具体实现、运行调试与分析讨论、设计体会与小结、参考文献、附录等
(3)课程设计论文装订按学校的统一要求完成
4)答辩与评分标准:
(1)完成原理分析:20分;
(2)完成设计过程:50分;
(3)完成调试:10分;
(4)回答问题:20分。
5)参考文献:
(1) 汤子瀛.《计算机操作系统》[M].西安电子科技大学出版社, 2006年9月
(2) 罗宇.《操作系统》[M].电子工业出版社,2005年9月.
(3) 蒋静.《操作系统原理·技术与编程》[M].机械工业出版社
6)课程设计进度安排
内容 天数 地点
构思及收集资料 1 图书馆
设计与测试 2.5 实验室
撰写论文 1.5 图书馆、实验室
学生签名:
2010年 1 月4日
课程设计(论文)评审意见
(1)完成原理分析(20分):优( )、良( )、中( )、一般( )、差( );
(2)设计分析 (20分):优( )、良( )、中( )、一般( )、差( );
(3)完成调试 (20分):优( )、良( )、中( )、一般( )、差( );
(4)翻译能力 (20分):优( )、良( )、中( )、一般( )、差( );
(5)回答问题 (20分):优( )、良( )、中( )、一般( )、差( );
(6)格式规范性及考勤是否降等级:是( )、否( )
评阅人: 职称: 讲 师
2010 年 1月9 日
课程设计报告
目 录
一、题目要求及原理分析…………………………………………1
二、概要设计………………………………………………………4
三、详细设计及流程图……………………………………………5
四、运行结果………………………………………………………8
五、程序主要代码…………………………………………………10
六、自我评析与总结………………………………………………13
七、参考文献………………………………………………………14
一、题目要求及原理分析
1.1 题目要求
本次课设我们需要做的是假脱机技术的模拟,用C编程利用软件程序模拟外围控制机对输入输出设备的在线控制,即假脱机技术。试利用所编的程序模拟实现对独占设备的改造,使之成为可以共享的虚拟设备。
假脱机,即SPOOLing(Simultaneous Peripheral Operation On-Line )。它将作业放到缓存中,是关于慢速字符设备如何与计算机主机交换信息的一种技术。之所以有用是因为设备获取数据的速度不同,而缓存提供了一个等待区域使慢速设备可以有足够时间读取数据而不影响其他设备。在操作系统里常用,老式的大型os是脱机处理方式,而先进os用的是假脱机技术,就是模拟脱机处理。
1.2 原理分析
假脱机技术(SPOOLing)实际上是一种外围设备同时联机操作技术,又称为排队转储技术。它在输入和输出之间增加了“输入井”和“输出井”的排队转储环节。SPOOLing系统主要包括以下三部分:
(1)输入井和输出井:这是在磁盘上开辟出来的两个存储区域。输入井模拟脱机输入时的磁盘,用于收容I/O设备输入的数据。输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据。
(2)输入缓冲区和输出缓冲区:这是在内存中开辟的两个缓冲区。输入缓冲区用于暂存有输入设备送来的数据,以后在传送到输出井。输出缓冲区用于暂存从输出井送来的数据,以后再传送到输出设备。
(3)输入进程和输出进程:输入进程模拟脱机输入时的外围控制机,将用户要求的数据有输入设备到输入缓冲区,再送到输入井。当CPU需要输入设备时,直接从输入井读入内存。输出进程模拟脱机输出时的外围控制机,把用户要求输入的数据,先从内存送到输出井,待输出设备空闲时,再将输出井中的数据,经过输出缓冲区送到输出设备上。
SPOOLing技术的特点:
(1)提高了I/O速度.从对低速I/O设备进行的I/O操作变为对输入井或输出井的操作,如同脱机操作一样,提高了I/O速度,缓和了CPU与低速I/O设备速度不匹配的矛盾.
(2)设备并没有分配给任何进程.在输入井或输出井中,分配给进程的是一存储区和建立一张I/O请求表.
(3)实现了虚拟设备功能.多个进程同时使用一独享设备,而对每一进程而言,都认为自己独占这一设备,不过,该设备是逻辑上的设备.
SPOOLing系统既不同于脱机方式,也不同于直接藕合方式。它在输入和输出之间增加了“输入井”和“输出井”的排队转儲环节,以消除用户的“联机”等待时间。在系统输入模块收到作业输入请求信号后,输入管理模块中的读过程负责将信息从输入装置中读入输入井缓冲区。当缓冲区满时,由写过程将信息从缓冲区写到外存的输入井中,读过程和写过程反复循环,直到一个作业输入完毕。
当读过程读到一个硬件结束标志之后,系统再次驱动写过程把最后一批信息写入外存输入井并调用中断处理程序结束该次输入。然后,系统为该作业建立作业控制块,从而使输入井中的作业进入作业等待队列,等待作业调度程序选中后进入内存运行。系统在管理输入井过程中可以“不断”读入输入的作业,直到输入结束或输入井满而暂停。
若系统的某台台行式打印机采用了虚拟设备技术,那么若有进程要求对它打印输出时,SPOOLing系统并不是将这台打印机直接分配给进程,而是在共享设备(磁盘或磁鼓)上的输出SPOOLing存储区中为其分配一块存储空间,进程的输出数据以文件形式此。各进程的数据输出文件形成了一个输出队列,由输出POOLing系统控制这台打印机进程,依次将队列中的输出文件实际打印输出。在SPOOLing 系统中,实际上并没有为任何进程分配,而只是在输入井和输出井中,为进程分配一存储区和建立一章I/O请求表。这样,便把独占设备改造为共享设备。
SPOOLing技术实质上是用户进程利用一共享设备的一个存储区,并不是真正占有这一设备,用户进程把要完成的任务以文件的形式存入存储区,在存储区中排队并等待SPOOLing系统调度,只有被SPOOLing系统调度并输出,此项任务才真正完成,通过这一技术可以大大提高了共享设备的使用率,节约了硬件资源。
SPOOLing技术是在通道技术和多道程序设计基础上产生的,它由主机和相应的通道共同承担作业的输入输出工作,利用磁盘作为后援存储器,实现外围设备同时联机操作。它由专门负责I/O的常驻内存的进程以及输入井、输出井组成;它将独占设备改造为共享设备,实现了虚拟设备功能。
SPOOLing技术实现设备管理时的工作特征:
1、提高了I/O速度
2、将独占设备改造为共享设备
在SPOOLing 系统中,实际上并没有为任何进程分配,而只是在输入井和输出井中,为进程分配一存储区并建立一张I/O请求表。这样,便把独占设备改造为共享设备。宏观上,虽然是多个进程在同时使用一台独立设备,而对每一个进程而言,它们都认为自己是独占了一个设备。当然,该设备只是逻辑上的设备。spooling系统实现了将独占设备变换为若干台对应的逻辑设备的功能。二、概要设计
1、进程状态
进程基本状态有3种,分别为可执行、等待和结束。可执行状态就是进程正在或等待调度的状态;等待状态又分为等待状态1、等待状态2、等待状态3。状态变化的条件为:
(1) 进程执行完成时,置为“结束”态;
(2) 服务程序在将输出信息送输出井时,如发现输出井已满,将调用进程置为“等待状态1”;
(3) SPOOLing进程在进行输出时,若输出井空,则进入“等待状态2”;
(4) SPOOLing进程输出一个信息块后,应立即释放该信息块所占的输出井空间,并将正在等待输出的进程置为“可执行状态”;
(5) 服务程序在输出信息到输出井并形成输出请求信息块后,若SPOOLing进程处于等待态,则将其置为“可执行状态”;
(6) 当用户进程申请请求输出块时,若没有可用请求块时,调用进程进入“等待状态3”。
2、设计实现SPOOLing技术的进程
要求设计一个SPOOLing输出进程和两个请求输出的用户进程,以及一个SPOOLing输出服务程序。当请求输出的用户进程希望输出一系列信息时,调用输出服务程序,由它将该信息送入输出井。待遇到一个输出结束标志时,表示进程该次的输出文件输出结束。之后,申请一个输出请求块(用来记录请求输出的用户进程的名字、信息在输出井中的位置、要输出信息的长度等),等待SPOOLing进程进行输出。
3、设计进程调度算法
进程调度采用随机算法,这与进程输出信息的随机性相一致。
可将 Spooling 输入输出程序编制成一个独立的进程与其它要求 输入输出的进程并发工作。进程的运行必须考虑同步问题。采用进程的随机调度法模拟 Spooling 输出是合适的,因为各进程的输出应是随机的。 进程调度采用随机调度法,二个要求输出进程的调度概率各为30%和45%,spooling进程为25% 。
三、详细设计及流程图
首先,为了实现假脱机工作,我们设计了一个结构模式,人机对话开始,机器发出一个询问以后,并非是在原地等待等候用户回答,而是转入了一个特殊的处理子程序。在这个子程序中,一边进行着预先安排好的数据处理工作,一边对键盘进行扫描。用户一作出响应,就中断数据处理工作,继续进行下面的对话。
主程序包括调度程序,调度程序中包括一个随机数函数,以该函数值为依据,按照如下图所示框图调用3个进程,完成对各数据结构的初始化。 SPOOLing输出模拟系统主控流程图如下图所示:
X<30%
开始
初始化
生成、判断随机数
进程结束?
SPOOLing进程
输出进程2
输出进程1
结束
N
Y
30%<X<75%
X>75%
在上述流程图中用随机数模拟进程执行概率,概率设定为进程一:30%,进程二:45%,SPOOLing进程:25%
当X<30,输出进程1;
当X<75,输出进程2;
其他情况,执行SPOOLing进程。
程序中每个进程有一个进程控制块PCB,内容包括:
id 进程控制数,id=0,1,2;
status 进程状态,可为e,r,t,w,c;
priorty 进程优先数;
nexrtwr 等待链指针,只是在同一信号量上等待的下一个进程的标时数。
信号量semaphore,对于临界资源 s1和s2分别有sem1和sem2均为互斥信号量。内容包括:
value 信号量值,初值为1;
firstwr 等待链首指针,指示该信号量上等待的下一个进程标识数。
(1)进程控制块(PCB )
对于输出进程和 spooling 进程两种不同的进程,采用相同的结构处理,包括进程标识,进程状态,输出缓冲,输出指针,信息块首地址,输出长度等内容。需要支持在不同状态之间的转换,输出缓冲清空等操作。
struct PCB
{
int ID; /* 进程标识数*/
int status; /* 进程状态*/
int po;/*输出指针*/
int head;/*信息块首地址*/
int count; /* 要输出的文件数*/
int wait[1000];/*输出缓冲*/
}PCB[4];
(2)输出请求块包括要求输出的进程标识,输出长度,输出首地址等内容。
struct reblock
{
int rename; /* 请求进程名*/
int length; /* 本次输出信息长度*/
int addr; /* 信息在输出井的首地址*/
}reblock[128];
(4) 输出井使用队列结构模拟。需要支持队列重整,取队首元素,删除队首元素,在队尾插入等操作,需要使用 closed,open 两个指针协助操作。SPOOLing系统为每个请求输出的进程在输出井中分别开辟一个区。本实验可设计一个二维数组(int buffer[2][100])作为输出井。每个进程在输出井最多可占用100个位置。
SPOOLing输出进程流程图:
开始
Y
请求输出块是否空
进程是否结束
Y
N
N
SPOOLing进程结束
SPOOLing进程等待
输出内容且释放相应输出井
返回
返回
Y
是否有空进程
N
唤醒相应进程进行调度
释放请求输出块
Y
N
是否有等待输出块的进程
唤醒相应进程进行调度
四、运行结果
1、运行程序,进入假脱机模拟程序界面。
测试数据,输入进程1输出文件次数4和进程2输出文件次数7
2、运行结果如下所示:
3、输入‘ y ’继续程序
4、最后‘ n ’退出程序。 五、程序主要代码
主函数main:
定义标志位;
调用输入函数input()要求用户输入两进程输出文件次数;
调用初始化函数init()对三进程PCB及相关数据进行初始化;
调用模拟进程调度函数work()进行进程调度及相关输出;
int main()
{
cout<<"########## WELCOME TO THE SPOOLing SYSTEM ##########"<<endl;
cout<<"please follow the action: "<<endl;
cout<<endl;
int t=1;
while(t)
{
srand(time(NULL));
input();
init();
work();
cout<<"continue(y or n)?"<<endl;
getchar();
if(getchar()=='y')
t=1;
else
t=0;
}
模拟进程调度
void work()
{
int r; //当所有进程的状态位为3,即不可运行状态时,执行
int f;
int a,b;
int i,j;
while (PCB[1].status!=3 || PCB[2].status!=3 || PCB[3].status!=3)
{
r=rand()%100+1; //用随机数得到进程执行概率 ,(rand()%100+1)赋予其值给R;
if (r<=30)
{
f=1;
}
else
{
if (r<=75)
f=2;
else
f=3;
}
第F个进程的状态位不等于0),跳过此次循环;
if (PCB[f].status!=0)
continue;
switch (f)
{
case 1:
case 2:
a=rand()%25;
++PCB[f].po;
PCB[f].wait[PCB[f].po]=a;
if (a==0)
{
b=wall[f].closed+1;
for (i=1;i<=PCB[f].po;i++)
{
wall[f].num[++wall[f].closed]=PCB[f].wait[i];
}
PCB[f].po=0;
PCB[f].count++;
if (PCB[f].count==F[f])
{
PCB[f].status=3;
}
if (PCB[3].status==2)
{
PCB[3].status=0;
}
if (L2[f]==0 && PCB[f].status==0)
{
PCB[f].status=1;
}
n++;
block[n].ID=f;
block[n].head=b;
block[n].len=wall[f].closed-b+1;
printf("process %ld product a export message %ld!\n",f,n);
}
break;
case 3: // Spooling 进程
PCB[3].po++;
a=PCB[3].po;
printf("print the message %ld: (ID=%ld)\n",a,block[a].ID);
for (i=1;i<=block[a].len;i++) //输出输出请求块号
{
printf("%ld ",wall[block[a].ID].num[i+block[a].head-1]);
}
printf("\n");
if (PCB[3].po==n)
{
PCB[3].status=2;
if (PCB[1].status==3 && PCB[2].status==3)
{
PCB[3].status=3;
}
}
break;
}
}
}
第 11 页
六、自我评析与总结
这次课设做完了,我给自己评了79分。假脱机技术对我来说是比较欠缺掌握的知识点,我一直没能很好把握假脱机技术的含义,不过虽然不太懂,我还是慢慢完成了这份课设,请教同学,查阅书本以及查找网络资料。让我对假脱机技术有了更深的了解。
调试程序过程中发现一些问题,输出内容多,在屏幕上一闪而过,可采用在程序中预先设置断点或将输出信息发送到文件中的方法来处理。如果在Windows XP系统上运行可看到全部运行结果。
操作系统是现代计算机系统工作的基石,而且运行程序离不开操作系统的支持。本程序完成后对于进程管理有了整体的定义和理解。进程:可并发执行的程序,在某个数据集合上的一次运行过程。而进程控制块是为使程序(含数据)能独立运行,为之配置一进程控制块,即PCB。进程有三种基本状态为就绪态(Ready),执行态(Running),阻塞态(Blocked)在程序中还涉及到进程的阻塞与唤醒,系统有3个进程,执行时涉及到高低就绪态和优先数的选择。经过本次试验加深了对于进程管理的理解和认识,对于它的执行过程和整体的结构有了一定的了解,熟悉了进程管理中主要数据结构的设计及进程调度算法,进程控制机构,同步机构,通讯机构的实施。通过本次实验把理论知识转化成了实际结果,强化了理论知识的学习,把课本知识生动的得到了验证。对今后从事实际工作打下了坚实的基础。
通过一周的操作系统上机实验,使我对计算机的操作系统有了更加系统的认识。对计算机的操作,监测,管理有了新的、有效的认知与理解,对以后的学习工作中有着重要的帮助与提示。
实验过程中的VC++编程使我从另一方面认识了C的编程,C语言编写的成功程序,可以顺利的控制计算机,恶意的程序可以大量占用系统的内存与空间,一些病毒与木马正是由于检测到WIN操作系统的漏洞,从而入侵、破坏计算机的。通过操作系统的学习可以让我们发现一些平时不易出现的进程,应该对其进行正确的监视、检测、分析,做出正确的处理结果。
第 13 页
七、参考文献
[1] 汤子瀛. 《计算机操作系统》[M].西安电子科技大学出版社, 2006年9月
[2] 罗宇. 《操作系统》[M].电子工业出版社,2005年9月
[3] 蒋静. 《操作系统原理·技术与编程》[M].机械工业出版社
[4] Lubomir F.Bic,Alan C.Shaw. 《操作系统原理》[M].清华大学出版社
[5]
展开阅读全文