问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用C++编程实现两个调度算法(如SJF、时间片轮转法、优先权调度、、、)谢谢!

发布网友 发布时间:2022-04-13 02:44

我来回答

1个回答

热心网友 时间:2022-04-13 04:14

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

/*********************以下是全局数据结构和变量***********************/
/*PCB 结构*/
struct PCB{
int pname;
int pri;
int runtime;
int waittime;
struct PCB *next;
}pcb[7];

/* 运行指针*/
struct PCB *running;

/*高优先级就绪队列头指针*/
struct PCB *Hready;

/*低优先级队列头指针*/
struct PCB *Lready;

/*等待队列头指针*/
struct PCB *wait;

int sig=0;

/**************************以下是函数说明****************************/
/*利用循环实现延迟*/
void delay();

/*模拟进程3-9*/
void proc(struct PCB *running);

/*将node插入到head所指示的队列的尾部*/
void InsertIntoQueueTail(struct PCB ** head,struct PCB *node);

/*进程调度函数*/
int proc_switch();

/*进程等待函数*/
void proc_wait();

/*进程唤醒函数*/
int proc_wakeup();

/************************以下是函数定义及注释************************/
/*主函数*/
main()
{
int i;
/*初始化,创建进程3-9,置低优先级,等待时间为0,
依次插入低优先级队列*/
for(i = 0;i < 7;i++){
pcb[i].pname = i+3;
pcb[i].pri = 0;
pcb[i].waittime = 0;
InsertIntoQueueTail(&Lready,&pcb[i]);
}
/*等待队列和高优先级队列为空*/
wait = NULL;
Hready=NULL;

printf("\nThe process_switch begin:\n");
/*模拟进程调度开始*/
for(;;)
{
switch(sig){
case 0:/*无进程等待调度,打印信息并返回*/
if(!proc_switch())
{
printf("No Process to run,press any key to return:\n");
getchar();
}
break;
case 1:proc_wait();
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:proc(running);
break;
default:printf("\nerror!");
exit(-1);
}
}
}

/*功能:延迟一个时间片*/
/*入口参数:无*/
/*出口参数:无*/
void delay()
{
int i,j;
for(i=0;i<20000;i++)
for(j=0;j<10000;j++)
{
}
}

/*功能:进程3-9*/
/*入口参数:运行指针*/
/*出口参数:无*/
void proc(struct PCB * running)
{
int i;
srand( (unsigned)time( NULL ) );
/*显示当前运行的进程的id*/
printf("\nNow Process %d is running\n",running->pname);
/*当前进程执行running->runtime个时间片*/
for(i=running->runtime;i>0;i--){
/*显示剩余的时间片*/
printf("%d time slice(s) left\n",i);
/*延迟*/
delay();
proc_wakeup();
/*产生一个1到1000的随机数,若该随机数小余100,当前进程等待,*/
if((rand()%1000+1)<100){
printf("Process %d begins to wait.\n",running->pname);
sig=1;
return;
}
}
/*显示时间片耗尽,进程转为低优先级就绪状态*/
printf("Time slices for process %d exhausted.\n",running->pname);
InsertIntoQueueTail(&Hready,running);
sig=0;
return;

}
/*功能:将一个节点插入队列尾部*/
/*入口参数:队列头指针地址head,待插入结点node*/
/*出口参数:无*/
void InsertIntoQueueTail(struct PCB **head,struct PCB *node)
{
struct PCB *p;
node->next=NULL;
/*被插入队列为空*/
if(*head==NULL){
*head=node;
return;
}
/*被插入队列不为空*/
else{
p=*head;
/*找到队列的最后一个结点*/
while(p->next!=NULL) p=p->next;
p->next=node;
}
}

/*功能:进程调度*/
/*入口参数:无*/
/*出口参数:若调度成功,返回1,否则返回0*/

int proc_switch()
{
/*若高优先级就绪队列和低优先级就绪队列均为空,则循环执行进程唤醒*/
while(Hready == NULL && Lready == NULL)
if(!proc_wakeup()) return 0;

/*若高优先级就绪队列非空,则执行其第一个进程,分配2个时间片*/
if(Hready != NULL){
running = Hready;
Hready = Hready -> next;
running->runtime = 2;
}
/*若高优先级就绪队列为空,则执行低优先级就绪队列的第一个进程,
分配5个时间片*/
else{
running = Lready;
Lready=Lready -> next;
running -> runtime = 5;
}
/*别调度进程的id赋给sig*/
sig = running -> pname;
return 1;
}

/*功能:进程等待。将当前运行进程置高优先级,等待时间为20,
插入等待队列尾部*/
/*入口参数:无*/
/*出口参数:无*/
void proc_wait()
{
struct PCB *p;
running->pri=1;
running->waittime=20;
InsertIntoQueueTail(&wait,running);
sig=0;
return;
}

/*功能:进程唤醒*/
/*入口参数:无*/
/*出口参数:若等待队列为空,则返回0,否则返回1*/
int proc_wakeup()
{
struct PCB *p,*last,*MoveToReady;
p = wait;
/*等待队列为空,返回0*/
if(p == NULL) return 0;

/*延迟*/
delay();
/*等待队列中每个进程的等待时间减1*/
while(p != NULL){
p -> waittime -= 1;
p=p->next;
}
p=wait;
/*从等待队列中摘除等待时间为0的进程,插入到高优先级就绪队列的尾部*/
while(p!=NULL){
if(p -> waittime == 0){
MoveToReady = p;
if (p == wait)
wait = p->next;
else
last -> next = p->next;
p = p -> next;
InsertIntoQueueTail(&Hready,MoveToReady);
}
else{

p = p -> next;
}
}
sig =0;
return 1;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 交互设计的“根”——七大定律 交互设计原则和理论2——七大定律 七大设计原则 附近的加油站有哪些 附近的加油站有哪些地方 发票放到打印机自动打印怎么办 可以异地注销手机号吗? 求猫友送点猫扑MP 手机绑定的糖猫手表登录不了怎么回事 公猫发情咬同伴怎么办? 猫友,猫友快出现吧,今天找工作找的顺利吗?求求猫友不要不理我 男生割双眼皮行不 靠谱不 眼睛会变大么 男生割双眼皮的方法? 手机有哪些对养猫有用的软件 男的割双眼皮正常吗? pop猫友飙车群怎么进 为什么喵啵登录不了? 男生可以割双眼皮吗?我觉得自己眼睛小,想割双眼皮,又怕人笑话 高考生扎堆割双眼皮男生占20%? 猫咪身上掉毛怎么办? 高考生扎堆割双眼皮男生占20%,对此你有何看法? 男人割双眼皮好吗? 猫友这个平台上聊天能发小视频吗为什么在猫友上聊天小视频发不出去? 男生割双眼皮好不好?有什么方法割双眼皮好? 男生割双眼皮好不好 那个打印增值税发票的打印机有没有办法取消打印的啊 发票打印机一开机就会自动打印是怎么回事 发票打印机怎么一进纸就自己打印了? 打印机在发票上打出的字怎样消除 附近有修空调的吗 全民养龙这个新出项目怎么样? 手机养龙真的可以挣钱吗? 椰丝有什么好处 椰子壳泡水能当洗洁精洗碗吗? 利用众人帮推广养龙赚钱吗? 什么是椰棕丝 床蛰是有椰壳丝的好还是没有椰壳丝的好? 椰丝的营养价值有哪些 椰壳纤维算危险品么 热带雨林气候,10cm厚的椰壳丝放在水泥地上晾晒与放在输送带上晒,底部风机往上吹,哪个晒干速度快? 海南椰壳 酸甜爽口的鱼香茄子是用什么方法做的? 如何制定“家庭节约用水计划”,提出三项 如何制定“家庭节约用水计划”,提出三项措施,并分别说明这些措施的哲学依据 关于C语言中有参函数的调度问题