網(wǎng)絡(luò)答案,經(jīng)過(guò)驗(yàn)證:
成都創(chuàng)新互聯(lián)是工信部頒發(fā)資質(zhì)IDC服務(wù)器商,為用戶(hù)提供優(yōu)質(zhì)的鄭州服務(wù)器托管服務(wù)
#include "stdio.h"
#include stdlib.h
#include conio.h
#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0
struct pcb { /* 定義進(jìn)程控制塊PCB */
char name[10];
char state;
int super;
int ntime;
int rtime;
struct pcb* link;
}*ready=NULL,*p;
typedef struct pcb PCB;
void sort() /* 建立對(duì)進(jìn)程進(jìn)行優(yōu)先級(jí)排列函數(shù)*/
{
PCB *first, *second;
int insert=0;
if((ready==NULL)||((p-super)(ready-super))) /*優(yōu)先級(jí)最大者,插入隊(duì)首*/
{
p-link=ready;
ready=p;
}
else /* 進(jìn)程比較優(yōu)先級(jí),插入適當(dāng)?shù)奈恢弥?/
{
first=ready;
second=first-link;
while(second!=NULL)
{
if((p-super)(second-super)) /*若插入進(jìn)程比當(dāng)前進(jìn)程優(yōu)先數(shù)大,*/
{ /*插入到當(dāng)前進(jìn)程前面*/
p-link=second;
first-link=p;
second=NULL;
insert=1;
}
else /* 插入進(jìn)程優(yōu)先數(shù)最低,則插入到隊(duì)尾*/
{
first=first-link;
second=second-link;
}
}
if(insert==0) first-link=p;
}
}
void input() /* 建立進(jìn)程控制塊函數(shù)*/
{
int i,num;
system("cls"); /*清屏*/
printf("\n 請(qǐng)輸入進(jìn)程數(shù): ");
scanf("%d",num);
for(i=1;i=num;i++)
{
printf("\n 進(jìn)程號(hào)No.%d:\n",i);
p=getpch(PCB);
printf("\n 輸入進(jìn)程名:");
scanf("%s",p-name);
printf("\n 輸入進(jìn)程優(yōu)先數(shù):");
scanf("%d",p-super);
printf("\n 輸入進(jìn)程運(yùn)行時(shí)間:");
scanf("%d",p-ntime);
printf("\n");
p-rtime=0;p-state='W';
p-link=NULL;
sort(); /* 調(diào)用sort函數(shù)*/
}
}
int space()
{
int l=0;
PCB* pr=ready;
while(pr!=NULL)
{
l++;
pr=pr-link;
}
return(l);
}
void disp(PCB * pr) /*建立進(jìn)程顯示函數(shù),用于顯示當(dāng)前進(jìn)程*/
{
printf("\n 進(jìn)程名\t 狀態(tài)\t 優(yōu)先數(shù)\t 需要運(yùn)行時(shí)間\t 已經(jīng)運(yùn)行時(shí)間\n");
printf("|%s\t",pr-name);
printf("|%c\t",pr-state);
printf("|%d\t",pr-super);
printf("|%d\t\t",pr-ntime);
printf("|%d\t",pr-rtime);
printf("\n");
}
void check() /* 建立進(jìn)程查看函數(shù) */
{
PCB* pr;
printf("\n **** 當(dāng)前正在運(yùn)行的進(jìn)程是:\n"); /*顯示當(dāng)前運(yùn)行進(jìn)程*/
disp(p);
pr=ready;
printf("\n **** 當(dāng)前就緒隊(duì)列狀態(tài)為:\n"); /*顯示就緒隊(duì)列狀態(tài)*/
while(pr!=NULL)
{
disp(pr);
pr=pr-link;
}
}
void destroy() /*建立進(jìn)程撤消函數(shù)(進(jìn)程運(yùn)行結(jié)束,撤消進(jìn)程)*/
{
printf("\n 進(jìn)程 [%s] 已完成.\n",p-name);
free(p);
}
void running() /* 建立進(jìn)程就緒函數(shù)(進(jìn)程運(yùn)行時(shí)間到,置就緒狀態(tài)*/
{
(p-rtime)++;
if(p-rtime==p-ntime)
destroy(); /* 調(diào)用destroy函數(shù)*/
else
{
(p-super)--;
p-state='W';
sort(); /*調(diào)用sort函數(shù)*/
}
}
void main() /*主函數(shù)*/
{
int len,h=0;
char ch;
input();
len=space();
while((len!=0)(ready!=NULL))
{
ch=getchar()();
h++;
printf("-----------------------------------------------------");
printf("\n 現(xiàn)在是第%d次運(yùn)行: \n",h);
p=ready;
ready=p-link;
p-link=NULL;
p-state='R';
check();
running();
printf("\n 按任意鍵繼續(xù)......\n");
}
printf("\n\n 進(jìn)程已經(jīng)完成.\n");
}
調(diào)用函數(shù)就是計(jì)算機(jī)編譯或運(yùn)行時(shí),使用某個(gè)函數(shù)來(lái)完成相關(guān)命令。對(duì)無(wú)參函數(shù)調(diào)用時(shí)則無(wú)實(shí)際參數(shù)表。實(shí)際參數(shù)表中的參數(shù)可以是常數(shù)、變量或其它構(gòu)造類(lèi)型數(shù)據(jù)及表達(dá)式。各實(shí)參之間用逗號(hào)分隔。
這兩個(gè)定義是相對(duì)的,比如說(shuō)你自己定義編寫(xiě)了一個(gè)函數(shù),然后在后面的編寫(xiě)語(yǔ)句中要用到你之前編寫(xiě)的函數(shù),你引用了,那個(gè)函數(shù)就是被調(diào)用函數(shù),你正在寫(xiě)的那個(gè)主函數(shù)就是調(diào)用函數(shù)。
給,已經(jīng)編譯運(yùn)行通過(guò)了,簡(jiǎn)單寫(xiě)的:
#includestdio.h
#includetime.h
#includestdlib.h
/*********************以下是全局?jǐn)?shù)據(jù)結(jié)構(gòu)和變量***********************/
/*PCB 結(jié)構(gòu)*/
struct PCB{
int pname;
int pri;
int runtime;
int waittime;
struct PCB *next;
}pcb[7];
/* 運(yùn)行指針*/
struct PCB *running;
/*高優(yōu)先級(jí)就緒隊(duì)列頭指針*/
struct PCB *Hready;
/*低優(yōu)先級(jí)隊(duì)列頭指針*/
struct PCB *Lready;
/*等待隊(duì)列頭指針*/
struct PCB *wait;
int sig=0;
/**************************以下是函數(shù)說(shuō)明****************************/
/*利用循環(huán)實(shí)現(xiàn)延遲*/
void delay();
/*模擬進(jìn)程3-9*/
void proc(struct PCB *running);
/*將node插入到head所指示的隊(duì)列的尾部*/
void InsertIntoQueueTail(struct PCB ** head,struct PCB *node);
/*進(jìn)程調(diào)度函數(shù)*/
int proc_switch();
/*進(jìn)程等待函數(shù)*/
void proc_wait();
/*進(jìn)程喚醒函數(shù)*/
int proc_wakeup();
/************************以下是函數(shù)定義及注釋************************/
/*主函數(shù)*/
main()
{
int i;
/*初始化,創(chuàng)建進(jìn)程3-9,置低優(yōu)先級(jí),等待時(shí)間為0,
依次插入低優(yōu)先級(jí)隊(duì)列*/
for(i = 0;i 7;i++){
pcb[i].pname = i+3;
pcb[i].pri = 0;
pcb[i].waittime = 0;
InsertIntoQueueTail(Lready,pcb[i]);
}
/*等待隊(duì)列和高優(yōu)先級(jí)隊(duì)列為空*/
wait = NULL;
Hready=NULL;
printf("\nThe process_switch begin:\n");
/*模擬進(jìn)程調(diào)度開(kāi)始*/
for(;;)
{
switch(sig){
case 0:/*無(wú)進(jìn)程等待調(diào)度,打印信息并返回*/
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);
}
}
}
/*功能:延遲一個(gè)時(shí)間片*/
/*入口參數(shù):無(wú)*/
/*出口參數(shù):無(wú)*/
void delay()
{
int i,j;
for(i=0;i20000;i++)
for(j=0;j10000;j++)
{
}
}
/*功能:進(jìn)程3-9*/
/*入口參數(shù):運(yùn)行指針*/
/*出口參數(shù):無(wú)*/
void proc(struct PCB * running)
{
int i;
srand( (unsigned)time( NULL ) );
/*顯示當(dāng)前運(yùn)行的進(jìn)程的id*/
printf("\nNow Process %d is running\n",running-pname);
/*當(dāng)前進(jìn)程執(zhí)行running-runtime個(gè)時(shí)間片*/
for(i=running-runtime;i0;i--){
/*顯示剩余的時(shí)間片*/
printf("%d time slice(s) left\n",i);
/*延遲*/
delay();
proc_wakeup();
/*產(chǎn)生一個(gè)1到1000的隨機(jī)數(shù),若該隨機(jī)數(shù)小余100,當(dāng)前進(jìn)程等待,*/
if((rand()%1000+1)100){
printf("Process %d begins to wait.\n",running-pname);
sig=1;
return;
}
}
/*顯示時(shí)間片耗盡,進(jìn)程轉(zhuǎn)為低優(yōu)先級(jí)就緒狀態(tài)*/
printf("Time slices for process %d exhausted.\n",running-pname);
InsertIntoQueueTail(Hready,running);
sig=0;
return;
}
/*功能:將一個(gè)節(jié)點(diǎn)插入隊(duì)列尾部*/
/*入口參數(shù):隊(duì)列頭指針地址head,待插入結(jié)點(diǎn)node*/
/*出口參數(shù):無(wú)*/
void InsertIntoQueueTail(struct PCB **head,struct PCB *node)
{
struct PCB *p;
node-next=NULL;
/*被插入隊(duì)列為空*/
if(*head==NULL){
*head=node;
return;
}
/*被插入隊(duì)列不為空*/
else{
p=*head;
/*找到隊(duì)列的最后一個(gè)結(jié)點(diǎn)*/
while(p-next!=NULL) p=p-next;
p-next=node;
}
}
/*功能:進(jìn)程調(diào)度*/
/*入口參數(shù):無(wú)*/
/*出口參數(shù):若調(diào)度成功,返回1,否則返回0*/
int proc_switch()
{
/*若高優(yōu)先級(jí)就緒隊(duì)列和低優(yōu)先級(jí)就緒隊(duì)列均為空,則循環(huán)執(zhí)行進(jìn)程喚醒*/
while(Hready == NULL Lready == NULL)
if(!proc_wakeup()) return 0;
/*若高優(yōu)先級(jí)就緒隊(duì)列非空,則執(zhí)行其第一個(gè)進(jìn)程,分配2個(gè)時(shí)間片*/
if(Hready != NULL){
running = Hready;
Hready = Hready - next;
running-runtime = 2;
}
/*若高優(yōu)先級(jí)就緒隊(duì)列為空,則執(zhí)行低優(yōu)先級(jí)就緒隊(duì)列的第一個(gè)進(jìn)程,
分配5個(gè)時(shí)間片*/
else{
running = Lready;
Lready=Lready - next;
running - runtime = 5;
}
/*別調(diào)度進(jìn)程的id賦給sig*/
sig = running - pname;
return 1;
}
/*功能:進(jìn)程等待。將當(dāng)前運(yùn)行進(jìn)程置高優(yōu)先級(jí),等待時(shí)間為20,
插入等待隊(duì)列尾部*/
/*入口參數(shù):無(wú)*/
/*出口參數(shù):無(wú)*/
void proc_wait()
{
struct PCB *p;
running-pri=1;
running-waittime=20;
InsertIntoQueueTail(wait,running);
sig=0;
return;
}
/*功能:進(jìn)程喚醒*/
/*入口參數(shù):無(wú)*/
/*出口參數(shù):若等待隊(duì)列為空,則返回0,否則返回1*/
int proc_wakeup()
{
struct PCB *p,*last,*MoveToReady;
p = wait;
/*等待隊(duì)列為空,返回0*/
if(p == NULL) return 0;
/*延遲*/
delay();
/*等待隊(duì)列中每個(gè)進(jìn)程的等待時(shí)間減1*/
while(p != NULL){
p - waittime -= 1;
p=p-next;
}
p=wait;
/*從等待隊(duì)列中摘除等待時(shí)間為0的進(jìn)程,插入到高優(yōu)先級(jí)就緒隊(duì)列的尾部*/
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;
}