时间片轮转算法课程设计

合集下载

时间片轮转算法课程设计

时间片轮转算法课程设计

一、实验目的本课程设计以Windows操作系统为实验平台,进行源代码分析和修改。

通过该课程设计,使学生掌握Windows操作系统各部分结构、实现机理和各种典型算法;系统地了解操作系统的设计和实现思路,运用内核开发环境实现对内核的修改,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。

二、实验内容1.分析设计内容,给出解决方案(要说明设计实现的原理,采用的数据结构)。

2.画出程序的基本结构框图和流程图。

3.对程序的每一部分要有详细的设计分析说明。

4.源代码格式要规范。

5.设计合适的测试用例,对得到的运行结果要有分析。

6.设计中遇到的问题,设计的心得体会。

7.按期提交完整的程序代码、可执行程序和课程设计报告。

三、实验步骤1、任务分析:时间片轮转的主要思想就是按顺序为每一个进程一次只分配一个时间片的时间。

算法要完成的功能就是将各个进程按照时间片轮转运行的动态过程显示出来。

时间片轮转算法的主要实现过程是首先为每一个进程创建一个进程控制块,定义数据结构,说明进程控制块所包含的内容,有进程名、进程所需运行时间、已运行时间和进程的状态以及指针的信息。

实现的过程即运用指针指向某一个进程,判断当前的进程是否是就绪状态“r”,如果是,则为该进程分配一个时间片,同时,已运行时间加一且要求运行的时间减一,如此循环执行,当某一个进程的所需要运行的时间减少至0时,则将该进程的状态设置为“e”。

然后,将指针指向下一个未运行完成的进程,重复判断,直至所有的进程都运行结束。

2、概要设计:(1)所用数据结构及符号说明typedef struct PCB{c har name[10];先建立PCB的数据结构,为了便于正确输出,加上了进程结束标志flag。

输入进程信息(包括进程名和要求运行的时间),并为每个进程创建一个PCB并初始化形成一个循环链队列,用函数creatPCB()来实现。

b.建立函数judge()用来判断进程全部运行结束标志,即当所有进程的状态变为’e’(即完成状态)后,循环结束,表示所有进程都已运行成功。

操作系统实验二报告-时间片轮转进程调度算法1

操作系统实验二报告-时间片轮转进程调度算法1

操作系统实验报告实验二时间片轮转进程调度算法学号:班级:姓名:【实验题目】: 时间片轮转进程调度算法【实验目的】通过这次实验, 加深对进程概念的理解, 进一步掌握进程状态的转变、进程调度的策略与对系统性能的评价方法。

【实验内容】问题描述:设计程序模拟进程的时间片轮转RR 调度过程。

假设有n 个进程分别在T1, … ,Tn 时刻到达系统, 它们需要的服务时间分别为S1, … ,Sn 。

分别利用不同的时间片大小q, 采用时间片轮转RR 进程调度算法进行调度, 计算每个进程的完成时间, 周转时间和带权周转时间, 并且统计n 个进程的平均周转时间和平均带权周转时间。

程序要求如下:1)进程个数n ;每个进程的到达时间T 1, … ,T n 和服务时间S 1, … ,S n ;输入时间片大小q 。

2)要求时间片轮转法RR 调度进程运行, 计算每个进程的周转时间, 带权周转时间, 并且计算所有进程的平均周转时间, 带权平均周转时间;3)输出: 要求模拟整个调度过程, 输出每个时刻的进程运行状态, 如“时刻3: 进程B开始运行”等等;4)输出:要求输出计算出来的每个进程的周转时间, 带权周转时间, 所有进程的平均周转时间, 带权平均周转时间。

实现提示:用C++语言实现提示:1)程序中进程调度时间变量描述如下:int ArrivalTime[100];int ServiceTime[100];int PServiceTime[100];int FinishTime[100];int WholeTime[100];double WeightWholeTime[100];double AverageWT,AverageWWT;bool Finished[100];➢2)进程调度的实现过程如下:➢变量初始化;➢接收用户输入n, T1, … ,Tn, S1, … ,Sn;时间片大小q;➢按照时间片轮转RR算法进行进程调度, 计算进程的完成时间、周转时间和带权周转时间;➢计算所有进程的平均周转时间和平均带权周转时间;➢按格式输出调度结果。

操作系统课程设计——CPU时间片轮转算法

操作系统课程设计——CPU时间片轮转算法

目录一、设计目的 (1)二、设计内容 (1)三、设计原理 (2)四、算法实现 (2)五、流程图 (4)六、源程序 (5)七、运行示例及结果分析 (14)八、心得体会 (16)九、参考资料 (17)时间片轮转法进行CPU调度一、设计目的处理机调度是操作系统中非常重要的部分。

为深入理解进程管理部分的功能,设计时间片轮转法进行CPU调度算法,模拟实现处理机的调度。

通过本次课程设计理解进程调度的概念,深入理解进程控制的功能、进程的创建与删除以及进程各个状态之间的转换过程,实现时间片轮转算法调度进程。

1、学会使用C++语言编写和调试一个简单的时间片轮转法进行CPU调度的程序。

2、加深了解有关进程控制块和进程队列的概念。

3、并体会时间片轮转算法的具体实现方法。

二、设计内容用时间片轮转算法模拟单处理机调度。

(1)建立一个进程控制块PCB来代表。

PCB包括:进程名、链接指针、到达时间、估计运行时间、剩余时间和进程状态。

进程状态分为就绪(P)、运行(W)和完成(F)。

(2)为每个进程任意确定一个要求运行时间和到达时间。

(3)按照进程到达的先后顺序排成一个循环队列。

再设一个对首指针指向第一个到达进程的首址。

(4)执行处理机调度时,开始选择对首的第一个进程运行。

另外再设一个当前运行进程的指针,指向当前正运行的进程。

(5)执行: a)预计运行时间减1;b)输出当前运行进程的名字。

(6)进程执行一次后,若该进程的剩余运行时间为零,则将该进程的状态置为完成态F,并退出循环队列;若不为空,则将其移至队尾。

继续在运行队首的进程。

(7)若就绪队列不空,则重复上述的(5)和(6)步骤直到所有进程都运行完为止。

在所设计的调度程序中,要求包含显示或打印语句。

以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。

三、设计原理在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。

计算机操作系统时间片循环轮转算法

计算机操作系统时间片循环轮转算法
int rou nd=0; //记录轮转数
Proc p=H->n ext;
while (p->All_Time > p->Ru ned_Time) { //即未结束的进程
roun d++;
cout<<endl<<"Round "<<round<<"--正在运行"<<p->name<<"进程"<<endl;
PCB3
PCB4
PCB5
(4)处理器调度总是选择标志单元指示的进程运行。由于本实验是模拟处理器调度的功能,
所以,对被选中的进程并不实际的启动运行,而是执行:
已运行时间+1
来模拟进程的一次运行,表示进程已经运行过一个单位的时间。
请注意:在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,
do {
if (p->state != 'E') //如果该进程的状态不是End的话
{
cout<<"进程名:"<<p->name<<"\t总运行时间:"<<p->All_Time
<<"\t已运行时间:"<<p->Runed_Time
<<"\t状态:"<<p->state<<endl;
p=p->n ext;
(2)每次运行所设计的进程调度程序前,为每个进程任意确定它的“要求运行时间”。

时间片轮转调度算法

时间片轮转调度算法

(1)一设计要求:编写一程序,可以创建若干个虚拟进程,并对若干个虚拟进程进行调度,调度策略为时间片轮转。

要求:进程的个数,进程的内容(即进程的功能序列)来源于一个进程序列描述文件,另外调度运行结果输出到一个运行日志文件。

二设计目的:熟悉进程调度、设计内容:1.设计PCB适用于轮转法;2.建立进程队列;三虚拟程序的描述:虚拟指令的格式:操作命令操作时间● C :表示在CPU上计算● I :表示输入● O :表示输出● W :表示等待● H :表示进程结束操作时间代表该操作命令要执行多长时间。

这里假设I/O设备的数量没有限制,I和O 设备都只有一类。

I,O,W三条指令实际上是不占有CPU的,执行这三条指令就应该将进程放入对应的等待队列(INPUT等待队列,OUTPUT等待队列,WAIT等待队列)。

例如有一虚拟程序p1.prc描述如下:C 30O 12C 9I 14H 0................程序部分代码如下:enum InstructionSet {INPUT,OUTPUT,WAIT,HALT,CALC};//指令类class CInstruction{friend class COsTestDlg;friend class PCB;public:CInstruction(){}~CInstruction(){}CInstruction(InstructionSet iid,int rt){m_nInstructionID=iid;m_nRunTime=rt;}private:CInstruction* m_pNextInstruction;//用于链接一个进程的所有指令成为链表(指令序列)int m_nRunTime;//本指令需要运行的时间长度(定时器时间间隔的个数)InstructionSet m_nInstructionID;//指令类型标识};//进程控制块类class PCB{friend class COsTestDlg;public:PCB(){m_nPID=0;m_csProcessName="";m_nRemainedTime=0;//m_pRuningInstruction=NULL;m_pInstructionList=NULL;m_pNextPCB=NULL;}//构造或创建一个进程PCB(int pid,CString pname){m_nPID=pid;m_csProcessName=pname;m_nRemainedTime=0;//m_pRuningInstruction=NULL;m_pInstructionList=NULL;m_pNextPCB=NULL;}~PCB(){CInstruction* pTemp;while(m_pInstructionList){m_pInstructionList=m_pInstructionList->m_pNextInstruction; pTemp=m_pInstructionList;delete pTemp;}}//本进程添加一条指令void AppendInstruction(CInstruction* pInstruction){CInstruction* pTempInstruction;if(m_pInstructionList==NULL){//emptym_pInstructionList=pInstruction;}else{//more than one nodepTempInstruction = m_pInstructionList;while(pTempInstruction->m_pNextInstruction!=NULL) pTempInstruction=pTempInstruction->m_pNextInstruction; pTempInstruction->m_pNextInstruction=pInstruction;}}private:PCB* m_pNextPCB; //进程队列的指针int m_nPID; //进程标识符CString m_csProcessName; //进程名字int m_nRemainedTime; //当前运行指令运行还需要的时间CInstruction* m_pRuningInstruction; //指向正在运行或将要运行的指令CInstruction* m_pInstructionList; //指向本进程的指令序列(线性表)的第一条指令};PCB* m_pReadyPCBs;//就绪队列PCB* m_pBackupReadyPCBs;//后备就绪队列PCB* m_pInputWaittingPCBs;//输入等待队列PCB* m_pOutputWaittingPCBs;//输出等待队列PCB* m_pPureWaittingPCBs;//其他等待队列int m_nTimeSlice;//时间片大小(定时器时间间隔的倍数)void LoadPCBs(CString csFileName);//从文件中加载要试验的进程信息void RemoveProcess(PCB* pPCB);//删除进程void DoSchedule();void RunOneTimeRange(PCB* pPCB,int nTime);//运行一个时间段void TreadWaittingQueue(PCB* pWaittingPCBs);//处理某个等待队列,适时将完成进程移出到后备就绪队列。

计算机操作系统时间片循环轮转算法

计算机操作系统时间片循环轮转算法

计算机操作系统时间片循环轮转算法实验报告书课程名:«计算机操作系统»题目:时间片循环轮转调度班级:软件081班学号:110831116姓名:陈点点(4) 处置器调度总是选择标志单元指示的进程运转。

由于本实验是模拟处置器调度的功用,所以,对被选中的进程并不实践的启动运转,而是执行:已运转时间+1来模拟进程的一次运转,表示进程曾经运转过一个单位的时间。

请留意:在实践的系统中,当一个进程被选中运转时,必需置上该进程可以运转的时间片值,以及恢复进程的现场,让它占有处置器运转,直到出现等候事情或运转满一个时间片。

在这时省去了这些任务,仅用〝已运转时间+1〞来表示进程曾经运转满一个时间片。

(5) 进程运转一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运转的进程。

同时,应判别该进程的要求运转时间与已运转时间,假定该进程的要求运转时间 已运转时间,那么表示它尚未执行完毕,应待到下一轮时再运转。

假定该进程的要求运转时间=已运转时间,那么表示它曾经执行完毕,应指点它的形状修正成〝完毕〞〔E〕且参与队列。

此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。

(6) 假定〝就绪〞形状的进程队列不为空,那么重复下面的〔4〕和〔5〕的步骤,直到一切的进程都成为〝完毕〞形状。

(7) 在所设计的顺序中应有显示或打印语句,能显示或打印每次选中进程的进程名以及运转一次后进程队列的变化。

(8) 为五个进程恣意确定一组〝要求运转时间〞,启动所设计的处置器调度顺序,显示或打印逐次被选中的进程名以及进程控制块的静态变化进程。

五、流程图与源顺序int ProcNum; // 总进程个数// 初始化就绪队列void InitPCB(Proc &H) {cout<<"请输入总进程个数: ";cin>>ProcNum; // 进程总个数int Num=ProcNum;H=(Proc)malloc(sizeof(PNode)); // 树立头节点H->next=NULL;Proc p=H; //定义一个指针cout<<"总进程个数为 "<<ProcNum<<" 个,请依次输入相应信息\n\n";while (Num--) {p=p->next=(Proc)malloc(sizeof(PNode));cout<<"进程名总运转时间已运转时间 :";cin>>p->name>>p->All_Time>>p->Runed_Time;p->state='R';p->next=NULL;}p->next=H->next;}//输入运转中的进程信息void DispInfo(Proc H) {Proc p=H->next;do {if (p->state != 'E') //假设该进程的形状不是End的话{cout<<"进程名:"<<p->name<<"\t总运转时间:"<<p->All_Time <<"\t已运转时间:"<<p->Runed_Time<<"\t形状:"<<p->state<<endl;p=p->next;}else p=p->next;} while (p != H->next); // 整个进程链条一直完整,只是形状位有差异}// 时间片轮转法void SJP_Simulator(Proc &H) {cout<<endl<<"-------------------START--------------------\n";int flag=ProcNum; // 记载剩余进程数int round=0; // 记载轮转数Proc p=H->next;while (p->All_Time > p->Runed_Time) { // 即未完毕的进程round++;cout<<endl<<"Round "<<round<<"--正在运转 "<<p->name<<" 进程"<<endl; p->Runed_Time++; // 更矫正在运转的进程的已运转时间DispInfo(H); // 输入此时为就绪形状的进程的信息if (p->All_Time == p->Runed_Time) { // 并判别该进程能否完毕p->state='E';flag--;cout<<p->name<<" 进程已运转完毕,进程被删除!\n";}p=p->next;while (flag && p->All_Time == p->Runed_Time)p=p->next; // 跳过先前已完毕的进程}cout<<endl<<"--------------------END---------------------\n";}void main() {Proc H;InitPCB(H); // 数据初始化DispInfo(H); // 输入此刻的进程形状SJP_Simulator(H); // 时间片轮转法system("pause");}六、测试数据与实验结果七、结果剖析与实验体会时间片轮转算法中,系统将一切的就绪顺序按先来先效劳的原那么排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。

时间片轮转算法

时间片轮转算法
b.改进设想:本实验较简单,但还不够完善,如未实现插入进程功能,即进程在运行过程中可以插入其他的进程再运行。还有未进行进程优先级判别,本实验默认进程的优先级按输入的先后顺序从大到小排列的,还有其他功能等,希望在以后的实验中逐步完善。
5、测试结果:
a.首先输出五个进程的初始状态
b.开始从进程Q1开始按时间片轮转运行进程,Q4先运行完成
printf("进程%s已经运行完成!\n\n",s->name);
s->flag=1;
}
s=s->next;
flag1=judge(s);
}
printf("--------------------------------------------\n");
}
void main(){
printf("Please enter process number\n");
c.接着Q1运行完成
d.接着Q5运行完成
e.再Q3运行完成
f.最后Q2运行完成
四、实验总结
因在早期的时间片轮转法中,系统将所有的就绪进程按照先来先服务的原则排成一个队列,每次调度是,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,调度程序停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。在时间片轮转算法中,时间片的大小对系统性能有很大的影响。如果选择很小的时间片将有利于短作业,因为它能较快地完成,但会频繁的发生中断、进程上下文的切换,从而增加系统的开销;反之,如果选择太长时间片,使得每个进程都能在一个时间片内完成,所以,一般定为时间片略大于一次典型地交互所需要的时间。

进程调度模拟设计.时间片轮转、优先级法

进程调度模拟设计.时间片轮转、优先级法

学号:课程设计进程调度模拟设计——题目时间片轮转、优先级法学院计算机科学与技术学院专业班级姓名指导教师吴利君2013 年 1 月16 日课程设计任务书学生姓名:指导教师:吴利君工作单位:计算机科学与技术学院题目: 进程调度模拟设计——时间片轮转、优先级法初始条件:1.预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.模拟进程调度,能够处理以下的情形:⑴能够选择不同的调度算法(要求中给出的调度算法);⑵能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;⑶根据选择的调度算法显示进程调度队列;⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。

2.设计报告内容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。

周2、周3:完成程序调试及测试。

周4、周5:验收、撰写课程设计报告。

(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日进程调度模拟设计——时间片轮转、优先级法一、需求分析无论是批处理系统、分时系统还是实时系统,用户进程数目一般都多余处理机数,这将直接导致用户进程相互争夺处理机。

另外,系统进程也同样需要使用处理机。

进程调度虽然是系统内部的低级调度,但进程调度算法的优劣直接影响作业调度的性能,因此一个好的调度策略对处理机的处理速度是至关重要的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

时间片轮转算法课程设计TYYGROUP system office room 【TYYUA16H-TYY-TYYYUA8Q8-一、实验目的本课程设计以Windows操作系统为实验平台,进行源代码分析和修改。

通过该课程设计,使学生掌握Windows操作系统各部分结构、实现机理和各种典型算法;系统地了解操作系统的设计和实现思路,运用内核开发环境实现对内核的修改,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。

二、实验内容1.分析设计内容,给出解决方案(要说明设计实现的原理,采用的数据结构)。

2.画出程序的基本结构框图和流程图。

3.对程序的每一部分要有详细的设计分析说明。

4.源代码格式要规范。

5.设计合适的测试用例,对得到的运行结果要有分析。

6.设计中遇到的问题,设计的心得体会。

7.按期提交完整的程序代码、可执行程序和课程设计报告。

三、实验步骤1、任务分析:时间片轮转的主要思想就是按顺序为每一个进程一次只分配一个时间片的时间。

算法要完成的功能就是将各个进程按照时间片轮转运行的动态过程显示出来。

时间片轮转算法的主要实现过程是首先为每一个进程创建一个进程控制块,定义数据结构,说明进程控制块所包含的内容,有进程名、进程所需运行时间、已运行时间和进程的状态以及指针的信息。

实现的过程即运用指针指向某一个进程,判断当前的进程是否是就绪状态“r”,如果是,则为该进程分配一个时间片,同时,已运行时间加一且要求运行的时间减一,如此循环执行,当某一个进程的所需要运行的时间减少至0时,则将该进程的状态设置为“e”。

然后,将指针指向下一个未运行完成的进程,重复判断,直至所有的进程都运行结束。

2、概要设计:(1)所用数据结构及符号说明typedef struct PCB{char name[10];先建立PCB的数据结构,为了便于正确输出,加上了进程结束标志flag。

输入进程信息(包括进程名和要求运行的时间),并为每个进程创建一个PCB并初始化形成一个循环链队列,用函数creatPCB()来实现。

b.建立函数judge()用来判断进程全部运行结束标志,即当所有进程的状态变为’e’(即完成状态)后,循环结束,表示所有进程都已运行成功。

c.建立时间片轮转算法creatProcess()对进程进行轮转运行,首先指针s指向第一个进程PCB,即s=front,判断该进程的状态是否为’r’(就绪状态),即if(s->condition == 'r'),若是则表示此进程尚未执行结束,则执行s->worked_time++且s->need_time--,if(s->need_time==0),则表示此进程已运行结束,将其状态置为结束,即s->condition='e',并根据状态位输出完成信息,且以后不会再运行此进程。

将指针指向下个进程,s=s->next,并判断所有进程是否已全部运行结束,没有则重复上面算法。

当所有进程的状态位都变成’e’表示所有进程运行完成,则循环结束。

d.建立主函数main(),输入进程数N,调用初始化循环链队列函数creatPCB()和时间片轮转算法creatProcess(N),每次选中进程的进程名以及运行一次后进程队列的变化,实现处理器的调度。

4、调试分析:a.调试过程中遇到的问题及解决方案开始运行到Q5运行完成后显示错误,如下图所示:原因:经检查程序发现语句if(s->condition=='e' ){printf("进程%s已经运行完成!\n\n",s->name);}有错误,因为当某个进程运行完成后,其状态标志已修改为’e’,所以再次循环运行未完成的进程时,当运行到此句时仍会将前面已完成的进程重新输出一遍完成信息,导致输出错误。

解决方案:为每个进程加上一个结束标志flag,并赋初值为0,当进程运行完成后,将flag改为1,再将后面输出改为if(s->condition=='e' || s->flag==0 ){printf("进程%s已经运行完成!\n\n",s->name);s->flag==0;},这样在前面进程运行完成输出后,后面再循环时就不会重新输出一遍了。

b.改进设想:本实验较简单,但还不够完善,如未实现插入进程功能,即进程在运行过程中可以插入其他的进程再运行。

还有未进行进程优先级判别,本实验默认进程的优先级按输入的先后顺序从大到小排列的,还有其他功能等,希望在以后的实验中逐步完善。

5、测试结果:a.首先输出五个进程的初始状态b.开始从进程Q1开始按时间片轮转运行进程,Q4先运行完成c.接着Q1运行完成d.接着Q5运行完成e.再Q3运行完成f.最后Q2运行完成四、实验总结因在早期的时间片轮转法中,系统将所有的就绪进程按照先来先服务的原则排成一个队列,每次调度是,把CPU分配给队首进程,并令其执行一个时间片。

当执行的时间片用完时,调度程序停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。

在时间片轮转算法中,时间片的大小对系统性能有很大的影响。

如果选择很小的时间片将有利于短作业,因为它能较快地完成,但会频繁的发生中断、进程上下文的切换,从而增加系统的开销;反之,如果选择太长时间片,使得每个进程都能在一个时间片内完成,所以,一般定为时间片略大于一次典型地交互所需要的时间。

在完成时间片轮转算法的实现过程中,我们遇到了一些问题,比如怎样运用循环队列,如何设计结构体等等,也积极配合并思考进行解决。

整体来说,我们的算法虽然实现了体现进程动态运行变化的过程,但是相对而言比较简单。

实验中,我们小组不断讨论对算法进行优化,使得运行结果看起来更容易理解,也达到了处理机调度的功能。

做实验让我们对于时间片轮转的思想理解的更加透彻,巩固了理论知识的学习。

实验心得体会:首先,我们认为这次课程设计是对学习《操作系统》的一次综合考察,锻炼我们综合分析问题、解决问题的能力。

初次得到课程设计的题目时,为程序本身的简单而窃喜过;实验过程中也出现了一些难题需要解决,为此去苦苦探索过。

课程设计期间,几乎有几天我们完全投入进去了,就像是在做一个相当重要的项目一样的感觉。

曾经跑过图书馆几次,只是为了一种新的想法得到实现,也曾多次登录网站浏览网页,为了弥补一些知识上的纰漏,为此曾洒下了真实的汗水。

当我们的想法得到实现,又学会了新的知识的时候,心中满是欣喜,或许这是实践出真知的真实验证,有付出就有回报的真实写照吧。

其次,我们感受了真诚的友谊。

在实验中,遇到的问题是多方面的,而且有那么一部分是以前学过的C问题,但是已经忘却或是以前没有真正的理解过。

但是你会发现就在你的身边,会有那么一批人在背后热心的帮助你,让你身处困境却感到无限希望。

这好像是人生的一种历程,风风雨雨中我们一起走过,然后为了一些坑坑洼洼彼此真诚的帮助过和无私的付出过。

团队的协作和彼此心的交流让我们彼此丰厚起来,这也是我们成长中必不可失的重要部分。

最后,我认识到了自己的不足。

平心而论,以前真的没有认真的学习过,即使是在听课,可是后来却没有对学习中出现的问题而仔细分析过。

得过且过,迷失了我前进的方向,而现在却又重新敞开了。

不论是以后的学习还是工作,我想这都是很重要的,我们需要不断进步的动力。

总的说来知识上的收获很是重要,精神上的丰收也是更加可喜的,让我知道了学无止境的道理。

我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。

挫折是一份财富,经历是一份拥有。

这次课程设计必将成为我人生旅途上一个非常美好的回忆。

五、源程序实验源程序如下:#include""#include""#include""#include""#define NULL 0typedef struct PCB{char name[10]; //进程名struct PCB *next; //链指针int need_time; //要求运行时间int worked_time; //已运行时间char condition; //进程状态,只有"就绪"和"结束"两种状态int flag; //进程结束标志}PCB;PCB *front,*rear;int N; //N为进程数void creatPCB(){ //为每个进程创建一个PCB并初始化形成一个循环链队列PCB *p,*l;l = (PCB *)malloc(sizeof(PCB));printf("请输入各进程名和要求运行时间\n");scanf("%s%d",l->name,&l->need_time);l->condition = 'r'; //进程初始状态为就绪l->worked_time = 0;l->next=NULL;l->flag=0;front=l;for(int i = 1;i < N ;i ++){p = (PCB *)malloc(sizeof(PCB));scanf("%s%d",p->name,&p->need_time);p->condition = 'r';p->worked_time = 0;p->flag=0;l->next = p;l=l->next;}rear=l;rear->next=front;}void output(){ //进程输出函数printf("进程名已运行时间需要时间状态\n");for(int j=1;j<=N;j++){printf(" %-4s\t %-4d\t %-4d\t%-c\n",front->name, front->worked_time, front->need_time, front->condition);front=front->next;}printf("\n");}int judge(PCB *p){ //判断所有进程运行结束int flag = 1;for(int i=0;i<N;i++){if(p->condition != 'e'){flag = 0;break;}p=p->next;}return flag;}void creatProcess(int n){ //时间片轮转算法PCB *s,*p;int i,j,flag1=0;s = (PCB *)malloc(sizeof(PCB));s=front;printf("\n--------------------------------------------\n");output();printf("请按任意键继续\n\n");getch(); //按任意键继续s=front;while(flag1 != 1){if(s->condition == 'r'){s->worked_time++;s->need_time--;if(s->need_time==0)s->condition='e';output();printf("请按任意键继续\n\n");getch();}if(s->condition=='e' && s->flag==0){printf("进程%s已经运行完成!\n\n",s->name);s->flag=1;}s=s->next;flag1=judge(s);}printf("--------------------------------------------\n"); }void main(){printf("请输入进程总数\n");scanf("%d",&N);creatPCB();creatProcess(N);}。

相关文档
最新文档