計算機操作系統實驗一 進程調度

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Max 100
typedef struct pcb
{
    char name[Max];  //進程名
    int priority;    //優先級
    int arrtime;     //到達時間
    int needtime;    //需要運行時間
    int usedtime;    //已用時間
    char state;      //進程狀態
}PCB;
PCB pcb[Max];
 
int n=1;
int pTime;
char SelectMenu();
void Input();
void Sort();
void Print();
void Attemper();
 
char SelectMenu()
{
    char select;
    printf("功能菜單:");
    printf("\n    1.增加並調度進程");
    printf("\n    2.打印進程");
    printf("\n    3.退出");
    printf("\n請輸入你的選擇(1--3):");
    do{
        select=getchar();
    }while(select!='1'&&select!='2'&&select!='3');
    return select;
}

void main()
{
    int choice;
    n=1;
    printf("                       \n");
    printf("\t\t歡迎使用進程調度模擬\n\n");  
    choice=SelectMenu();
    do{
        if(choice=='1')
        {
            printf("\n");
            printf("請設置時間片的大小:");
            scanf("%d",&pTime);
            Input();
            Print();
            Attemper();
        }
        if(choice=='2')
        {
            Print();
        }
        if(choice=='3')
        {
            return;
        }
        choice=SelectMenu();
    }while(1);
}

void Input()
{
	printf("輸入要創建進程的數目:\n");
	int m;
	scanf("%d",&m);
    do{
        printf("\n---請輸入第%d個進程進程---\n",n);
        printf("\n進程名:");
        scanf("%s",pcb[n].name);
        printf("進程優先級:");
        scanf("%d",&pcb[n].priority);
        printf("進程需要的時間:");
        scanf("%d",&pcb[n].needtime);
        pcb[n].arrtime=n;
        pcb[n].usedtime=0;
        pcb[n].state='W';
        n++;
    }while(n<=m);
}

void Sort()
{
    int i,j;
    PCB temp;
    for(i=0;i<n-1;i++)         //按照到達時間排序
    {
        for(j=n-2;j>=i;j--)
        {
            if(pcb[j+1].arrtime<pcb[j].arrtime)
            {
                temp=pcb[j];
                pcb[j]=pcb[j+1];
                pcb[j+1]=temp;
            }
        }
    }
     
    for(i=0;i<n-1;i++)      //按照優先級排序
    {
        for(j=n-2;j>=i;j--)
        {
            if(pcb[j+1].priority>pcb[j].priority)
            {
                temp=pcb[j];
                pcb[j]=pcb[j+1];
                pcb[j+1]=temp;
            }
        }
    }
    if(pcb[0].state!='F')
    {
        pcb[0].state='R';
    }
}

void Print()
{
    int i;
    Sort();
    printf("\n   進程名    優先級  到達時間  需要時間    已用時間   進程狀態 \n");
    for(i=0;i<n;i++)
    {
        printf("%8s%8d %8d %10d %10d %10c\n",pcb[i].name,pcb[i].priority,pcb[i].arrtime,pcb[i].needtime,pcb[i].usedtime,pcb[i].state);
    }
}

void Attemper()
{
    do{
        if((pcb[0].needtime-pcb[0].usedtime)>pTime)   //判斷進程剩餘的運行時間是否大於時間片
        {
            pcb[0].usedtime+=pTime;
            pcb[0].priority--;
            pcb[0].state='W';
        }
        else                       //已完成的進程
        {
            pcb[0].usedtime=pcb[0].needtime;
            pcb[0].priority=-1;
            pcb[0].state='F';
        }
        Print();
    }while(pcb[0].state!='F');
}

 

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