专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
电路设计
实验四、SPOOLing技术
2019-07-14 11:05
发布
生成海报
站内文章
/
电路设计
10849
0
1787
C语言
#include
#include
#include
struct pcb{ //定义结构体 int status; //进程状态 int length; //输出长度 }*PCB[3]; struct req{ //请求进程名 int reqname; //定义名称 int length; //输出长度 int addr; //本次输出的首地址 }reqblock[10]; int buffer[2][100]; int head=0,tail=0; int t1=5,t2=5; void request(int i) //定义请求函数 { int j,m,s,length=0; struct req*run; if(1==i) t1--; else t2--; 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; } } s=0; while(1) { j=rand()%10; if(0==j) { run->length=length; break; } buffer[i-1][(run->addr+length)]=s; printf("%3d",s); s++; length++; } printf("/n"); PCB[i-1]->length+=length; length=0; if(2==PCB[2]->status) PCB[2]->status=0; tail++; } void spooling() { int i,j; struct req*run; printf("调用SPOOLING输出服务程序输出数据:/n"); run=&reqblock[head%10]; printf("%d:/n",run->reqname); for(i=0;i
length;i++) printf("%3d",buffer[run->reqname-1][run->addr+i] ); printf("/n"); head++; for( j=0;j<2;j++) { if(1==PCB[j]->status) PCB[j]->status=0; } } //程序主函数 void main() { int l,m,n,j,k; for(l=0;l<2;l++) for(j=0;j<100;j++) buffer[l][j]=0; for(n=0;n<3;n++) { struct pcb*tmpPcb=(struct pcb*)malloc(sizeof(struct pcb)); tmpPcb->status=0; tmpPcb->length=0; PCB[n]=tmpPcb; } printf("两个用户进程的请求分别为5,5./n"); srand((unsigned)time(NULL)); while(1) { k=rand()%100; //用随机数模拟进程执行概率 if(k<=45)//执行请求输出用户进程1 { if((0==PCB[0]->status)&&(t1>0)) request(1); } else if((k<=90)&&(t2>0))//执行请求输出用户进程2 { if(0==PCB[1]->status) request(2); } else spooling();//执行SPOOLING进程 if((0==t1)&&(0==t2)&&(head==tail)) break; } for(m=0;m<3;m++) { free(PCB[m]); PCB[m]=NULL;//PCB值为空 } getchar(); }//主函数结束
java
import java.awt.*; import javax.swing.*; import java.awt.event.*; public class spolingaction extends JFrame implements ActionListener,WindowListener { int Ptr1,Ptr2,c3; //Ptr1是要输出的第一个请求输出块指针,Ptr2是空闲请求输出块指针,按模10进行变化,c3标示当前系统剩余的请求输出信息块个数 int c1[]=new int[2]; //表示用户进程可使用的输出井的空间 int c2[][]=new int[2][2]; //表示输出井使用情况,c1[i][0]表示buffer[i]的第一个可用空缓冲指针,c1[i][1]表示buffer[i]的第一个满缓冲指针 int buffer[][]=new int[2][100]; //输出井 int m=0; int w[]=new int[2]; private JButton button_ok,button_diaodu; private JTextField text_k,text_s,text_p; private JTextArea text_user,text_1; private JScrollPane scroll,scroll_1; pcb PCB[]=new pcb[3]; reqblock rb[]=new reqblock[10]; public spolingaction() { super("SPOOLING假脱机输入输出技术模拟"); this.setSize(800,600); this.setLocation(160,120); this.setResizable(false); this.setLayout(new BorderLayout()); JPanel panel=new JPanel(new GridLayout(2,1)); this.add(panel,BorderLayout.NORTH); this.setBackground(Color.blue); JPanel panel_1=new JPanel(new GridLayout(1,2)); JPanel panel_2=new JPanel(new BorderLayout()); JPanel panel_3=new JPanel(new BorderLayout()); this.add(panel_1); text_user=new JTextArea(); scroll= new JScrollPane(text_user); panel_2.add(scroll,BorderLayout.CENTER); text_1=new JTextArea(); scroll_1=new JScrollPane(text_1); panel_3.add(scroll_1,BorderLayout.CENTER); panel_1.add(panel_2); panel_1.add(panel_3); JPanel panel1=new JPanel(new FlowLayout()); panel.add(panel1); JPanel panel2=new JPanel(new FlowLayout()); panel.add(panel2); JLabel label_k=new JLabel(" 进程1文件数:"); panel1.add(label_k); text_k=new JTextField(15); panel1.add(text_k); JLabel label_s=new JLabel(" 进程2文件数:"); panel1.add(label_s); text_s=new JTextField(15); panel1.add(text_s); button_ok=new JButton("确定"); button_ok.addActionListener(this); panel2.add(button_ok); button_diaodu=new JButton("模拟"); button_diaodu.addActionListener(this); panel2.add(button_diaodu); this.setVisible(true); } public void Diaodu() //模拟SPOOLING算法 { int i,j,n; while(PCB[1].status!=4||PCB[2].status!=4||c3!=10) { for(i=0;i<3;i++) if(PCB[i].status!=4) PCB[i].status=0; if(c1[0]==0&&PCB[1].status!=4) { text_1.append("进程1输出井满,进程1等待。/n"); PCB[1].status=1; } if(c1[1]==0&&PCB[1].status!=4) { text_1.append("进程2输出井满,进程2等待。/n"); PCB[2].status=1; } if(c3==10) { text_1.append("请求输出井空,SPOOLING输出进程等待。/n"); PCB[0].status=2; } if(c3==0) { if(PCB[1].status!=4) {PCB[1].status=3;text_1.append("请求输出井满,第1个进程请求输出进程等待。/n");} if(PCB[2].status!=4) {PCB[2].status=3;text_1.append("请求输出井满,第2个进程请求输出进程等待。/n");} } n=random(); if(n!=0&&PCB[n].status==0) { rb[Ptr2].reqname=n; rb[Ptr2].addr=c2[n-1][0]; sc(n); rb[Ptr2].length=m; c3--; Ptr2++;Ptr2=Ptr2%10; PCB[n].x++; text_1.append("进程"+n+"第"+PCB[n].x+"个文件请求输出。/n"); if(PCB[n].x==PCB[n].count) { text_1.append("进程"+n+"执行完成。/n"); PCB[n].status=4; } } if(n==0&&PCB[0].status==0) { w[rb[Ptr1].reqname-1]++; text_user.append("SPOOLING输出进程"+rb[Ptr1].reqname+"的第"+w[rb[Ptr1].reqname-1]+"个文件:"); for(i=0;i
54) return 2; else return 0; } public void create() { int i; w[0]=0;w[1]=0; Ptr1=0;Ptr2=0; c3=10; c1[0]=100;c1[1]=100; for(i=0;i<3;i++) { PCB[i]=new pcb(); PCB[i].id=i; PCB[i].status=0; PCB[i].x=0; } for(i=0;i<10;i++) { rb[i]=new reqblock(); rb[i].reqname=0; rb[i].length=0; rb[i].addr=0; } } public void actionPerformed(ActionEvent e) { String s=e.getActionCommand(); if(s.equals("确定")) { create(); PCB[1].count=Integer.parseInt(text_k.getText()); text_user.append("进程1文件数为: "+text_k.getText()+"/t"); PCB[2].count=Integer.parseInt(text_s.getText()); text_user.append("进程2文件数为: "+text_s.getText()+" "+"/n"); } if(s.equals("模拟")) { Diaodu(); } } public void windowDeactivated(WindowEvent e){} public void windowClosing(WindowEvent e){} public void windowOpened(WindowEvent e){} public void windowActivated(WindowEvent e){} public void windowClosed(WindowEvent e){} public void windowIconified(WindowEvent e){} public void windowDeiconified(WindowEvent e){} public static void main(String arg[]) { new spolingaction(); } } class pcb //进程控制块 { int id; //进程标示数 int status; //进程状态 int count; //要输出的文件数 int x; //进程输出时的临时变量 } class reqblock //请求输出块 { int reqname; //请求进程名 int length; //本次输出信息长度 int addr; //信息在输出井的首地址 }
Ta的文章
更多
>>
实验四、SPOOLing技术
0 个评论
把公司LOGO转换成PCB库文件
0 个评论
一种嵌入式ARM-Linux GPS智能终端设计
0 个评论
热门文章
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮