操作系统实验报告
学生姓名
学
号
专业班级
指导教师
凌欣
0902160610
计科 1606
宋弘
学
院
信息工程与科学学院
完成时间
2018.05.05
目录
一、
(一)
(二)
实验概述................................................................................................................................................3
实验目的 ..................................................................................................................................3
实验内容及要求....................................................................................................................3
1. 实验内容...................................................................................................................................... 3
2. 实验要求...................................................................................................................................... 3
二、总体设计.........................................................................................................................................................5
(一)总体设计思路..................................................................................................................................5
(三)
总体工作流程图....................................................................................................................6
四、详细设计与实现...........................................................................................................................................7
(一)数据结构设计..................................................................................................................................7
(1)PCB 类:............................................................................................................................................. 7
(2)CPU 类:.............................................................................................................................................8
(3)Main_Store 结构体:............................................................................................................ 8
(二)Pool_to_Ready()函数的设计与实现..................................................................................... 8
(三)时间片算法的实现........................................................................................................................ 9
(四)分配内存函数实现........................................................................................................................ 9
(五)回收内存函数实现......................................................................................................................10
五、实验运行结果............................................................................................................................................. 11
结束语..................................................................................................................................................13
参考文献........................................................................................................错误!未定义书签。
一、 实验概述
(一) 实验目的
本实验是操作系统原理课程的实践性锻炼环节。通过实验,帮助学生更好地
掌握操作系统在计算机软硬件资源管理中的地位和作用,掌握操作系统的基本概
念、原理和基本方法,锻炼学生应用高级编程语言完成进程管理和内存管理编程
的能力,初步培养学生系统层次软件分析、设计能力,使学生加深对操作系统本
质的理解,巩固课堂所学的理论知识。
(二) 实验内容及要求
1. 实验内容
(1) 设计进程管理中数据结构的内容;
(2) 设计一个优先权调度算法,实现进程调度;
(3) 设计至少两个临界资源的同步管理模拟。
(4) 在可变分区管理方式下,采用最先适应算法实现主存空间的分配和
回收。
2. 实验要求
(1) 最好采用图形界面
(2) 可随时增加进程
(3) 规定道数,设置后备队列和阻塞状态。若内存中进程少于规定道
数,可自动从后备队列中调度作业进入。被阻塞进程入阻塞队列,设
置唤醒功能用于将指定阻塞进程唤醒进入就绪队列;
(4) 每次调度完成,显示各进程状态;
(5) 设置至少两个临界资源阻塞队列和公共变量,模拟同步过程;
(6) 设置时间片中断操作;
(7) 自行假设主存空间大小,预设操作系统所占大小并构造未分分区
表;表目内容:起址、长度、状态(未分/空表目)
(8) 结合实验一,PCB增加为: {PID,要求运行时间,优先权,状态,
所需主存大小,主存起始位置,PCB指针}
(9) 采用最先适应算法分配主存空间。
(10) 进程完成后,回收主存,并与相邻空闲分区合并。
二、总体设计
(一)总体设计思路
本程序设计了一个 PCB 类,一个 CPU 类还要一个主存结构体 subarea。PCB
类用来表示进程,主存结构体用来表示内存已分配的和未分配的表目,同时针对
内存分配设计了几个关键函数,分配内存函数 alloc(PCB *p)、合并空表目函数同
时释放结束进程内存函数 setfree(PCB *p)。CPU 类用来实现对进程的调度还有在
进程调度的同时进行内存分配,针对处理机调度设计了几个关键函数,增加进程
函数 addPCB1(int a,int b,int c,int d)和 addPCB2()分别以手动和自动方式增加进程,
从后备队列调往就绪队列函数 Pool_to_Ready(),时间片调度函数 run1(),挂起进
程函数 hang_up(),解挂函数 wake_up()。通过两个线程让从后备队列往就绪队列
增加进程函数和时间片调度函数一直在后台运行以此实现了程序的自动运行。
(三) 总体工作流程图
四、详细设计与实现
(一)数据结构设计
(1)PCB类:
class PCB
{
private:
int PID;
int run_time;//运行时间
int priority;//优先级
int state=0;//状态 0后背 1就绪 2执行 3挂起 4结束
int n_store;//所需主存大小
int s_location;//主存起始位置
bool is_alloc;//分配了内存为1;否则为0
int *pcb;
public:
PCB(int pid, int time, int pri, int store) {
this->PID = pid;
this->run_time = time;
this->priority = pri;
this->n_store = store;
}
int getPID();
int getrun_time();
int getpriority();
int getstate();
int getn_store();
int gets_location();
int getis_alloc();
void setPID(int pid);
void setrun_time(int time);
void setpriority(int p);
void setstate(int s);
void setn_store(int n);
void sets_location(int n);
void setis_alloc(bool i);
void show();};
(2)CPU类:
class CPU{
public:
vector
Ready;//就绪队列
vectorPool;//后备队列
vectorBlock;//挂起队列
vectorEnd;//终止队列
void addPCB1(int a, int b, int c, int d);
void addPCB2();
void Pool_to_Ready();//后备队列到就绪队列
void run1();
void run2();
void hang_up();
void wake_up();
void show_pcb(vectora);//显示PCB队列信息
void show_cpu();//显示所有队列信息
void show_sub();};
(3)Main_Store 结构体:
struct subarea {
int num;
int start;
int length;
int state;//0表示未分配1表示空表目
};
(二)Pool_to_Ready()函数的设计与实现
void CPU::Pool_to_Ready() {
while (true){
for (int i = 0; i < this->Pool.size(); i++) {
//Sort_sub();
if (alloc(&this->Pool[i])) {
cout << "从后备队列往就绪队列加入进程\n";
this->Pool[i].setstate(1);
this->Pool[i].show();
this->Ready.push_back(this->Pool[i]);
this->Pool.erase(this->Pool.begin() + i);
}
else continue;