請麻煩高手進來幫看一下SJF with Preemptive 的代碼是哪裡出的問題!!

毋暝熊熊 2008-12-24 09:37:32
#include <iostream>
#include <cstdlib>
#include <iomanip>

using namespace std;
void PSJF(int data[100][4],int n)
{ //data[][] is input array
while( true ) //Bubble sort
{ int t=0;
for ( int i=0;i<n-1;++i )
{ if (data[i][2]>data[i+1][2] )//Arrival Time 前項>後項就交換
{ swap(data[i][3],data[i+1][3]);
swap(data[i][2],data[i+1][2]);
swap(data[i][1],data[i+1][1]);
swap(data[i][0],data[i+1][0]);
++t;
}
}
if ( t==0) break;//若無交換即退出
}
int tt=data[0][2];
int time=data[0][2];//目前時間
int c=0,j=0,m=0,a,b=1;
int ready[100][4];//ready array
int rdata[100][4];//running array

for (int i=0;i<n;i++)
{ tt+=data[i][1]; //last finish time
}

while (time<=tt)
{
while (m<n)
{ if (data[m][2]==time )//將ready process放入 ready array
{ ready[c][3]=data[m][3];
ready[c][2]=data[m][2];
ready[c][1]=data[m][1];
ready[c][0]=data[m][0];
c++;
m++;
}
}
if (c>1)//ready array 內有2個以上的process
{ for (a=0;a<c-1;a++)//比較剩餘Burst Time 較少的放到前面
{ for (int k=a+1;k<c;k++)
{ if (ready[a][1]>ready[k][1] && ready[a][2]==ready[k][2])
{ swap(ready[a][3],ready[k][3]);
swap(ready[a][2],ready[k][2]);
swap(ready[a][1],ready[k][1]);
swap(ready[a][0],ready[k][0]);
}
}
}
}
//將ready array的第一個內容放入running array
rdata[j][0]=ready[0][0]; //process id 放入
rdata[j][2]=ready[0][2]; //process start time 放入
rdata[j][3]=ready[0][3]; //process Priority放入
time=data[b][2]; //目前時間
b++;
rdata[j][1]=time-rdata[j][2];//已執行的Burst Time
ready[0][1]-=rdata[j][1];//剩餘Burst Time

if (rdata[j][0]!=ready[0][0])
{ ready[0][2]=time;//Arrival Time 改變
j++;
}
for (int i=0;i<c-1;i++) //完成schedule 的process 從ready array 移除.
{ if (ready[i][1]==0)
{ ready[i][3]=ready[i+1][3];
ready[i][2]=ready[i+1][2];
ready[i][1]=ready[i+1][1];
ready[i][0]=ready[i+1][0];
}
}
for (int i=0;i<4;i++) ready[c-1][i]=0;
if (ready[0][1]==0 && ready[1][1]==0) break; //ready array沒有process時離開迴圈



}
for (int i=0;i<j;i++)
{ for (int z=0;z<4;z++)
{ cout<<rdata[i][z]<<" ";
}
cout<<endl;
}
}
int main ()
{
int data[100][4],n,m,a=1;
char s;
while (a=1)
{
cout<<"CPU Scheduling:"<<endl;
cout<<"-----------------------------------------------"<<endl;
cout<<"(1)First-Come, First-Served(FCFS)"<<endl;
cout<<"(2)Non-Preemptive Shortest-Job-First(Non-Preemptive SJF)"<<endl;
cout<<"(3)Preemptive Shortest-Job-First(Preemptive SJF)"<<endl;
cout<<"(4)Non-Preemptive Priority"<<endl;
cout<<"(5)Preemptive Priority"<<endl;
cout<<"(6)Round-Robin(RR)"<<endl;
cout<<"-----------------------------------------------"<<endl;
cout<<"Select CPU Scheduling Method Number: ";
cin>>m;
cout<<"Input number of processes: ";
cin>>n;
int tq;
if(m==6)
{ cout<<"Time Quantum: ";
cin>>tq;//Time Quantum
}

for (int i=0;i<n;i++)
{ data[i][0]=i+1;//process id

cout<<"P"<<data[i][0]<<"'s Burst Time: ";
cin>>data[i][1]; //Burst Time
if (m!=6)
{ cout<<"P"<<data[i][0]<<"'s Arrival Time: ";
cin>>data[i][2]; //Arrival Time
}
else data[i][2]=0;
if (m==4||m==5 )
{ cout<<"P"<<data[i][0]<<"'s Priority: ";
cin>>data[i][3]; //Priority
}
else data[i][3]=0;
}

if(m==1) fcfs(data,n);
else if(m==2) NPSJF(data,n);
else if(m==3) PSJF(data,n);
else if(m==4) NPP(data,n);
else if(m==5) PP(data,n);
else if(m==6) RR(data,n,tq);
cout<<endl;
cout<<"Again Schedule? (y/n)";
cin>>s;
if (s=='Y' || s=='y') a=1;
if (s=='N' || s=='n') exit(0);
cout<<endl;
}

system("pause");
return 0;
}

目前Compiler後,完全沒有顯示出結果..
麻煩高手幫看一下是哪邊的問題...感激不盡!!
...全文
136 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
毋暝熊熊 2008-12-24
  • 打赏
  • 举报
回复
void PSJF(int data[100][4],int n)
{ //data[][] is input array
while( true ) //Bubble sort
{ int t=0;
for ( int i=0;i <n-1;++i )
{ if (data[i][2]>data[i+1][2] ) //Arrival Time 前项>后项就交换
{ swap(data[i][3],data[i+1][3]);
swap(data[i][2],data[i+1][2]);
swap(data[i][1],data[i+1][1]);
swap(data[i][0],data[i+1][0]);
++t;
}
if (data[i][2]==data[i+1][2] && data[i][1]>data[i+1][1])//Arrival Time 相同且Burst time 前项比后项大,就交换
{ swap(data[i][3],data[i+1][3]);
swap(data[i][2],data[i+1][2]);
swap(data[i][1],data[i+1][1]);
swap(data[i][0],data[i+1][0]);
++t;
}
}
if ( t==0) break; //若无交换即退出
}
int tt=data[0][2];
int time=data[0][2]; //目前时间
int c=0,j=0,m=0,a,b=1;
int ready[100][4]; //ready array
int rdata[100][4]; //running array

for (int i=0;i <n;i++)
{ tt+=data[i][1]; //last finish time
}

while (time <=tt)
{
while (m <n)
{ if (data[m][2]==time ) //将ready process放入 ready array
{ ready[c][3]=data[m][3];
ready[c][2]=data[m][2];
ready[c][1]=data[m][1];
ready[c][0]=data[m][0];
c++;
m++;
}
}
if (c>1) //ready array 内有2个以上的process
{ for (a=0;a <c-1;a++) //比较剩余Burst Time 较少的放到前面
{ for (int k=a+1;k <c;k++)
{ if (ready[a][1]>ready[k][1] && ready[a][2]==ready[k][2])
{ swap(ready[a][3],ready[k][3]);
swap(ready[a][2],ready[k][2]);
swap(ready[a][1],ready[k][1]);
swap(ready[a][0],ready[k][0]);
}
}
}
}
//将ready array的第一个内容放入running array
rdata[j][0]=ready[0][0]; //process id 放入
rdata[j][2]=ready[0][2]; //process start time 放入
rdata[j][3]=ready[0][3]; //process Priority放入
time=data[b][2]; //目前时间
b++;
rdata[j][1]=time-rdata[j][2]; //已执行的Burst Time
ready[0][1]-=rdata[j][1]; //剩余Burst Time

if (rdata[j][0]!=ready[0][0])
{ ready[0][2]=time; //ready array中process Arrival Time 改变
j++;
}
for (int i=0;i <c-1;i++) //完成schedule 的process 从ready array 移除.
{ if (ready[i][1]==0)
{ ready[i][3]=ready[i+1][3];
ready[i][2]=ready[i+1][2];
ready[i][1]=ready[i+1][1];
ready[i][0]=ready[i+1][0];
}
}
for (int i=0;i <4;i++) ready[c-1][i]=0;
if (ready[0][1]==0 && ready[1][1]==0) break; //ready array没有process时离开循环



}
for (int i=0;i <j;i++)
{ for (int z=0;z <4;z++)
{ cout<<rdata[i][z] < <" ";
}
cout<<endl;
}
}
思路:
1.先依Arrival Time排序process (By Bubble sort)
2.若Arrival Time相同则依Burst time小的放前面,若都相同则process id小的放前面
3.排好后,将目前时间设为第一个process的Arrival Time --(time)
4.计算最后的完成时间 --(tt)
5.开始模拟schedule
6.当目前时间为某个/些process的Arrival Time放入ready array
7.若ready array中有2个以上的process时,Burst time小的移到最前面
8.将ready array中第一个process放人running array-内容包括其process id /Arrival Time/Priority,Burst time另做处理.
9.将目前时间(time)增加为input array中的下一个process的Arrival Time
10.放入running array中process 的Burst time (处理过的)
11.调整ready array中该process的剩余Burst time,不为0就修改Arrival Time
12.若process剩余Burst time为0就从ready array 中移除,回到步骤6


毋暝熊熊 2008-12-24
  • 打赏
  • 举报
回复
如何把代码发得漂亮一点= =?
没有很常上论坛真的不知如何美化CODE = =a..囧rz


我帖子上的程序已经是PSJF而需要的内容
其它5个副程序不需要另外贴吧= =!
FCFS
Non-Preemptive SJF
Non-Preemptive Priority
Preemptive Priority
Round-Robin

我现在有问题的是PSJF的部分
要改应该只需改PSJF这个副程序的内容而已吧..!

目前是只需要rdata[][] 这个running array 的内容是正确的OK了..

麻烦高手指点一下..问题所在!!..
感激不尽!!

matrixdwy 2008-12-24
  • 打赏
  • 举报
回复
希望LZ能把代码发得漂亮点
xiaoyisnail 2008-12-24
  • 打赏
  • 举报
回复
代码没帖全吧
毋暝熊熊 2008-12-24
  • 打赏
  • 举报
回复
PS CODE中
cout<<XXX; '<<'中實際上是沒有空格的..只是帖子發出來就變成那樣= =
随着通信电子技术的迅速发展,信息技术给家居行业产生了深远的影响,家居环境的智能化监控已经成为智能家居的一个重要的发展方向。人们逐渐对自己的生活提一种更高的要求,他们需要一种智能化、可交互,并且融合现代创新科技的产品来改善他们的生活环境,使他们生活更加安全、舒适、便捷、智能。本文根据智能家居的发展背景和研究现状,并且从实用性和可行性角度发,研究设计了一种基于STM32单片机的智能家居系统。该系统由一个多功能综合的技术系统组成,各个多功能子系统间具有协同配合能力。基于STM32单片机实现的功能子系统包括:智能温度检测,智能湿度检测,智能烟雾/火灾检测智能检测,无线传输,人机交互机构,风扇调节,报警模块。 整个系统分为前端51单片机采集板和后端STM32单片机接收板。 采集板使用DHT11温湿度传感器、MQ烟雾传感器完成室内家居环境的采集。然后通过nRFL24L01将采集到的数据发送给后端。接收板使用LCD1602完成数据显示、使用蜂鸣器模块报警,使用风扇驱动模块调节室内家居环境。本文完成了智能家居控制系统前端、后端软硬件的设计,使用Altium designer绘制了电路原理图,使用Keil C完成了51单片机和STM32单片机的编程与调试。 最后,对本文设计的基于STM32的智能家居控制系统进行部署调试。试验结果表明,该系统可成功应用在智能家居环境检测调节和火灾安全防护的领域,可提高家居生活智能化水平。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧