处理器调度 实习报告
一、实习题目
第二题:设计一个按时间片轮转法实现处理器调度的程序。
二、结构及说明
程序采用结构体来定义进程控制块PBC单元,整个控制块利用单向循环链表。 typedef struct tagPCB //进程控制块PBC
{ char name; struct tagPCB *next; int demand_time; int used_time; char status;
}PBC;
定义链首指针head,当前指针p; 利用时钟时间差来模拟时间片。
即:quantum = current_time – last_time; 在模拟运行中,给定时间片为1s。 三、流程图
四、源程序
#include \"stdafx.h\" #include \"time.h\" #include \"stdlib.h\" #include \"iostream.h\"
//-------------------------------------------
typedef struct tagPCB //进程控制块PBC { char name; //进程名 struct tagPCB *next; //下个进程 int demand_time; //需求时间 int used_time; //已用时间 char status; //进程状态 }PBC;
PBC *head,*p; //全局变量:链首指针,活动指针 time_t timep;
long current_time,last_time; //时间控制变量 int n,i;
//---------------------------------------//函数声明 int init_link(); int enter_PBC();
int processing_PBC();
//---------------main--------------------//主函数 int main(int argc, char* argv[]) { cout<<\"输入需执行的进程数:\"; init_link(); cin>>n;//scanf(\"%d\ for (i=0;inext))) //时间控制循环 { current_time = time(&timep); if (current_time - last_time >=1) { processing_PBC(); last_time = current_time; } } printf(\"Hello GHouan!\\n\"); return 0; }//------------------------------------------
int init_link() /*链表初始化:仅含头指针的循环链表*/ {
head = (PBC *)malloc(sizeof(PBC)); head->demand_time = 0; //无意义 head->used_time = 32768; //无意义 head->status = 'N'; //无意义 head->next = head; p = head; return 0; }
int enter_PBC() /*进程进入PBC链表*/ { char c; int n; PBC *temp; temp = (PBC *)malloc(sizeof(PBC)); cout<<\"进程名:\"; cin>>c; temp->name = c; cout<<\"需要运行时间:\"; cin>>n; temp->demand_time = n; temp->used_time = 0; temp->status = 'R'; p->next = temp; temp->next = head; p = temp; return 0; };
int processing_PBC() /*进程运行模拟*/ { if (head == p->next) //跳过链首 { p = head; } if (p->next->status == 'E') //状态改变则退出链表 { PBC *q; q = p->next; cout<<\"进程\"<name<<\"退出队列\"<next = q->next; free(q); //释放内存 return 0; } (p->next->used_time)++; //模拟时间片分配时间并运行 cout<<\"进程\"<<(p->next)->name<<\"运行时间+1\"<if ((p->next)->used_time == (p->next)->demand_time) { p->next->status = 'E'; //若达到所需时间则改变状态 } p = p->next; return 0; };五、运行参数及结果 初始态参数: K1 a K2 b K2 K3 2 4 0 0 R R
PCB1
PCB2 输入需执行的进程数:5
进程名:a
需要运行时间:2 进程名:b
需要运行时间:4 进程名:c
需要运行时间:1 进程名:d
需要运行时间:5 进程名:e
需要运行时间:3
终止态参数: K1 a K2
b K2 K3 2 4 2 4 E E
PCB1
PCB2 进程a时间+1
进程b时间+1 进程c时间+1 进程d时间+1 进程e时间+1 进程a时间+1 进程b时间+1
K3 c K4 1 0 R PCB3 K3 c K4 1 1 E PCB3 K4 d K5 5 0 R PCB4 K4 d K5 5 5 E PCB4 K5
e K1 3 0 R PCB5 K5 e K1 3 3 E PCB5
进程c退出队列 进程d时间+1 进程e时间+1 进程a退出队列 进程b时间+1 进程d时间+1 进程e时间+1 进程b时间+1 进程d时间+1 进程e退出队列 进程b时间+1 进程d时间+1 进程b退出队列 进程d时间+1 进程d退出队列