#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);
}
操作系統-實驗2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.