操作系统(SPOOLING技术)

article/2025/8/21 3:03:33

SPOOKING技术

  • 一、实验目的
  • 二、实验内容
  • 三、实验准备
    • 1、设计一个实现SPOOLING技术的进程
    • 2、设计进程调度算法
    • 3、进程状态
    • 4、数据结构
    • 5、编程说明
    • 6、程序框图
  • 四、实验要求
    • 1、数据结构
    • 2、程序流程图
    • 代码运行结果

一、实验目的

理解和掌握SPOOLING假脱机技术


二、实验内容

  通过SPOOLING技术可将一台物理I/O设备虚拟为多台逻辑I/O设备,同样允许多个用户共享一台物理I/O设备,从而使其成为虚拟设备。该技术广泛应用与各种计算机的I/O,通过采用预输入和缓输出的方法,使用共享设备的一部分空间来模拟独占设备,以提高独占设备的利用率。


三、实验准备

1、设计一个实现SPOOLING技术的进程

  设计一个SPOOLING输出进程和两个请求输出的用户进程及一个SPOOLING输出服务程序。

  SPOOLING输出进程工作时,根据请求块记录的各进程要输出的信息,将其实际输出到打印机或显示器。这里,SPOOLING进程与请求输出的用户进程可并发运行。


2、设计进程调度算法

  进程调度采用随机算法,这与进程输出信息的随机性相一致。两个请求输出的用户进程的调度概率各为45%,SPOOLING输出进程为10%,这由随机数发生器产生的随机数模拟决定。


3、进程状态

  进程基本状态有3种,分别为可执行、等待和结束。可执行状态就是进程正在运行或等待调度的状态;

  等待状态又分为等待状态1、等待状态2、等待状态3。

  状态变化的条件为:

  ①进程执行完成时,置为“结東”状态。

  ②服务程序在将输出信息送至输出井时,如发现输出井已满,将调用进程置为“等待状态1”。

  ③SPOOLING进程在进行输出时,若输出井空,则进入“等待状态2”。

  ④当用户进程申请请求输出块时,若没有可用请求块时,调用进程进入“等待状态3”。

  ⑤SPOOLING进程输出一个信息块后,应立即释放该信息块所占的输出井空间,并将正在等待输出的进程置为“可执行状态”。

  ⑥服务程序在输出信息到输出井并形成输出请求信息块后,若SPOOLING进程处于等待状态则将其置为“可执行状态”


4、数据结构

1)进程控制块PCB

structpcb{

    intstatus:

    intlength

}PCBL3];

其中status表示进程状态,其取值:

0表示可执行状态

1表示等待状态1;

2表示等待状态2;

3表示等待状态3。


2)请求输出块reqblock

struct{

intreqname;//请求进程名

intlength;//本次输出信息长度

intaddr;//信息在输出井的首地址

}reblock[10];


3)输出井BUFFER

  SPOOLING系统为每个请求输出的进程在输出井中分别开辟一个区。本实验可设计一个二维数组(intbuffer[2][10])作为输出井。每个进程在输出井最多可占用10个位置。


5、编程说明

  为两个请求输出的用户进程设计两个输出井。每个可存放10个信息,即buffer[2][10]。当用户进程将其所有文件输出完时,终止运行。

  为简单起见,用户进程简单地设计成:每运行一次,随机输出数字0~9之间的一个数,当输入10个数时形成一个请求信息块,填入请求输出信息块reqlock结构中。


6、程序框图

SPOOLING输出模拟系统主控流程图如图所示。
在这里插入图片描述

四、实验要求

1、分析程序所定义使用的数据结构;
2、分析程序的结构,并画出程序流程图;
3、撰写实验报告;

1、数据结构

struct process 
{int status;//进程状态 int length;//数据长度 
}*PCB[3]; struct requset
{int reqName;//用户名字 int length;//输出数据长度 int addr;//地址寄存器 
}reqBlock[10];int Buffer[2][100];//定义# 
int Head = 0;//打印用户请求的的数据<10的随机数 
int Tail = 0;//请求用户数据<10的随机数 
int T1 = 0;//用户1请求次数定义 
int T2 = 0;//用户2请求次数定义
void Request(int i);//i=1表示用户进程1;i=2表示用户进程2
void Spooling();

2、程序流程图

在这里插入图片描述
获取本地时间代码

void Time()
{time_t t;//将t声明为时间变量struct tm *p;//struct tm是一个结构体,声明一个结构体指针time(&t);p=localtime(&t);//获得当地的时间int s = 7;//定义一个值int k = 7;int sum;//计算出k和s,自己的学号是sumsum = s * k;printf("\n");printf("          学号展示\n",sum);printf("          自己的姓名\n");printf("\n");printf("操作系统实验展示于%d年%d月%d日 %d时%d分%d秒\n",1900 + p -> tm_year, 1 + p -> tm_mon, p -> tm_mday, p -> tm_hour, p -> tm_min, p -> tm_sec);//输出当前本地的时间 
}

请求函数代码

void Request(int i)
{int j = 0;int m = 0;int length = 0;struct requset *run;if(1 == i)T1--;elseT2--;printf("用户%d请求数据:\n",i);run =& reqBlock[Tail%10];run->reqName = i;run->length = 0;if(0 == Tail)run->addr = 0;else{int index = (Tail-1) % 10;run->addr = reqBlock[index].addr + reqBlock[index].length;}for(m = 0; m < 100; m++){if(0 == Buffer[i-1][m]){run->addr = m;break;}}while(1){j = rand()%10;if(0 == j){run -> length = length;break;}Buffer[i-1][(run->addr+length)] = j;printf("%3d",j);length++;}printf("\n");PCB[i-1]->length += length;printf("此时process[%d]中length的值为%d\n",i,length); printf("*******************************\n");length = 0;if(2 == PCB[j]->status)PCB[j]->status = 0;Tail++;
}

SPOOLING代码

void Spooling()
{int i = 0;int j = 0;struct requset *run;printf("调用SPOOLING输出服务程序输出数据:\n");run =& reqBlock[Head%10];printf("用户%d请求的数据:\n",run->reqName);for(i = 0; i < run->length; i++){printf("%3d",Buffer[run->reqName-1][run->addr+i]);}printf("\n");printf("\n***********************************\n");Head++;for(j = 0; j < 2; j++){if(1 == PCB[j]->status)//若没有可用请求块时,调用进程进入"等待状态3PCB[j]->status = 0;}
}

主函数代码

int main()
{int l = 0;int j = 0;int n = 0;int m = 0;int k = 0;for(l = 0; l < 2; l++)for(j = 0; j < 100; j++)Buffer[l][j] = 0;for(n = 0; n < 3; n++){struct process *tmpprocess = (struct process*)malloc(sizeof(struct process));tmpprocess->status = 0;tmpprocess->length = 0;PCB[n] = tmpprocess;}Time();printf("用户1请求次数为:\n");scanf("%d",&T1);printf("用户2请求次数为:\n");scanf("%d",&T2);srand((unsigned)time(NULL));while(1){k = rand()%100;printf("\n");printf("当前K值为%d\n",k);if((k <= 45) && (T1 > 0)){if((0 == PCB[0]->status) && (T1 > 0))Request(1);		}else if((k <= 90) && (T2 > 0)){if(0 == PCB[1]->status)Request(2);}elseSpooling();if((0 == T1) && (0 == T2) && (Head == Tail))break;}for(m = 0; m < 3; m++){free(PCB[m]);PCB[m] = NULL;}getchar();
}

全部代码展示

#include<stdio.h>
#include<iostream>
#include<time.h>
#include<stdlib.h>struct process 
{int status;//进程状态 int length;//数据长度 
}*PCB[3]; struct requset
{int reqName;//用户名字 int length;//输出数据长度 int addr;//地址寄存器 
}reqBlock[10];int Buffer[2][100];//定义# 
int Head = 0;//打印用户请求的的数据<10的随机数 
int Tail = 0;//请求用户数据<10的随机数 
int T1 = 0;//用户1请求次数定义 
int T2 = 0;//用户2请求次数定义
void Request(int i);//i=1表示用户进程1;i=2表示用户进程2
void Spooling();void Time()
{time_t ti;//将t声明为时间变量struct tm *p;//struct tm是一个结构体,声明一个结构体指针time(&ti);p = localtime(&ti);//获得当地的时间int s = 7;int k = 7;int sum;sum = s * k;printf("***********************************\n");printf("******   SPOOLING技术模拟系统  ****\n"); printf("******      学号   *********\n",sum);printf("******       姓名       *********\n");printf("***********************************\n");printf("操作系统实验展示于%d年%d月%d日 %d时%d分%d秒\n",1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min, p ->tm_sec);printf("---------------------------------------------\n");
}int main()
{int l = 0;int j = 0;int n = 0;int m = 0;int k = 0;for(l = 0; l < 2; l++)for(j = 0; j < 100; j++)Buffer[l][j] = 0;for(n = 0; n < 3; n++){struct process *tmpprocess = (struct process*)malloc(sizeof(struct process));tmpprocess->status = 0;tmpprocess->length = 0;PCB[n] = tmpprocess;}Time();printf("用户1请求次数为:\n");scanf("%d",&T1);printf("用户2请求次数为:\n");scanf("%d",&T2);srand((unsigned)time(NULL));while(1){k = rand()%100;printf("\n");printf("当前K值为%d\n",k);if((k <= 45) && (T1 > 0)){if((0 == PCB[0]->status) && (T1 > 0))Request(1);		}else if((k <= 90) && (T2 > 0)){if(0 == PCB[1]->status)Request(2);}elseSpooling();if((0 == T1) && (0 == T2) && (Head == Tail))break;}for(m = 0; m < 3; m++){free(PCB[m]);PCB[m] = NULL;}getchar();
}void Request(int i)
{int j = 0;int m = 0;int length = 0;struct requset *run;if(1 == i)T1--;elseT2--;printf("用户%d请求数据:\n",i);run =& reqBlock[Tail%10];run->reqName = i;run->length = 0;if(0 == Tail)run->addr = 0;else{int index = (Tail-1) % 10;run->addr = reqBlock[index].addr + reqBlock[index].length;}for(m = 0; m < 100; m++){if(0 == Buffer[i-1][m]){run->addr = m;break;}}while(1){j = rand()%10;if(0 == j){run -> length = length;break;}Buffer[i-1][(run->addr+length)] = j;printf("%3d",j);length++;}printf("\n");PCB[i-1]->length += length;printf("此时process[%d]中length的值为%d\n",i,length); printf("*******************************\n");length = 0;if(2 == PCB[j]->status)PCB[j]->status = 0;Tail++;
}void Spooling()
{int i = 0;int j = 0;struct requset *run;printf("调用SPOOLING输出服务程序输出数据:\n");run =& reqBlock[Head%10];printf("用户%d请求的数据:\n",run->reqName);for(i = 0; i < run->length; i++){printf("%3d",Buffer[run->reqName-1][run->addr+i]);}printf("\n");printf("\n***********************************\n");Head++;for(j = 0; j < 2; j++){if(1 == PCB[j]->status)//若没有可用请求块时,调用进程进入"等待状态3PCB[j]->status = 0;}
}

代码运行结果

在这里插入图片描述


http://chatgpt.dhexx.cn/article/oTqFa2Tn.shtml

相关文章

什么是业务对象?业务逻辑是什么?

业务对象通常被认为是代表实体&#xff0c;比如 或者存储的类。 这样的类具有一定的属性&#xff0c;比如价格&#xff0c;颜色&#xff0c;宽度&#xff0c;国际标准图书编号 等等. NET 地图( 对象地图中&#xff0c;它是由所谓的setter和 getter&#xff0c;换句话说&#xf…

【burpsuite安全练兵场-服务端5】业务逻辑漏洞-11个实验(全)

前言&#xff1a; 介绍&#xff1a; 博主&#xff1a;网络安全领域狂热爱好者&#xff08;承诺在CSDN永久无偿分享文章&#xff09;。 殊荣&#xff1a;CSDN网络安全领域优质创作者&#xff0c;2022年双十一业务安全保卫战-某厂第一名&#xff0c;某厂特邀数字业务安全研究员&…

三层架构之业务逻辑层

你好&#xff0c;是我琉忆。 今天我们讲一讲三层架构中的业务逻辑层 1、业务逻辑层的介绍 业务逻辑层&#xff08;Business Logic Layer&#xff0c;简称 BLL&#xff09;是系统架构中体现核心价值的部分。它的关注点主要集中在业务规则的制定、业务流程的实现等与业务需求有…

如何绘制逻辑图 — 7.逻辑的表达:业务逻辑

前4 篇介绍完了逻辑图三元素中“要素”的表达方式&#xff0c;下面要介绍逻辑图三元素之二“逻辑”的表达方式。逻辑表达的说明分为两篇&#xff0c;第一篇说明“业务逻辑”的表达方式&#xff0c;第二篇说明“数据逻辑”的表达方式。 在语言、文字和图形这三种表达方式中&…

如何先梳理业务逻辑再写代码

1.业务逻辑与代码 代码是需求逻辑的一种展现形式 需求文档是业务逻辑的一种展现形式&#xff0c;而代码不过是业务逻辑的另一种表现形式&#xff1b;如果逻辑本身有问题&#xff0c;那么它的各种展示形式自然也是错的&#xff0c;所以写代码前应该先思考清楚业务逻辑。 Revi…

【web实战-业务逻辑】评论点赞逻辑

前言&#xff1a; 介绍&#xff1a; 博主&#xff1a;网络安全领域狂热爱好者&#xff08;承诺在CSDN永久无偿分享文章&#xff09;。 殊荣&#xff1a;CSDN网络安全领域优质创作者&#xff0c;2022年双十一业务安全保卫战-某厂第一名&#xff0c;某厂特邀数字业务安全研究员&…

SpringBoot框架实现简单业务逻辑

SpringBoot框架实现简单业务逻辑 总述Entity层Dao层Mapper.xml Service层ServiceImpl Controller层完整的业务逻辑实现写法示例Dao层声明方法Mapper.xml具体实现sql语句Service层声明方法ServiceImpl具体实现业务逻辑Controller层调用Service层方法实现 总结 总述 最基本的业务…

java如何优雅的写业务逻辑_java业务逻辑,写在哪里比较好?

java业务逻辑&#xff0c;写在哪里比较好&#xff1f;对于这个问题&#xff0c;我想说的是&#xff1a;规范是死的&#xff0c;人是活的&#xff0c;一般情况下&#xff0c;我们可以根据不同的 java 框架规范的目录来写&#xff0c;特殊情况下也可以自定义。 问题分析 接触过 j…

常见的业务逻辑漏洞-整合篇

笔者前言&#xff1a; 作为一个地地道道的安服仔&#xff0c;每日的工作就是渗透测试&#xff0c;在测试的过程中累积了很多的经验&#xff0c;看到了各种各样奇葩的漏洞&#xff0c;于是乎便有了这样的一篇文章。以下文章均由本人测试发现并打码&#xff0c;侵删 什么是业务逻…

浅谈——业务逻辑漏洞

目录 什么是业务逻辑漏洞产生原因脑图有哪些应用场景&#xff1f;哪些危害&#xff1f;越权支付漏洞靶机案例修改支付金额密码找回绕过越权 防御方式参考 | 提示&#x1f4dd;&#xff1a; “业务逻辑"一词仅指定义应用程序操作方式的一组规则。由于这些规则并不总是与企…

订单业务逻辑设计

订单业务逻辑 订单的常见功能&#xff1a; 创建订单功能、查看订单列表、根据订单id查询订单的详细信息、订单修改、订单取消、订单状态、订单评价等功能的实现数据库表的设计 tb_order(订单信息表) tb_order_item&#xff08;订单详情表&#xff09; tb_order_shipping&am…

业务安全 –业务逻辑漏洞

目录 业务安全 –业务逻辑漏洞 业务安全概述; 业务安全测试流程&#xff1a; 业务数据安全 商品支付金额篡改 前端JS限制绕过验证 请求重放测试 业务上线测试 *商品订购数量篡改 密码找回安全 注入 业务逻辑 信息泄露 业务安全概述; 简单讲&#xff0c;随着社会发…

不可思议但又无处不在的漏洞,WEB安全基础入门—业务逻辑漏洞

欢迎关注订阅专栏&#xff01; WEB安全系列包括如下三个专栏&#xff1a; 《WEB安全基础-服务器端漏洞》《WEB安全基础-客户端漏洞》《WEB安全高级-综合利用》 知识点全面细致&#xff0c;逻辑清晰、结合实战&#xff0c;并配有大量练习靶场&#xff0c;让你读一篇、练一篇&a…

业务逻辑安全思路总结

在一些关键的业务场景里&#xff0c;我们最应该关注的安全问题是什么呢&#xff1f; 想到这&#xff0c;发现挺有意思的&#xff0c;于是我重新去梳理了一下业务逻辑方面的内容&#xff0c;做了一张关于业务逻辑安全的思维导图&#xff0c;在整理的过程中&#xff0c;自己的思路…

开发业务逻辑

转自&#xff1a;http://www.uml.org.cn/zjjs/201008021.asp 前言 记得几个月前&#xff0c;在一次北京博客园俱乐部的活动上&#xff0c;最后一个环节是话题自由讨论。就是提几个话题&#xff0c;然后大家各自加入感兴趣的话题小组&#xff0c;进行自由讨论。当时金色海洋同学…

Service业务逻辑层

就是功能实现 例&#xff1a;Account类要求编写业务逻辑层AccountServiceImpl类实现一个转账功能 先定义DBUtils类封装数据库连接代码、定义Account类、定义PersonDao类提供增删改查方法 public class AccountServiceImpl{public static void transfer(int fromId,String pwd,…

业务逻辑详解

不同的项目有不同的功能&#xff0c;不同的功能需要不同的实现&#xff0c;实现这些核心功能的代码就叫业务逻辑 比如让你实现一个功能&#xff0c;给你两个数&#xff0c;让你获取它的和&#xff0c;你所写的如何才能获得任意给定的两个数的和&#xff0c;这个程序实现过程即可…

业务逻辑漏洞

业务逻辑漏洞定义&#xff1a; 业务逻辑漏洞是指由于程序逻辑不严谨或逻辑太复杂&#xff0c;导致一些逻辑分支不能正常处理或处理错误。 业务逻辑漏洞特性&#xff1a; 业务逻辑漏洞只出现于业务流程中&#xff08;模块功能&#xff09;&#xff0c;也就是说网站的部分都有…

业务逻辑漏洞总结

一、漏洞简介 业务逻辑漏洞产生的最核心原因&#xff0c;就是在编写程序时&#xff0c;只考虑了常规的操作流程&#xff0c;即“当在A情况下&#xff0c;就会出现B&#xff0c;此时执行C即可”&#xff0c;但是开发者却没有考虑当用户执行了意料之外的X时会发生什么。这种对于…

前端业务逻辑

前端业务逻辑 1-关于全选和非全选 Vue3环境下运用ant-design-vue框架 展示效果 全选 非全选 业务逻辑 1、数据结构data const state reactive({cart: , // 购物车信息ids: [], // 删除购物车单个商品的idcartNum: , // 购物车数量checkAll: false, // 是否处于全选状态c…