• 大小: 2.59MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-11-17
  • 语言: 其他
  • 标签: 广州大学  

资源简介

一、课程设计题目及内容
时间片轮转法实现处理机调度的程序设计提示如下:
(1)假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表。进程控制块的格式如下表所示,且参数意义也相同。

进程名
链接指针
到达时间
估计运行时间
进程状态

(2)按照进程到达的先后顺序排成一个循环队列,设一个队首指针指向第一个到达进程的首址。另外再设一个当前运行进程指针,指向当前正运行的进程。
(3)执行处理机调度时,首先选择队首的第一个进程运行。
(4)由于本题目是模拟实验,所以对被选中的进程并不实际启动运行,而只是执行如下操作:1)估计运行时间减1;
2)输出当前运行进程的名字。
用这两个操作来模拟进程的一次运行。
(5)进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程,同时还应判断该进程的剩余运行时间是否为0,若不为0,则等待下一轮的运行,若该进程的剩余运行时间为0,则将该进程的状态置为完成状态“C”,并退出循环队列。
(6)若就绪队列不为空,则重复上述的步骤(4)和(5)直到所有进程都运行完为止。
(7)在所设计的调度程序中,应包含显示或打印语句,以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。

资源截图

代码片段和文件信息

#include
#include
#include
using namespace std;

typedef struct PNode   //PCB
{
struct PNode *next;  //定义指向下一个节点的指针
char name[10];       //定义进程名,并分配空间
int laitime;      //定义到达时间
int All_time;        //定义总运行时间
int Runed_Time;      //定义已运行时间
char state;          //定义进程状态R (就绪态)/C(完成态)/Y(运行态)/W(未到态)
}
*Proc;                   //指向该PCB的指针
int ProcNum; //总进程数

//初始化就绪队列
void lnitPCB(Proc &H)
{
fstream fin(“D:\\data1.txt“);     //打开数据文件
fin >> ProcNum; //读取进程数
int Num = ProcNum;
H = (Proc)malloc(sizeof(PNode));   //建立头结点
H->next = NULL;
Proc p = H;            //定义一个指针
Proc j;
cout << “总进程个数为“ << ProcNum << endl;
cout << endl;
while (Num--)
{
j = (Proc)malloc(sizeof(PNode));
fin >> j->name >> j->laitime >> j->All_time >> j->Runed_Time;//读取进程信息
if (j->laitime != 0) 
j->state = ‘W‘; //进程未到达则状态为W
else
j->state = ‘R‘; //进程到达则状态为R
j->next = NULL;
while (1)
{
if (p->next == NULL) //若下一个节点为空则直接插入
{
p->next = j;
break;
}
if (j->laitime < p->next->laitime) //前插
{
j->next = p->next;
p->next = j;
break;
}
else p = p->next;
}
p = H;
}
while (p->next != NULL) //将p指向最后一个节点
p = p->next;
p->next = H->next; //将尾节点和头节点连接变成循环队列
}
//输入运行中的进程信息
void Displnfo(Proc H)
{
Proc p = H->next;
do
{
cout << “进程名:“ << p->name << “\t总运行时间:“ << p->All_time << “\t已运行时间“ << p->Runed_Time << “\t状态:“ << p->state << endl;
p = p->next;
} while (p != H->next);  //整个进程链条始终完整,只是状态位有差异
}

//输入初始状态的进程信息
void Displnfo1(Proc H)
{
Proc p = H->next;
do
{
cout << “进程名:“ << p->name << “\t到达时间:“ << p->laitime << “\t总运行时间:“ << p->All_time << “\t已运行时间“ << p->Runed_Time << “\t状态:“ << p->state << endl;
p = p->next;
} while (p != H->next);  //整个进程链条始终完整,只是状态位有差异
}

void Displnfo2(Proc H)
{
Proc p = H->next;
do
{
if (p->state == ‘R‘) //输出此时可执行队列
{
cout << “进程名:“ << p->name << “\t总运行时间:“ << p->All_time << “\t已运行时间“ << p->Runed_Time << “\t状态:“ << p->state << endl;
p = p->next;
}
else break;
} while (p != H->next);
}

//时间片轮转法
void SJP_Simulator(Proc &H)
{
cout << endl << “-------------START-----------------\n“;
int flag = ProcNum;     //记录剩余进程数
int round = 0;          //记录轮转数
Proc p = H->next;
/*Proc q = H->next;  */    //存放头节点
while (p->All_time > p->Runed_Time)

Proc j;
j = p;   //记录当前p指针
p = H->next;
while (1)   //标记此时进程状态
{
if (p->laitime <= round)
{
p->state = ‘R‘;
p = p->next;
}
else
{
p->state = ‘W‘;
p = p->next;
}
if (p->next == H->next)
break;
}
if (H->next->state == ‘W‘)
cout << “此时无可执行进程“;
else
{
cout << “此时可执行的进程有:“ << endl;
Displnfo2(H);
}
p = j; //恢复p指针位置
if (p->laitime <= round)
{
round++;
cout << endl << “Round“ << round << “--正在运行“ << p->name << “进程“ << endl;
p->state = ‘Y‘;
p->Runed_Time++;          //更改正在运行的进程的

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件      623104  2018-12-27 22:18  1606100068_陈家乐_操作系统课程设计实验报告.doc
     文件      246450  2018-12-24 06:15  实验一---处理器调度(设计一个按时间片轮转法实现处理器调度的程序).doc
     文件     2031616  2018-12-21 15:54  操作系统课程设计2017.doc
     文件        3530  2018-12-26 14:07  时间法1.txt
     文件        3953  2018-12-26 15:07  时间法2(增加输出可执行队列).txt
     文件       21478  2018-12-27 21:12  时间片流转法主要思想流程图.pdf
     文件       70011  2018-12-27 16:27  时间片流转法初始化流程图.jpg
     文件       58587  2018-12-27 16:27  时间片流转法初始化流程图.pdf
     目录           0  2018-12-28 23:04  计机162_1606100068_陈家乐\
     文件        4501  2018-12-27 21:14  计机162_1606100068_陈家乐\源.cpp

评论

共有 条评论