假脱机技术实验报告.docx
《假脱机技术实验报告.docx》由会员分享,可在线阅读,更多相关《假脱机技术实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
假脱机技术实验报告
假脱机技术实验报告
一、实验名称
假脱机技术实现实验
二、实验目标
假脱机(SPOOLING)技术是广泛应用于各种计算机系统的一种行之有效的输入输出手段。
这种技术使用比较简单的方法,缓和了高速处理机与低速输入输出设备速度不匹配的矛盾,提高了设备的利用率。
为了更好地掌握这种技术,使用高级语言编写一个SPOOLING程序模拟假脱机输入输出过程,
三、实验环境要求:
1.PC机。
2.Windows。
3.VisualStudio2017。
四、实验基本原理
1本实验编制一个SPOOLING输出进程,与另外两个要求输出的进程并发执行。
输出进程每运行一次只输出一项信息到输出井,待输出到一个结束标志时,表示一批信息输出完成,在输出井中形成一输出信息块,再由SPOOLING进程把整个信息块实际输出到打印机或CRT。
因此,进程运行考虑到了同步问题。
采用进程的随机调度法模拟SPOOLING输出,因为各进程的输出是随机的。
2.进程调度采用随机调度法,假设两个要求输出进程的调度概率各为45%,SPOOLING进程的调度概率为10%。
3.进程设置三种工作状态:
可运行状态、不可运行状态和结束状态。
为了区分要求输出的进程和SPOOLING进程处于不可运行状态的不同原因,又把不可运行状态分称不可运行状态1和2,分别叙述如下:
1)进程执行完毕后应设置成“结束状态”。
2)要求输出进程在输出信息时,如果发现输出井已满,应设置成“不可运行状态1”。
3)SPOOLING进程在输出井空时应设置成“不可运行状态2”。
4)SPOOLING进程输出一个信息块后,应释放该信息块所占的输出井位置,并将正在等待输出的进程置成“可运行状态”。
5)要求输出进程把信息输出到输出井并形成信息块后,应将SPOOLING进程置成“可运行状态”。
五、数据结构设计
1.进程控制块
typedefstructpcb{
intid;
longstatus;
longpo;
longhead;
longlength;
longbuffer[1000];
}PCB;
2.输出请求块
typedefstructblock{
intid;
longlen;
longhead;
}BLOCK;
3.输出井
typedefstructwall{
longnum[10000];
longst,ed;
}WALL;
六、流程图
1)假脱机输出系统如图1,该进程由函数init和scheduler实现。
2)请求输出进程如图2,该进程由函数userproc实现。
3)SPOOLING进程,该进程由函数SPOOLING实现。
七、源代码
//假脱机技术.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include"stdafx.h"
#include"stdio.h"
#include"iostream"
usingnamespacestd;
#defineREADY0/*CANRUNINGSTATE*/
#defineWAIT11/*CANNOTRUNNINGSTATE,OUTPUTPOOLISFULL;*/
#defineWAIT22/*CANNOTRUNNINGSTATE;NOFREEIOBLOK;*/
#defineFINISH3/*FINISHSTATE*/
typedefstructpcb{
intid;
longstatus;
longpo;
longhead;
longlength;
longbuffer[1000];
}PCB;
PCBpcbs[4];
typedefstructblock{
intid;
longlen;
longhead;
}BLOCK;
BLOCKblocks[100];
typedefstructwall{
longnum[10000];
longst,ed;
}WALL;
WALLwalls[3];
intL1;//空闲输出(freeioblkunm)
intL2[3];//两个输出井的计数器(freeollen)
intcount[2];
intK[3];//totaliotimes
intblocks_num=0;
voidinit(){
L1=10;
L2[1]=L2[2]=100;
memset(pcbs,0,sizeof(pcbs));
for(inti=1;i<4;i++){
pcbs[i].id=i;
}
pcbs[3].status=WAIT2;
memset(walls,0,sizeof(walls));
cout<<"inputthetimesofuser1'soutputfile:
";
cin>>K[1];
cout<<"inputthetimesofuser2'soutputfile:
";
cin>>K[2];
}
voiduserproc(intr){
intvalue=rand()%10;
//cout<value:
"<inttemp=1;
pcbs[r].po++;
pcbs[r].buffer[pcbs[r].po]=value;
if(value==0){
temp=walls[r].ed+1;
for(inti=1;i<=pcbs[r].po;i++){
walls[r].num[++walls[r].ed]=pcbs[r].buffer[i];
}
pcbs[r].po=0;
pcbs[r].length++;
if(pcbs[r].length==K[r]){
pcbs[r].status=FINISH;
}
if(pcbs[3].status==WAIT2){
pcbs[3].status=READY;
}
if(L2[r]==0&&pcbs[r].status==READY){
pcbs[r].status=WAIT1;
}
blocks_num++;
blocks[blocks_num].id=r;
blocks[blocks_num].head=temp;
blocks[blocks_num].len=walls[r].ed-temp+1;
cout<<"Process"<"<}
}
voidspooling(){
pcbs[3].po++;
inttemp=pcbs[3].po;
cout<<"block"<for(inti=1;i<=blocks[temp].len;i++){
cout<}
cout<if(pcbs[3].po==blocks_num){
pcbs[3].status=WAIT2;
if(pcbs[1].status==FINISH&&pcbs[2].status==FINISH){
pcbs[3].status=FINISH;
}
}
}
voidscheduler(){
intagain=1;
inttemp;
while(again){
temp=rand()%100+1;
//cout<<"temp:
"<if(temp<=45&&pcbs[1].status==READY){
userproc
(1);
}
elseif(temp>45&&temp<=90&&pcbs[2].status==READY){
userproc
(2);
}
elseif(temp>90&&pcbs[3].status==READY)
{
printf("enterinhere!
\n");
spooling();
}
if(pcbs[1].status==FINISH&&pcbs[2].status==FINISH&&pcbs[3].status==FINISH){
break;
}
//cout<}
}
intmain()
{
init();
scheduler();
inti;
cin>>i;
return0;
}
八、运行结果
九、结果分析
运行结果信息比较简洁,不够详细,同时需要考虑到数据达到上限时的情况。
可以进一步丰富输出,同时可以给出更多数据进行测试。
十、本次实验体会
通过模拟假脱机技术的输入输出过程,熟悉了假脱机技术的基本内容,加深了对假脱机技术的理解。