操作系统的进程调度实验

#include <stdio.h>    
#include <stdlib.h>    
    
struct node    
{    
    int pid;//进程id号     
    int prio;//进程优先级     
    int runtime;//进程运行的时间     
    int alltime;//进程还需运行的时间     
    char state;//进程的状态 运行r,就绪j,阻塞b。     
    struct node *next;    
};    
    
     
typedef struct node Node;    
typedef Node * Link;    
    
void init(Link *head);    
void create(Link head);    
void menu(Link head);    
void RR(Link head);    
void FCFS(Link head);     
Link gethighprio(Link head);    
void PRIORITY(Link head);    
void error();    
void quit();    
void save();    
int num = 0;//进程的id号     
     
 void create(Link head)    
{    
    Link p = head;    
    Link newnode;    
    //char ch;    
    newnode = (Link)malloc(sizeof(Node));       
        
    newnode->runtime = 0;    
    newnode->state = 'j';    
    newnode->pid = ++num;    
    newnode->prio = 2;    
    newnode->alltime = 2;    
    p = head;     
    while(p->next != NULL)    
    {    
        p = p->next;    
    }    
    newnode->next = p->next;    
    p->next = newnode;    
        
    newnode = (Link)malloc(sizeof(Node));       
        
    newnode->runtime = 0;    
    newnode->state = 'j';    
    newnode->pid = ++num;    
    newnode->prio = 3;    
    newnode->alltime = 3;    
    p = head;     
    while(p->next != NULL)    
    {    
        p = p->next;    
    }    
    newnode->next = p->next;    
    p->next = newnode;    
        
    newnode = (Link)malloc(sizeof(Node));       
        
    newnode->runtime = 0;    
    newnode->state = 'j';    
    newnode->pid = ++num;    
    newnode->prio = 4;    
    newnode->alltime = 4;    
    p = head;     
    while(p->next != NULL)    
    {    
        p = p->next;    
    }    
    newnode->next = p->next;    
    p->next = newnode;    
        
    newnode = (Link)malloc(sizeof(Node));       
        
    newnode->runtime = 0;    
    newnode->state = 'j';    
    newnode->pid = ++num;    
    newnode->prio = 5;    
    newnode->alltime = 5;    
    p = head;     
    while(p->next != NULL)    
    {    
        p = p->next;    
    }    
    newnode->next = p->next;    
    p->next = newnode;    
  //printf("请输入进程的优先级:");    
//  scanf("%d",&(newnode->prio));    
//  printf("请输入进程的总共需要运行的时间:") ;    
//  scanf("%d",&(newnode->alltime));     
//  getchar();    
//  printf("\n");    
    /*  
printf("是否要继续创建进程:");  
    scanf("%c",&ch);  
    if(ch == 'y')  
    {  
        create(head);  
    }  
    else if(ch == 'n')  
    {  
        menu(head);  
    }  
    else  
    {  
        printf("您的输入有误!\n");  
    }*/    
}     
    
    
/*尾插入的形式调度算法*/     
//void create(Link head)    
//{    
//  Link p = head;    
//  Link newnode;    
//  char ch;    
//  newnode = (Link)malloc(sizeof(Node));    
//      
//  printf("请输入进程的优先级:");    
//  scanf("%d",&(newnode->prio));    
//  printf("请输入进程的总共需要运行的时间:") ;    
//  scanf("%d",&(newnode->alltime));    
//      
//  newnode->runtime = 0;    
//  newnode->state = 'j';    
//  newnode->pid = ++num;    
//    
//  while(p->next != NULL)    
//  {    
//      p = p->next;    
//  }    
//  newnode->next = p->next;    
//  p->next = newnode;       
//  getchar();    
//  printf("\n");    
//  printf("是否要继续创建进程:");    
//    scanf("%c",&ch);    
//    if(ch == 'y')    
//    {    
//      create(head);    
//    }    
//    else if(ch == 'n')    
//    {    
//        menu(head);    
//    }    
//    else    
//    {    
//      printf("您的输入有误!\n");    
//    }    
//}     
//    
//void save()    
//{    
//        
//}    
    
/*先来先服务调度算法*/     
void FCFS(Link head)    
{    
    Link old;    
    Link p = head->next;    
    if(p == NULL)    
    {    
        printf("队列里面没有进程,返回啦!\n");    
        menu(head);    
    }    
    
    p->state = 'r';    
        
    while(p != NULL && ((p->alltime) > 0))    
    {    
        p->runtime++;    
        p->alltime--;    
        printf("运行进程id号: %d 优先级:%d  进程运行时间: %d  进程还需运行时间 %d  进程状态:%c\n",p->pid,p->prio,p->runtime,p->alltime,p->state);     
                
    }    
    old = p;    
    head->next = p->next;    
    p = p->next;    
    free(old);    
}    
    
/*查找获得链表中优先级最高的进程,返回指向该进程的指针*/     
Link gethighprio(Link head)     
{    
    Link p = head->next;    
    Link q = p->next;    
       
    while(q != NULL)    
    {    
        if(p->prio < q->prio)    
        {    
            p = q;      
        }    
        q=q->next;    
    }    
    return p;    
}    
    
/*动态优先级调度算法*/     
void PRIORITY(Link head)    
{    
    Link q = head;    
    Link front = head;    
    Link old;    
    if(q->next == NULL)    
    {    
        printf("队列里面没有进程,返回啦!\n");    
        menu(head);     
    }    
    q = gethighprio(head);    
    q->state = 'r';    
          
    if(q->alltime > 0)    
    {    
        q->runtime++;    
        q->alltime--;    
        q->prio = (q->prio) - 1;    
        printf("运行的进程pid:%d  优先级:%d   进程运行时间: %d  进程还需运行时间 %d  进程状态:%c\n",q->pid,q->prio,q->runtime,q->alltime,q->state);    
        if(q->alltime == 0)    
        {    
            old = q;    
            if(q->next != NULL)    
            {    
                while(front->next != q)    
                {    
                    front = front->next;    
                }    
                front->next = q->next;    
                q = NULL;    
                free(old);    
            }    
            else              /*一开始程序问题出在这里,删除结点末尾没有=NULL,以后要注意*/    
            {    
                while(front->next != q)    
                {    
                    front = front->next;    
                }    
                front->next = NULL;    
                q = NULL;    
                free(old);          
            }       
        }    
        PRIORITY(head);    
    }    
}    
    
/*时间片轮转调度算法*/     
void RR(Link head)    
{    
    Link p = head->next;    
    Link front = head;    
    Link old;    
        
    if(p == NULL)    
    {    
        printf("队列里面没有进程,返回啦!\n");    
        menu(head);     
    }    
    while(head->next != NULL)    
    {    
        front = head;    
        p->runtime++;    
        p->alltime--;    
        p->state = 'r';    
            
        printf("运行的进程pid:%d  优先级:%d   进程运行时间: %d  进程还需运行时间 %d  进程状态:%c\n",p->pid,p->prio,p->runtime,p->alltime,p->state);    
            
        if(p->alltime <= 0)    
        {    
            old = p;    
            if(p->next != NULL)    
            {    
                while(front->next != p)    
                {    
                    front = front->next;    
                }    
                front->next = p->next;    
                p = p->next;    
                free(old);     
            }    
            else{    
                while(front->next != p)    
                {    
                    front = front->next;    
                }    
                front->next = NULL;    
                p = NULL;    
                free(old);    
                old = NULL;    
            }    
        }    
            
        if((p != NULL) && (p->next != NULL))    
        {    
            p = p->next;    
        }    
        else{    
            p = head->next;    
        }    
            
            
    }    
        
}    
    
/*输入有误*/    
void error()    
{    
    printf("您的输入有误,退出啦!\n");    
    exit(1);     
}    
    
/*退出*/    
void quit()    
{    
    printf("Thank you for your using!\n");    
    printf("        再见!             \n");    
    exit(1);    
}    
    
void menu(Link head)    
{    
    int choice;    
    while(1)    
    {    
        printf("\n");    
        printf("********************************************\n");    
        printf("***************进程调度*********************\n");    
        printf("*    1.创建进程       2.先来先服务算法     *\n");    
        printf("*    3.时间片轮转算法 4.优先级调度算法     *\n");    
        printf("*    5.退出                                *\n");    
        
        printf("请输入您的选项(1~5):");    
        scanf("%d",&choice);    
            
        switch(choice)    
        {    
            case 1:{    
                create(head);    
                break;    
            }    
                
            case 2:{    
                FCFS(head);    
                break;    
            }    
                
            case 3:{    
                RR(head);    
                break;    
            }    
            case 4:{    
                PRIORITY(head);    
                break;    
            }    
            case 5:{    
                quit();    
                exit(1);    
            }    
                
            default:{    
                error();    
                break;    
            }    
        }    
            
    }    
         
}    
    
void init(Link *head)    
{    
    *head = (Link)malloc(sizeof(Node));    
    (*head)->next = NULL;    
}    
    
int main()    
{    
    Link head;    
    //Link newnode;    
        
    
        
    init(&head);    
        
    menu(head);    
            
}    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值