问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

动态高优先权优先调度算法

发布网友 发布时间:2022-05-06 18:39

我来回答

2个回答

热心网友 时间:2023-10-15 11:12

动态高优先权优先调度算法:

动态优先权是指,在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。例如,我们可以规定,在就绪队列中的进程,随其等待时间的增长,其优先权以速率a提高。若所有的进程都具有相同的优先权初值,则显然是最先进入就绪队列的进程,将因其动态优先权变得最高而优先获得处理机,此即FCFS算法。若所有的就绪进程具有各不相同的优先权初值,那么,对于优先权初值低的进程,在等待了足够的时间后,其优先权便可能升为最高,从而可以获得处理机。当采用抢占式优先权调度算法时,如果再规定当前进程的优先权以速率b下降,则可防止一个长作业长期地垄断处理机。

算法代码模拟实现:

#include<stdio.h>
#include<stdlib.h>
#define N 6

// 待插入就绪队列的进程数据
int id[N]    = { 0,  1,
 2,  3,  4,
 5 };
int priority[N] = { 9, 38, 17,
 2,  7, 18 };
int cpuTime[N]  = { 0,
 0,  0,  0,
 0,  0 };
int allTime[N]  = { 3,
 2,  3,  6,
 1,  3 };

//********************************
//
//  模拟进程/PCB数据结构
//
//********************************

//
枚举进程的状态:就绪、执行、阻塞、完成
enum STATE { Ready, Run, Block, Finish
};

// 建立PCB结构体
struct PCB {
  int id;           // 标志数
  int priority;        // 优先数
  int cpuTime;         //
已占CPU时间
  int allTime;         //
还需占CPU时间
  int blockTime;        // 已被阻塞的时间
  STATE state;         //
进程状态
  PCB *pre;          //
PCB的前指针
  PCB *nxt;          //
PCB的后指针
};

//********************************
//
//  模拟进程队列
//
//********************************

// 进程入列
void queQush(PCB *process, PCB
*queHead)
{
  process->pre = NULL;
  process->nxt =
queHead->nxt;
  if(queHead->nxt != NULL) {
    // 非第一个入列
    queHead->nxt->pre =
process;
  }
  queHead->nxt = process;
}

// 进程出列
void quePop(PCB *process, PCB
*queHead)
{
  if(process->pre != NULL) {
    // 不是头节点
    process->pre->nxt =
process->nxt;
  }
else {
    queHead->nxt =
process->nxt;
  }
  if(process->nxt != NULL) {
    // 不是尾节点
    process->nxt->pre =
process->pre;
  }
  //
清空进程指针
  process->pre = process->nxt =
NULL;
}

// 查看队列里进程的信息
void queWalk(PCB *queHead)
{
  PCB *pro = queHead->nxt;
  if(pro == NULL) {
    printf("(无进程)\n");
    return;
  }
  while(pro != NULL) 
  {
    printf("id:%d,
 pri:%d,  alltime:%d\n",
pro->id, 
      pro->priority,
pro->allTime);
    pro =
pro->nxt;
  }
}

//********************************
//
//  模拟就绪队列
//
//********************************

int readyQueNum;         // 就绪队列的进程数量
PCB readyQueHead;        //
就绪队列的头部
PCB *readyMaxProcess;      // 就绪队列中优先级最高的进程

// 进程插入到就绪队列
void readyQueQush(PCB
*process)
{
  readyQueNum ++;
  process->state = Ready;
  queQush(process, &readyQueHead);
}

// 优先级最高的进程出列
PCB* readyQuePop()
{
  readyQueNum --;
  quePop(readyMaxProcess,
&readyQueHead);
  return readyMaxProcess;
}

// 每个时间片,更新就绪队列里进程的信息
void readyQueUpdate()
{
  int maxPriority = -1;
  PCB *pro = readyQueHead.nxt;
  if(pro == NULL){
    // 就绪队列没有进程
    readyMaxProcess =
NULL;
    return;
  }
  while(pro != NULL) 
  {
    pro->priority
++;
    if(pro->priority > maxPriority)
{
      maxPriority =
pro->priority;
      readyMaxProcess = pro;
    }
    pro =
pro->nxt;
  }
}

// 返回就绪队列最高优先级的值
int readyMaxPriority()
{
  return readyMaxProcess->priority;
}

// 查看就绪队列里进程的信息
void readyQueWalk()
{
  printf("就绪队列里的进程信息为:\n");
  queWalk(&readyQueHead);
}

//********************************
//
//  模拟阻塞队列
//
//********************************

#define EndBlockTime 3
     // 进程最长被阻塞时间

int blockQueNum;         // 阻塞队列的进程数量
PCB blockQueHead;        //
阻塞队列的头部
PCB *blockMaxProcess;      // 阻塞队列中优先级最高的进程

// 进程插入到阻塞队列
void blockQueQush(PCB
*process)
{
  blockQueNum ++;
  process->blockTime = 0;
  process->state = Block;
  queQush(process, &blockQueHead);
}

// 优先级最高的进程出列
PCB* blockQuePop()
{
  blockQueNum --;
  quePop(blockMaxProcess,
&blockQueHead);
  return blockMaxProcess;
}

// 每个时间片,更新阻塞队列里进程的信息
void blockQueUpdate()
{
  int maxPriority = -1;
  PCB *pro = blockQueHead.nxt;
  while(pro != NULL) 
  {
    pro->blockTime
++;
    if(pro->blockTime >= EndBlockTime)
{
      PCB *process = pro;
      pro = pro->nxt;
      // 阻塞时间到,调入就绪队列
      blockQueNum --;
      quePop(process,
&blockQueHead);
      readyQueQush(process);
    } else
if(pro->priority > maxPriority)
{
      // 更新阻塞队列里优先级最高的进程指针
      maxPriority =
pro->priority;
      blockMaxProcess = pro;
      pro = pro->nxt;
    }
  }
}

// 查看阻塞队列里进程的信息
void blockQueWalk()
{
  printf("阻塞队列里的进程信息为:\n");
  queWalk(&blockQueHead);
}

//********************************
//
//  模拟动态优先权的进程调度
//
//********************************

// 初始化数据
void initData()
{
  //
初始化就绪队列和阻塞队列
  readyQueNum = blockQueNum = 0;
  readyMaxProcess = blockMaxProcess = NULL;
  readyQueHead.pre = readyQueHead.nxt = NULL;
  blockQueHead.pre = blockQueHead.nxt = NULL;

  //
初始化进程进入就绪队列
  int i, maxPriority = -1;
  for(i = 0; i < N; i
++) 
  {
    // 分配一个PCB的内存空间
    PCB *pro = (PCB
*)malloc(sizeof(PCB));
    // 给当前的PCB赋值
    pro->id
    = id[i];
    pro->priority
 = priority[i];
    pro->cpuTime
 = cpuTime[i];
    pro->allTime
 = allTime[i];
    pro->blockTime
= 0;
    if(pro->allTime > 0) {
      // 插入到就绪队列中
      readyQueQush(pro);
      // 更新就绪队列优先级最高的进程指针
      if(pro->priority >
maxPriority) {
        maxPriority = pro->priority;
        readyMaxProcess = pro;
      }
    }
  }
}

// 模拟cpu执行1个时间片的操作
void cpuWord(PCB
*cpuProcess)
{
  cpuProcess->priority -= 3;
  if(cpuProcess->priority < 0)
{
    cpuProcess->priority = 0;
  }
  cpuProcess->cpuTime ++;
  cpuProcess->allTime --;
  //
显示正执行进程的信息:
  printf("CPU正执行的进程信息为:\n");
  printf("id:M,  pri:M,
 alltime:M\n",
cpuProcess->id, 
    cpuProcess->priority,
cpuProcess->allTime);
}

int main()
{
  int timeSlice  = 0;     //
模拟时间片
  int cpuBusy   = 0;
    // 模拟cpu状态
  PCB *cpuProcess = NULL;    // 当前在cpu执行的进程
  //
初始化数据
  initData(); 
  //
模拟进程调度
  while(1)
  {
    if(readyQueNum == 0
&& blockQueNum == 0
&& cpuBusy == 0) {
      // 就绪队列、阻塞队列和cpu无进程,退出
      break;
    }
    //printf("\n%d %d",
readyQueNum, blockQueNum);
    if(cpuBusy == 0)
{
      // cpu空闲,选择一个进程进入cpu
      if(readyQueNum > 0)
{
        //
选择绪队列优先级最高的进程
        cpuProcess
= readyQuePop();
      } else {
        //
就绪队列没有进程,改为选择阻塞队列优先级最高的进程
        cpuProcess
= blockQuePop();
      }
      cpuProcess->cpuTime =
0;
      cpuProcess->state =
Run;
      cpuBusy = 1;
    }
    timeSlice ++;
    printf("\n第%d个时间片后:\n",
timeSlice);
    //
模拟cpu执行1个时间片的操作
    cpuWord(cpuProcess);
    if(cpuProcess->allTime == 0) {
      cpuProcess->state =
Finish;
      // 释放已完成进程的PCB
      free(cpuProcess);
      cpuBusy = 0;
    }
    //
更新就绪队列和阻塞队列里的进程信息
    blockQueUpdate();
    readyQueUpdate();
    //
查看就绪队列和阻塞队列的进程信息
    readyQueWalk();
    blockQueWalk();
    if(cpuBusy == 1
&& readyQueNum >0
&& 
      cpuProcess->priority
< readyMaxPriority()) {
      // 需抢占cpu,当前执行的进程调入阻塞队列
      blockQueQush(cpuProcess);
      cpuProcess = readyQuePop();
    }
  }
  printf("\n模拟进程调度算法结束\n");
  return 0;
}

热心网友 时间:2023-10-15 11:12

在百度文库里有样例的
http://wenku.baidu.com/view/1aee3f5e3b3567ec102d8aa2.html

参考资料:http://wenku.baidu.com/view/1aee3f5e3b3567ec102d8aa2.html

热心网友 时间:2023-10-15 11:12

动态高优先权优先调度算法:

动态优先权是指,在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。例如,我们可以规定,在就绪队列中的进程,随其等待时间的增长,其优先权以速率a提高。若所有的进程都具有相同的优先权初值,则显然是最先进入就绪队列的进程,将因其动态优先权变得最高而优先获得处理机,此即FCFS算法。若所有的就绪进程具有各不相同的优先权初值,那么,对于优先权初值低的进程,在等待了足够的时间后,其优先权便可能升为最高,从而可以获得处理机。当采用抢占式优先权调度算法时,如果再规定当前进程的优先权以速率b下降,则可防止一个长作业长期地垄断处理机。

算法代码模拟实现:

#include<stdio.h>
#include<stdlib.h>
#define N 6

// 待插入就绪队列的进程数据
int id[N]    = { 0,  1,
 2,  3,  4,
 5 };
int priority[N] = { 9, 38, 17,
 2,  7, 18 };
int cpuTime[N]  = { 0,
 0,  0,  0,
 0,  0 };
int allTime[N]  = { 3,
 2,  3,  6,
 1,  3 };

//********************************
//
//  模拟进程/PCB数据结构
//
//********************************

//
枚举进程的状态:就绪、执行、阻塞、完成
enum STATE { Ready, Run, Block, Finish
};

// 建立PCB结构体
struct PCB {
  int id;           // 标志数
  int priority;        // 优先数
  int cpuTime;         //
已占CPU时间
  int allTime;         //
还需占CPU时间
  int blockTime;        // 已被阻塞的时间
  STATE state;         //
进程状态
  PCB *pre;          //
PCB的前指针
  PCB *nxt;          //
PCB的后指针
};

//********************************
//
//  模拟进程队列
//
//********************************

// 进程入列
void queQush(PCB *process, PCB
*queHead)
{
  process->pre = NULL;
  process->nxt =
queHead->nxt;
  if(queHead->nxt != NULL) {
    // 非第一个入列
    queHead->nxt->pre =
process;
  }
  queHead->nxt = process;
}

// 进程出列
void quePop(PCB *process, PCB
*queHead)
{
  if(process->pre != NULL) {
    // 不是头节点
    process->pre->nxt =
process->nxt;
  }
else {
    queHead->nxt =
process->nxt;
  }
  if(process->nxt != NULL) {
    // 不是尾节点
    process->nxt->pre =
process->pre;
  }
  //
清空进程指针
  process->pre = process->nxt =
NULL;
}

// 查看队列里进程的信息
void queWalk(PCB *queHead)
{
  PCB *pro = queHead->nxt;
  if(pro == NULL) {
    printf("(无进程)\n");
    return;
  }
  while(pro != NULL) 
  {
    printf("id:%d,
 pri:%d,  alltime:%d\n",
pro->id, 
      pro->priority,
pro->allTime);
    pro =
pro->nxt;
  }
}

//********************************
//
//  模拟就绪队列
//
//********************************

int readyQueNum;         // 就绪队列的进程数量
PCB readyQueHead;        //
就绪队列的头部
PCB *readyMaxProcess;      // 就绪队列中优先级最高的进程

// 进程插入到就绪队列
void readyQueQush(PCB
*process)
{
  readyQueNum ++;
  process->state = Ready;
  queQush(process, &readyQueHead);
}

// 优先级最高的进程出列
PCB* readyQuePop()
{
  readyQueNum --;
  quePop(readyMaxProcess,
&readyQueHead);
  return readyMaxProcess;
}

// 每个时间片,更新就绪队列里进程的信息
void readyQueUpdate()
{
  int maxPriority = -1;
  PCB *pro = readyQueHead.nxt;
  if(pro == NULL){
    // 就绪队列没有进程
    readyMaxProcess =
NULL;
    return;
  }
  while(pro != NULL) 
  {
    pro->priority
++;
    if(pro->priority > maxPriority)
{
      maxPriority =
pro->priority;
      readyMaxProcess = pro;
    }
    pro =
pro->nxt;
  }
}

// 返回就绪队列最高优先级的值
int readyMaxPriority()
{
  return readyMaxProcess->priority;
}

// 查看就绪队列里进程的信息
void readyQueWalk()
{
  printf("就绪队列里的进程信息为:\n");
  queWalk(&readyQueHead);
}

//********************************
//
//  模拟阻塞队列
//
//********************************

#define EndBlockTime 3
     // 进程最长被阻塞时间

int blockQueNum;         // 阻塞队列的进程数量
PCB blockQueHead;        //
阻塞队列的头部
PCB *blockMaxProcess;      // 阻塞队列中优先级最高的进程

// 进程插入到阻塞队列
void blockQueQush(PCB
*process)
{
  blockQueNum ++;
  process->blockTime = 0;
  process->state = Block;
  queQush(process, &blockQueHead);
}

// 优先级最高的进程出列
PCB* blockQuePop()
{
  blockQueNum --;
  quePop(blockMaxProcess,
&blockQueHead);
  return blockMaxProcess;
}

// 每个时间片,更新阻塞队列里进程的信息
void blockQueUpdate()
{
  int maxPriority = -1;
  PCB *pro = blockQueHead.nxt;
  while(pro != NULL) 
  {
    pro->blockTime
++;
    if(pro->blockTime >= EndBlockTime)
{
      PCB *process = pro;
      pro = pro->nxt;
      // 阻塞时间到,调入就绪队列
      blockQueNum --;
      quePop(process,
&blockQueHead);
      readyQueQush(process);
    } else
if(pro->priority > maxPriority)
{
      // 更新阻塞队列里优先级最高的进程指针
      maxPriority =
pro->priority;
      blockMaxProcess = pro;
      pro = pro->nxt;
    }
  }
}

// 查看阻塞队列里进程的信息
void blockQueWalk()
{
  printf("阻塞队列里的进程信息为:\n");
  queWalk(&blockQueHead);
}

//********************************
//
//  模拟动态优先权的进程调度
//
//********************************

// 初始化数据
void initData()
{
  //
初始化就绪队列和阻塞队列
  readyQueNum = blockQueNum = 0;
  readyMaxProcess = blockMaxProcess = NULL;
  readyQueHead.pre = readyQueHead.nxt = NULL;
  blockQueHead.pre = blockQueHead.nxt = NULL;

  //
初始化进程进入就绪队列
  int i, maxPriority = -1;
  for(i = 0; i < N; i
++) 
  {
    // 分配一个PCB的内存空间
    PCB *pro = (PCB
*)malloc(sizeof(PCB));
    // 给当前的PCB赋值
    pro->id
    = id[i];
    pro->priority
 = priority[i];
    pro->cpuTime
 = cpuTime[i];
    pro->allTime
 = allTime[i];
    pro->blockTime
= 0;
    if(pro->allTime > 0) {
      // 插入到就绪队列中
      readyQueQush(pro);
      // 更新就绪队列优先级最高的进程指针
      if(pro->priority >
maxPriority) {
        maxPriority = pro->priority;
        readyMaxProcess = pro;
      }
    }
  }
}

// 模拟cpu执行1个时间片的操作
void cpuWord(PCB
*cpuProcess)
{
  cpuProcess->priority -= 3;
  if(cpuProcess->priority < 0)
{
    cpuProcess->priority = 0;
  }
  cpuProcess->cpuTime ++;
  cpuProcess->allTime --;
  //
显示正执行进程的信息:
  printf("CPU正执行的进程信息为:\n");
  printf("id:M,  pri:M,
 alltime:M\n",
cpuProcess->id, 
    cpuProcess->priority,
cpuProcess->allTime);
}

int main()
{
  int timeSlice  = 0;     //
模拟时间片
  int cpuBusy   = 0;
    // 模拟cpu状态
  PCB *cpuProcess = NULL;    // 当前在cpu执行的进程
  //
初始化数据
  initData(); 
  //
模拟进程调度
  while(1)
  {
    if(readyQueNum == 0
&& blockQueNum == 0
&& cpuBusy == 0) {
      // 就绪队列、阻塞队列和cpu无进程,退出
      break;
    }
    //printf("\n%d %d",
readyQueNum, blockQueNum);
    if(cpuBusy == 0)
{
      // cpu空闲,选择一个进程进入cpu
      if(readyQueNum > 0)
{
        //
选择绪队列优先级最高的进程
        cpuProcess
= readyQuePop();
      } else {
        //
就绪队列没有进程,改为选择阻塞队列优先级最高的进程
        cpuProcess
= blockQuePop();
      }
      cpuProcess->cpuTime =
0;
      cpuProcess->state =
Run;
      cpuBusy = 1;
    }
    timeSlice ++;
    printf("\n第%d个时间片后:\n",
timeSlice);
    //
模拟cpu执行1个时间片的操作
    cpuWord(cpuProcess);
    if(cpuProcess->allTime == 0) {
      cpuProcess->state =
Finish;
      // 释放已完成进程的PCB
      free(cpuProcess);
      cpuBusy = 0;
    }
    //
更新就绪队列和阻塞队列里的进程信息
    blockQueUpdate();
    readyQueUpdate();
    //
查看就绪队列和阻塞队列的进程信息
    readyQueWalk();
    blockQueWalk();
    if(cpuBusy == 1
&& readyQueNum >0
&& 
      cpuProcess->priority
< readyMaxPriority()) {
      // 需抢占cpu,当前执行的进程调入阻塞队列
      blockQueQush(cpuProcess);
      cpuProcess = readyQuePop();
    }
  }
  printf("\n模拟进程调度算法结束\n");
  return 0;
}

热心网友 时间:2023-10-15 11:12

在百度文库里有样例的
http://wenku.baidu.com/view/1aee3f5e3b3567ec102d8aa2.html

参考资料:http://wenku.baidu.com/view/1aee3f5e3b3567ec102d8aa2.html

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
春水的诗句有哪些(描写春水的好词好句) 关于春水的诗句有哪些? 描写春水的词句 形容春水的诗句有哪些 请问不联网怎么用电脑拍照呀,东芝 win7家庭普通版的? win7内置摄像头怎么打开啊,是东芝L600D 536的,问了一下卖电脑那里,她说... 东芝笔记本windows7怎么开视频 东芝笔记本windows7开视频方法 tn6破解器tn6怎么使用? 金银首饰及一些制品是机器雕刻的还是模板印的。 ospod行业模版分类 ...红色、黑色还要什么颜色,都是放什么垃圾的,记不太清了 大起大落代表什么生肖 优先级调度算法是什么 充电式刮胡刀打开开关充电会损坏什么电子元件? 大起大落猜一生肖 有一个场景,我梦见两次,但现实中并没有见过那样的场景,这是怎么回事? 【第一次梦】 我和闺蜜去本城 梦见去闺蜜家的新房子,正好又是我常去的地方 如何做青椒榨菜炒肉丝 梦见闺蜜家装修房子,什么没说,就醒了? 我梦到好多蛇咬我 华为p7没电后,充电不断重启动? 华为P7充电器能长期给苹果6S充电吗 小蚁摄像机怎么看有几个用户 如何通过富时中国A50指数期货持仓量判断价格走势 梦到很多蛇咬到自己,老公不管要害死自己,自己哭的很伤心 独立显卡显存越大,共享系统内存越大么?显存大小和共享系统内存有没有关系? 电脑上看到GPU显存是GPU专享是8g GPU共享显存是8G 共16G显存 蓝时光赴美生子流程如何 共享gpu内存为什么几乎不用 关于独立显卡显存问题,独显不使用GPU专用内存而是使用共享内存? 我这个笔记本的GPU专用内存和共享内存什么意思 大学操作系统:假设下述四个作业同时到达,当使用最高优先数优先调度算法时,作业的平均周转时间为__小时 将最高优先数优先的调度算法改为时间片轮转调度算法 最高响应比优先作业调度算法 操作系统问题 关于响应比最高优先算法 在线等~ PD称为什么控制算法 什么是调度算法? 大起大落是指什么生肖?请友友帮助! 在最高优先级算法的系统中,cpu调度方式为不可抢占是,不会发生进程切换的是? 猜生肖,大起大落的动物 假设下述四个作业同时到达,当使用最高优先数优先调度算法时,作业的平均周转时间为 小时 重重叠叠,起起落落,大起大落又不怕失败的动物?猜一个生肖 重重叠叠,起起落落,大起大落又不怕失败是什么生肖 大起大落又不怕失败的动物,十二生肖动物 字谜,“大起大落”不稳当。打两个数字。 重重叠叠,起起落落,大起大落又不怕失败的生肖是什么呢 重重叠叠,起起落落,大起大落又不怕失败的动物是什么生肖 重重叠叠,起起落落,大起大落不怕失败的生肖是什么 怎样设置电脑开机后自动启动某个.EXE文件 怎样设置电脑开机后自动启动某个.EXE文件? 怎样设置开机自动运行EXE