一 基本细想
1.1进程的定义
进程是具有独立功能的可并发执行的程序在一个数据集合上的运行过程,是系统进行资源分配和调度的基本单位。
1.2进程的基本状态和及其转换
进程的三个基本状态:就绪状态;执行状态;阻塞状态。 执行状态 进程调度 发生等待事件 落选 阻塞状态 就绪状态 等待事件已经发生 因为系统中各个进程并发执行,并因竞争系统资源而相互依赖,相互制约,因而进程执行时呈现了“运行---暂停---运行”的间断性。进程执行时间的间断性可用进程的状态以及转换来描述。
1.3进程管理
中央处理器的模拟用函数CPU()模拟中央处理器。该函数主要负责解释“可执行文件”中的命令。x=?; 给x赋值一位数;x++; x加1;x--; x减1;!??; 第一个?为A,B,C中某个设备,第二个?为一位数,表示使用设备的时间;end. 表示进程结束,同时将结果写入运行结果框中,其中包括进程名和最终结果。CPU只能解释指令寄存器IR中的指令。一个进程的运行时要根据进程执行的位置,将对应的指令存放到指令寄存器中。
1.4中断的模拟
中断的发现应该是硬件的工作,这里在函数CPU中加检测PSW的方式来模拟在CPU()函数中,每执行一条指令之前,先检查PSW,判断有无中断,若有进行中断处理,然后再运行解释指令。CPU函数应该不断循环执行的。
模拟中断的种类和中断处理方式:程序结束(执行指令end形成的中断,软中断):将结果写入运行结果框体中,其中包括运行指令的指令名和指令的值,调用进程撤销原语撤销进程,然后进行进程调度;
时间片到(当相对始终寄存器值减到0时):将正在运行进程的CPU现场保存在进程控制块中,然后进行进程调度;
I/O中断(设备完成输入输出):将输入输出完成的进程唤醒,将等待该设
1
河北大学工商学院07级操作系统课程设计
备的一个进程同时唤醒。
1.5时钟模拟
系统中的绝对时钟和相对时钟用全局变量模拟。绝对时钟用来记录开机以后的时间,相对时钟用来存放进程可执行的时间片,在进程调度时设置初值,随系统时间的增值1而减值1,减到0时,发出时钟中断。此模拟进程中时间片大小设置为4。它主要完成当CPU发出中断时重新调度就绪队列中的就绪的进程获得处理机得到运行的机会。应遵循的原则是既要保证系统各个进程及时地得到响应,又不要由于时间片太短而增加调度的开销,降低系统的效率。
1.6进程控制块
进程控制块内容包括进程标识符、处理机状态信息(如主要寄存器内容)、进程调度信息(如进程状态、进程优先级、进程调度所需的其他信息、阻塞原因)、进程控制信息(如进程程序和数据的地址)。本模拟系统最多容纳10个进程块。
PCB区域用数组模拟。进程控制块根据内容的不同组成不同的队列:空白进程控制块链、就绪队列和阻塞队列,正在运行的进程只有一个,系统初始时只有空白进程控制块链。
1.7进程调度
进程调度在模拟系统中,采用时间片轮转调度算法,时间片可设定。 进程调度函数的主要工作是:将正在运行的进程保存在该进程对应进程控制块中;从就绪队列中选择一个进程;将这个进程中进程控制块中记录的各寄存器内容恢复到CPU各个寄存器内。
闲逛进程建立一个闲逛进程,当就绪对列为空时,系统调用该进程运行。当有进程就绪时,就调度就绪进程运行。闲逛进程什么也不做,只是起到系统能正常运转的作用。
1.8进程控制
建立四个函数模拟进程创建、阻塞和唤醒四个原语。 1.进程创建create 进程创建的主要工作是: 第一步,申请空白进程控制块;
第二步,申请主存空间,申请成功,装入主存; 第三步,初始化进程控制块; 第四步,将进程链入就绪队列。 2.进程撤销destory 进程撤销的主要工作是:
2
河北大学工商学院07级操作系统课程设计
第一步,回收进程所占内存资源; 第二步,回收进程控制块;
第三步,在屏幕上显示进程执行结果,进程撤销 3.进程阻塞block 进程阻塞的主要工作是:
第一步,保存运行进程的CPU现场; 第二步,修改进程状态;
第三步,将进程链入对应的阻塞队列,然后转向进程调度。 4.进程的唤醒
进程唤醒的主要工作是将进程由阻塞队列中摘下,修改进程状态为就绪,然后链入就绪队列。
3
河北大学工商学院07级操作系统课程设计
二 定义的公共变量或数据结构
2.1公共变量
int i; i用来记录CPU时间 CCPU cpu1; 模拟CPU
CString memery1[512]; 存储a1.exe内的运算信息 CString memery2[512]; 存储a2.exe内的运算信息 CString memery3[512]; 存储a3.exe内的运算信息 CString memery4[512]; 存储w2.exe内的运算信息
CString nam1=\"a1.exe\"; CString nam1是\"a1.exe\"的全局变量 CString nam2=\"a2.exe\"; CString nam2是\"a2.exe\"的全局变量 CString nam3=\"a3.exe\"; CString nam3是\"a3.exe\"的全局变量 CString nam4=\"w2.exe\"; CString nam4是\"w2.exe\"的全局变量
2.2进程控制块PCB
class PCB { public:
CString pcb_nam; //进程名 int pcb_no; //进程号
CString*command; /进程文件
int linesnum; //进程文件指令数 int current; //当前指针 int result; //计算结果
enum event_source event; //事件
enum event_type eventtype; //阻塞事件请求的资源 int event_time; //使用资源时间 PCB *link; };
2.3队列Queue
class Queue { public:
PCB *first,*last; int count;
public:
QUEUE() {first=NULL;last=NULL;count=0;}
4
河北大学工商学院07级操作系统课程设计
void add(PCB * a) { if(first==NULL) }
void gethead(PCB **a) { *a=first; }
{ first=a;
last=a; } last=a; }
else { last->link=a;
count++;
int getcount() {return count;}
};
void takeoffhead() { if(first!=NULL)
first=first->link; count--; }
2.4 CPU的定义
class CCPU {public:
CCPU(); virtual ~CCPU();
CRect rect; //时间片辅助控制 int timepieces; //时间片长度
int timelength; //当前处理进程进程块 PCB * currPCB; //设备状态标志 int useA;
public:
int useB;
int useC; //进程个数 int totalnum; //就绪队列
QUEUE ready; //使用设备阻塞队列,
QUEUE block_0; //得不到设备A,B,C阻塞队列 QUEUE block_1,block_2,block_3;
int pcbnum; //运行过进程总个数
5
河北大学工商学院07级操作系统课程设计
public: //一个时钟周期操作
void Process(); //进程创建操作,并加入就绪队列
void Creat(CString name,CString*command,int number); //撤消进程操作 void Destroy(PCB *pcb); //阻塞队列操作 void Block(PCB *pcb); //唤醒操作 void Wake(); //进程调度操作 void scheduling(); //进程调度 void InitCpu(PCB *pcb);
int GetCpuStatus(); };
6
河北大学工商学院07级操作系统课程设计
三 各部分主要函数的过程描述
3.1进程的创建Creat
CCPU::Creat() { PCB *pcb; }
pcb=new PCB; //申请空白PCB 初始化pcb的name;result; number;
将进程连入到就绪队列;
3.2进程的撤销Destory
CCPU::Destroy( ) { 释放进程块 释放进程程序
回收进程所占内存资源; 回收进程控制块;
在屏幕上显示进程执行结果,进程撤销
}
3.3进程的阻塞Block
CCPU::Block()
if(pcb->command[pcb->current].GetAt(1)=='a')
{ 请求A设备 if( A空闲) { 则分配A设备;}
else { A设备忙碌,进程阻塞并添加到阻塞队列; }
if(pcb->command[pcb->current].GetAt(1)=='b') { 请求设备B
if( B空闲) { 则分配B设备;}
else { B设备忙碌,进程阻塞并添加到阻塞队列;}
if(pcb->command[pcb->current].GetAt(1)=='c') { 请求C设备
if( C空闲)
{则分配C设备;}
else { C设备忙碌,进程阻塞并添加到阻塞队列;}
7
河北大学工商学院07级操作系统课程设计
}
3.4阻塞队列的唤醒
void CCPU::Wake() { 判断就绪队列是否为空;
为空则唤醒相应请求响映设备的进程; if(设备使用完)
{ 则唤醒其他进程使用该设备;} if(阻塞进程申请A设备)
{ 执行该进程,运行界面显示相应信息; 进程运行完后,将该进程添加到就绪队列;} elseif(阻塞进程申请B设备)
{ 执行该进程,运行界面显示相应信息; 进程运行完后,将该进程添加到就绪队列;} elseif(阻塞进程申请C设备)
{ 执行该进程,运行界面显示相应信息; 进程运行完后,将该进程添加到就绪队列;} Else仍旧阻塞; }
3.5队列Queue
Queue::add(PCB *p) public:
PCB *first,*last; int count;
public:
QUEUE() {first=NULL;last=NULL;count=0;}
void add(PCB * a) //队列添加进程函数 { if(first==NULL) }
8
{ first=a; last=a; } { last->link=a;
last=a; } count++;
else
河北大学工商学院07级操作系统课程设计
void gethead(PCB **a) //在队列中取出头进程函数 { *a=first; } //摘到的结点link域不一定为空
int getcount() {return count;} void takeoffhead() { if(first!=NULL) first=first->link; count--; }
};
3.6运行Process
void CCPU::Process() {if(timepieces%timelength==0) 则出错; Else {
if((currPCB->current)<(currPCB->linesnum)) {
if(currPCB->command[currPCB->current].GetAt(0)=='x') { 对X进行运算处理;} If(m_progress1.GetPos()>10) { 滚动条从0开始继续运行; else时间片根据滚动条的变化而变化; 时间片累加;} } }
运行总时间累加; }
9
//获取X的值; 河北大学工商学院07级操作系统课程设计
四 运行截图
4.1 打开程序时的界面
图4.1
4.2 显示文件内容
图 4.2
4.3运行时的程序界面
10
河北大学工商学院07级操作系统课程设计
图 4.3
4.4 运行结束时的程序界面
图 4.4
11
河北大学工商学院07级操作系统课程设计
五 使用说明
5.1程序基本操作的说明
本程序添加进程时可以采用双击方式另外还可以通过菜单方式将目录中的进程添加到就绪队列中;单击开始按键后程序便开始运行,执行相应的运算和操作;进度条开始运行,CPU运行总时间开始累加;就绪队列、阻塞队列、内显示相应进程;已结束进程及结果框内显示已结束进程及其结果;调度进程后,当前进程,指令,结果分别显示相应结果;拖动滑块可以改变时间片的长度;在目录的文件1下选中某一个文件右键单击接着选中显示文件左键单击就会显示当前文件的内容;单击停止按键程序暂停;单击退出本程序就会从程序中退出;
5.2 总结
操作系统课程设计这门课程刚开始时我对VC++可视化程序设计的操作环境已经不是很熟悉了,后来经过不断的探索与修改,逐渐弄懂该系统中的代码与思想,通过不断的学习,让我对该语言产生了浓厚的兴趣与爱好,通过模拟操作系统中的进程运行与管理,以及对设备的利用,让我明白了电脑中系统是如何运行与进行的,并且了解到分时处理系统中时间片控制对系统中用户作业运行的作用。使我对系统的理解逐渐加深,并且初步了解了系统的工作原理。但我觉得自己还有许多不足之处,本程序也有许多缺点。
12
因篇幅问题不能全部显示,请点此查看更多更全内容