《计算机操作系统》实验要求
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二
实验三
实验一 进程调度算法模拟 实验二 页面置换算法模拟 实验三 银行家算法模拟
实验一
进程调度算法模拟
【开发语言及实现平台或实验环境】 Java/C++/C# Myeclipse等/Turbo C / Microsoft Visual Studio 6.0 / Microsoft Visual Studio .NET 2010 【实验目的】 (1)加深对进程的概念及进程调度算法的理解; (2)在了解和掌握进程调度算法的基础上,编制进程调度算法通用程 序,将调试结果显示在计算机屏幕上,并检测机算和笔算的一致性。 【实验要求】 (1)了解进程调度; (2)理解利用进程调度算法进行调度的原理; (3)使用某种编程语言进行算法模拟。 【实验原理】 (注意:这个仅是个例子,可以参考本例,选择其他算法进行实验) 1、 例题:设计一个有N个进程的进程调度算法。 进程调度算法:采用最高优先数的调度算法(即把处理机分配给优 先数最高的进程)。 每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如 下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、 进程状态等等。 进程的优先数及需要的运行时间可以事先人为的指定(也可以由随 机数产生)。进程的到达时间为进程的输入的时间。进程的运行时间以 时间片为单位进行计算。 每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成 F(Finish)三种状态之一。就绪进程获得CPU后都只能运行一个时间 片。用已占用CPU时间加1表示。 如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运 行时间,则撤销该进程,如果运行一个时间片后,进程的已占用CPU时 间还未达到所需要的运行时间,也就是进程还需要继续运行,此时应该 将进程的优先数减1(即降低一级),然后把它插入就绪队列等待 CPU。
为:%d\n",g_queue[id].s_static_prior); printf("进程的动态优先权 为:%d\n",g_queue[id].s_dynamic_prior); printf("进程的到达时间 为:%d\n",g_queue[id].s_start_time); printf("进程需要时间 为:%d\n",g_queue[id].s_need_time); printf("进程已用CPU时间 为:%d\n",g_queue[id].s_used_time); printf("进程的状态为:%d\n",g_queue[id].s_state); printf("\n"); } else { printf("创建进程失败\n"); } } }wk.baidu.comvoid Init_Queue() { int i; for(i=0;i<PRO_NUM;++i) { g_queue[i].s_id=i; g_queue[i].s_dynamic_prior=MIN_PRIOR; g_queue[i].s_need_time=0; g_queue[i].s_start_time=0; g_queue[i].s_static_prior=MIN_PRIOR; g_queue[i].s_used_time=0; g_queue[i].s_state=FINISH; } } Uint32 Create_Process(Uint32 pri,Uint32 needtime) {
int i=0; Uint32 id=ID_ERROR; for(i=0;i<PRO_NUM;++i) { if(g_queue[i].s_state==FINISH) { id=g_queue[i].s_id; g_queue[i].s_dynamic_prior=MIN_PRIOR; g_queue[i].s_need_time=needtime; g_queue[i].s_start_time=g_time; g_queue[i].s_state=WAIT; g_queue[i].s_static_prior=pri; g_queue[i].s_used_time=0x0; break; } } return id; } void Run_Process() { Uint32 id; while((id=Get_PriProcess())!=ID_ERROR) { Work_Process(id); Change_Process(id); } } void Print_State() { int i; printf("时间 进程ID\t状态 已用时间 需要时间 开始时间 静优先 级 动优先级\n"); for(i=0;i<PRO_NUM;++i) {
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进 程的PCB,以便进行检查。 重复以上过程,直到所要的进程都完成为止。 分析: 使用固定队列与静动态优先级结合每个优先级为0~0xFF,并且以小 的数字为高优先级,大的数字为低优先级,每次皆使用循环得到最高优 先级的进程并执行,然后将其动态优先级设置为最低,并将其他进程动 态优先级提高,以使得每个进程都有机会运行。进程的优先级与运行时 间由随机数产生。
printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",g_time,g_queue[i].s_i
g_queue[i].s_start_time,g_queue[i].s_static_prior,g_queue[i].s_dynam } } Uint32 Get_PriProcess() { Uint32 id=ID_ERROR; int i,prev_id=ID_ERROR; Uint32 prior=MIN_PRIOR*2,temp_prior; for(i=0;i<PRO_NUM;++i) { if(g_queue[i].s_state!=FINISH) { temp_prior=g_queue[i].s_dynamic_prior+g_queue[i].s_static_prior; if(temp_prior<=prior) { id=i; prior=temp_prior; } } } return id; } void Work_Process(Uint32 id) { ++g_time; g_queue[id].s_state=RUN; ++g_queue[id].s_used_time; Print_State(); } void Change_Process(Uint32 id)
《计算机操作系统》实验要求
为了顺利完成操作系统课程实验,应做到: (1) 实验前,认真学习教材以及实验要求的相关内容,提前做 好实验准备。 (2) 实验结束后三天内提交实验报告的电子版和打印版。实验 报告内容应包括:实验目的、实验内容、设计思路和流程 框图,主要程序代码、测试结果以及实验总结。(实验报 告模板见“OS实验模板”) (3) 遵守机房纪律,服从指挥,爱护实验设备。 实验的验收将分为两个部分。第一部分是上机操作,随机抽查程序 运行和即时提问;第二部分是提交书面的实验报告。要杜绝抄袭现 象,一经发现雷同,双方成绩均以0分计算。 实验内容安排: 实验内容与要 编写程序,模拟某个算法。实验一和实验二选一, 求 实验三必选(可全选) 实验一 熟悉进程调度相关内容;根据进程调度算法,选择 先来先服务、短进程优先、时间片轮转、高优先权 优先调度等算法中的一个,编写算法模拟程序。 熟悉页面置换相关内容;选择最佳置换算法、先进 先出置换算法、LRU置换算法中的一个,编写算法 模拟程序。 熟悉银行家算法,并编写程序进行模拟。
#define #define #define
ID_ERROR 0x10 MIN_PRIOR 0xFF MAX_PRIOR 0x00
typedef unsigned int
Uint32;
/*进程PCB*/ struct PCB_Info { Uint32 s_id; Uint32 s_static_prior; Uint32 s_dynamic_prior; Uint32 s_start_time; Uint32 s_need_time; Uint32 s_used_time; Uint32 s_state; }; /*进程队列*/ PCB_Info g_queue[5]; Uint32 g_time; /*模拟进程执行函数*/ void Simulator(); /*初始化5个进程函数*/ void Init_Process(); /*初始化进程队列函数*/ void Init_Queue(); /*创建进程函数*/ Uint32 Create_Process(Uint32 pri,Uint32 needtime); /*系统运行函数*/ void Run_Process(); /*得到最高优先级进程 ID函数*/ Uint32 Get_PriProcess(); /*进程时间片执行函数*/ void Work_Process(Uint32 id); /*改变进程状态和优先级函数*/
void Change_Process(Uint32 id); /*打印进程状态函数*/ void Print_State(); /*结束系统函数*/ void End_Process(); /*入口函数*/ int main( int argc, char *argv[ ]) { Simulator(); return 0; } void Simulator() { Init_Process(); Run_Process(); End_Process(); } void Init_Process() { int i; Uint32 id; srand( (unsigned)time( NULL ) ); Init_Queue(); for(i=0;i<PRO_NUM;++i) { /*在这里修改随机数的范围,建议优先级取值为0到4之间, 进程工作总时间为1到10之间*/ id=Create_Process(rand()%4,1+rand()%10); if(id!=ID_ERROR) { printf("**********************************\n"); printf("创建进程成功\n"); printf("进程ID号为:%d\n",id); printf("进程的静态优先权
Y 已达到 未达到 N
开 始 初始化PCB,输入进程信息 各进程按优先数从高到低排列 就绪队列空?
结 束
就绪队列首进程投入运行 时间片到,运行进程已占用CPU时间+1 运行进程已占用CPU时间达到所需的运行时间? 进程完成 撤销该进程 使运行进程的优先数减1 把运行进程插入到就绪队列
2、 代码试例 #include <stdlib.h> #include <stdio.h> #include <time.h> /*常量和状态定义*/ #define PRO_NUM 0x05 #define MAX_TIME 0xFF /*状态宏*/ #define WAIT 0x01 #define RUN 0x02 #define FINISH 0x03
{ int i; if(g_queue[id].s_need_time==g_queue[id].s_used_time) { g_queue[id].s_state=FINISH; } else { g_queue[id].s_dynamic_prior=MIN_PRIOR; g_queue[id].s_state=WAIT; } for(i=0;i<PRO_NUM;++i) { if((i!=id)&&(g_queue[i].s_state!=FINISH)) { g_queue[i].s_dynamic_prior>0?-g_queue[i].s_dynamic_prior:g_queue[i].s_dynamic_prior=0; } } }