欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

操作系統(tǒng)期末課程設(shè)計(jì)-創(chuàng)新互聯(lián)

進(jìn)程調(diào)度算法模擬 一、設(shè)計(jì)目的

編程實(shí)現(xiàn)進(jìn)程調(diào)度的算法,更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,從而有利于把握進(jìn)程調(diào)度細(xì)節(jié)。

創(chuàng)新互聯(lián)建站是一家專(zhuān)業(yè)提供連山企業(yè)網(wǎng)站建設(shè),專(zhuān)注與網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)H5開(kāi)發(fā)、小程序制作等業(yè)務(wù)。10年已為連山眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。二、設(shè)計(jì)要求

(1)要求實(shí)現(xiàn)先來(lái)先服務(wù),短作業(yè)優(yōu)先,時(shí)間片輪轉(zhuǎn),高優(yōu)先權(quán)調(diào)度算法四種算法并進(jìn)行對(duì)比分析.

(2)要求界面簡(jiǎn)單,易懂,關(guān)鍵代碼部分要注釋.

(3)編程語(yǔ)言可以采用自己任意精通的語(yǔ)言

三、設(shè)計(jì)思想說(shuō)明

先來(lái)先服務(wù):程序的執(zhí)行調(diào)度順序按先進(jìn)入隊(duì)列的先獲得執(zhí)行,并且其他進(jìn)程都不能中斷正在執(zhí)行的進(jìn)程,要等進(jìn)程完成后才能,讓出CPU給其他進(jìn)程。執(zhí)行的時(shí)候可以隨時(shí)在隊(duì)列中插入進(jìn)程。

短作業(yè)優(yōu)先:進(jìn)程的調(diào)度順序按程序的服務(wù)時(shí)間來(lái)決定,進(jìn)程的執(zhí)行順序。服務(wù)時(shí)間短的先被調(diào)用。調(diào)度時(shí)先從隊(duì)列中選取服務(wù)時(shí)間最短的進(jìn)程來(lái)執(zhí)行。進(jìn)程中途不能中斷,即使此時(shí)隊(duì)列中存在服務(wù)時(shí)間比其更短的進(jìn)程,仍需要等待該進(jìn)程執(zhí)行完后才能被執(zhí)行。

高優(yōu)先權(quán)調(diào)度:選取進(jìn)程中優(yōu)先級(jí)最高的一個(gè),以優(yōu)先級(jí)的值大,優(yōu)先級(jí)就大。調(diào)度時(shí)總是選取隊(duì)列中進(jìn)程優(yōu)先級(jí)最高的來(lái)執(zhí)行,不管是否有某個(gè)進(jìn)程在執(zhí)行,只要存在比正在執(zhí)行進(jìn)程優(yōu)先級(jí)高的進(jìn)程,則就會(huì)立刻中斷正在執(zhí)行的進(jìn)程,讓給跟高優(yōu)先級(jí)的進(jìn)程。

時(shí)間片輪轉(zhuǎn):本課程設(shè)計(jì)采用多級(jí)反饋隊(duì)列調(diào)度算法,設(shè)立4個(gè)進(jìn)程隊(duì)列,分給隊(duì)列1的時(shí)間片為3秒,隊(duì)列2的時(shí)間片為6秒,隊(duì)列3的時(shí)間片為12秒,隊(duì)列4的時(shí)間片為24秒。隊(duì)列1的優(yōu)先級(jí)最高,隊(duì)列4的優(yōu)先級(jí)最低。高優(yōu)先級(jí)的隊(duì)列沒(méi)執(zhí)行完,即不為空,就永遠(yuǎn)不執(zhí)行其下面的低優(yōu)先級(jí)的隊(duì)列里面的進(jìn)程。當(dāng)執(zhí)行低優(yōu)先級(jí)隊(duì)列里面的進(jìn)程時(shí),突然間高優(yōu)先級(jí)的隊(duì)列插入了進(jìn)程就立刻跳到高優(yōu)先級(jí)的隊(duì)列執(zhí)行其里面的進(jìn)程。每個(gè)隊(duì)列的進(jìn)程都是按先來(lái)先執(zhí)行的順序執(zhí)行。進(jìn)程初次執(zhí)行肯定要進(jìn)入隊(duì)列1。如何從頭到尾執(zhí)行一遍隊(duì)列1中的進(jìn)程是,存在某些進(jìn)程在隊(duì)列1的時(shí)間片內(nèi)還沒(méi)執(zhí)行完,就把進(jìn)程移交到下一個(gè)隊(duì)列中。每個(gè)隊(duì)列都如此類(lèi)推。直到最后一個(gè)隊(duì)列4,如果在隊(duì)列4還有進(jìn)程在本時(shí)間片內(nèi)還沒(méi)沒(méi)執(zhí)行完,就把該程序放到隊(duì)尾,從新等待時(shí)間片執(zhí)行。

基本概念

程序:程序是指靜態(tài)的指令集合,它不占用系統(tǒng)的運(yùn)行資源,可以長(zhǎng)久地保存在磁盤(pán)中。

進(jìn)程:進(jìn)程是指進(jìn)程實(shí)體(由程序、數(shù)據(jù)和進(jìn)程控制塊構(gòu)成)的運(yùn)行過(guò)程,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。進(jìn)程執(zhí)行程序,但進(jìn)程與程序之間不是一一對(duì)應(yīng)的。通過(guò)多次運(yùn)行,一個(gè)程序可以包含多個(gè)進(jìn)程;通過(guò)調(diào)用關(guān)系,同一進(jìn)程可以被多個(gè)程序包含(如一個(gè)DLL文件可以被多個(gè)程序運(yùn)用)。

作業(yè):作業(yè)由一組統(tǒng)一管理和操作的進(jìn)程集合構(gòu)成,是用戶要求計(jì)算機(jī)系統(tǒng)完成的一項(xiàng)相對(duì)獨(dú)立的工作。作業(yè)可以是完成了編譯、鏈接之后的一個(gè)用戶程序,也可以是各種命令構(gòu)成的一個(gè)腳本。

作業(yè)調(diào)度:作業(yè)調(diào)度是在資源滿足的條件下,將處于后備狀態(tài)的作業(yè)調(diào)入內(nèi)存,同時(shí)生成與作業(yè)相對(duì)應(yīng)的進(jìn)程,并為這些進(jìn)程提供所需要的資源。作業(yè)調(diào)度適用于多道批處理系統(tǒng)中的批處理作業(yè)。根據(jù)作業(yè)控制塊中的信息,檢查系統(tǒng)是否滿足作業(yè)的資源要求,只有在滿足作業(yè)調(diào)度的資源需求的情況下,系統(tǒng)才能進(jìn)行作業(yè)調(diào)度。

基本調(diào)度算法

1)先來(lái)先服務(wù)(First-Come First-Served,F(xiàn)CFS)調(diào)度算法

先來(lái)先服務(wù)調(diào)度算法遵循按照進(jìn)入后備隊(duì)列的順序進(jìn)行調(diào)度的原則。該算法是一種非搶占式的算法,是到目前為止最簡(jiǎn)單的調(diào)度算法,其編碼實(shí)現(xiàn)非常容易。該算法僅考慮了作業(yè)到達(dá)的先后順序,而沒(méi)有考慮作業(yè)的執(zhí)行時(shí)間長(zhǎng)短、作業(yè)的運(yùn)行特性和作業(yè)對(duì)資源的要求。

2)短作業(yè)優(yōu)先(Shortest-Job-First,SJF)調(diào)度算法

短作業(yè)優(yōu)先調(diào)度算法根據(jù)作業(yè)控制塊中指出的執(zhí)行時(shí)間,選取執(zhí)行時(shí)間最短的作業(yè)優(yōu)先調(diào)度。本實(shí)驗(yàn)中規(guī)定,該算法是非搶占式的,即不允許立即搶占正在執(zhí)行中的長(zhǎng)進(jìn)程,而是等當(dāng)前作業(yè)執(zhí)行完畢再進(jìn)行調(diào)度。

3)響應(yīng)比高者優(yōu)先(HRRF)調(diào)度算法

FCFS調(diào)度算法只片面地考慮了作業(yè)的進(jìn)入時(shí)間,短作業(yè)優(yōu)先調(diào)度算法考慮了作業(yè)的運(yùn)行時(shí)間而忽略了作業(yè)的等待時(shí)間。響應(yīng)比高者優(yōu)先調(diào)度算法為這兩種算法的折中。響應(yīng)比為作業(yè)的響應(yīng)時(shí)間與作業(yè)需要執(zhí)行的時(shí)間之比。作業(yè)的響應(yīng)時(shí)間為作業(yè)進(jìn)入系統(tǒng)后的等待時(shí)間與作業(yè)要求處理器處理的時(shí)間之和。

4)優(yōu)先權(quán)高者優(yōu)先(Highest-Priority-First,HPF)調(diào)度算法

優(yōu)先權(quán)高者優(yōu)先調(diào)度算法與響應(yīng)比高者優(yōu)先調(diào)度算法十分相似,根據(jù)作業(yè)的優(yōu)先權(quán)進(jìn)行作業(yè)調(diào)度,每次總是選取優(yōu)先權(quán)高的作業(yè)優(yōu)先調(diào)度。作業(yè)的優(yōu)先權(quán)通常用一個(gè)整數(shù)表示,也叫優(yōu)先數(shù)。優(yōu)先數(shù)的大小與優(yōu)先權(quán)的關(guān)系由系統(tǒng)或者用戶規(guī)定。優(yōu)先權(quán)高者優(yōu)先調(diào)度算法綜合考慮了作業(yè)執(zhí)行時(shí)間和等待時(shí)間的長(zhǎng)短、作業(yè)的緩急度,作業(yè)對(duì)外部設(shè)備的使用情況等因素,根據(jù)系統(tǒng)設(shè)計(jì)目標(biāo)和運(yùn)行環(huán)境而給定各個(gè)作業(yè)的優(yōu)先權(quán),決定作業(yè)調(diào)度的先后順序。

實(shí)驗(yàn)環(huán)境與測(cè)試數(shù)據(jù)

實(shí)驗(yàn)環(huán)境

硬件環(huán)境:計(jì)算機(jī)一臺(tái);

軟件環(huán)境:Linux操作系統(tǒng),C語(yǔ)言編程環(huán)境。

本實(shí)驗(yàn)所選用的調(diào)度算法均默認(rèn)為非搶占式調(diào)度。

測(cè)試數(shù)據(jù)如下表所示。

作業(yè)Id

到達(dá)時(shí)間

執(zhí)行時(shí)間

優(yōu)先權(quán)

1

800

50

0

2

815

30

1

3

830

25

2

4

835

20

2

5

845

15

2

6

700

10

1

重要函數(shù)說(shuō)明

void initial_jobs()

初始化所有作業(yè)信息

void reset_jinfo()

重置所有作業(yè)信息

int findminjob(job jobs[],int count)

找到執(zhí)行時(shí)間最短的作業(yè)。輸入?yún)?shù):所有的作業(yè)信息及待查找的作業(yè)總數(shù),輸出為執(zhí)行時(shí)間最短的作業(yè)id

int findrearlyjob(job jobs[],int count)

找到達(dá)到最早的作業(yè) 輸入?yún)?shù):所有的作業(yè)信息及待查找的作業(yè)總數(shù),輸出參數(shù)為最早達(dá)到的作業(yè)id

void readJobdata()

//讀取作業(yè)的基本信息

void FCFS()

//先來(lái)先服務(wù)算法

void SFJschdulejob(job jobs[],int count)

//短作業(yè)優(yōu)先算法 輸入?yún)?shù):所有的作業(yè)信息及待查找的作業(yè)總數(shù)

實(shí)驗(yàn)內(nèi)容

運(yùn)行程序代碼

#include#include#include#include//大作業(yè)數(shù)量
#define MAXJOB 50
//作業(yè)的數(shù)據(jù)結(jié)構(gòu)
typedef struct node
{
 int number;//作業(yè)號(hào)        
 int reach_time;//作業(yè)抵達(dá)時(shí)間
 int need_time;//作業(yè)的執(zhí)行時(shí)間
 int privilege;//作業(yè)優(yōu)先權(quán)
 float excellent; //響應(yīng)比
 int start_time;//作業(yè)開(kāi)始時(shí)間
 int wait_time;//等待時(shí)間
 int visited;//作業(yè)是否被訪問(wèn)過(guò)
 bool isreached;//作業(yè)是否抵達(dá)
}job;
job jobs[MAXJOB];//作業(yè)序列
int quantity;//作業(yè)數(shù)量
//初始化作業(yè)序列
void initial_jobs()
{
 int i;
 for(i=0;ijobs[i].reach_time&&jobs[i].visited==0)
  {
   rearlyjob=jobs[i].reach_time;
   rearlyloc=i;
  }
 }
 return rearlyloc;
}
//讀取作業(yè)數(shù)據(jù)
void readJobdata()
{
 FILE *fp;
 char fname[20];
 int i;
 //輸入測(cè)試文件文件名
 printf("please input job data file name\n");
 scanf("%s",fname);
 if((fp=fopen(fname,"r"))==NULL)
 {//讀取文件失敗
  printf("error, open file failed, please check filename:\n");
 }
 else
 {
  //依次讀取作業(yè)信息
  while(!feof(fp))
  {
 if(fscanf(fp,"%d %d %d %d",&jobs[quantity].number,&jobs[quantity].reach_time,&jobs[quantity].need_time,&jobs[quantity].privilege)==4)
   quantity++;
  }
  //打印作業(yè)信息
  printf("output the origin job data\n");
  printf("---------------------------------------------------------------------\n");
  printf("\tjobID\treachtime\tneedtime\tprivilege\n");
  for(i=0;icurrent_time)
  {
   jobs[loc].start_time=jobs[loc].reach_time;
   current_time=jobs[loc].reach_time;
  }
  else
  {
   jobs[loc].start_time=current_time;
  }
  jobs[loc].wait_time=current_time-jobs[loc].reach_time; 
 printf("\t%-8d\t%-8d\t%-8d\t%-8d\t%-8d\n",loc+1,jobs[loc].reach_time,jobs[loc].start_time,jobs[loc].wait_time,
   jobs[loc].wait_time+jobs[loc].need_time);
  jobs[loc].visited=1;
  current_time+=jobs[loc].need_time;
  total_waitime+=jobs[loc].wait_time; 
  total_roundtime=total_roundtime+jobs[loc].wait_time+jobs[loc].need_time;
  //獲取剩余作業(yè)中最近到達(dá)作業(yè)
  loc=findrearlyjob(jobs,quantity);
 } 
 printf("總等待時(shí)間:%-8d 總周轉(zhuǎn)時(shí)間:%-8d\n",total_waitime,total_roundtime); 
 printf("平均等待時(shí)間: %4.2f 平均周轉(zhuǎn)時(shí)間: %4.2f\n",(float)total_waitime/(quantity),(float)total_roundtime/(quantity)); 
}
//短作業(yè)優(yōu)先作業(yè)調(diào)度
//在current_time之前找最短,都在current_time之后找最近
void SFJschdulejob()
{
 int loc=0;
 int current_time=0;
 int total_waitime=0;
 int total_roundtime=0;
 int rearlyloc = findrearlyjob(jobs, quantity);//最早到達(dá)的作業(yè)序號(hào)
 loc = findminjob(jobs, jobs[rearlyloc].reach_time);
 //獲取執(zhí)行時(shí)間最短的作業(yè)
 //輸出作業(yè)流
 printf("\n\nSJF算法作業(yè)流\n");
 printf("------------------------------------------------------------------------\n"); 
 printf("\tjobID\treachtime\tstarttime\twaittime\troundtime\n");
 current_time=jobs[loc].reach_time; 
 //每次循環(huán)找出最先到達(dá)的作業(yè)并打印相關(guān)信息
 for(int i=0;icurrent_time)
  {
   jobs[loc].start_time=jobs[loc].reach_time;
   current_time=jobs[loc].reach_time;
  }
  else
  {
   jobs[loc].start_time=current_time;
  }
  jobs[loc].wait_time=current_time-jobs[loc].reach_time; 
 printf("\t%-8d\t%-8d\t%-8d\t%-8d\t%-8d\n",loc+1,jobs[loc].reach_time,jobs[loc].start_time,jobs[loc].wait_time,
   jobs[loc].wait_time+jobs[loc].need_time);
  jobs[loc].visited=1;
  current_time+=jobs[loc].need_time;
  total_waitime+=jobs[loc].wait_time; 
  total_roundtime=total_roundtime+jobs[loc].wait_time+jobs[loc].need_time;
  //獲取剩余作業(yè)中最短的作業(yè)
  loc=findminjob(jobs,current_time);
 }
 printf("總等待時(shí)間:%-8d 總周轉(zhuǎn)時(shí)間:%-8d\n",total_waitime,total_roundtime); 
 printf("平均等待時(shí)間: %4.2f 平均周轉(zhuǎn)時(shí)間: %4.2f\n",(float)total_waitime/(quantity),(float)total_roundtime/(quantity)); 
}
//高響應(yīng)比調(diào)度算法
int max_excellent(job jobs[], int current_time)
{
 int maxjob= -1;
 int maxloc= -1;
 for (int i = 0; i< quantity; i++)
 {
  //current_time之前有最高響應(yīng)比的作業(yè),取
  if(jobs[i].reach_time<= current_time && jobs[i].visited==0)
  {
   if(jobs[i].excellent >maxjob)
   {
    maxjob=jobs[i].excellent;
    maxloc=i;
   }
  }
 }
 int min_reachtime = 1000000;
 //若current_time之前沒(méi)有作業(yè),
 //取current_time之后最先開(kāi)始的(如果多個(gè)項(xiàng)目同時(shí)最先開(kāi)始,取權(quán)值最高的)
 if (maxloc == -1)
 {
  for(int i=0;imaxjob)
     {
      maxjob=jobs[i].excellent;
      maxloc=i;
     }
    }
   }
  }
 }
 return maxloc;
}
void HRRFschdulejob() 
{
 int i; 
 int current_time=0;
 int loc;
 int total_waitime=0;
 int total_roundtime=0;
 float new_excellent=0;
 //獲取最高響應(yīng)比的作業(yè)
 int rearlyloc = findrearlyjob(jobs,quantity);
 loc = max_excellent(jobs, jobs[rearlyloc].reach_time);
 //輸出作業(yè)流
 printf("\n\nHRRF算法作業(yè)流\n");
 printf("------------------------------------------------------------------------\n"); 
 printf("\tjobID\treachtime\tstarttime\twaittime\troundtime\n");
 current_time=jobs[loc].reach_time; 
 //每次循環(huán)找出最先到達(dá)的作業(yè)并打印相關(guān)信息
 for(i=0;icurrent_time)
  {
   jobs[loc].start_time=jobs[loc].reach_time;
   current_time=jobs[loc].reach_time;
  }
  else
  {
   jobs[loc].start_time=current_time;
  }
  jobs[loc].wait_time=current_time-jobs[loc].reach_time; 
 printf("\t%-8d\t%-8d\t%-8d\t%-8d\t%-8d\n",loc+1,jobs[loc].reach_time,jobs[loc].start_time,jobs[loc].wait_time,
   jobs[loc].wait_time+jobs[loc].need_time);
  jobs[loc].visited=1;
  current_time+=jobs[loc].need_time;
  total_waitime+=jobs[loc].wait_time; 
  total_roundtime=total_roundtime+jobs[loc].wait_time+jobs[loc].need_time;
  //獲取剩余作業(yè)中最近到達(dá)作業(yè)
 
 for(int j = 0; j< quantity; j++)
  {
   if(current_time >jobs[j].reach_time && jobs[j].visited == 0)
   {
    jobs[j].wait_time = current_time - jobs[j].reach_time;
    new_excellent =( (float)jobs[j].wait_time + (float)jobs[j].need_time ) / (float)jobs[j].need_time ;
   jobs[j].excellent = new_excellent;
   }
   
  }
  loc = max_excellent(jobs, current_time);
 } 
 printf("總等待時(shí)間:%-8d 總周轉(zhuǎn)時(shí)間:%-8d\n",total_waitime,total_roundtime); 
 printf("平均等待時(shí)間: %4.2f 平均周轉(zhuǎn)時(shí)間: %4.2f\n",(float)total_waitime/(quantity),(float)total_roundtime/(quantity)); 
}
int max_privilege(job jobs[], int current_time)
{
 int maxjob= -1;
 int minloc= -1;
 for (int i = 0; i< quantity; i++)
 {
  //current_time之前有最高權(quán)值,取
  if(jobs[i].reach_time<= current_time && jobs[i].visited==0)
  {
   if(jobs[i].privilege >maxjob)
   {
    maxjob=jobs[i].privilege;
    minloc=i;
   }
  }
 }
 int min_reachtime = 100000;
 //current_time之前沒(méi)有作業(yè),
 //取current_time之后最先開(kāi)始的(如果多個(gè)項(xiàng)目同時(shí)最先開(kāi)始,取權(quán)值最高的)
 if (minloc == -1)
 {
  for(int i=0;imaxjob)
     {
      maxjob=jobs[i].privilege;
      minloc=i;
     }
    }
   }
  }
 }
 return minloc;
}
//優(yōu)先權(quán)高者優(yōu)先調(diào)度算法
void HPF()
{
 int loc=0;
 int current_time=0;
 int total_waitime=0;
 int total_roundtime=0;
 int rearlyloc = findrearlyjob(jobs, quantity);
 loc = max_privilege(jobs, jobs[rearlyloc].reach_time);
 //獲取優(yōu)先權(quán)最高的作業(yè)
 //輸出作業(yè)流
 printf("\n\nHPF算法作業(yè)流\n");
 printf("------------------------------------------------------------------------\n"); 
 printf("\tjobID\treachtime\tstarttime\twaittime\troundtime\n");
 current_time=jobs[loc].reach_time; 
 //每次循環(huán)找出最先到達(dá)的作業(yè)并打印相關(guān)信息
 for(int i=0;icurrent_time)
  {
   jobs[loc].start_time=jobs[loc].reach_time;
   current_time=jobs[loc].reach_time;
  }
  else
  {
   jobs[loc].start_time=current_time;
  }
  jobs[loc].wait_time=current_time-jobs[loc].reach_time; 
 printf("\t%-8d\t%-8d\t%-8d\t%-8d\t%-8d\n",loc+1,jobs[loc].reach_time,jobs[loc].start_time,jobs[loc].wait_time,
   jobs[loc].wait_time+jobs[loc].need_time);
  jobs[loc].visited=1;
  current_time+=jobs[loc].need_time;
  total_waitime+=jobs[loc].wait_time; 
  total_roundtime=total_roundtime+jobs[loc].wait_time+jobs[loc].need_time;
  //獲取剩余作業(yè)中最短的作業(yè)
  loc=max_privilege(jobs,current_time);
 }
 printf("總等待時(shí)間:%-8d 總周轉(zhuǎn)時(shí)間:%-8d\n",total_waitime,total_roundtime); 
 printf("平均等待時(shí)間: %4.2f 平均周轉(zhuǎn)時(shí)間: %4.2f\n",(float)total_waitime/(quantity),(float)total_roundtime/(quantity)); 
}
 
int main() 
{   
 initial_jobs(); 
 readJobdata();
 HRRFschdulejob();
 reset_jinfo();
 HPF();
 reset_jinfo();
 FCFS();
 reset_jinfo();
 SFJschdulejob();
 system("pause");
 return 0;
}

時(shí)間片輪轉(zhuǎn)調(diào)度算法模擬C語(yǔ)言
#include#include#define MAX 10   //大進(jìn)程數(shù)
int Time;   //時(shí)間片
int process_amount;  //進(jìn)程數(shù)量
int current_number = 0;   //當(dāng)前執(zhí)行的“號(hào)碼牌”
int index = 0;       //就緒隊(duì)列要發(fā)的“號(hào)碼牌”,初始值為0
struct PCB
{
 char name[10];   //進(jìn)程名字
 int arrival_time;   //到達(dá)時(shí)間
 int service_time;   //服務(wù)時(shí)間
 int completion_time;   //完成時(shí)刻
 int sign_completion;  //標(biāo)志是否完成調(diào)用,0表示沒(méi)完成,1表示完成
 int remaining_time;  //剩余服務(wù)時(shí)間
 int number;          //進(jìn)程在就緒隊(duì)列里的“號(hào)碼牌”
}process[MAX];
void input()     //初始化進(jìn)程的信息
{
 int i;
 printf("請(qǐng)輸入時(shí)間片:\n");
 scanf("%d",&Time);
 printf("請(qǐng)輸入進(jìn)程名稱(chēng)、到達(dá)時(shí)間、服務(wù)時(shí)間:\n");
 for(i = 0; i< process_amount; i ++)      
 { 
  printf("%d號(hào)進(jìn)程:\n",i+1);
  scanf("%s%d%d",process[i].name,&process[i].arrival_time,&process[i].service_time);
  printf("\n");
  process[i].remaining_time = process[i].service_time;
  process[i].sign_completion = 0;
  process[i].number = 0;       //“號(hào)碼牌”初始為0
 }
}
void BubbleSort()    //冒泡排序算法對(duì)進(jìn)程抵達(dá)時(shí)間先后排序
{
 int i,j,n = process_amount;
 for(i = 0; i< n - 1; i++)         
 for(j = 0; j< n - 1 - i; j++) 
 {
  if(process[j].arrival_time >process[j+1].arrival_time)
  {
   process[n] = process[j+1];
   process[j+1] = process[j];
   process[j] = process[n];
 
  }
 }
}
void RunProcess()     //時(shí)間片輪轉(zhuǎn)調(diào)用過(guò)程
{
 int time = process[0].arrival_time;      //給當(dāng)前時(shí)間賦初值 
 int sum = 0;     //記錄完成的進(jìn)程數(shù) 
 int i,j;
 while(sum< process_amount)
 {  
 for(i = 0;  i< process_amount; i++)
  if(current_number == process[i].number && process[i].sign_completion == 0)
  {
    if(process[i].remaining_time<= Time)    //剩余服務(wù)時(shí)間少于等于一個(gè)時(shí)間片 
    {
    time = time + process[i].remaining_time;
    process[i].sign_completion = 1;
    process[i].completion_time = time;
    process[i].remaining_time = 0;
   printf("%s ",process[i].name);          
   sum++;
   current_number++;
   for(j = i + 1; j< process_amount; j++)     //檢測(cè)后面有沒(méi)有新進(jìn)程到達(dá)
    if(process[j].arrival_time<= time && process[j].number == 0)
    {
     index++;
     process[j].number = index;
    }
    }
    else if(process[i].remaining_time >Time)//剩余服務(wù)時(shí)間大于一個(gè)時(shí)間片 
    {
     time = time + Time;
    process[i].remaining_time -= Time;
    printf("%s ",process[i].name);
    current_number++;
    for(j = i + 1; j< process_amount; j++)    //檢測(cè)后面有沒(méi)有新進(jìn)程到達(dá)
    if(process[j].arrival_time<= time && process[j].number == 0)
    {
     index++;
     process[j].number = index;
    }
    index++;
    process[i].number = index;
   } 
  }
 if(index< current_number && sum< process_amount)   // 還有沒(méi)執(zhí)行的進(jìn)程,且沒(méi)進(jìn)入就緒隊(duì)列 
 {
 for(i = 0; i<= process_amount; i++)
  if(process[i].sign_completion == 0) 
  {
   time = process[i].arrival_time;
   index++;
   process[i].number = index;
   break;
  }
 }
}
}
void output()   //打印信息
{
 int i;
 printf("程序名 到達(dá)時(shí)間 服務(wù)時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間  帶權(quán)周轉(zhuǎn)時(shí)間\n");
 for(i = 0; i< process_amount; i++)
 {
  float weight_time = (float)(process[i].completion_time - process[i].arrival_time)/process[i].service_time;
  printf("  %s\t  %d\t   %d\t    %d\t     %d\t\t%.2f\n",process[i].name,process[i].arrival_time,process[i].service_time,
   process[i].completion_time,process[i].completion_time-process[i].arrival_time,weight_time);
 }
}
int main()
{
 int f;
 printf("模擬時(shí)間片輪轉(zhuǎn)法實(shí)現(xiàn)進(jìn)程調(diào)度\n");
 printf("請(qǐng)輸入總進(jìn)程數(shù):\n");
 scanf("%d",&process_amount);
 input();
 BubbleSort();
 printf("進(jìn)程運(yùn)行順序:\n");
 RunProcess();
 printf("\n");
 output();
 printf("\n");
 system("pause");
 return 0;
}
實(shí)驗(yàn)步驟

1)先來(lái)先服務(wù)(First-Come First-Served,F(xiàn)CFS)調(diào)度算法,2)短作業(yè)優(yōu)先(Shortest-Job-First,SJF)調(diào)度算法,3)響應(yīng)比高者優(yōu)先(HRRF)調(diào)度算法,4)優(yōu)先權(quán)高者優(yōu)先(Highest-Priority-First,HPF)調(diào)度算法

代碼如下

使用vim tiaodu.c 編輯器并且編寫(xiě)代碼,保存退出,再使用cat tiaodu.c查看

使用vim a.txt創(chuàng)建一個(gè)測(cè)試數(shù)據(jù),保存后使用cat b.txt查看

使用命令gcc tiaodu.c –o tiaodu.c 編譯代碼,./tiaodu運(yùn)行程序,接著輸入測(cè)試數(shù)據(jù)的文件名

時(shí)間片輪轉(zhuǎn)調(diào)度算法

使用vim rr3.c 編輯器并且編寫(xiě)代碼,保存退出

使用cat rr3.c查看

執(zhí)行結(jié)果:

1)先來(lái)先服務(wù)(First-Come First-Served,F(xiàn)CFS)調(diào)度算法,2)短作業(yè)優(yōu)先(Shortest-Job-First,SJF)調(diào)度算法,3)響應(yīng)比高者優(yōu)先(HRRF)調(diào)度算法,4)優(yōu)先權(quán)高者優(yōu)先(Highest-Priority-First,HPF)調(diào)度算法

結(jié)果如下

時(shí)間片輪轉(zhuǎn)調(diào)度算法結(jié)果

編輯切換為居中

添加圖片注釋?zhuān)怀^(guò) 140 字(可選)

實(shí)驗(yàn)總結(jié)

由四種算法的測(cè)試數(shù)據(jù)來(lái)看,算法思想不同,所需的等待時(shí)間和周轉(zhuǎn)時(shí)間也不同。

算法與等待時(shí)間、執(zhí)行時(shí)間、優(yōu)先級(jí)的關(guān)系

作業(yè)調(diào)度算法

等待時(shí)間

執(zhí)行時(shí)間

優(yōu)先權(quán)

FCFS

SJF

HRRF

HPF

從上表得出FCFS算法僅考慮作業(yè)的等待時(shí)間,等待時(shí)間長(zhǎng)的優(yōu)先考慮;SJF算法主要考慮作業(yè)的執(zhí)行時(shí)間,執(zhí)行時(shí)間短的優(yōu)先考慮;HRRF算法同時(shí)考慮了作業(yè)的等待時(shí)間和執(zhí)行時(shí)間,是FCFS和SJF算法的折中;HPF算法僅考慮作業(yè)的優(yōu)先權(quán),優(yōu)先權(quán)高者先執(zhí)行。

我們實(shí)驗(yàn)結(jié)果中可以發(fā)現(xiàn)對(duì)測(cè)試數(shù)據(jù)而言,并非HRRF算法的平均等待時(shí)間和平均周轉(zhuǎn)時(shí)間最短。對(duì)于這組作業(yè),SJF算法的平均等待時(shí)間和平均周轉(zhuǎn)時(shí)間比 HRRF算法和HPF算法的短,說(shuō)明最適合這個(gè)作業(yè)的調(diào)度算法是SJF。

由此可以得出判斷算法的好壞要根據(jù)具體的作業(yè),如果對(duì)于a作業(yè)A算法的平均等待時(shí)間和周轉(zhuǎn)時(shí)間是最短的,那說(shuō)明A算法是最適合a作業(yè)的調(diào)度算法。

心得

FCFS算法比較有利于長(zhǎng)作業(yè),而不利于短作業(yè),有利于CPU繁忙型作業(yè),而不利于I/O繁忙型作業(yè)。并且 用于批處理系統(tǒng),不適于分時(shí)系統(tǒng)。

SJF算法易于實(shí)現(xiàn),照顧了短進(jìn)程,縮短了短進(jìn)程的等待時(shí)間,體現(xiàn)了短進(jìn)程優(yōu)先原則,改善了平均周轉(zhuǎn)時(shí)間和平均帶權(quán)周轉(zhuǎn)時(shí)間,有利于提高系統(tǒng)的吞吐量。但是對(duì)長(zhǎng)進(jìn)程不利,甚至?xí)?dǎo)致長(zhǎng)進(jìn)程長(zhǎng)時(shí)間無(wú)法得到關(guān)注而使得系統(tǒng)整體性能下降,完全未考慮進(jìn)程的急迫程度,因而不能保證緊迫性進(jìn)程會(huì)被及時(shí)處理,進(jìn)程的運(yùn)行時(shí)間很難精確估計(jì),進(jìn)程在運(yùn)行前不一定能真正做到短進(jìn)程被優(yōu)先調(diào)度。

HRRF算法既照顧了短作業(yè)又照顧了長(zhǎng)作業(yè),同時(shí)也照顧了先到達(dá)進(jìn)程。但是調(diào)度之前需要計(jì)算各個(gè)進(jìn)程的響應(yīng)比,增加了系統(tǒng)開(kāi)銷(xiāo),導(dǎo)致對(duì)實(shí)時(shí)進(jìn)程無(wú)法做出及時(shí)反映。

HPF算法調(diào)度靈活,能適應(yīng)多種調(diào)度需求。但是進(jìn)程優(yōu)先級(jí)的劃分和確定每個(gè)進(jìn)程優(yōu)先級(jí)比較困難,同時(shí)搶占式調(diào)度增加了系統(tǒng)開(kāi)銷(xiāo)。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

新聞標(biāo)題:操作系統(tǒng)期末課程設(shè)計(jì)-創(chuàng)新互聯(lián)
標(biāo)題來(lái)源:http://chinadenli.net/article48/ccgshp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)企業(yè)建站App設(shè)計(jì)網(wǎng)站排名網(wǎng)站收錄做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)