搜档网
当前位置:搜档网 › 天津理工大学操作系统实验报告实验一

天津理工大学操作系统实验报告实验一

天津理工大学操作系统实验报告实验一
天津理工大学操作系统实验报告实验一

实验报告学院(系)名称:计算机与通信工程学院

【实验过程记录(源程序、测试用例、测试结果及心得体会等)】

设计思想:

1.模拟单CPU系统时间片切换、进程切换。

2.使用优先队列,让优先级高的进程位于队列顶端。

在每次时钟周期时,从优先队列队首取出优先级最高的进程,并使其运行一个时钟周期,然后将其优先级减1,已运行时间加1。然后判断程序是否完成,如果未完成,则重新加入优先队列,参与时钟周期。

数据结构:

使用优先队列,以获得优先级最高程序。

源代码:

#include

#include

using namespace std;

// 进程控制块PCB

struct PCB {

unsigned int pid; //进程id

unsigned int priority; //进程优先级

unsigned int claimTime; //需要运行时间

unsigned int runTime; //已经运行时间

//构造函数

PCB(unsigned int id, unsigned int p, unsigned int ct) {

pid=id;

priority=p;

claimTime=ct;

runTime=0;

}

//运行当前进程一个时钟周期,并使进程优先级减1,已运行时间加1

void run() {

runTime++;

if(priority>0)priority--;

}

//判断进程是否完成

bool isFinished() {

if(claimTime==runTime)

return true;

else return false;

}

//重载<运算符,以使用STL中的priority_queue

bool operator <(const PCB& p)const {

if(priority!=

return priority<; //比较优先级

else

//优先级相同的话快完成的任务先执行

return claimTime-runTime<

}

};

int main(int argc, char **argv) {

int clock=0;

priority_queue q; //优先队列

for(int i=0; i<5; i++) {

int p, t;

printf("请输入pid=%u的进程的优先级(非负数):\n", i);

scanf("%u", &p);

printf("请输入pid=%u的进程的要求运行时间(非负数):\n", i);

scanf("%u", &t);

printf("pid = %u, 优先级 = %u, 要求运行时间 = %u\n\n", i, p, t);

(PCB(i, p, t));

}

while(!()) { //模拟单CPU

printf("当前时钟%2d\t", clock++);

PCB t = ();

();

printf("pid = %u进程运行, 优先级 = %u, 已运行时间 = %u\n", , , ;

();

printf("执行过后:\tpid = %u, 优先级 = %u, 已运行时间 = %u\n", , , ;

if(!())

(t);

else

printf("pid=%d进程结束\n", ;

}

printf("程序结束\n");

return 0;

}

执行结果:

实验问题:

1.在进程优先级相同时,调度结果不确定。

原因:在优先级相同时,未进行相关处理。

解决:添加优先级相同时判断逻辑,快结束的进程先调度

2.程序陷入死循环。

原因:当忘记判断进程是否结束就加入队列。

解决:判断进程是否结束,如果未结束,则继续参与调度,否则不参与。

实验总结:

要根据调度算法,选择合适的数据结构,以实现相应的调度程序。在调度时,应明确:哪个程序被调度,调度后优先级有什么变化,该进程是否还参与调度等问题。

相关主题