操作系统课程设计
一实验目的
在多道程序或多任务系统中,系统中同时处于就绪态的进程有若干个,也就是说能运行的进程数远远大于处理机个数。为了使系统中的各进程能有条不紊地进行,必须选择某种调度策略,以选择一进程占用处理机。要求学生设计一个模拟单处理机调度的算法,以加深对处理机调度的概念理解。
通过自己变成来实现页面调度算法,进一步理解页面调度算法 的概念及含义,提高对页面调度算法的认识,同时提高自己的动手实践能力。加深我们对主存与辅助存储器统一管理、逻辑地址与物理地址转换、部分装入和部分替换问题的理解,同时,有利于我们对虚拟存储技术的理解。
为了了解系统的资源分配情况,假定系统的任何一种资源在 任一时刻只能被一个进程使用。任何进程已经占用的资源只能由进程自己释放,而不能由其他进程抢占。当进程申请的资源不能满足时,必须等待。因此,只要资源分配算法能保证进程的资源请求,且不出现循环等待,则系统不会出现死锁。
编写模拟系统进行资源调度的程序,一个是随机算法,即只 要系统剩余资源能满足进程的当前请求,就立即将资源分配给进程,以观察死锁产生情况;一个是采用银行家算法,有效地避免死锁的产生。
模拟进程的资源分配算法,了解死锁的产生和避免的办法。 通过设计一个磁盘调度模拟系统,深入理解磁盘的工作原理,从而使磁盘调度更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对磁盘调度算法的理解。具体实现为,运用一门高级编程语言编写程序模拟磁盘调度的过程,采用先来先服务算法和电梯算法,模拟并输出存取臂的移动顺序,并计算存取臂移动的磁道总数。能够处理以下的情形:
(1)可根据需要输入当前磁头的位置,磁头移动方向; (2)能够输入柱面数,磁道访问序列等参数,并能够显示调度结果(磁盘访问请求的磁道号以及磁头移动的总磁道数)。
二、实验内容
利用C++实验以下算法: 处理机管理中:
(1) 先来先服务算法(FCFS)
实验题目:
假设系统中有3~5个进程,每个进程由一个进程控制块(PCB)来标识。
设置一个队首指针head,用来指出最先进入系统的进程,各就绪进程通过链接指针连在一起。
处理机调度时总是选择队首指针指向的进程投入运行。 由于本实验是模拟实验,所以对被选中进程并不实际启动运行,而只是执行。 估计运行时间减1,用这个操作来模拟进程的一次运行,而且省去进程的现场保护和现场恢复工作。
在所设计的程序中应有显示或打印语句,能显示或打印正运行的进程名字、已运行时间、还剩时间、就绪对列中进程名字等。所有进程运行完成时,给出各进程的周转时间和平均周转时间.数据结构设计如下:
struct PCB
//定义进程控制块
{
char ID[3];
//进程号
char name[10];
//进程名
char state;
//运行状态
int arrivetime; //到达时间
int starttime; //进程开始时间
int finishtime; //进程结束时间
int servicetime;
//运行时间
float turnaroundtime;//周转时间
float weightedturnaroundtime;//带权周转时间
struct PCB *next; //指向下个进程
};
(2) 时间片轮算法
实验题目:
假设系统中有3~5个进程,每个进程由一个进程控制块(PCB)来代表。
按照进程到达的先后顺序排成一个循环队列,设一个队首指针指向第一个到达的进程的首址。另外再设一个当前运行进程指针,指向当前正运行的进程。
执行处理机调度时,首先选择队首的第一个进程运行。 由于本实验是模拟实验,所以对被选中进程并不实际启动运行,而只是执行:
估计运行时间减1 用这个操作来模拟进程的一次运行。
进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程,同时
还应判断该进程的剩余运行时间是否为0.若不为0,则等待下一轮的运行,若该进程的剩余运行时间为0,则将该进程的状态置为完成状态“C”,并退出循环队列。 若就绪队列不空,则重复上述的步骤(4)和(5)直到所有进程都运行完为止。
在所设计的调度程序中,应包含显示或打印语句吧,已便显示或打印每次选中进程的名称及运行一次后队列的变化情况。 数据结构设计如下:
typedef struct pcb
//进程控制块定义
{
char pname[N];
//进程名
int runtime;
//运行时间
int arrivetime;
char state;
struct pcb*next;
}PCB; PCB head_input;
PCB head_run;
PCB *pcb_input;
void inputproce();
函数
int readydata();
int runproce();
进程的函数
int readyproce();
static char R=\'r\',C=\'c\';
量
unsigned long current;
//到达时间
//进程状态 //链接指针
//就绪队列头指针 //运行队列头指针
//判断是否有就绪进程的
//运行进程的函数
//检查就绪队列并准备运行
//声明一个文件指针
//记录系统当前时间的变
//建立进程的函数
(3) 优先级调度算法
实验题目:
假设系统中有3~5个进程,每个进程由一个进程控制块(PCB)来代表。进程的优先数、要求运行时间和估计运行
时间由用户程序任意设计,且优先数越低,优先级越高。调度时,总是选择优先级最高的进程运行。
为了调度方便,设计一个指针指向就绪队列的第一个进程。另外再设一个当前运行进程指针,指向当前正运行的进程。
处理机调度时,总是选择已经到达队列的优先级最高的进程运行。为了采用 动态优先级调度,进程每运行一次,其优先级就减1。由于本实验是模拟实验,所以对被选中进程并不实际启动运行,而只是执行:
优先数加1和估计运行时间减1 用这个操作来模拟进程的一次运行。
进程运行一次后,若剩余的运行时间不为0,且其优先级低于就绪队列的其他进程的优先级,则选择一个高优先级进程抢占CPU;若剩余运行时间为0,则把它
的状态改为完成状态“C”,并撤出就绪队列。
若就绪队列不空,则重复上述的步骤(3)和(4)直到所有进程都运行完为止。
在所设计的程序中应有显示或打印语句,以显示或打印每次被选中进程的进程名字、运行一次后进程的变化以及就绪队列中的各进程排队情况等。 数据结构设计如下:
struct pcb {
/* 定义进程控制块PCB */
char name[10];
//进程名
char state;
//进程状态
int super;
//优先级数
int ntime;
//需要运行时间
int rtime;
//已运行时间 页面替换算法中:
(1) 先进先出页面替换算法(FIFO) (2) 最近最少使用页面替换算法(LRU) (3) 最少使用频率页面替换算法(LFU)
数据结构设计如下:
struct PageFrame
//页框结构 {
int id;
//页框号
int pageId;
//驻留的页号
int visitedCount; //驻留页计数器,访问加1 int unvisitedCount; //最近访问,访问清零,未访问加1 bool replace; //将被淘汰为true int stayTime;
//驻留时间计数 int nextsite; }; 银行家算法 实验题目
为了观察死锁产生和避免的情况,要求设计3~4个并发进程,共享系统的10个同类补课抢占的资源。各进程是动态进行资源的申请和释放。
用随机算法和银行家算法分别设计一个资源分配程序,运行这两个程序,观察系统运行情况,并对系统运行的每一步情况进行显示。
程序中使用的数据结构及主要符号说明
初始化这组进程的最大资源请求和依次申请的资源序列,把进程已占用和需求的资源情况记录在进程控制块中,假定进程控制块的格式如下图所示;
进程状态有:就绪、等待和完成。当系统不能满足进程的资源请求时,进程处于等待态。
“资源需求总量”表示进程运行过程中对资源的最大需求量。显然每个进程的资源需求总量不应超过系统拥有的资源总量。 “已占资源量”表示进程目前已经得到但还未归还的资源量。因此,进程在以后还需要的剩余资源量等于资源需要总量减去已占资源量。 “当前申请量”指进程都拿过去按运行时需要申请的资源量。 银行家算法分配资源的原则是:
(1) 当某个进程提出资源请求时,假定先分配给它,之后调用系统安全性检查算法,进行系统安全性检查,若系统安全,须分配变为真分配。否则作废假分配,让进程等待。 (2) 系统安全性检查算法。 驱动调度算法中:
作为操作系统的辅助存储器,用来存放文件的磁盘是一类高速大容量旋转型存储设备,在繁重的I/O负载下,同时会有若干传输请求来到并等待处理,系统必须采用一种调度策略,按照最佳次序执行要求访问的诸多请求,减少为若干I/O请求服务所需消耗的总时间。
磁盘驱动调度对磁盘的效率有重要影响。磁盘驱动调度算法的好坏直接影响辅助存储器的效率,从而影响计算机系统的整体效率。 (1) 电梯调度算法 (2) 最短查找时间优先算法 (3) 先来先服务算法
三、实验心得
通过本次课程设计,我认识到要将操作系统这门计算机专业课学好不易——不仅仅是要把书上的基本知识学好,而且还要不断进行实践,将所学与实践操作结合起来才能更好地巩固所学,才能提高自己实践能力。在以后的学习中一方面我要不断的巩固自己所学的理论知识,一方面还要多参加实际操作工作以便提高自己的实际操作能力。