操作系统——进程调度 C语言版

先来先服务FCFS算法:进程先进入的先服务。
短作业优先SJF算法:根据当前到来的进程,筛选当前所有进程中所需运行时间最短的进程。
时间片轮转算法:根据时间片的大小,切换进程,直到每个进程都运行完成。
计算出每个进程的开始时间,结束时间,周转时间T=开始时间-到达时间,带权周转时间W = T/运行时间,平均周转时间,平均带权周转时间。

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct P
{
    char name;//进程名字
    int come;//进程到达时间
    int need;//进程所需运行时间
    int start;//进程开始运行时间
    int finish;//进程运行结束时间
    int flag;
    struct P *next;
} P;
P p[5];
int n = 5;
char str[100] = {0};
//先来先服务
void FCFS()
{
    int start[n];//开始时间
    int success[n];//完成时间
    int t[n];
    float w[n];
    float tsum =0,wsum = 0;
    start[0] = p[0].come;
    success[0]=p[0].need+p[0].come;
    for(int i = 1; i<n; i++)
    {
        success[i] = success[i-1]+p[i].need;
        start[i] = success[i-1];
    }
    printf("FCFS算法:\n");
    for(int i=0; i<n; i++)
    {
        t[i] = success[i]-p[i].come;
        tsum = t[i] + tsum;
        w[i] = (float)t[i]/p[i].need;
        wsum = wsum+w[i];
        printf("%c开始时间:%d  周转时间T:  %d  带权周转时间W:  %.2lf\n",p[i].name,start[i],t[i],w[i]);
    }
    printf("\n平均周转时间:%.2lf\n",(float)tsum/n);
    printf("\n平均带权周转时间:%.2lf\n",wsum/n);
}
void sort(int s,int k)//开始,结束
{
    P temp;
    for(int i = s; i<k-1; i++)
    {
        for(int j = i+1; j<k; j++)
        {
            if(p[i].need>p[j].need)
            {
                temp = p[i];
                p[i]= p[j];
                p[j] = temp;
            }
        }
    }
}
//短作业优先
void SJF()
{
    int start[n];//开始时间
    int success[n];
    int t[n];
    float w[n];
    int j;
    float tsum = 0,wsum = 0;
    /*
    for(int i = 0;i<n;i++)//初始化未激活状态0
    {
        p[i].flag = 0;
    }
    */
    start[0] = p[0].come;
    success[0]=p[0].need+p[0].come;
    for(int i = 1; i<n; i++)
    {
        for(j = i; j<n; j++)
        {
            if(p[j].come>success[i-1])
            {
                j=j+1;
                break;
            }

        }
        sort(i,j);//到达时间早于当前进程结束时间的激活,进行排序,取运行时间最小的进程
        success[i] = success[i-1]+p[i].need;
        start[i] = success[i-1];
    }
    /*
    for(j = 1;p[j].come<=success[0]&&j<n;j++)
    {

    }
    sort(1,j);
    success[1] = success[0]+p[1].need;
    */

    /*
    for(int i = 1;i<n;i++)
    {
        success[i] = success[i-1]+p[i].need;
        start[i] = success[i-1];
    }
    */
    printf("SJF算法:\n");
    for(int i=0; i<n; i++)
    {
        t[i] = success[i]-p[i].come;
        tsum = t[i] + tsum;
        w[i] = (float)t[i]/p[i].need;
        wsum = wsum+w[i];
        printf("%c 开始时间:%d  周转时间T:  %d  带权周转时间W:  %.2lf\n",p[i].name,start[i],t[i],w[i]);
    }
    printf("\n平均周转时间:%.2lf\n",(float)tsum/n);
    printf("\n平均带权周转时间:%.2lf\n",wsum/n);
}
void TT()
{
    int time = 0;
    int count[n];
    int q;
    int a = 1;//循环标志
    int c = 0;//记录数组长度
    int sum = 0;//数组总长
    int t[n];
    float w[n];
    float tsum = 0,wsum = 0;
    printf("请输入时间片\n");
    scanf(" %d",&q);
    for(int i = 0; i<n; i++)
    {
        p[i].flag = 1;
        count[i] = p[i].need;
        sum = sum + p[i].need;
    }
    while(a)
    {
        for(int i = 0; i<n; i++)
        {
            if(p[i].flag==1)
            {
                if(count[i]-q>0)//未完成
                {
                    for(int j = 0;j<q;j++)
                    {
                        //printf("%c ",p[i].name);
                        c++;
                        str[c] = p[i].name;
                    }
                    count[i] = count[i]-q;
                }else if(count[i]-q == 0)//完成
                {
                    for(int j = 0;j<q;j++)
                    {
                        //printf("%c ",p[i].name);
                        c++;
                        str[c] = p[i].name;
                    }
                    count[i] = count[i]-q;
                    p[i].flag = 0;
                }else if(count[i]-q < 0)//完成
                {
                    for(int j = 0;j<count[i];j++)
                    {
                        //printf("%c ",p[i].name);
                        c++;
                        str[c] = p[i].name;
                    }
                    count[i] = 0;
                    p[i].flag = 0;
                }
            }
        }

        if(c==sum)
            a = 0;
    }
    for(int i = 1;i<=c;i++)
    {
        printf("%c ",str[i]);
    }
    for(int i = c ;i>=1;i--)//查找完成时间
    {
        if(str[i]=='a')
        {
            p[0].finish = i;
            break;
        }
    }
    for(int i = c ;i>=1;i--)//查找完成时间
    {
        if(str[i]=='b')
        {
            p[1].finish = i;
            break;
        }
    }
    for(int i = c ;i>=1;i--)//查找完成时间
    {
        if(str[i]=='c')
        {
            p[2].finish = i;
            break;
        }
    }
    for(int i = c ;i>=1;i--)//查找完成时间
    {
        if(str[i]=='d')
        {
            p[3].finish = i;
            break;
        }
    }
    for(int i = c ;i>=1;i--)//查找完成时间
    {
        if(str[i]=='e')
        {
            p[4].finish = i;
            break;
        }
    }
    printf("时间片轮转算法:\n");
    //完成时间
    printf("完成时间\n");
    for(int i = 0;i<n;i++)
    {
        printf("%d ",p[i].finish);
    }
    printf("\n");
    for(int i=0; i<n; i++)
    {
        t[i] = p[i].finish-p[i].come;
        tsum = t[i] + tsum;
        w[i] = (float)t[i]/p[i].need;
        wsum = wsum+w[i];
        printf("%c 周转时间T:  %d  带权周转时间W:  %.2lf\n",p[i].name,t[i],w[i]);
    }
    printf("\n平均周转时间:%.2lf\n",(float)tsum/n);
    printf("\n平均带权周转时间:%.2lf\n",wsum/n);
}
void sortQuan(int *quan)//开始,结束
{
    P temp;
    for(int i = 1; i<n-1; i++)
    {
        for(int j = i+1; j<n; j++)
        {
            if(quan[j]>quan[i])
            {
                temp = p[i];
                p[i]= p[j];
                p[j] = temp;
            }
        }
    }
}
void SN()
{
    int success[n];
    int t[n];
    float w[n];
    int j;
    int quan[n];
    float tsum = 0,wsum = 0;
    success[0]=p[0].need+p[0].come;
    printf("请输入各权值\n");
    for(int i=0;i<n;i++)
    {
        scanf(" %d",&quan[i]);
    }
    sortQuan(quan);
    for(int i = 1; i<n; i++)
    {
        success[i] = success[i-1]+p[i].need;
    }
    printf("静态非抢占算法:\n");
    for(int i=0; i<n; i++)
    {
        t[i] = success[i]-p[i].come;
        tsum = t[i] + tsum;
        w[i] = (float)t[i]/p[i].need;
        wsum = wsum+w[i];
        printf("%c 周转时间T:  %d  带权周转时间W:  %.2lf\n",p[i].name,t[i],w[i]);
    }
    printf("\n平均周转时间:%.2lf\n",(float)tsum/n);
    printf("\n平均带权周转时间:%.2lf\n",wsum/n);
}
int main()
{
    int r,f = 1;
    printf("请输入5个进程的名字、到达时间 和 服务时间\n");
    for(int i = 0; i<n; i++)
    {
        scanf(" %c %d %d",&p[i].name,&p[i].come,&p[i].need);
    }
    printf("**************\n\n");
    printf("1.FCFS\n");
    printf("2.短作业优先SJF\n");
    printf("3.时间片轮转\n");
    printf("4.静态非抢占\n");
    printf("5.退出\n");
    printf("**************\n\n");

    while(f)
    {
        scanf(" %d",&r);
        switch(r)
        {
            case 1:
                FCFS();
                break;
            case 2:
                SJF();
                break;
            case 3:
                TT();
                break;
            case 4:
                SN();
                break;
            case 5:
                f = 0;

        }
    }

    return 0;
}

运行截图

FCFS算法运行截图
SJF算法运行截图
时间片轮转调度算法运行截图
静态非抢占调度算法运行截图

以下是一个简单的 C 语言实现,使用的是时间片轮转调度算法: ```c #include<stdio.h> #include<stdlib.h> #define N 5 // 进程数 #define TIME_QUANTUM 3 // 时间片长度 typedef struct PCB{ int pid; // 进程ID int arrive_time; // 到达时间 int execute_time; // 执行时间 int remain_time; // 剩余时间 int priority; // 优先级 }PCB; int queue[N]; // 进程队列 int front = -1, rear = -1; // 队头、队尾指针 PCB processes[N]; // 进程数组 // 进程入队 void enqueue(int pid){ if(rear == N-1) rear = -1; // 队尾指针回到队头 queue[++rear] = pid; if(front == -1) front = 0; } // 进程出队 int dequeue(){ int pid = queue[front++]; if(front == N) front = 0; // 队头指针回到队头 if(front == rear+1) front = rear = -1; // 队列为空 return pid; } // 时间片轮转调度 void RR(){ int time = 0; // 当前时间 int pid = -1; // 当前执行的进程 int round = 0; // 记录轮转次数 int i; // 初始化进程数组 for(i=0; i<N; i++){ printf("请输入第%d个进程的信息(进程ID 到达时间 执行时间 优先级):", i+1); scanf("%d %d %d %d", &processes[i].pid, &processes[i].arrive_time, &processes[i].execute_time, &processes[i].priority); processes[i].remain_time = processes[i].execute_time; } // 时间片轮转调度 while(1){ for(i=0; i<N; i++){ if(processes[i].arrive_time <= time && processes[i].remain_time > 0){ enqueue(i); // 将到达时间小于等于当前时间,且剩余时间大于0的进程入队 } } if(front == -1){ // 队列为空 printf("所有进程已经执行完毕!\n"); break; } pid = dequeue(); // 取出队首进程 if(processes[pid].remain_time <= TIME_QUANTUM){ // 进程执行完毕 time += processes[pid].remain_time; processes[pid].remain_time = 0; printf("进程%d执行完毕,用时%d秒\n", processes[pid].pid, time-processes[pid].arrive_time); } else{ // 进程未执行完毕,放回队尾 time += TIME_QUANTUM; processes[pid].remain_time -= TIME_QUANTUM; printf("进程%d运行%d秒后被放回队列\n", processes[pid].pid, TIME_QUANTUM); enqueue(pid); } round++; // 记录轮转次数 if(round % N == 0){ // 每轮转一次,打印一次队列中的进程 printf("当前时间:%d\n", time); printf("队列中的进程:"); for(i=front; i<=rear; i++){ printf("%d ", processes[queue[i]].pid); } printf("\n"); } } } int main(){ RR(); return 0; } ``` 以上代码为一个简单的时间片轮转调度的实现,可以根据实际需求进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子Link

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值