操作系统课程设计任务指导书

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

《操作系统原理》课程设计

--进程调度模拟程序

一、课程设计目的

《操作系统原理》是计算机科学与技术专业的一门专业核心课程,也是研究生入学考试中计算机专业综合中所涉及的内容。该课程理论性强,纯粹的理论学习相对枯燥乏味,不易理解。通过课程设计,可加强学生对原理知识的理解。

二、课程设计的任务和要求

本次课程设计的题目是,时间片轮转调度算法的模拟实现。要求在充分理解时间片轮转调度算法原理的基础上,编写一个可视化的算法模拟程序。

具体任务如下:

1、根据需要,合理设计PCB(进程控制块)结构,以适用于时间片轮转调度算法;

2、设计模拟指令格式,并以文件形式存储,程序能够读取文件并自动生成指令序列。

3、根据文件内容,建立模拟进程队列,并能采用时间片轮转调度算法对模拟进程进行调度。

任务要求:

1、进程的个数,进程的内容(即进程的功能序列)来源于一个进程序列描述文件。

2、需将调度过程输出到一个运行日志文件。

3、开发平台及语言不限。

4、要求设计一个Windows可视化应用程序。

三、模拟程序的描述:

模拟指令的格式:操作命令+操作时间

● C :表示在CPU上计算

●I :表示输入

●O :表示输出

●W :表示等待

●H :表示进程结束

操作时间代表该操作命令要执行多长时间。这里假设I/O设备的数量没有限制,I和O设备都只有一类。

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

例如,有一虚拟程序文件prc.txt描述如下:

P1

C10 // 在CPU上运算10个时间单位

I20 // 输入,占用20个时间单位

C40 // 在CPU上运算40个时间单位

I30 // 输入,占用30个时间单位

C20 // 在CPU上运算20个时间单位

O30 // 输出,占用30个时间单位

H00 // 进程结束

P2

I10

C50

O20

H00

P3

C10

I20

W20 // 等待20个时间单位

C40

O10

H00................

四、实验报告要求

除了编程实现设计的要求,在运行调试完成后,要书写出课程设计报告,总结归纳课设的各个方面,锻炼自己实践和总结报告的能力。课设报告正文部分不得少于5000字,要图文并茂。

课设报告的封面封底及参考目录见“数据库课程设计报告封面目录封底.doc”。

五、参考资料

1. 汤小丹.计算机操作系统[M]

2. 严蔚敏.数据结构[M]

六、部份参考代码及界面

进程队列及结构图(参考):

PCB PCB

……

PCB

……

图1 PCB 结构及队列模型

1. C++参考类:

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)

{

//empty

m_pInstructionList=pInstruction;

}

else

{

//more than one node

pTempInstruction = 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;//后备就绪队列

相关文档
最新文档