操作系統-實驗2

#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~6):");
		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);
    	
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章