学年论文(课程设计) 操作系统课程设计 学 院 数学与计算机学院 学科门类 工 学 专 业 网络工程 学 号 姓 名 指导教师
年 月
日 题目:
河北大学2010届本科生毕业论文(设计)
河北大学学年论文(课程设计)任务书
(指导教师用表)
装
订
线 指导教师签字:
系主任签字:
主管教学院长签字:
装
订
线河北大学2010届本科生毕业论文(设计) 河北大学学年论文(课程设计)成绩评定表 学院:数学与计算机学院
摘 要
此系统实现了存储管理、设备管理和进程管理。
存储管理部分主要实现主存空间的分配和回收。存储管理采用可移动的可变分区存储管理方式。采用数组来模拟主存,大小为512个字节。
设备管理主要包括设备的分配和回收。模拟系统中有A 、B 、C 三种独占型设备,A 设备3个,B 设备2个,C 设备1个。设备分配时采用采用先来先服务策略。设备回收时唤醒等待设备的进程。
进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。其中硬件中的中央处理器用不断循环的函数CPU( )模拟,重要寄存器(如:程序状态寄存器PSW 、指令寄存器IR )用全局变量模拟,中断的发现是在函数CPU 中加检测PSW 的方式来模拟,时钟的模拟通过timer 控件实现。进程控制块的模拟通过数组,本系统最多容纳10个。进程调度时采用时间片轮转调度算法,时间片为5。
关键词:存储管理 设备管理 进程管理 时间片
ABSTRACT
The system has storage management, equipment management and process management. The storage management has achieved the allocation and recovery of the main memory space. Variable storage management is used as storage management .We simulate the main memory by array, whose size is 512 bytes.
The device management, including the distribution and recovery of devicet. We simulate three devices ,A,B,C. the numbers of them are 3,2,1. The distribution of device used to adopt first-come first-service strategy. It awakes the blocking process when the device is recycled.
The process management, including scheduling ,creating revocation ,blocking and waking up the process, the realization of the interruption.We simulate the central processing unit by the cycling function named CPU(),simulate the important register by global variable, simulate the recovering of interruption by checking PSW in the function of CPU(),simulate the clock by the timer control. The simulation of the process control block by array, whose number is up to 10. When the scheduling of the process happens, we use the algorithm of time piece rotation scheduling, and the time piece is 5.
Key words: storage device process time
目 录
一 引言 . ....................................................................................................................................... 1
1.1 性质................................................................................................................................ 1
1.2教学目的........................................................................................................................ 1
1.3任务和要求 . .................................................................................................................. 1
1.4意义 . ................................................................................................................................ 1
1.5论文结构安排 .............................................................................................................. 1
二 系统分析与设计 ............................................................................................................ 2
2.1. 存储管理的要求 ........................................................................................................ 2
2.2设备管理的要求.......................................................................................................... 2
2.3进程管理的要求.......................................................................................................... 2
2.3.1进程控制块 ....................................................................................................... 2
2.3.2进程调度 . ........................................................................................................... 2
2.3.3进程创建 . ........................................................................................................... 3
2.3.4进程撤销 . ........................................................................................................... 3
2.3.5进程阻塞 . ........................................................................................................... 3
2.3.6进程的唤醒 ....................................................................................................... 3
2.3.7硬件工作的模拟 . ............................................................................................. 4
三 系统实现 . ............................................................................................................................. 4
3.1全局变量........................................................................................................................ 4
3.2内存分配........................................................................................................................ 5
3.3内存回收........................................................................................................................ 7
3.4创建进程........................................................................................................................ 8
3.5撤销进程...................................................................................................................... 10
3.6进程调度...................................................................................................................... 11
3.7设备申请...................................................................................................................... 12
3.8进程阻塞...................................................................................................................... 15
3.9进程唤醒...................................................................................................................... 17
3.10 CPU函数 ................................................................................................................... 19
四 结束语 . ................................................................................................................................ 25
一 引言
1.1 性质
操作系统是计算机科学与技术专业的主要专业基础课和主干课。操作系统对计算机系统资源实施管理,是所有其他软件与计算机硬件的唯一接口,所有用户在使用计算机时都要得到操作系统提供的服务。本课程使学生掌握操作系统的基本概念、基本原理、设计方法和实现技术,具有初步分析实际操作系统的能力 ,训练分析和解决实际问题能力,为其今后在相关领域开展工作打下坚实的基础。
1.2教学目的
本科程通过模拟操作系统原理的实现,应使学生加深对操作系统工作原理和操作系统实现方法的理解,系统科学地受到分析问题和解决问题的训练,提高运用理论知识解决实际问题的能力。为学生从事科学研究和独立负担计算机及其应用方面的工作打好扎实的基础。
1.3任务和要求
此系统为基于时间片轮转调度算法的进程管理系统,主要实现存储管理,设备管理和进程管理。存储管理部分主要实现主存空间的分配和回收、存储保护。设备管理主要包括设备的分配和回收。进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。
1.4意义
通过本模拟系统的设计,可以加深学生对操作系统的原理的理解,明白操作系统的各项功能的具体实现和具体操作,提高学生的动手能力。
1.5论文结构安排
第二章为系统分析与设计,写出系统要求,分析出包含哪些功能模块、每个模块的计划采用的实现方法和原理。
第三章为系统实现,写出主要模块的实现,包括全局变量说明和主要功能的实现流程。
第四章为结束语,总结课程设计的体会。
二 系统分析与设计
2.1. 存储管理的要求
存储管理部分主要实现主存空间的分配和回收、存储保护。
模拟系统中,内存部分分为两部分,一部分是系统区,这里只存放进程控制块,一部分是用户区,这里主要是对用户区的管理。
系统区包括pcb 区域、主存空间分配表。
存储管理采用可移动的可变分区存储管理方式。
采用数组来模拟主存的用户区,每个数组元素占用一个字节。实验中主存大小为512个字节
2.2设备管理的要求
设备管理主要包括设备的分配和回收。
模拟系统中有A 、B 、C 三种独占型设备,A 设备3个,B 设备2个,C 设备1个。设备分配时,采用先来先服务策略。回收设备后,要注意唤醒等待设备的进程。
2.3进程管理的要求
进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。
2.3.1进程控制块
进程控制块内容包括进程标识符、主要寄存器内容、进程状态、阻塞原因等等。本模拟系统最多容纳10个进程块。pcb 区域用数组模拟。
进程控制块根据内容的不同组成不同的队列,空白进程控制块链、就绪队列和阻塞队列,正在运行的进程只有一个,系统初始时只有空白进程控制块链。
2.3.2进程调度
采用时间片轮转调度算法,时间片为5。
进程调度函数的主要工作是:
第一步,将正在运行的进程保存在该进程对应进程控制块中;
第二步,从就绪队列中选择一个进程;
第三步,将这个进程中进程控制块中记录的各寄存器内容恢复到CPU 各个寄存器内。
2.3.3进程创建
进程创建creat 的主要工作是:
第一步,申请空白进程控制块;
第二步,申请主存空间,申请成功,装入主存;
第三步,初始化进程控制块;
第四步,将进程链入就绪队列,根据情况决定是否转向进程调度。
2.3.4进程撤销
进程撤销destory 的主要工作是:
第一步,回收进程所占内存资源;
第二步,回收进程控制块;
第三步,在屏幕上显示进程执行结果,进程撤销
2.3.5进程阻塞
进程阻塞block 的主要工作是:
第一步,保存运行进程的CPU 现场;
第二步,修改进程状态;
第三步,将进程链入对应的阻塞队列,然后转向进程调度。
2.3.6进程的唤醒
进程唤醒的主要工作是
第一步,将进程由阻塞队列中摘下;
第二步,修改进程状态为就绪;
第三步,链入就绪队列,根据情况决定是否转向进程调度。
2.3.7硬件工作的模拟
硬件工作的模拟包括中央处理器的模拟、主要寄存器的模拟、中断的模拟和时钟的模拟四方面。
①中央处理器的模拟。用函数CPU( )(该函数不能有参数) 模拟中央处理器。该函数主要负责解释“可执行文件”中的命令。如:给x 赋值x=?;x自加x++;x自减x--; 申请设备和时间!??; 程序结束end ;
CPU 只能解释指令寄存器IR 中的指令。一个进程的运行时要根据进程执行的位置,将对应的指令存放到指令寄存器中。
②主要寄存器的模拟用全局变量模拟重要寄存器,如cpu 重要寄存器,程序状态寄存器PSW 、指令寄存器IR ,程序计数器PC ,数据缓冲寄存器DR 等。
③中断的模拟。中断的发现应该是硬件的工作,这里在函数CPU 中加检测PSW 的方式来模拟。在CPU ()函数中,每执行一条指令之前,先检查PSW ,判断有无中断,若有进行中断处理,然后再运行解释指令。CPU 函数应该不断循环执行的。
模拟中断的种类有如下几种:程序结束、时间片到、I/O中断。程序结束(执行指令end 形成的中断,软中断):将结果写入文件out ,其中包括文件路径名和x 的值,调用进程撤销原语撤销进程,然后进行进程调度;I/O中断(设备完成输入输出):将输入输出完成的进程唤醒,将等待该设备的一个进程同时唤醒。时钟中断:进程时间片用完,转为就绪,重新进程调度。
④时钟的模拟。系统中的绝对时钟和相对时钟用全局变量模拟。系统时钟用来记录开机以后的时间。
这里的系统时钟并不是计算机的真正的时钟,这里所说的时间只是一个单位,例如使用vb 中的时钟控件实现,每触发一次timer 事件,绝对时钟增1,表示增加一个时间单位,绝对时钟减1。
三 系统实现
3.1全局变量
系统代码中定义了一些全局变量 public struct PCB {
public int ProcessID; //进程块的编号(0-9) public string ProcessName; //使用该进程块的进程名 public int PageAdress; //页表的首地址
public int Sum; //页表的长度 public int PC; //各个寄存器的状态 public string IR; public int DR;
public Interrupt PSW;
public int Pri; //优先级
public int WaitTime; //要使用设备多长时间 public int GetDeviceTime; //获得设备的时间 public int ExecuteTime; //开始执行的时间
public DeviceType NeedDevice; //申请失败的设备类型 public DeviceType HaveDevice; //正在使用的设备类型 public int DN; //使用的是哪个设备 public string BlockReason; //阻塞的原因 public int Next; }
class CPU {
public int PC; public int DR;
public string IR; public Interrupt PSW; public Interrupt PSW1;
public PCB[] PCBArray=new PCB[10]; public DateTime XTTime; public int XDTime; public int White; public int Ready; public int Block; public int Execute;
private DeviceType type; private int time;
public OS.ClassFolder.MainRam ram = new MainRam(); public OS.ClassFolder.Device Dev = new Device();
3.2内存分配
可变分区方式的内存分配流程如图3-1所示。
图3-1 可变分区最优分配算法流程图
3.3内存回收
归还内存区域的流程如图3-3所示。
图3-3 可变分区回收流程图
内存回收后颜色恢复。如图3-4所示。
图3-4 内存回收后的界面显示
3.4创建进程
当执行可执行文件时,把指令传过来,调用creat 函数。 //Creat函数,创建进程 //
public void Creat(string Name,string str) {
//
//申请PCB ,a>10,则申请失败
//
int a = GetOneFromWhite(); int b;
if (str.Length > 0) {
int sum = (str.Length + 15) / 16; if (a
if (ram.Judge(sum) == true) {
//
//分配内存并加载到内存 //
b = ram.Allocate(sum); ram.LoadContent(str, b); //
//初始化PCB //
PCBArray[a].ProcessName = Name; PCBArray[a].PageAdress = b; PCBArray[a].Sum = sum; PCBArray[a].PC = 0; PCBArray[a].IR = ""; PCBArray[a].DR = 0;
PCBArray[a].PSW = Interrupt.No; PCBArray[a].WaitTime = -10;
PCBArray[a].Pri = 1024 / str.Length; PCBArray[a].ExecuteTime = 0;
PCBArray[a].NeedDevice = DeviceType.no; PCBArray[a].HaveDevice = DeviceType.no; PCBArray[a].GetDeviceTime = 0; PCBArray[a].DN = -1;
PCBArray[a].BlockReason = ""; InsertOneToReady(a); //
//是否转向进程调度 //
int c = JudgeAttemper(); if (c
Attemper(c); }
} else
{
InsertOneToWhite(a);
MessageBox.Show("内存不足或文件太长,创建进程失败", "消息", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else {
MessageBox.Show("PCB块不足,创建进程失败", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information); } } else {
MessageBox.Show("文件为空, 不能创建进程"," 错误",MessageBoxButtons.OK,MessageBoxIcon.Error); } }
3.5撤销进程
进程结束时,即读到end 指令后,传递指向当前正在运行的指针,撤销当前进程。 //Destroy函数,撤销程序 //
public void Destory(int a) {
//
//回收内存 //
int p = PCBArray[a].PageAdress; int sum = PCBArray[a].Sum; ram.DeAllocate(p,sum); //
//回收PCB 块 //
InsertOneToWhite(a); Execute = 10; //
//显示结果 // // // //
}
3.6进程调度
当前一进程结束时,CPU 会调度就绪队列中的进程。
//判断是否需要进行进程的调度,若需要则返回进程块号(0-9),不需要则返回10
//
public int JudgeAttemper() {
//
// //
int k;
if (Ready
int p = Ready;
int a = PCBArray[Ready].Pri;
k = Ready; //块号
while (PCBArray[p].Next
if (PCBArray[PCBArray[p].Next].Pri > a) {
a = PCBArray[PCBArray[p].Next].Pri; k = PCBArray[p].Next; }
p = PCBArray[p].Next; } } else {
return 10; } //
// //
if (Execute
if (PCBArray[k].Pri > PCBArray[Execute].Pri) {
选出就绪链表中优先级最高 跟执行链表内的PCB 块进行比较 优先级最高的
return k; } else {
return 10; } } else {
return k; } } //
//进程调度函数 //
public void Attemper(int a) {
//
//保护CPU 现场 //
if (Execute
PCBArray[Execute].PC = PC; PCBArray[Execute].IR = IR; PCBArray[Execute].DR = DR; InsertOneToReady(Execute); } //
//选择一个进程,初始化CPU 中的寄存器 //
GetOneFromReady(a); Execute = a;
PC = PCBArray[a].PC; IR = PCBArray[a].IR; DR = PCBArray[a].DR;
}
3.7设备申请
进程的指令申请设备时,读到进程所要申请的设备,调用AppEquip 函数 public void AppEquip(char equipment, int r, int t)
{
int i;
for (i = 0; i
if (eq[i].name == equipment && eq[i].flag == 0) {
eq[i].flag = 1; pcb[r].eq = equipment; if (timer4.Enabled == false) {
timer4.Enabled = true;//设备时间片开始执行 }
if (i == 0) //设备区域显示~ {
ETIME[0] = t;
textBox001.Text = pcb[r].name.ToString(); textBox011.Text = ETIME[0].ToString(); }
else if (i == 1) {
ETIME[1] = t;
textBox002.Text = pcb[r].name.ToString(); textBox012.Text = ETIME[1].ToString(); }
else if (i == 2) {
ETIME[2] = t;
textBox003.Text = pcb[r].name.ToString(); textBox013.Text = ETIME[2].ToString(); }
else if (i == 3) {
ETIME[3] = t;
textBox004.Text = pcb[r].name.ToString(); textBox014.Text = ETIME[3].ToString(); }
else if (i == 4) {
ETIME[4] = t;
textBox005.Text = pcb[r].name.ToString(); textBox015.Text = ETIME[4].ToString(); }
else if (i == 5) {
ETIME[5] = t;
textBox006.Text = pcb[r].name.ToString(); textBox016.Text = ETIME[5].ToString(); } return; } }
//没有申请到设备,调用阻塞函数 block(r, equipment);
}
申请设备到设备后设备区域会显示相应设备的占用进程名和占用时间。如图3-6所示。
图3-6 申请设备后的界面显示
3.8进程阻塞
进程申请设备不够时,则阻塞该进程。 //BlockProcess函数,阻塞进程 //
public void BlockProcess(int a,DeviceType b,int time) {
//
//保护CPU 现场 //
PCBArray[a].PC = PC; PCBArray[a].IR = IR; PCBArray[a].DR = DR; //
//判断申请设备是否成功,根据不同情况填写BlockReason 项 //
bool d = Dev.JudgeDevice(b); if (d == false) {
PCBArray[a].NeedDevice = b;
PCBArray[a].HaveDevice = DeviceType.no;
PCBArray[a].BlockReason = "申请" + b + "设备失败"; PCBArray[a].PC = PCBArray[a].PC - 4; } else {
PCBArray[a].DN = Dev.Allocate(b); PCBArray[a].HaveDevice = b;
PCBArray[a].NeedDevice = DeviceType.no; PCBArray[a].GetDeviceTime = XDTime; PCBArray[a].WaitTime = time;
PCBArray[a].BlockReason = "等待IO 输入输出"; if (DeviceStateChange != null) {
DeviceStateChangeEventArgs e=new DeviceStateChangeEventArgs();
e.DN = PCBArray[a].DN;
e.type = b;
e.processname = PCBArray[a].ProcessName; e.needtime = time; e.Atime = XDTime;
DeviceStateChange(null,e); } } //
//修改进程状态 //
InsertOneToBlock(a); Execute = 10; //
//转向进程调度 //
int c = JudgeAttemper(); if (c
Attemper(c); }
}
由于缺少设备进程被阻塞后,在阻塞队列区域显示阻塞的进程名和阻塞原因。如图3-7所示。
图3-7 进程阻塞后的界面显示
3.9进程唤醒
占有某设备的进程归还设备时,要唤醒阻塞队列中等待该设备的进程
//WakeUp函数,唤醒进程 //
public void WakeUp(int ID,DeviceType device) {
//
//唤醒自己 //
int d = Block; if (Block == ID) {
Block = PCBArray[ID].Next; InsertOneToReady(ID); } else {
while (PCBArray[d].Next
if (PCBArray[d].Next == ID) {
PCBArray[d].Next = PCBArray[ID].Next; InsertOneToReady(ID); break; }
d = PCBArray[d].Next; } } //
//检查第一个节点 //
while(Block
int h = Block;
Block = PCBArray[h].Next; InsertOneToReady(h); } //
//检查其他节点 //
if(Block
int a = Block;
while (PCBArray[a].Next
if (PCBArray[PCBArray[a].Next].NeedDevice == device) {
int h = PCBArray[a].Next;
PCBArray[a].Next = PCBArray[PCBArray[a].Next].Next; InsertOneToReady(h); } else {
a = PCBArray[a].Next; } } }
int c = JudgeAttemper(); if (c
Attemper(c); } } //
//判断是否需要进行进程的调度,若需要则返回进程块号(0-9),不需要则返回10
//
public int JudgeAttemper() {
//
//选出就绪链表中优先级最高 //
int k;
if (Ready
int p = Ready;
int a = PCBArray[Ready].Pri;
k = Ready; //优先级最高的块号
while (PCBArray[p].Next
if (PCBArray[PCBArray[p].Next].Pri > a) {
a = PCBArray[PCBArray[p].Next].Pri; k = PCBArray[p].Next; }
p = PCBArray[p].Next; } } else {
return 10; } //
//跟执行链表内的PCB 块进行比较 //
if (Execute
if (PCBArray[k].Pri > PCBArray[Execute].Pri) {
return k; } else {
return 10; } } else {
return k; } }
3.10 CPU函数
public void cpu() {
if (true) {
switch (PSW)
{
case Interrupt.End: {
//
//写入out 文件 //
//
//撤销进程,进行进程调度 //
Destory(Execute);
int a = JudgeAttemper(); if (a
Attemper(a); }
PSW = Interrupt.No; break; }
case Interrupt.IO: {
BlockProcess(Execute,type,time); PSW = Interrupt.No; break; } default: {
break; } }
switch (PSW1) {
case Interrupt.IO: {
int b = Block; while (b
if (XDTime - PCBArray[b].GetDeviceTime - 1 == PCBArray[b].WaitTime)
{
Dev.DeAllocate(PCBArray[b].HaveDevice, PCBArray[b].DN);
WakeUp(b, PCBArray[b].HaveDevice); PCBArray[b].DN = -1;
PCBArray[b].GetDeviceTime = 0;
PCBArray[b].HaveDevice = DeviceType.no; PCBArray[b].WaitTime = -10; }
b = PCBArray[b].Next; }
PSW1 = Interrupt.No; break; } default: {
break; } }
if (Execute
IR = ram.SendToIR(PCBArray[Execute].PageAdress, PC); PC = PC + 4;
bool str = ram.JudgeIR(IR); if (str == true) {
switch (IR[1]) {
case '=': {
DR = Convert.ToInt32(IR[2].ToString()); break; }
case '+': {
DR++; break; }
case '-': {
DR--; break; }
case 'a': case 'A': {
type=DeviceType.a;
time=Convert.ToInt32(IR[2].ToString()); PSW = Interrupt.IO;
break; }
case 'b': case 'B': {
type = DeviceType.b;
time = Convert.ToInt32(IR[2].ToString());
PSW = Interrupt.IO; break; }
case 'c': case 'C': {
type = DeviceType.c;
time = Convert.ToInt32(IR[2].ToString()); PSW = Interrupt.IO; break; }
case 'n': {
PSW = Interrupt.End; break; } }
PCBArray[Execute].ExecuteTime++; if (FinishIR != null) {
EventArgs e = new EventArgs(); FinishIR(null, e); } } else {
Destory(Execute);
int b = JudgeAttemper(); if (b
Attemper(b); }
if (ErrorIR != null) {
EventArgs e = new EventArgs(); ErrorIR(null,e); }
} } else {
//
//do nothing //
if (this.ExecuteIsWhite != null) {
EventArgs e = new EventArgs(); ExecuteIsWhite(null,e); } }
int k = Block; while (k
if (XDTime - PCBArray[k].GetDeviceTime == PCBArray[k].WaitTime) {
PSW1 = Interrupt.IO; }
k = PCBArray[k].Next; }
if (QueueChange != null) {
EventArgs e = new EventArgs(); QueueChange(null, e); }
XDTime++; IR = ""; } } } }
整体界面显示如图3-11所示。
图3-11 系统整体界面
四 结束语
通过操作系统课程设计,我更加明白了操作系统内部的工作原理,能够更清楚的理解一些操作的原因,理解了操作系统的实现方法,明白了遇到问题时应该系统的分析,运用自己学过的理论知识来解决问题,而不是马上着手进行设计。另外,遇到问题时,应该思考一下问题出现在什么地方,不能漫无目的的查找错误,思考应该全面一些,想到会出现的种种情况,系统分析后再改变代码。遇到原理不理解的地方应该查找资料,把原理弄明白了才可以设计好程序。
参考文献
[1] 王煜,张明,刘振鹏. 操作系统(第二版). 北京:中国铁道出版社, 2007
[2] 王煜,张明,刘振鹏. 操作系统习题解答与实验指导. 北京:中国铁道出版社, 2007
[3] 万科,覃剑. Visual C# .NET程序设计基础与上机指导. 北京:清华大学出版社, 2007
学年论文(课程设计) 操作系统课程设计 学 院 数学与计算机学院 学科门类 工 学 专 业 网络工程 学 号 姓 名 指导教师
年 月
日 题目:
河北大学2010届本科生毕业论文(设计)
河北大学学年论文(课程设计)任务书
(指导教师用表)
装
订
线 指导教师签字:
系主任签字:
主管教学院长签字:
装
订
线河北大学2010届本科生毕业论文(设计) 河北大学学年论文(课程设计)成绩评定表 学院:数学与计算机学院
摘 要
此系统实现了存储管理、设备管理和进程管理。
存储管理部分主要实现主存空间的分配和回收。存储管理采用可移动的可变分区存储管理方式。采用数组来模拟主存,大小为512个字节。
设备管理主要包括设备的分配和回收。模拟系统中有A 、B 、C 三种独占型设备,A 设备3个,B 设备2个,C 设备1个。设备分配时采用采用先来先服务策略。设备回收时唤醒等待设备的进程。
进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。其中硬件中的中央处理器用不断循环的函数CPU( )模拟,重要寄存器(如:程序状态寄存器PSW 、指令寄存器IR )用全局变量模拟,中断的发现是在函数CPU 中加检测PSW 的方式来模拟,时钟的模拟通过timer 控件实现。进程控制块的模拟通过数组,本系统最多容纳10个。进程调度时采用时间片轮转调度算法,时间片为5。
关键词:存储管理 设备管理 进程管理 时间片
ABSTRACT
The system has storage management, equipment management and process management. The storage management has achieved the allocation and recovery of the main memory space. Variable storage management is used as storage management .We simulate the main memory by array, whose size is 512 bytes.
The device management, including the distribution and recovery of devicet. We simulate three devices ,A,B,C. the numbers of them are 3,2,1. The distribution of device used to adopt first-come first-service strategy. It awakes the blocking process when the device is recycled.
The process management, including scheduling ,creating revocation ,blocking and waking up the process, the realization of the interruption.We simulate the central processing unit by the cycling function named CPU(),simulate the important register by global variable, simulate the recovering of interruption by checking PSW in the function of CPU(),simulate the clock by the timer control. The simulation of the process control block by array, whose number is up to 10. When the scheduling of the process happens, we use the algorithm of time piece rotation scheduling, and the time piece is 5.
Key words: storage device process time
目 录
一 引言 . ....................................................................................................................................... 1
1.1 性质................................................................................................................................ 1
1.2教学目的........................................................................................................................ 1
1.3任务和要求 . .................................................................................................................. 1
1.4意义 . ................................................................................................................................ 1
1.5论文结构安排 .............................................................................................................. 1
二 系统分析与设计 ............................................................................................................ 2
2.1. 存储管理的要求 ........................................................................................................ 2
2.2设备管理的要求.......................................................................................................... 2
2.3进程管理的要求.......................................................................................................... 2
2.3.1进程控制块 ....................................................................................................... 2
2.3.2进程调度 . ........................................................................................................... 2
2.3.3进程创建 . ........................................................................................................... 3
2.3.4进程撤销 . ........................................................................................................... 3
2.3.5进程阻塞 . ........................................................................................................... 3
2.3.6进程的唤醒 ....................................................................................................... 3
2.3.7硬件工作的模拟 . ............................................................................................. 4
三 系统实现 . ............................................................................................................................. 4
3.1全局变量........................................................................................................................ 4
3.2内存分配........................................................................................................................ 5
3.3内存回收........................................................................................................................ 7
3.4创建进程........................................................................................................................ 8
3.5撤销进程...................................................................................................................... 10
3.6进程调度...................................................................................................................... 11
3.7设备申请...................................................................................................................... 12
3.8进程阻塞...................................................................................................................... 15
3.9进程唤醒...................................................................................................................... 17
3.10 CPU函数 ................................................................................................................... 19
四 结束语 . ................................................................................................................................ 25
一 引言
1.1 性质
操作系统是计算机科学与技术专业的主要专业基础课和主干课。操作系统对计算机系统资源实施管理,是所有其他软件与计算机硬件的唯一接口,所有用户在使用计算机时都要得到操作系统提供的服务。本课程使学生掌握操作系统的基本概念、基本原理、设计方法和实现技术,具有初步分析实际操作系统的能力 ,训练分析和解决实际问题能力,为其今后在相关领域开展工作打下坚实的基础。
1.2教学目的
本科程通过模拟操作系统原理的实现,应使学生加深对操作系统工作原理和操作系统实现方法的理解,系统科学地受到分析问题和解决问题的训练,提高运用理论知识解决实际问题的能力。为学生从事科学研究和独立负担计算机及其应用方面的工作打好扎实的基础。
1.3任务和要求
此系统为基于时间片轮转调度算法的进程管理系统,主要实现存储管理,设备管理和进程管理。存储管理部分主要实现主存空间的分配和回收、存储保护。设备管理主要包括设备的分配和回收。进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。
1.4意义
通过本模拟系统的设计,可以加深学生对操作系统的原理的理解,明白操作系统的各项功能的具体实现和具体操作,提高学生的动手能力。
1.5论文结构安排
第二章为系统分析与设计,写出系统要求,分析出包含哪些功能模块、每个模块的计划采用的实现方法和原理。
第三章为系统实现,写出主要模块的实现,包括全局变量说明和主要功能的实现流程。
第四章为结束语,总结课程设计的体会。
二 系统分析与设计
2.1. 存储管理的要求
存储管理部分主要实现主存空间的分配和回收、存储保护。
模拟系统中,内存部分分为两部分,一部分是系统区,这里只存放进程控制块,一部分是用户区,这里主要是对用户区的管理。
系统区包括pcb 区域、主存空间分配表。
存储管理采用可移动的可变分区存储管理方式。
采用数组来模拟主存的用户区,每个数组元素占用一个字节。实验中主存大小为512个字节
2.2设备管理的要求
设备管理主要包括设备的分配和回收。
模拟系统中有A 、B 、C 三种独占型设备,A 设备3个,B 设备2个,C 设备1个。设备分配时,采用先来先服务策略。回收设备后,要注意唤醒等待设备的进程。
2.3进程管理的要求
进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。
2.3.1进程控制块
进程控制块内容包括进程标识符、主要寄存器内容、进程状态、阻塞原因等等。本模拟系统最多容纳10个进程块。pcb 区域用数组模拟。
进程控制块根据内容的不同组成不同的队列,空白进程控制块链、就绪队列和阻塞队列,正在运行的进程只有一个,系统初始时只有空白进程控制块链。
2.3.2进程调度
采用时间片轮转调度算法,时间片为5。
进程调度函数的主要工作是:
第一步,将正在运行的进程保存在该进程对应进程控制块中;
第二步,从就绪队列中选择一个进程;
第三步,将这个进程中进程控制块中记录的各寄存器内容恢复到CPU 各个寄存器内。
2.3.3进程创建
进程创建creat 的主要工作是:
第一步,申请空白进程控制块;
第二步,申请主存空间,申请成功,装入主存;
第三步,初始化进程控制块;
第四步,将进程链入就绪队列,根据情况决定是否转向进程调度。
2.3.4进程撤销
进程撤销destory 的主要工作是:
第一步,回收进程所占内存资源;
第二步,回收进程控制块;
第三步,在屏幕上显示进程执行结果,进程撤销
2.3.5进程阻塞
进程阻塞block 的主要工作是:
第一步,保存运行进程的CPU 现场;
第二步,修改进程状态;
第三步,将进程链入对应的阻塞队列,然后转向进程调度。
2.3.6进程的唤醒
进程唤醒的主要工作是
第一步,将进程由阻塞队列中摘下;
第二步,修改进程状态为就绪;
第三步,链入就绪队列,根据情况决定是否转向进程调度。
2.3.7硬件工作的模拟
硬件工作的模拟包括中央处理器的模拟、主要寄存器的模拟、中断的模拟和时钟的模拟四方面。
①中央处理器的模拟。用函数CPU( )(该函数不能有参数) 模拟中央处理器。该函数主要负责解释“可执行文件”中的命令。如:给x 赋值x=?;x自加x++;x自减x--; 申请设备和时间!??; 程序结束end ;
CPU 只能解释指令寄存器IR 中的指令。一个进程的运行时要根据进程执行的位置,将对应的指令存放到指令寄存器中。
②主要寄存器的模拟用全局变量模拟重要寄存器,如cpu 重要寄存器,程序状态寄存器PSW 、指令寄存器IR ,程序计数器PC ,数据缓冲寄存器DR 等。
③中断的模拟。中断的发现应该是硬件的工作,这里在函数CPU 中加检测PSW 的方式来模拟。在CPU ()函数中,每执行一条指令之前,先检查PSW ,判断有无中断,若有进行中断处理,然后再运行解释指令。CPU 函数应该不断循环执行的。
模拟中断的种类有如下几种:程序结束、时间片到、I/O中断。程序结束(执行指令end 形成的中断,软中断):将结果写入文件out ,其中包括文件路径名和x 的值,调用进程撤销原语撤销进程,然后进行进程调度;I/O中断(设备完成输入输出):将输入输出完成的进程唤醒,将等待该设备的一个进程同时唤醒。时钟中断:进程时间片用完,转为就绪,重新进程调度。
④时钟的模拟。系统中的绝对时钟和相对时钟用全局变量模拟。系统时钟用来记录开机以后的时间。
这里的系统时钟并不是计算机的真正的时钟,这里所说的时间只是一个单位,例如使用vb 中的时钟控件实现,每触发一次timer 事件,绝对时钟增1,表示增加一个时间单位,绝对时钟减1。
三 系统实现
3.1全局变量
系统代码中定义了一些全局变量 public struct PCB {
public int ProcessID; //进程块的编号(0-9) public string ProcessName; //使用该进程块的进程名 public int PageAdress; //页表的首地址
public int Sum; //页表的长度 public int PC; //各个寄存器的状态 public string IR; public int DR;
public Interrupt PSW;
public int Pri; //优先级
public int WaitTime; //要使用设备多长时间 public int GetDeviceTime; //获得设备的时间 public int ExecuteTime; //开始执行的时间
public DeviceType NeedDevice; //申请失败的设备类型 public DeviceType HaveDevice; //正在使用的设备类型 public int DN; //使用的是哪个设备 public string BlockReason; //阻塞的原因 public int Next; }
class CPU {
public int PC; public int DR;
public string IR; public Interrupt PSW; public Interrupt PSW1;
public PCB[] PCBArray=new PCB[10]; public DateTime XTTime; public int XDTime; public int White; public int Ready; public int Block; public int Execute;
private DeviceType type; private int time;
public OS.ClassFolder.MainRam ram = new MainRam(); public OS.ClassFolder.Device Dev = new Device();
3.2内存分配
可变分区方式的内存分配流程如图3-1所示。
图3-1 可变分区最优分配算法流程图
3.3内存回收
归还内存区域的流程如图3-3所示。
图3-3 可变分区回收流程图
内存回收后颜色恢复。如图3-4所示。
图3-4 内存回收后的界面显示
3.4创建进程
当执行可执行文件时,把指令传过来,调用creat 函数。 //Creat函数,创建进程 //
public void Creat(string Name,string str) {
//
//申请PCB ,a>10,则申请失败
//
int a = GetOneFromWhite(); int b;
if (str.Length > 0) {
int sum = (str.Length + 15) / 16; if (a
if (ram.Judge(sum) == true) {
//
//分配内存并加载到内存 //
b = ram.Allocate(sum); ram.LoadContent(str, b); //
//初始化PCB //
PCBArray[a].ProcessName = Name; PCBArray[a].PageAdress = b; PCBArray[a].Sum = sum; PCBArray[a].PC = 0; PCBArray[a].IR = ""; PCBArray[a].DR = 0;
PCBArray[a].PSW = Interrupt.No; PCBArray[a].WaitTime = -10;
PCBArray[a].Pri = 1024 / str.Length; PCBArray[a].ExecuteTime = 0;
PCBArray[a].NeedDevice = DeviceType.no; PCBArray[a].HaveDevice = DeviceType.no; PCBArray[a].GetDeviceTime = 0; PCBArray[a].DN = -1;
PCBArray[a].BlockReason = ""; InsertOneToReady(a); //
//是否转向进程调度 //
int c = JudgeAttemper(); if (c
Attemper(c); }
} else
{
InsertOneToWhite(a);
MessageBox.Show("内存不足或文件太长,创建进程失败", "消息", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else {
MessageBox.Show("PCB块不足,创建进程失败", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information); } } else {
MessageBox.Show("文件为空, 不能创建进程"," 错误",MessageBoxButtons.OK,MessageBoxIcon.Error); } }
3.5撤销进程
进程结束时,即读到end 指令后,传递指向当前正在运行的指针,撤销当前进程。 //Destroy函数,撤销程序 //
public void Destory(int a) {
//
//回收内存 //
int p = PCBArray[a].PageAdress; int sum = PCBArray[a].Sum; ram.DeAllocate(p,sum); //
//回收PCB 块 //
InsertOneToWhite(a); Execute = 10; //
//显示结果 // // // //
}
3.6进程调度
当前一进程结束时,CPU 会调度就绪队列中的进程。
//判断是否需要进行进程的调度,若需要则返回进程块号(0-9),不需要则返回10
//
public int JudgeAttemper() {
//
// //
int k;
if (Ready
int p = Ready;
int a = PCBArray[Ready].Pri;
k = Ready; //块号
while (PCBArray[p].Next
if (PCBArray[PCBArray[p].Next].Pri > a) {
a = PCBArray[PCBArray[p].Next].Pri; k = PCBArray[p].Next; }
p = PCBArray[p].Next; } } else {
return 10; } //
// //
if (Execute
if (PCBArray[k].Pri > PCBArray[Execute].Pri) {
选出就绪链表中优先级最高 跟执行链表内的PCB 块进行比较 优先级最高的
return k; } else {
return 10; } } else {
return k; } } //
//进程调度函数 //
public void Attemper(int a) {
//
//保护CPU 现场 //
if (Execute
PCBArray[Execute].PC = PC; PCBArray[Execute].IR = IR; PCBArray[Execute].DR = DR; InsertOneToReady(Execute); } //
//选择一个进程,初始化CPU 中的寄存器 //
GetOneFromReady(a); Execute = a;
PC = PCBArray[a].PC; IR = PCBArray[a].IR; DR = PCBArray[a].DR;
}
3.7设备申请
进程的指令申请设备时,读到进程所要申请的设备,调用AppEquip 函数 public void AppEquip(char equipment, int r, int t)
{
int i;
for (i = 0; i
if (eq[i].name == equipment && eq[i].flag == 0) {
eq[i].flag = 1; pcb[r].eq = equipment; if (timer4.Enabled == false) {
timer4.Enabled = true;//设备时间片开始执行 }
if (i == 0) //设备区域显示~ {
ETIME[0] = t;
textBox001.Text = pcb[r].name.ToString(); textBox011.Text = ETIME[0].ToString(); }
else if (i == 1) {
ETIME[1] = t;
textBox002.Text = pcb[r].name.ToString(); textBox012.Text = ETIME[1].ToString(); }
else if (i == 2) {
ETIME[2] = t;
textBox003.Text = pcb[r].name.ToString(); textBox013.Text = ETIME[2].ToString(); }
else if (i == 3) {
ETIME[3] = t;
textBox004.Text = pcb[r].name.ToString(); textBox014.Text = ETIME[3].ToString(); }
else if (i == 4) {
ETIME[4] = t;
textBox005.Text = pcb[r].name.ToString(); textBox015.Text = ETIME[4].ToString(); }
else if (i == 5) {
ETIME[5] = t;
textBox006.Text = pcb[r].name.ToString(); textBox016.Text = ETIME[5].ToString(); } return; } }
//没有申请到设备,调用阻塞函数 block(r, equipment);
}
申请设备到设备后设备区域会显示相应设备的占用进程名和占用时间。如图3-6所示。
图3-6 申请设备后的界面显示
3.8进程阻塞
进程申请设备不够时,则阻塞该进程。 //BlockProcess函数,阻塞进程 //
public void BlockProcess(int a,DeviceType b,int time) {
//
//保护CPU 现场 //
PCBArray[a].PC = PC; PCBArray[a].IR = IR; PCBArray[a].DR = DR; //
//判断申请设备是否成功,根据不同情况填写BlockReason 项 //
bool d = Dev.JudgeDevice(b); if (d == false) {
PCBArray[a].NeedDevice = b;
PCBArray[a].HaveDevice = DeviceType.no;
PCBArray[a].BlockReason = "申请" + b + "设备失败"; PCBArray[a].PC = PCBArray[a].PC - 4; } else {
PCBArray[a].DN = Dev.Allocate(b); PCBArray[a].HaveDevice = b;
PCBArray[a].NeedDevice = DeviceType.no; PCBArray[a].GetDeviceTime = XDTime; PCBArray[a].WaitTime = time;
PCBArray[a].BlockReason = "等待IO 输入输出"; if (DeviceStateChange != null) {
DeviceStateChangeEventArgs e=new DeviceStateChangeEventArgs();
e.DN = PCBArray[a].DN;
e.type = b;
e.processname = PCBArray[a].ProcessName; e.needtime = time; e.Atime = XDTime;
DeviceStateChange(null,e); } } //
//修改进程状态 //
InsertOneToBlock(a); Execute = 10; //
//转向进程调度 //
int c = JudgeAttemper(); if (c
Attemper(c); }
}
由于缺少设备进程被阻塞后,在阻塞队列区域显示阻塞的进程名和阻塞原因。如图3-7所示。
图3-7 进程阻塞后的界面显示
3.9进程唤醒
占有某设备的进程归还设备时,要唤醒阻塞队列中等待该设备的进程
//WakeUp函数,唤醒进程 //
public void WakeUp(int ID,DeviceType device) {
//
//唤醒自己 //
int d = Block; if (Block == ID) {
Block = PCBArray[ID].Next; InsertOneToReady(ID); } else {
while (PCBArray[d].Next
if (PCBArray[d].Next == ID) {
PCBArray[d].Next = PCBArray[ID].Next; InsertOneToReady(ID); break; }
d = PCBArray[d].Next; } } //
//检查第一个节点 //
while(Block
int h = Block;
Block = PCBArray[h].Next; InsertOneToReady(h); } //
//检查其他节点 //
if(Block
int a = Block;
while (PCBArray[a].Next
if (PCBArray[PCBArray[a].Next].NeedDevice == device) {
int h = PCBArray[a].Next;
PCBArray[a].Next = PCBArray[PCBArray[a].Next].Next; InsertOneToReady(h); } else {
a = PCBArray[a].Next; } } }
int c = JudgeAttemper(); if (c
Attemper(c); } } //
//判断是否需要进行进程的调度,若需要则返回进程块号(0-9),不需要则返回10
//
public int JudgeAttemper() {
//
//选出就绪链表中优先级最高 //
int k;
if (Ready
int p = Ready;
int a = PCBArray[Ready].Pri;
k = Ready; //优先级最高的块号
while (PCBArray[p].Next
if (PCBArray[PCBArray[p].Next].Pri > a) {
a = PCBArray[PCBArray[p].Next].Pri; k = PCBArray[p].Next; }
p = PCBArray[p].Next; } } else {
return 10; } //
//跟执行链表内的PCB 块进行比较 //
if (Execute
if (PCBArray[k].Pri > PCBArray[Execute].Pri) {
return k; } else {
return 10; } } else {
return k; } }
3.10 CPU函数
public void cpu() {
if (true) {
switch (PSW)
{
case Interrupt.End: {
//
//写入out 文件 //
//
//撤销进程,进行进程调度 //
Destory(Execute);
int a = JudgeAttemper(); if (a
Attemper(a); }
PSW = Interrupt.No; break; }
case Interrupt.IO: {
BlockProcess(Execute,type,time); PSW = Interrupt.No; break; } default: {
break; } }
switch (PSW1) {
case Interrupt.IO: {
int b = Block; while (b
if (XDTime - PCBArray[b].GetDeviceTime - 1 == PCBArray[b].WaitTime)
{
Dev.DeAllocate(PCBArray[b].HaveDevice, PCBArray[b].DN);
WakeUp(b, PCBArray[b].HaveDevice); PCBArray[b].DN = -1;
PCBArray[b].GetDeviceTime = 0;
PCBArray[b].HaveDevice = DeviceType.no; PCBArray[b].WaitTime = -10; }
b = PCBArray[b].Next; }
PSW1 = Interrupt.No; break; } default: {
break; } }
if (Execute
IR = ram.SendToIR(PCBArray[Execute].PageAdress, PC); PC = PC + 4;
bool str = ram.JudgeIR(IR); if (str == true) {
switch (IR[1]) {
case '=': {
DR = Convert.ToInt32(IR[2].ToString()); break; }
case '+': {
DR++; break; }
case '-': {
DR--; break; }
case 'a': case 'A': {
type=DeviceType.a;
time=Convert.ToInt32(IR[2].ToString()); PSW = Interrupt.IO;
break; }
case 'b': case 'B': {
type = DeviceType.b;
time = Convert.ToInt32(IR[2].ToString());
PSW = Interrupt.IO; break; }
case 'c': case 'C': {
type = DeviceType.c;
time = Convert.ToInt32(IR[2].ToString()); PSW = Interrupt.IO; break; }
case 'n': {
PSW = Interrupt.End; break; } }
PCBArray[Execute].ExecuteTime++; if (FinishIR != null) {
EventArgs e = new EventArgs(); FinishIR(null, e); } } else {
Destory(Execute);
int b = JudgeAttemper(); if (b
Attemper(b); }
if (ErrorIR != null) {
EventArgs e = new EventArgs(); ErrorIR(null,e); }
} } else {
//
//do nothing //
if (this.ExecuteIsWhite != null) {
EventArgs e = new EventArgs(); ExecuteIsWhite(null,e); } }
int k = Block; while (k
if (XDTime - PCBArray[k].GetDeviceTime == PCBArray[k].WaitTime) {
PSW1 = Interrupt.IO; }
k = PCBArray[k].Next; }
if (QueueChange != null) {
EventArgs e = new EventArgs(); QueueChange(null, e); }
XDTime++; IR = ""; } } } }
整体界面显示如图3-11所示。
图3-11 系统整体界面
四 结束语
通过操作系统课程设计,我更加明白了操作系统内部的工作原理,能够更清楚的理解一些操作的原因,理解了操作系统的实现方法,明白了遇到问题时应该系统的分析,运用自己学过的理论知识来解决问题,而不是马上着手进行设计。另外,遇到问题时,应该思考一下问题出现在什么地方,不能漫无目的的查找错误,思考应该全面一些,想到会出现的种种情况,系统分析后再改变代码。遇到原理不理解的地方应该查找资料,把原理弄明白了才可以设计好程序。
参考文献
[1] 王煜,张明,刘振鹏. 操作系统(第二版). 北京:中国铁道出版社, 2007
[2] 王煜,张明,刘振鹏. 操作系统习题解答与实验指导. 北京:中国铁道出版社, 2007
[3] 万科,覃剑. Visual C# .NET程序设计基础与上机指导. 北京:清华大学出版社, 2007