假脱机技术实验报告.docx

上传人:b****6 文档编号:6383710 上传时间:2023-01-05 格式:DOCX 页数:10 大小:197.19KB
下载 相关 举报
假脱机技术实验报告.docx_第1页
第1页 / 共10页
假脱机技术实验报告.docx_第2页
第2页 / 共10页
假脱机技术实验报告.docx_第3页
第3页 / 共10页
假脱机技术实验报告.docx_第4页
第4页 / 共10页
假脱机技术实验报告.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

假脱机技术实验报告.docx

《假脱机技术实验报告.docx》由会员分享,可在线阅读,更多相关《假脱机技术实验报告.docx(10页珍藏版)》请在冰豆网上搜索。

假脱机技术实验报告.docx

假脱机技术实验报告

假脱机技术实验报告

一、实验名称

假脱机技术实现实验

二、实验目标

假脱机(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;

}

八、运行结果

九、结果分析

运行结果信息比较简洁,不够详细,同时需要考虑到数据达到上限时的情况。

可以进一步丰富输出,同时可以给出更多数据进行测试。

十、本次实验体会

通过模拟假脱机技术的输入输出过程,熟悉了假脱机技术的基本内容,加深了对假脱机技术的理解。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1