山东科技大学学生课程设计
printf(\到达时间: ?\\n\ printf(\开始时间:?\\n\ if(q->runtime<=rr) {
time=time+q->runtime;
printf(\完成时间: ?\\n\ q->turntime=time-q->arrivetime;
printf(\周转时间: ?\\n\ struct process *t=q; q=q->next; p->next=q; free(t); } else {
time=time+rr;
printf(\完成时间: ?\\n\ q->runtime=q->runtime-rr; q->rrtime++; p=q;
q=q->next;
} } } }
int main() {
printf(\时间片轮转调度算法\\n\ struct process *head=list();
- 28 -
山东科技大学学生课程设计
runrr(head); return 0; }
1.3.4运行结果
2.银行家算法
- 29 -
山东科技大学学生课程设计
2.1需求分析
利用银行家算法避免死锁,每一个进程再进入系统时,它必须申明在运行过程中,可能需要每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量。当进程请求一组资源时,系统必须首先确定是否有足够的资源分配给该进程。若有,再进一步计算在将这些资源分配给进程后,是否会使系统处于不安全状态。如果不会,才将资源分配给它。
基本功能如下:
(1)安全性算法。根据提供的安全序列判断是否为安全状态。
(2)银行家算法分配资源。根据银行家的算法判断能否分配申请的资源。 以下是各功能模块的功能描述: 1.主函数模块
本模块的主要功能是输入进程个数、已分配的资源、进程所需要最大的资源和系统此时所需要的资源,通过调用check()函数来检测此时系统是否安全,如果安全,则将资源分配并输出此时的安全序列。 2.安全性算法模块
本模块的主要功能是对进程进行安全性检测,检测此时的系统资源是否满足提出资源请求进程的需要,如果满足则进一步检测是否所有的进程都能运行完毕,如果均能运行完毕,则系统安全,否则,系统不安全。 3.银行家算法
本模块的主要功能是对资源进行分配,如果申请的资源正确,则尝试将资源分配给进程,并进行检测。 测试数据:
进程的个数:5资源的个数3
- 30 -
山东科技大学学生课程设计
2.2 概要设计
本次程序使用c语言的方法,程序中定义了一个主函数、一个安全性算法函数和一个输出函数,首先要做的是输入进程的个数和各类资源的数量,然后调用check()函数检测,在调用print()函数输出。
2.3 详细设计
1.主函数模块
首先输入进程的个数和资源的数量,然后调用check()模块和print()模块。
2.安全性算法模块
对提出申请资源的进程进行检查,当need大于work,则不能满足进程的需求,则系统不安全,如果成立,则输出安全序列a[s++]。
3. 银行家算法
- 31 -
山东科技大学学生课程设计
首先,检查Request[j]<=Need[i,j],然后检查
Request[j]<=Available[j],如果均成立,则试着分配给它资源,并修改数据,然后执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全则分配,否则分配前状态。 Request<=need? 开始 初始化数组:available,allocation,max 提出请求分配request Error(出错,无法分配) Request<=available? Error(出错,无法分配) Available=available-request; Allocation=allocation+request; Need=need-request; 是否存在安全序列? Error(出错,无法分配) Available=available+request; Allocation=allocation-request; Need=need+request; - 32 - 输出安全序列 再次进行分配?