进程调度算法(时间片轮转法和静态非抢占优先级算法)

1.时间片轮转法

设计程序模拟进程的时间片轮转调度算法。假设有n个进程分别在T1, … ,Tn时刻到达系统,它们需要的服务时间分别为S1, … ,Sn。分别利用不同的时间片大小q,采用时间片轮转RR进程调度算法进行调度。 计算每个进程的完成时间、周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。

C语言程序如下:

#include <cstdio>
#include <cstring>
#include<string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>
using namespace std;
struct PCB {
    char id;
    char name;            //进程名字
    int arrive;            //到达时间
    int serve;            //服务时间
    int finish;            //完成时刻
    //排序优先参考到达时间,其次是服务时间 
    bool operator< (const PCB &t) const{
        if(arrive != t.arrive) return arrive < t.arrive;
        return serve < t.serve;
    };
};
const int N = 10;    //最多10个进程
const int M = 100;    //最长100个时间单位 
PCB pcb_list[N];    //进程列表
vector<PCB> table[M];    //进程时刻表
deque<PCB> que;        //进程队列
int n,t,q,sjp;    //进程数,总计时,固定时间片,运转时间片
int max_time;    //最大时间
void query() {    //查询当前是否有进程到达,有则入队
    //将当前时刻的所有进程入队
    for(int i = 0; i < table[t].size(); i++)
        que.push_front(table[t][i]);
}
void run() {
    //cout << "当前时刻\t" << "运行进程\t" << "剩余服务时间" << endl;
    PCB cur = pcb_list[0];    //初始化当前进程
    sjp = q;    //初始化时间片 
    for(t = 0; t <= max_time; t++) {    //跑时间
        //记录队列中队首的进程
        deque<PCB>::iterator it;
        it = que.begin();
        query();    //当前是否有进程到达,有则入队
        if(que.empty()) continue;    //如果队列空,跳过
        if(!sjp || !cur.serve) {    //时间片用完了 或 当前进程运行完了,则调度 
            sjp = q;    //恢复时间片
            que.erase(it);    //删除之前记录的进程(相当于把那个进程出队) 
            if(cur.serve) que.push_back(cur);    //如果当前进程没有运行完,则移到队尾
            else pcb_list[cur.id].finish = t;    //运行完了,设置完成时刻 
            if(!que.empty()) cur = que.front();    //取新的队首
            else continue;    //已经空了,跳过 
        }
        sjp--,cur.serve--;    //时间片-1,当前进程服务时间-1 
    }
}
void set_max_time() {
    for(int i = 0; i < n; i++) {
        max_time += pcb_list[i].serve;
    }
}
int main() {
    double sum_zzsj=0;
    double sum_dqzzsj=0; 
    printf("请输入进程数:");
    cin >> n ;    //输入进程数和时间片时长
    printf("请输入每个进程的进程名 到达时间 服务时间\n");
    for(int i = 0; i < n; i++)
        cin >&g
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值