非抢占式高优先级调度算法

非抢占式高优先级调度算法
非抢占式高优先级调度算法

/*

非抢占式高优先级调度算法(优先数越大级别越高)

算法思想:在按进程达到时间由小到大的顺序输入进程信息后,先对其优先数进行排列,将最先到达的进程的到达时间设为开始时间,计算结束时间,

然后对后面到达的时间与该进程的结束时间进行比较,如若小于该进程的结束时间,记录进程的个数,再对其优先数逐个进行比较,将优

先数最大的提到前面,每次进程结束都要进行比较,得到执行序列,在依次输出结果

*/

#include

#define MAX 100

struct hrfs

{

char name[10];

float arrvitetime;

float starttime;

float servietime;

float finishtime;

int priority;//优先数

int order;//进程执行次序

int run_flag;//标记进程状态

};

hrfs p[MAX];

int count;

//排列到达时间

//按到达时间与优先数计算执行序列

void HRfs()

{

float temp_time=0;

int i=0,j;

int k,temp_count;

int max_priority;

max_priority=p[i].priority;

j=1;

while((j

if(p[j].priority>p[i].priority){

max_priority=p[j].priority;

i=j;

}

j++;

}

k=i;

p[k].starttime=p[k].arrvitetime;//开始时间=达到时间

p[k].finishtime=p[k].starttime+p[k].servietime;

p[k].run_flag=1;

temp_time=p[k].finishtime;

p[k].order=1;

temp_count=1;

while(temp_count

max_priority=0;

for(j=0;j

//判断到达时间是否小于上一个进程的结束时间并且非处在运行状态

if((p[j].arrvitetime<=temp_time)&&(!p[j].run_flag))

//判断进程优先数是否大于最大优先数,如果大于,就将其值赋给max_priority

if(p[j].priority>max_priority){

max_priority=p[j].priority;

k=j;

}

}

p[k].starttime=temp_time;

p[k].finishtime=p[k].starttime+p[k].servietime;

p[k].run_flag=1;

temp_time=p[k].finishtime;

temp_count++;

p[k].order=temp_count;

}

}

void input()

{

int i;

printf("\n请输入进程名到达时间运行时间优先数,例如:a 0 100 1\n");

for(i=0;i

{

printf("进程%d的信息:",i+1);

scanf("%s%f%f%d",p[i].name,&p[i].arrvitetime,&p[i].servietime,&p[i].priority);

p[i].starttime=0;

p[i].finishtime=0;

p[i].order=0;

p[i].run_flag=0;

}

}

void print()

{

int i;

float turn_round_time=0,f1,w=0;

float right_turn_round_time;

printf("\n-------------------------------进程完成信息------------------------------------\n");

printf("进程名优先级达到时间运行时间开始时间结束时间周转时间带权周转时间运行次序\n");

for(i=0;i

f1=p[i].finishtime-p[i].arrvitetime;

turn_round_time+=f1;

right_turn_round_time=f1/p[i].servietime;

w+=(f1/p[i].servietime);

printf("%s %5d %10.2f %8.2f %8.2f %8.2f %8.2f %8.2f %8d\n",p[i].name,p[i].priority,p[i].a rrvitetime,p[i].servietime,p[i].starttime,p[i].finishtime,f1,right_turn_round_time,p[i].order);

}

printf("平均周转时间=%5.2f\n",turn_round_time/count);

printf("平均带权周转时间=%5.2f\n",w/count);

}

void main()

{

printf("---------------------------非抢占式高优先级调度算法----------------------------\n");

printf("进程个数:");

scanf("%d",&count);

input();

HRfs();

print();

}

嵌入式操作系统实验报告

中南大学信息科学与工程学院实验报告 姓名:安磊 班级:计科0901 学号: 0909090310

指导老师:宋虹

目录 课程设计内容 ----------------------------------- 3 uC/OS操作系统简介 ------------------------------------ 3 uC/OS操作系统的组成 ------------------------------ 3 uC/OS操作系统功能作用 ---------------------------- 4 uC/OS文件系统的建立 ---------------------------- 6 文件系统设计的原则 ------------------------------6 文件系统的层次结构和功能模块 ---------------------6 文件系统的详细设计 -------------------------------- 8 文件系统核心代码 --------------------------------- 9 课程设计感想 ------------------------------------- 11 附录-------------------------------------------------- 12

课程设计内容 在uC/OS操作系统中增加一个简单的文件系统。 要求如下: (1)熟悉并分析uc/os操作系统 (2)设计并实现一个简单的文件系统 (3)可以是存放在内存的虚拟文件系统,也可以是存放在磁盘的实际文件系统 (4)编写测试代码,测试对文件的相关操作:建立,读写等 课程设计目的 操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。 本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。 I.uC/OS操作系统简介 μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。 μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。 严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全 可以由用户自己根据需要分别实现。 uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。 uC/OS操作系统的组成 μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。如下图:

(售后服务)操作系统编程进程或作业先来先服务高优先权按时间片轮转调度算法

(售后服务)操作系统编程进程或作业先来先服务高优先权按时间片轮转调度 算法

湖南农业大学科学技术师范学院 学生实验报告

(高优先权流程图) (按时间片轮转调度) 程序说明及实现: 1)先来先服务调度算法: 高响应比优先实现进程调度.(用C语言实现), 2)优先级调度程序: 该程序由主程序、构造队列子程序、打印子程序、运行子程序构成。 3)时间片轮转法程序: 于此程序中由于程序比较小,未进行分模块设计。直接采用单壹模块。 1先来先服务 #include floatt,d;/*定义俩个全局变量*/ struct/*定义壹个结构体数组,包括进程的信息*/ { intid; floatArriveTime; floatRequestTime; floatStartTime; floatEndTime; floatRunTime; floatDQRunTime; intStatus; }arrayT ask[4];/*定义初始化的结构体数组*/ GetTask()/*给结构体数组赋值,输入到达,服务时间*/ {inti; floata; for(i=0;i<4;i++) {arrayT ask[i].id=i+1; printf("inputthenumber"); printf("inputthetheArriveTimeofarrayT ask[%d]:",i);/*用户输入进程的时间,初始为零*/ scanf("%f",&a); arrayT ask[i].ArriveTime=a; printf("inputtheRequestTimeofarrayT ask[%d]:",i); scanf("%f",&a); arrayT ask[i].RequestTime=a; arrayT ask[i].StartTime=0; arrayT ask[i].EndTime=0; arrayT ask[i].RunTime=0;

Pintos pro 1 实验报告

Pintos pro 1 实验报告 第丁组 王小花 201201102 李三强 201201103 1.Alarm Clock timer_sleep的作用是让此线程等待ticks单位时长,然后再执行。函数原型: void timer_sleep (int64_t ticks) //参数的意思是你想要等待的时间长度 { int64_t start = timer_ticks (); //记录开始时的系统时间 ASSERT (intr_get_level () == INTR_ON); while (timer_elapsed (start) < ticks) //如果elapse(流逝)的时间>=ticks时就返回。否则将持续占用cpu。 thread_yield (); } 在timer_sleep()函数中让该进程暂时阻塞(调用thread_block()),然后过了ticks个时间段后再把它加回到ready queue中。 至于因为每一次时间中断的时候恰好是ticks加一的时候,因此我们可以改进timer_interrup()函数,使得系统每次调用他的时候都检查一下我的这个进程是否已经等待了足够长得时间了。如果还没有够,则不管它,如果已经足够长了,则调用thread_unblock()函数将它召唤回ready_queue中。 加入一个整形变量int block_ticks。当这个线程被block的时候,将block_ticks记录为需要等待的时间长度。之后每次中断的时候检查它一次,并且顺便使其自减。当它小到等于0的时候,把线程调到ready queue中。 Threads.h tread.c interrup.h timer.c

几种操作系统调度算法

保证调度算法 基本思想:向用户做出明确的性能保证,然后去实现它.如你工作时有n个用户的登录,则你将获得cpu处理能力的1/n 算法实现:跟踪计算各个进程已经使用的cpu时间和应该获得的cpu时间,调度将转向两者之比最低的进程 五,保证调度算法 思想:向用户做出明确的性能保证,然后去实现它. 算法:容易实现的一种保证是:当工作时己有n个用户登录在系统,则将获得CPU处理能力的1/n.类似的,如果在一个有n个进程运行的用户系统中,每个进程将获得CPU处理能力的1/n. 实现方法:OS应记录及计算,各个进程在一定时间段内,已经使用的CPU时间和应该得到的CPU时间,二者之比小者优先级高. 5. 保证调度 一种完全不同的调度算法是向用户作出明确的性能保证,然后去实现它。一种很实际并很容易实现的保证是:若用户工作时有n个用户登录,则用户将获得CPU处理能力的1/n。类似地,在一个有n个进程运行的单用户系统中,若所有的进程都等价,则每个进程将获得1/n的CPU时间。看上去足够公平了。 为了实现所做的保证,系统必须跟踪各个进程自创建以来已使用了多少CPU时间。然后它计算各个进程应获得的CPU时间,即自创建以来的时间除以n。由于各个进程实际获得的CPU时间是已知的,所以很容易计算出真正获得的CPU时间和应获得的CPU时间之比。比率为0.5说明一个进程只获得了应得时间的一半,而比率为2.0则说明它获得了应得时间的2倍。于是该算法随后转向比率最低的进程,直到该进程的比率超过它的最接近竞争者为止。 彩票调度算法 基本思想:为进程发放针对系统各种资源(如cpu时间)的彩票;当调度程序需要做出决策时,随机选择一张彩票,持有该彩票的进程将获得系统资源 合作进程之间的彩票交换 六,彩票调度算法 彩票调度算法: 为进程发放针对各种资源(如CPU时间)的彩票.调度程序随机选择一张彩票,持有该彩票的进程获得系统资源. 彩票调度算法的特点: 平等且体现优先级:进程都是平等的,有相同的运行机会.如果某些进程需要更多的机会,可被给予更多彩票,增加其中奖机会. 易计算CPU的占有几率:某进程占用CPU的几率,与所持有的彩票数成正比例.该算法可实现各进程占用CPU的几率. 响应迅速 各个进程可以合作,相互交换彩票. 容易实现按比例分配如图象传输率,10帧/s,15帧/s,25帧/s

操作系统第二版第四章课后习题答案

第四章调度作业答案 2,8,9,11,13 2. 高级调度与低级调度的主要功能是什么?为什么要引入中级调度? 参考答案: 高级调度的主要功能是根据一定的算法,从输入的一批作业中选出若干作业,分配必要的资源,如内存、外设等,为它建立相应的用户作业进程和为其服务的系统进程(如输入/输出进程),最后把它们的程序和数据调入内存,等待进程调度程序对其执行调度,并在作业完成后做善后处理工作。 低级调度的主要功能是根据一定的算法将CPU分派给就绪队列中的一个进程。 为了使内存中同时存放的进程数目不至于太多,有时需要把某些进程从内存移到外存上,以减少多道程序的数目,为此设立了中级调度。引入中级调度的主要目的是为了提高内存的利用率和系统吞吐量。它实际上就是存储管理中的对换功能。 8. 假定在单CPU条件下执行的作业表如表4-8所示。 作业到来的时间是按作业编号顺序进行的(即后面作业依次

比前一个作业迟到一个时间单位)。 ①用一个执行时间图描述使用下列算法时各自执行这些作业的情况:FCFS,RR(时间片=1)和非抢占式优先级。 ②对于上述每种算法,各个作业的周转时间是多少?平均周转时间是多少? ③对于上述每种算法,各个作业的带权周转时间是多少?平均带权周转时间是多少? 表4-8 作业列表 参考答案:24351 ①FCFS执行时间图 RR执行时间图 非抢占式优先级时间图

②和③ FCFS算法: RR算法:

非抢占式优先级算法: 13、中断处理的主要步骤是什么? 参考答案: 中断处理的一般步骤是:保存被中断程序的现场,分析中断原因,转入相应处理程序进行处理,恢复被中断程序现场(即中断返回)。 9. 在一个有两道作业的批处理系统中,作业调度采用短作业优先级调度算法,进程调度采用抢占式优先级调度算法。设作业序列如表4-9所示。

优先级调度算法

优先级调度算法 1、调度算法 考虑到紧迫型作业进入系统后能得到优先处理,引入了高优先级优先调度算法。 优先级调度的含义: (1)当该算法用于作业调度时,系统从后背作业队列中选择若干个优先级最高的,且系统能满足资源要求的作业装入内存运行;(2)当该算法用于进程调度时,将把处理机分配给就绪进行队列中优先级最高的进程。 2、调度算法的两种方式 非抢占式优先级算法:在这种调度方式下,系统一旦把处理机分配给就绪队列中优先级最高的进程后,该进程就能一直执行下去,直至完成;或因等待某事件的发生使该进程不得不放弃处理机时,系统才能将处理机分配给另一个优先级高的就绪队列。 抢占式优先级调度算法:在这种调度方式下,进程调度程序把处理机分配给当时优先级最高的就绪进程,使之执行。一旦出现了另一个优先级更高的就绪进程时,进程调度程序就停止正在执行的进程,将处理机分配给新出现的优先级最高的就绪进程。常用于实时要求比较严格的实时系统中,以及对实时性能要求高的分时系统。 3、优先级的类型 进程的优先级可采用静态优先级和动态优先级两种,优先级可由用户自定或由系统确定。

静态优先级调度算法 含义:静态优先级是在创建进程时确定进程的优先级,并且规定它在进程的整个运行期间保持不变。 确定优先级的依据: 1)进程的类型。 2)进程对资源的需求。 3)根据用户的要求。 优点:简单易行;系统开销小。 缺点:不太灵活,很可能出现低优先级的作业,长期得不到调度而等待的情况;静态优先级法仅适合于实时要求不太高的系统。 动态优先级调度算法 含义:动态优先级是创建进程时赋予该进程一个初始优先级,然后其优先级随着进程的执行情况的变化而改变,以便获得更好的调度性能。 优点:使相应的优先级调度算法比较灵活、科学,可防止有些进程一直得不到调度,也可防止有些进程长期垄断处理机。 缺点:需要花费相当多的执行程序时间,因而花费的系统开销比较大。 4、实时调度算法 由于在任何一个实时系统中毒存在着若干个实时进程或任务,用来反应或控制相应的外部事件,并往往具有某种程度的紧迫性,所以对实时系统中的调度算法提出了某些特殊要求。 对实时系统的要求

西电计算机操作系统课程设计pintos-pro3

西安电子科技大学 操作系统课程设计 (2016年度) 实 验 报 告 实验名称:Priority-Scheduling--Task 2 班级: 姓名: 学号:

一、实验内容 解决优先级反转的问题,在高优先级和低优先级之间竞争锁的问题。 二、分析及设计 使用多重优先级捐赠,解决优先级反转的问题。 1、一个线程获得锁,如果获得这个锁的线程比自己低就提高它的优先级,如果这个锁也是被锁着,那就递归捐赠优先级,在线程释放掉锁之后,恢复未捐赠的优先级。 2、在释放掉锁的时候,若优先级改变可以发生抢占。 3、将信号量的等待队列实现为优先队列。 4、将condition的等待队列实现为优先队列。 5、一个线程被多个线程捐赠,保持当前优先级为捐赠优先级中最大值。 6、在对一个线程设置优先级时,如果处于被捐赠状态,对original_priority进行设置,如果设置的优先级大于当前的优先级,改变当前的优先级,否则在捐赠完成时恢复 original_priority。 7、在释放锁对一个锁优先级有改变的时候应考虑其余被捐赠优先级和当前优先级。 三、详细实现 1、修改thread数据结构(thread.h) 2、在lock结构体中添加成员(synch.h)

3、修改lock_acquire函数(synch.c) 4、thread_hold_the_lock()函数的实现 5、thread_donate_priority()函数的实现

6、锁队列排序函数lock_cmp_priority实现 7、在lock_release函数加入以下语句 8、thread_remove_lock实现 9、thread_update_priority函数实现处理当前线程的优先级

优先级调度算法实验报告

优 先 级 调 度 算 法 实 验 报 告 院系:****************学院班级:*********** 姓名:*** 学号:************

一、实验题目:优先级调度算法 二、实验目的 进程调度是处理机管理的核心内容。本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会和了解优先级算法的具体实施办法。 三、实验内容 1.设计进程控制块PCB的结构,通常应包括如下信息: 进程名、进程优先数(或轮转时间片数)、进程已占用的CPU时间、进程到完成还需要的时间、进程的状态、当前队列指针等。 2.编写优先级调度算法程序 3.按要求输出结果。 四、实验要求 每个进程可有三种状态;执行状态(RUN)、就绪状态(READY,包括等待状态)和完成状态(FINISH),并假定初始状态为就绪状态。(一)进程控制块结构如下: NAME——进程标示符 PRIO/ROUND——进程优先数 NEEDTIME——进程到完成还需要的时间片数 STATE——进程状态 NEXT——链指针 注: 1.为了便于处理,程序中进程的的运行时间以时间片为单位进行

计算; 2.各进程的优先数或,以及进程运行时间片数的初值,均由用户在程序运行时给定。 (二)进程的就绪态和等待态均为链表结构,共有四个指针如下:RUN——当前运行进程指针 READY——就需队列头指针 TAIL——就需队列尾指针 FINISH——完成队列头指针 五、实验结果:

六、实验总结: 首先这次实验的难度不小,它必须在熟悉掌握数据结构的链表和队列的前提下才能完成,这次实验中用了三个队列,就绪队列,执行队列和完成队列,就绪队列中的优先级数是有序插入的,当进行进程调度的时候,需要先把就绪队列的队首节点(优先级数最大的节点)移入执行队列中,当执行进程结束后,判断该进程是否已经完成,如果已经完成则移入完成队列,如果没有完成,重新有序插入就绪队列中,这就是这次实验算法的思想。 附录(算法代码):

采用静态优先权优先算法的进程调度程序

采用静态优先权优先算法的进程调度程序 学号: 姓名: 专业: 指导教师: 日期: 目录 第1部分课设简介 (3)

1.1 课程设计题目 (3) 1.2 课程设计目的 (3) 1.3 课程设计内容 (3) 1.4 时间安排 (3) 第2部分实验原理分析 (3) 2.1问题描述 (3) 2.2解决方法 (4) 第3部分主要的功能模块 (5) 3.1主要的函数 (5) 3.2 测试用例及运行结果 (7) 第4部分源代码 (9) 第5部分总结及参考文献 (16) 5.1 总结 (16) 5.2 参考文献 (17)

第1部分课设简介 1.1 课程设计题目 采用静态优先权优先算法的进程调度程序 1.2 课程设计目的 操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。 1)进一步巩固和复习操作系统的基础知识。 2)培养学生结构化程序、模块化程序设计的方法和能力。 3)提高学生调试程序的技巧和软件设计的能力。 4)提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。 1.3 课程设计内容 设计并实现一个采用静态优先权算法的进程调度演示程序 1.4 时间安排 1)分析设计贮备阶段(1 天) 2)编程调试阶段(7 天) 3)写课程设计报告、考核(2 天) 第2部分实验原理分析 2.1问题描述 (1)每一个进程有一个PCB,其内容可以根据具体情况设定。 (2)进程数、进入内存时间、要求服务时间、优先级等均可以在界面上设定

(3)可读取样例数据(要求存放在外部文件中)进行进程数、进入内存时间、时间片长度、作业大小、进程优先级的初始化 (4)可以在运行中显示各进程的状态:就绪、执行(由于不要求设置互斥资源与进程间的同步关系,故只有两种状态) (5)采用可视化界面,可在进程调度过程中随时暂停调度,查看当前进程的状态以及相应的阻塞队列 (6)有性能比较功能,可比较同一组数据在不同调度算法下的平均周转时间(7)具有一定的数据容错性 2.2程序设计流程图

最早期限优先调度算法(EDF)的特点和实现

最早期限优先调度算法(EDF)的特点和实现 摘要:最早期限优先调度算法是基于优先级的动态调度方法,是最优的单处理器调度算法,具有灵活性高、能充分利用CPU计算能力的特点。但是同时也具有调度开销增大、不能确定优先级低的任务截止之间能否得到满足的缺点,从而产生了EDF算法的优化算法NEDF和DPDS,较好的解决了上述问题,平衡了CPU使用率、响应时间、公平性和截止时间的问题。关键词:任务调度;动态调度;优先级;EDF 引言:随着计算机的发展,多道程序处理的出现需要强大的调度算法来对多任务进行调度,以确定多任务环境下任务的执行顺序以及占有CPU时间。相对于静态、不可抢占的调度方法,EDF的出现使之凭借灵活性高、CPU占有率高很快成为最优的单处理器调度算法。 一、任务调度的基本概念 在计算机发展的初期,需要使用计算机时,通常要集中在计算机所在的地方,人为的以作业的方式把工作内容一件一件的交给计算机处理,也就不存在调度的概念。随后,出现了计算机的批处理方式,计算机把作业按照先来先服务的方式进行处理,体现了一种非常简单的调度概念。随着多道程序处理方式的出现,调度逐渐变得重要和复杂起来。 在多任务的实时操作系统中,调度是一个非常重要的功能,用来确定多任务环境下任务执行的顺序和获得CPU资源后能够执行的时间长度。操作系统通过一个调度程序看来实现调度功能,调度程序以函数的形式存在,用来实现操作系统的调度算法。 调度程序是影响系统性能(如吞吐率、延迟时间等)的重要部分。在设计调度程序时,通常要综合考虑如下因素:CPU的使用率、输入、输出设备的吞吐率、响应时间、公平性和截止时间。这些因素之间有一定的冲突性,在设计调度程序时需要优先考虑最重要的需求,然后再各种因素之间进行折中处理。 二、调度方法的分类 对于大量的实时调度方法来说,主要存在以下几种划分方法: 1、离线(off-line)和在线(on-line)调度 根据获得调度信息的时机,调度算法可以分为离线调度和在线调度两类。对

非抢占式优先级

非抢占式优先级#include #define MAX 10 struct Process { char name[10]; float AT; float sT; float RT; float fT; int priority;//优先数 int order;//进程执行次序 int flag;//标记进程状态 }p[MAX]; int count; //排列到达时间 //按到达时间与优先数计算执行序列 void P() { float temp_time=0; int i=0,j; int k,temp_count; int max_priority; max_priority=p[i].priority; j=1; while((jp[i].priority){ max_priority=p[j].priority; i=j; } j++; } k=i; p[k].sT=p[k].A T;//开始时间=达到时间 p[k].fT=p[k].sT+p[k].RT; p[k].flag=1; temp_time=p[k].fT; p[k].order=1; temp_count=1; while(temp_count

//判断到达时间是否小于上一个进程的结束时间并且非处在运行状态 if((p[j].AT<=temp_time)&&(!p[j].flag)) //判断进程优先数是否大于最大优先数,如果大于,就将其值赋给max_priority if(p[j].priority>max_priority){ max_priority=p[j].priority; k=j; } if(p[j].AT>temp_time) { k=j; temp_time=p[j].AT; } } p[k].sT=temp_time; p[k].fT=p[k].sT+p[k].RT; p[k].flag=1; temp_time=p[k].fT; temp_count++; p[k].order=temp_count; } } void input() { int i; printf("\n-------------------------------------------------------------------------------\n"); printf("\n请输入进程名到达时间运行时间优先数,例如:a 0 100 1\n"); for(i=0;i

设计一个按优先数调度算法实现处理器调度的程序 改

题目:设计一个按优先数调度算法实现处理器调度的程序 提示: (1)假定系统有5个进程,每个进程用一个PCB来代表。PCB的格式为: 进程名、指针、要求运行时间、优先数、状态。 进程名——P1~P5。 指针——按优先数的大小把5个进程连成队列,用指针指出下一个进程PCB的首地址。 要求运行时间——假设进程需要运行的单位时间数。 优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。 状态——假设两种状态,就绪,用R表示,和结束,用E表示。初始状态都为就绪状态。 (2) 每次运行之前,为每个进程任意确定它的“优先数”和“要求运行时间”。 (3) 处理器总是选队首进程运行。采用动态改变优先数的办法,进程每运行1次,优先 数减1,要求运行时间减1。 (4) 进程运行一次后,若要求运行时间不等于0,则将它加入队列,否则,将状态改为“结 束”,退出队列。 (5) 若就绪队列为空,结束,否则,重复(3)。 2.程序中使用的数据结构及符号说明: #define num 5//假定系统中进程个数为5 struct PCB{ char ID;//进程名 int runtime;//要求运行时间 int pri;//优先数 char state; //状态,R-就绪,F-结束 }; struct PCB pcblist[num];//定义进程控制块数组 3.流程图: (1)主程序流程图: (2)子程序init()流程图:

(3) 子程序max_pri_process()流程图:

(4)子程序show()流程图:

(5)子程序run()流程图:

操作系统编程进程或作业先来先服务、高优先权、按时间片轮转调度算法

操作系统编程进程或作业先来先服务、高优先权、按时间 片轮转调度算法 湖南农业大学科学技术师范学院 学生实验报告 姓名: 汤黎波年级专业班级 06级计算机教育班日期 2008 年 12 月 8 日 成绩 验证设计编程进程或作业先来先服务、 综合创新实验类型课程名称计算机操作系统实验名称高优先权、按时间片轮转调度 算法(4学时) 【实验目的、要求】 实验目的:(1)通过编写程序实现进程或作业先来先服务、高优先权、按时间片轮转调度算法,使学生进一步掌握进程调度的概念和算法,加深对处理机分配的理解。 (2)了解Windows2000/XP中进程(线程)的调度机制。 (3)学习使用Windows2000/XP中进程(线程)调度算法,掌握相应的与调度有关的Win32 API 函数。 实验要求:(1)经调试后程序能够正常运行。 (2)采用多进程或多线程方式运行,体现了进程或作业先来先服务、高优先权、按时间片轮转 调度的关系。 (3)程序界面美观。

【实验内容】 在Windows XP、Windows 2000等操作系统下,使用C语言,利用相应的WIN32 API函数,编写程序实现进程或作业先来先服务、高优先权、按时间片轮转调度算法。 【实验环境】(含主要设计设备、器材、软件等) Pc电脑一台 【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、 数据等) 定义: 1)先来先服务算法:如果早就绪的进程排在就绪队列的前面,迟就绪的进程排 在就绪队列的后面, 那么先来先服务(FCFS:first come first service)总是把当前处于就绪队列 之首的那个进程 调度到运行状态。 2)轮转法就是按一定时间片(记为q)轮番运行各个进程。如果q是一个定值,则轮转法是一种对各 进程机会均等的调度方法。 3)优先级调度的基本思想是,把当前处于就绪队列中优先级最高的进程投入运行,而不管各进程的 下一个CPU周期的长短和其他因素。 实验步骤: (1)需求分析:了解基本原理,确定程序的基本功能,查找相关资料,画出基本的数据流图; (2)概要设计:确定程序的总体结构、模块关系和总体流程; (3)详细设计:确定模块内部的流程和实现算法;

pintos Lab2 实验报告

华东师范大学软件学院实验报告 实验课程:操作系统实践年级:大二实验成绩: 实验名称:Pintos-User Programs 姓名: 实验编号:学号:实验日期:2018/12/27 指导教师:组号:实验时间:4学时 一、实验目的 当前, 我们已经完成了pintos 的第一部分(熟悉了其基础结构和线程包), 现在是开始处理系统中允许运行用户程序的部分的时候了。基本代码已经支持加载和运行用户程序, 但不能加载和运行或交互性。在此项目中, 我们将使程序能够通过系统调用与操作系统进行交互。我们将在"userprog" 目录中进行工作, 但我们也将与pintos 的几乎所有其他部分进行交互。 具体目的如下: (1)了解Pintos操作系统的功能流程及内核的软件工程结构。 (2)通过Pintos操作系统内核的剖析,了解现有Pintos操作系统在处理用户程序方面中存在的参数传递问题,有效解决其参数传递的问题。 (3)通过Pintos内核剖析,了解其中断处理的机制,学会操作系统中断功能的编写方法。 (4)了解现有Pintos操作系统的系统调用功能,根据其中断机制,完善系统调用功能,使Pintos系统具有处理用户中断请求的功能。 (5)通过Pintos内核剖析,解决现有Pintos操作系统中存在的进程终止时缺少终端提示的问题。 (6)通过Pintos内核剖析,解决现有Pintos操作系统中存在的运行文件禁止写操作的问题。 二、实验内容与实验步骤

实验内容如下: (1)在分析内核的基础上,对Pintos操作系统的参数传递问题提出有效的策略,设计算法,分步跟踪和调试,通过实践,有效解决参数传递问题,并对实验结果进行分析。 (2)通过Pintos操作系统内核的剖析,了解其中断处理的机制,在此基础上,完善Pintos的系统调用功能,设计算法,分步跟踪和调试,通过测试分析完善的系统调用功能。 (3)在分析内核的基础上,对现有Pintos操作系统进行完善,增加进程终止的终端提示功能,设计算法,分步跟踪和调试,通过实践,验证终端提示功的有效性。 (4)在分析内核的基础上,对现有Pintos操作系统进行完善,增加运行文件禁止写操作的功能,设计算法,分步跟踪和调试,通过实践,验证禁止写操作功能的有效性。 具体步骤: (1)进程终止的终端提示 每当用户进程终止时,不管是自愿退出或出于任何其他原因, 请打印进程的名称和退出代码, 格式为printf ("%s: exit(%d)\n", ...)。打印的名称应该是传递给 process_execute() 的全名, 省略了命令行参数。当不是用户进程的内核线程终止 或调用停止系统调用时, 不要打印这些消息。当进程加载失败时, 该消息是可选 的。除此之外, 不要打印任何其他消息。 (2)参数传递 目前, process_execute() 不支持将参数传递给新进程。实现此功能, 通过扩展process_execute(), 使其不是简单地将程序文件名作为其参数, 而是将其划分为空 格中的单词。第一个单词是程序名称, 第二个单词是第一个参数, 依此类推。也 就是说, process_execute ("grep foo bar") 应该运行grep 传递两个参数foo 和 bar。在命令行中, 多个空格等效于单个空格, 因此process_execute("grep foo bar") 相当于我们最初的示例。我们可以对命令行参数的长度施加合理的限制。 (3)系统调用 在"userprogsecalls. c" 中实现系统调用处理程序。我们通过终止进程提供" 句柄" 系统调用的骨架实现。它将需要检索系统调用号码, 然后检索任何系统调 用参数, 并执行适当的操作。实现以下系统调用。列出的原型是由一个用户程序 看到的, 其中包括"lib/usersicl. h"(此h文件以及“lib/user“中的所有其他h文 件仅供用户程序使用)。每个系统调用的系统调用编号在"libsicall-nr. h" 中定义:

实验二——动态高优先权优先调度算法

《操作系统》课程实验报告实验名称:动态分区存储管理 姓名:王子瑜 学号: 541413450235 地点:四教楼 指导老师:刘放美 专业班级:软件工程(测试技术14-02) 实验成绩:

一、实验要求: 熟悉并掌握动态分区分配的各种算法。 熟悉并掌握动态分区中分区回收的各种情况,并能够实现分区合并。 二、实验内容: 用高级语言模拟实现动态分区存储管理,要求: 1、分区分配算法至少实现首次适应算法、最佳适应算法和最坏适应算法中的至 少一种。熟悉并掌握各种算法的空闲区组织方式。 2、分区的初始化——可以由用户输入初始分区的大小。(初始化后只有一个空 闲分区,起始地址为0,大小是用户输入的大小) 3、分区的动态分配过程:由用户输入作业号和作业的大小,实现分区过程。 4、分区的回收:用户输入作业号,实现分区回收,同时,分区的合并要体现出 来。(注意:不存在的作业号要给出错误提示!) 5、分区的显示:任何时刻,可以查看当前内存的情况(起始地址是什么,大小 多大的分区时空闲的,或者占用的,能够显示出来) 要求考虑:(1)内存空间不足的情况,要有相应的显示; (2)作业不能同名,但是删除后可以再用这个名字; (3)作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存在,也要有相应的提示。 三、实验代码 #include #include #define SIZE 640 // 内存初始大小 #define MINSIZE 5 // 碎片最小值 enum STATE { Free, Busy }; struct subAreaNode { int addr; // 起始地址 int size; // 分区大小

非抢占式高优先级调度算法

/* 非抢占式高优先级调度算法(优先数越大级别越高) 算法思想:在按进程达到时间由小到大的顺序输入进程信息后,先对其优先数进行排列,将最先到达的进程的到达时间设为开始时间,计算结束时间, 然后对后面到达的时间与该进程的结束时间进行比较,如若小于该进程的结束时间,记录进程的个数,再对其优先数逐个进行比较,将优 先数最大的提到前面,每次进程结束都要进行比较,得到执行序列,在依次输出结果 */ #include<> #define MAX 100 struct hrfs { char name[10]; float arrvitetime; float starttime; float servietime; float finishtime; int priority;riority; j=1; while((jp[i].priority){ max_priority=p[j].priority; i=j; } j++; } k=i; p[k].starttime=p[k].arrvitetime;inishtime=p[k].starttime+p[k].servietime; p[k].run_flag=1; temp_time=p[k].finishtime; p[k].order=1; temp_count=1; while(temp_countmax_priority){ max_priority=p[j].priority; k=j; } } p[k].starttime=temp_time; p[k].finishtime=p[k].starttime+p[k].servietime;

静态优先权优先算法的进程调度程序

静态优先权优先算法的进程调度程序 学院 专业 学生姓名 学号 指导教师姓名 21014年3 月19 日

目录 1.系统需求分析 (1) 1.1问题描述 (1) 1.2功能要求 (1) 2.总体设计 (1) 2.1总体设计图 (2) 2.2各模块功能 (2) 2.3相关数据结构设计 (3) 3.详细设计 (3) 3.1采用C语言定义的相关数据类型 (3) 3.2调度算法的主要实现 (4) 4.运行结果 (4) 4.1系统调试 (4) 4.2功能实现界面 (5) 5.使用说明 (7) 6.心得体会 (8) 7.附录 (8) 7.1 源代码 (8) 7.2 参考文献 (17)

1.系统需求分析 1.1问题描述 1)设计并实现一个采用静态优先权算法的进程调度演示程序。并且求出每个进程的周转时间以及带权周转时间。 2)静态优先权是在创建进程时确定的,且在进程的整个运行期间保持不变. 一般地,优先权是利用某一范围内的一个整数来表示的,例如,0~7或0~255中的某一整数, 又把该整数称为优先数.只是具体用法各异:有的系统用"0"表示最高优先权,当数值愈大时,其优先权愈低;而有的系统恰恰相反. 确定进程优先权的依据有如下三个方面: a.进程类型.(系统进程/用户进程) b.进程对资源的需求.(需求量的大小) c.用户要求.(用户进程紧迫程度) 3)本程序采用优先级数字大的优先权大。 1.2功能要求 1)每一个进程有一个PCB,其内容可以根据具体情况设定。 2)进程数、进入内存时间、要求服务时间、优先级等均可以在界面上设定。3)可读取样例数据(要求存放在外部文件中)进行进程数、进入内存时间、进程优先级的初始化。 4)可以在运行中显示各进程的状态:就绪、执行(由于不要求设置互斥资源与进程间的同步关系,故只有两种状态)。 5)具有一定的数据容错性。

作业调度之最短作业优先算法5例题解析.doc

作业调度之最短作业优先算法5例题解析 例题一、某系统采用不能移动已在主存储器中作业的可变分区方式管理主存储器,现有供用户使用的主存空间100K,系统配有4台磁带机,有一批作业见下表: 作业序号进输入井时间要求计算时间需要主存容量申请磁带机数 1 10:00 25分钟15K 2台 2 10:20 30分钟60K 1台 3 10:30 10分钟50K 3台 4 10:3 5 20分钟10K 2台 5 10:40 15分钟30K 2台 按计算时间最短者优先算法如下表: 我的解释:系统首先装入1、2、4,但1结束时4沿未到达,因此先执行2;2执行完毕后,资源可以分配给3或5,考虑5的时间短优先分配5并执行,执行完5后,主存中只有4已就绪并等待执行,因此开始执行4,执行4的同时系统会将作业3装入主存,最后自然执行作业3;因此最后的顺序是: 1\2\5\4\3 作业序号进输入井时间进入主存时间开始计算时间结束计算时间周转时间解释 1 10:00 10:10 10:00 10:25 25 此时输入井中只有一个作业且满足资源要求,因此被选中运行。 2 10:20 10:20 10:25 10:55 35 作业2到达输入井,满足资源要求,装入主存,等到作业1运行完毕进入运行。 5 10:40 10:55 10: 55 11:10 30 由于作业3要求主存空间无法满足,因此作业4先行一步装入主存,当作业2让出处理器的同时,作业5满足资源要求进入主存就绪。根据算法作业5先进入处理器运行。

4 10:3 5 10:35 11:10 11:30 55 3 10:30 11:30 11:30 11:40 70 最后作业3装入主存并运行 平均周转时间:(25+35+30+55+70)/5=43 分钟 [分析]解答本题时应注意如下几个问题: 第一,系统采用的是多道程序设计技术,但没有限定并行工作的道数,因此,只要当前尚未分配的资源可以满足在输入井中等待的某些作业的要求时,作业调度可以按照给定的算法从中选择一个或多个作业装人主存储器; 第二,采用可变分区方式管理主存储器,但没给出主存空间的分配算法,因而,只要有合适的空间就可分配,题中还规定可用移动技术来合并分散的空闲区; 第三,对磁带机采用静态分配; 第四,进程调度采用可抢占的最高优先级调度算法,即对已被装人主存储器的作业而言优先级高的作业可抢占处理器执行; 第五,虽然作业需要使用磁带机,但题意中已提示忽略磁带机和调度所花的时间,所以,解题时不必考虑外围设备的启动二八D中断等复杂情况,只需把它们当作纯计算型的作业; 第六,由于没有规定什么时候开始进行作业调度,故在一般情况下只要输入井中有等待处理的作业就可按选定的算法去选择满足必要条件的作业。 根据本题的要求列表分析如下:

UCOS优先级调度算法最详解

UCOS优先级调度算法最详解 经过一个上午时间,终于明白UCOS系统的按优先级调度就绪任务的算法,以个人见解展示给各位,希望各位提出意见uponzw630@https://www.360docs.net/doc/b73214662.html,。 首先说明,解释两个表格的含义。 说明 OSMapTbl就是0-7这8个数值用二进制的BIT位来表示。 OSUnMapTbl就是将0x00-0xff每个数据中最低位为1的位号全部列举出来 INT8U const OSMapTbl[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; INT8U const OSUnMapTbl[] = { 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x00 to 0x0F*/ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x10 to 0x1F*/ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x20 to 0x2F*/ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x30 to 0x3F*/ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x40 to 0x4F*/ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x50 to 0x5F*/ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x60 to 0x6F*/ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x70 to 0x7F*/ 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x80 to 0x8F*/ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x90 to 0x9F*/ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xA0 to 0xAF*/ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xB0 to 0xBF*/ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xC0 to 0xCF*/ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xD0 to 0xDF*/ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xE0 to 0xEF*/ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /* 0xF0 to 0xFF*/ }; Y处于BIT5-BIT3,X处于BIT2-BIT0。 我们知道优先级prio的值越小,prio的优先级越高。 X和Y的范围均为000-111,十进制数里0-7,更8个级别,为了判断X或Y的大小,我们就引入了表格OSMapTbl[]= {0x01, 0x02, 0x04, 0x08, 0x10, 0x20,

相关文档
最新文档