时间片优先级进程调度算法

时间片轮转发加优先级的进程调度算法如下:

#include <stdio.h>


struct PCB
{
    int ID;
    int Alltime;
    int Cputime;
    int Priority;
    int starte;
};

int maxpriorityxiabiao(PCB pcb[],int n)
{
    int max = -10000;
    int a = 0;
    for(int i = 0; i < n; i++)
    {
            max = max > pcb[i].Priority?max : pcb[i].Priority;
            if(max == pcb[i].Priority)
            {
                a = i;
            }
    }
    return a;
}

void sort(PCB pcb[],int n)
{
    PCB p;
    for(int i = 0; i < n; i++)
    {
        for(int j = i + 1; j < n; j++)
        {
            if(pcb[i].Priority < pcb[j].Priority)
            {
                p = pcb[i];
                pcb[i] = pcb[j];
                pcb[j] = p;
            }
        }
    }
}

void priority(PCB pcb[],int n)
{
    int sum = 1;
    int *time = new int[n];
    float count = 0;
    while(sum!=0)
    {    
        sort(pcb,n);
        printf("当前就绪队列:");
        for(int i = 0; i < n; i++)
        {
            if(pcb[i].Alltime!=0)
            {
                printf("%d",pcb[i].ID);
            }
        }
        int id = maxpriorityxiabiao(pcb,n);
        printf("\n");
        printf("当前执行的程序ID:%d        ",pcb[id].ID);
        pcb[id].Alltime--;
        pcb[id].Cputime++;
        pcb[id].Priority = pcb[id].Priority-3;
        count++;
        printf("执行后Alltime:%d\n",pcb[id].Alltime);
        printf("执行后Cputime:%d            ",pcb[id].Cputime);
        printf("执行后Priority:%d\n",pcb[id].Priority);
        printf("\n");
        printf("\n");
        if(pcb[id].Alltime == 0)
        {
            pcb[id].Priority = -10000;
            time[pcb[id].ID] = (int)count;
        }
        sum = 0;
        for(int j = 0; j < n; j++)
        {
            sum+=pcb[j].Alltime;
        }
    }
    count = 0;
    for(int i = 0; i < n; i++)
    {
        printf("ID:%d运行时间是:%d\n",i,time[i]);
        
        count += time[i];
    }
    printf("进程平均周转时间是:%f\n",count/n);
}
void main()
{
    PCB pcb[5] = {{0,4,0,12,1},
                {1,2,0,16,1},
                {2,3,0,13,1},
                {3,6,0,17,1},
                {4,3,0,26,1}
                };
    priority(pcb,5);
}

 

### 回答1: 优先级时间片轮换进程调度算法实现,可以按照以下步骤进行: 1. 定义进程控制块(PCB)结构体,包含进程的基本信息,如进程ID、优先级、状态等。 2. 定义就绪队列,将所有就绪进程按照优先级从高到低排列,相同优先级的按照先来先服务的原则排列。 3. 定义时间片长度,当一个进程运行的时间达到时间片长度时,就将其挂起,放回就绪队列的末尾。 4. 定义调度函数,每次从就绪队列的头部取出一个进程运行,运行时间达到时间片长度时,将其挂起,放回就绪队列的末尾。 5. 当一个进程被阻塞或者完成时,将其从就绪队列中移除,并将其状态设置为阻塞或完成。 6. 当一个进程被唤醒时,将其加入就绪队列,并按照优先级从高到低排列。 7. 当一个进程的优先级发生变化时,将其从就绪队列中移除,并按照新的优先级重新插入就绪队列。 8. 当所有进程都完成时,结束调度。 以上就是优先级时间片轮换进程调度算法实现步骤。 ### 回答2: 优先级时间片轮换调度算法是一种多道程序的调度算法,它结合了时间片轮换调度算法优先级调度算法的优点,可以保证高优先级的进程优先得到调度,同时也能保证所有进程都有机会得到执行。 实现优先级时间片轮换调度算法的关键在于如何确定时间片的长度和进程的优先级。通常情况下,时间片的长度可以根据系统的负载情况和硬件资源来决定,一般为10ms至100ms之间。进程的优先级可以根据其重要性和响应时间等因素来决定,高优先级的进程应该先得到执行。 在实现时,首先需要建立一个进程队列,然后对每个进程赋予一个优先级时间片长度。接着,将进程按照优先级的高低排列成一个队列,并把时间片长度从大到小排列成一个数组。进程按照优先级从高到低依次进入执行队列,并根据时间片长度轮换执行。当进程的时间片用完后,会被暂停,并加入到等待队列,等待下一轮被调度。当系统空闲时,会优先执行高优先级的进程,以提高系统的处理效率。 需要注意的是,在实现时需要考虑到进程的优先级时间片长度的动态变化,一旦发生变化,需要重新排列进程队列和时间片数组。此外还要考虑到进程的阻塞和唤醒,如果某个进程被阻塞,需要从执行队列中移除,并加入到阻塞队列中等待唤醒;如果某个进程被唤醒,需要重新计算其优先级,并把它加入到执行队列中等待调度。 总之,优先级时间片轮换调度算法是一种高效的调度算法,可以满足多样化的进程调度需求,但需要注意算法实现的细节和灵活性,以提高系统的处理效率和稳定性。 ### 回答3: 优先级时间片轮换是一种比较常用的进程调度算法。在这种算法中,每个进程都被赋予不同的优先级,越高的优先级意味着进程需要更快地被执行。因此,优先级时间片轮换算法会优先执行优先级高的进程,如果进程的时间片用完了,它就会插队,然后抢占CPU继续执行。 该算法实现可以分为以下几步: 1. 设定每个进程的优先级。可以根据进程的重要性和执行时间等因素来确定优先级,一般来说,优先级分为高中低三个等级。 2. 设定每个进程的时间片大小。一般来说,高优先级进程的时间片要小于低优先级进程的时间片,以保证高优先级进程尽快地被执行。 3. 就绪队列中的进程按照优先级进行排序。每当一个进程被插入就绪队列中时,就需要根据它的优先级将它插入到相应的队列中。 4. 运行进程的时间片用完后,进程会自动退出并且将CPU资源还给操作系统,同时操作系统将会从优先级最高的队列中选择一个进程继续执行。 5. 如果有更高优先级的进程需要执行,操作系统会抢占正在执行的进程,将CPU资源分配给更高优先级的进程继续执行。 6. 如果进程在时间片内完成了任务,则可以主动让出CPU资源,让操作系统将CPU资源分配给其他待执行的进程。 总之,优先级时间片轮换算法实现的核心是按照优先级时间片大小的规则安排每个进程的执行顺序,保证高优先级进程先被执行,同时让每个进程都有机会分配到CPU资源。通过该算法,可以更好地管理CPU资源,提高系统的性能和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值