______________________________
进程调度模拟程序设计说明:
选择算法以后,进程由用户创建。
______________________________
*/
#include<stdio.h>
#include<stdlib.h>
#define Left 75
#define Right 77
typedef struct node{
int ID //进程ID
int PRIORITY //进程优先数
int CPUTIME //进程占用CPU的时间
int ALLTIME //进程所需要时间
char STATE //进程当前状态
struct node *next//指向下一个进程
}PRO
int CHIP //时间片数
int NUM //进程个数
int A=0 // 0代表先来先服务算法 1时间片轮转调度算法
PRO *p //进程队列队头
void choose(){//选择
char ch
while(1){
switch(A){
case 0:printf("→[先来先服务算法] [时间轮算法] [优先级服务算法]")break
case 1:printf(" [先来先服务算法]→[时间轮算法] [优先级服务算法]")break
case 2:printf(" [先来先服务算法] [时间轮算法]→[优先级服务算法]")break
}
ch=getch()
if(ch==Left) A--
if(ch==Right) A++
if(A<0) A=2
if(A>2) A=0
if(ch=='\r') break
system("cls")
}
}
int num(){//计算所有进程是否都调度完毕 返回为完成进程个数
int i=NUM
PRO *t1
t1=p
while(t1!=NULL){
if(t1->ALLTIME==0)
i--
t1=t1->next
}
return i
}
PRO *_sort(PRO *h){//链表排序子函数
PRO *p,*max
max=h
p=h
while(p->next!=NULL){//找max的节点
p=p->next
if(max->PRIORITY<p->PRIORITY)
max=p
}
p->next=h//形成环形链表
while(p->next!=max)//找出min节点前面的节点并让它指向NULL
p=p->next
p->next=NULL
h=max
return h
}
PRO *sort(PRO *h){//链表排序
int i=4
PRO *p
if(h==NULL)
return h
h=_sort(h)
p=h
while(p->next!=NULL){
p->next=_sort(p->next)
p=p->next
}
return h
}
int show(){//显示当前状态
PRO *t1
t1=p
printf("ID PRIORITY CPUTIME ALLTIME STATE\n")
while(t1!=NULL){
printf("P%-3d%-10d%-9d%-7d %c\n",t1->ID,t1->PRIORITY,t1->CPUTIME,t1->ALLTIME,t1->STATE)
t1=t1->next
}
printf("-------------------------------------\n\n")
}
void queue(){//先来先服务算法
int t
PRO *t1=p
printf("先来先服务算法,初始状态到每一个时间片用完状态:\n")
show()
while(t1!=NULL){
t=CHIP
while(t!=0&&t1!=NULL){
t--
t1->ALLTIME--
t1->CPUTIME++
t1->STATE='E'
if(t1->ALLTIME==0){//进程调度完毕
t1->STATE='F'
t1=t1->next
}
}
show()
}
}
void time(){//时间片轮转调度算法
int t,i
PRO *t1=p
printf("时间片轮转调度算法,初始状态到每一个时间片用完状态:\n")
show()
while(1){
t=CHIP
while(t!=0&&t1!=NULL&&t1->ALLTIME!=0){
t--
t1->ALLTIME--
t1->CPUTIME++
t1->STATE='E'
if(t1->ALLTIME==0){//进程调度完毕
t1->STATE='F'
t=CHIP//剩下时间段不要
}
}
show()
if(t1->STATE!='F')
t1->STATE='R'
if(t1!=NULL)
t1=t1->next
if(t1==NULL)
t1=p
i=num()
if(i==0)//i等于0,表示所有进程运行完毕
break
}
}
void priority(){//优先级算法
int t
PRO *t1
p=sort(p)
t1=p
printf("优先级算法,初始状态到每一个时间片用完状态:\n")
show()
while(t1!=NULL){
t=CHIP
while(t!=0&&t1!=NULL){
t--
t1->ALLTIME--
t1->CPUTIME++
t1->STATE='E'
if(t1->ALLTIME==0){//进程调度完毕
t1->STATE='F'
t1=t1->next
}
}
show()
}
}
create_process(){//创建进程
PRO *t1,*t2
int i=1
system("cls")
printf("请输入时间片数:")
scanf("%d",&CHIP)
printf("请输入想创建进程个数(大于1):")
scanf("%d",&NUM)
p=(PRO *)malloc(sizeof(PRO))
t1=p
t1->ID=i
t1->STATE='R'
t1->CPUTIME=0//开始创建时 占用cpu时间为0
printf("请输入进程P%d的优先级:",i)
scanf("%d",&t1->PRIORITY)
printf("请输入进程P%d的需要运行时间:",i)
scanf("%d",&t1->ALLTIME)
while(i++<NUM){
t2=(PRO *)malloc(sizeof(PRO))
t1->next=t2
t2->ID=i
t2->STATE='R'
t2->CPUTIME=0//开始创建时 占用cpu时间为0
printf("请输入进程P%d的优先级:",i)
scanf("%d",&t2->PRIORITY)
printf("请输入进程P%d的需要运行时间:",i)
scanf("%d",&t2->ALLTIME)
t1=t2
}
t1->next=NULL
}
int main(){
choose()//先选择算法
create_process()//再创建进程
system("cls")
if(A==0)
queue()
if(A==1)
time()
if(A==2)
priority()
return 0
}
这个是我以前写的,里面的算法比较多,不要的你可以删掉。
#include<stdlib.h>#define MAX 5//进程数量
#define RR 2//时间片大小
/*时间片轮转算法*/
struct pro
{
int num
int arriveTime
int burst
int rt //记录进程被运行的次数
struct pro *next
}
int TOTALTIME //记录所有进程的总时间
//函数声明
struct pro* creatList()
void insert(struct pro *head,struct pro *s)
struct pro* searchByAT(struct pro *head,int AT)
void del(struct pro* p)
int getCount(struct pro *head,int time)
struct pro* searchEnd(struct pro *head)
void move(struct pro *headF,struct pro *headT,int n)
struct pro* creatList()//创建链表,按照进程的到达时间排列,记录所有进程的信息
{
struct pro* head=(struct pro*)malloc(sizeof(struct pro))
head->next=NULL
struct pro* s
int i
TOTALTIME=0
for(i=0i<MAXi++)
{
s=(struct pro*)malloc(sizeof(struct pro))
printf("请输入进程名:\n")
scanf("%d",&(s->num))
printf("请输入到达时间:\n")
scanf("%d",&(s->arriveTime))
printf("请输入运行时间:\n")
scanf("%d",&(s->burst))
TOTALTIME+=s->burst //计算总时间
s->rt=1 //rt的初始值为1
s->next=NULL
insert(head,s)
}
return head //到达队列中的进程按照其到达时间的先后顺序排列
}
void insert(struct pro *head,struct pro *s)//插入节点
{
struct pro *p=searchByAT(head,s->arriveTime)
s->next=p->next
p->next=s
return
}
struct pro* searchByAT(struct pro *head,int AT)//查找第一个到达时间大于等于AT的节点,返回其前一个指针
{
struct pro *p,*q
p=head
q=head->next
while(q!=NULL&&q->arriveTime<=AT)
{
p=q
q=q->next
}
return p
}
void del(struct pro* p)//删除p的下一个节点
{
struct pro *tmp
tmp=p->next
p->next=tmp->next
free(tmp)
return
}
int getCount(struct pro *head,int time)//察看在time之前到达但未移动到运行队列的进程数量
{
int count=0
struct pro *s,*t
s=head
t=s->next
while(t!=NULL&&t->arriveTime<=time)
{
s=t
t=t->next
count++ //count记录当前时刻到达的进程数
}
return count
}
struct pro* searchEnd(struct pro *head)//查找并返回循坏队列的尾节点的前一个节点
{
struct pro *p,*q
p=head
q=head->next
while(q->next!=head)
{
p=q
q=q->next
}
return p
}
void move(struct pro *headF,struct pro *headT,int n)//将headF后的n个节点移动到循环队列headT中
{
struct pro *r,*s,*t
s=headF
t=s->next
r=t //r记录要移动的第一个节点
while(n>1)
{
t=t->next
n--
}
s->next=t->next //以上完成从原队列中摘除相关节点,r,t分别为第一个和最后一个节点
s=searchEnd(headT)
t->next=s->next
s->next=r
}
void run(struct pro *head)
{
int time=0 //记录当前时间
int newarrive//新到达进程数
struct pro *runhead=(struct pro*)malloc(sizeof(struct pro))
runhead->next=runhead //创建新的循环链表,存放当前就绪队列中的进程
struct pro *p,*q
p=runhead
q=p->next //q记录当前应当运行的进程
while(time<=TOTALTIME)
{
newarrive=getCount(head,time)
if(newarrive>0)
move(head,runhead,newarrive) //将head后的newarrive个节点移动到runhead队列中
if(runhead->next==runhead)//就绪队列中没有进程
time++
else if(q==runhead)
{
p=q
q=q->next
}
else
{
printf("进程名:%d\n",q->num)
printf("到达时间:%d\n",q->arriveTime)
if(q->rt==1)
printf("响应时间:%d\n",time-q->arriveTime)
else
printf("第%d次运行开始时间:%d\n",q->rt,time)
if(q->burst<=RR)
{
time+=q->burst
printf("第%d次运行结束时间:%d\n",q->rt,time)
printf("周转时间:%d\n",time-q->arriveTime)
printf("************************************\n")
struct pro *tmp=q
q=q->next
p->next=q
free(tmp)
}
else//q->burst>RR
{
time+=RR
printf("第%d次运行结束时间:%d\n",q->rt,time)
printf("************************************\n")
q->burst-=RR
q->rt++
p=q
q=q->next
}
}
}
}
void main()
{
struct pro *head=creatList()
printf("当前时间片大小为:%d\n",RR)
run(head)
}
#include<stdio.h>struct pcb
{
char name
int time
}
void main()
{
int n,i,j,flag=1
struct pcb a[100]
printf("输入程序个数:")
scanf("%d",&n)
getchar()/*接收回车*/
for(i=0i<ni++)
{
printf("输入程序的名字:如A B C...\n")
scanf("%c",&a[i].name)
getchar()/*接收回车*/
printf("输入占用的时间片:")
scanf("%d",&a[i].time)
getchar()/*接收回车*/
}
i=0
while(flag &&n>0)
{
if(a[i].time!=0)
{
printf("%c",a[i].name)
a[i].time--
}
for(j=0j<nj++)
if(a[j].time)
{
flag=1
break
}
else
flag=0
i=(++i)%n
}
}
调试通过...
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)