您的当前位置:首页正文

动态高优先权优先

2021-08-23 来源:星星旅游
《操作系统》课程实验报告

姓名: 学号: 地点: 指导老师: 专业班级:

实验名称:动态高优先权优先一、实验内容:

1、 实验内容:

2、 模拟实现动态高优先权优先(若数值越大优先权越高,每运行一个时间单位优先权-n,

若数值越小优先权越高,没运行一个时间单位优先权+n),具体如下:

3、 设置作业体:作业名,作业的到达时间,服务时间,初始优先权,作业状态(W——等

待,R——运行,F——完成),作业间的链接指针

4、 作业初始化:由用户输入作业名、服务时间、初始优先权进行初始化,同时,初始化作

业的状态为W。

5、 显示函数:在作业调度前、调度中和调度后进行显示。

6、 排序函数:对就绪状态的作业按照优先权排序。优先权相同时进入等待队列时间早的作

业在前。注意考虑到达时间

7、 调度函数:每次从等待队列队首调度优先权最高的作业执行,状态变化。并在执行一个

时间单位后优先权变化,服务时间变化,状态变化。当服务时间为0时,状态变为F。 8、 删除函数:撤销状态为F的作业。

实验要求:

9、 测试数据可以随即输入或从文件中读入。 10、 必须要考虑到作业的到达时间 11、 最终能够计算每一个作业的周转时间。

三、实验代码

#include #include

struct PCB{ charp_name[20]; intp_priority; intp_needTime; intp_runTime; charp_state;

struct PCB* next; };

voidHighPriority(); voidRoundRobin(); void Information(); char Choice();

struct PCB* SortList(PCB* HL);

int main() {

Information();

char choice = Choice(); switch(choice) { case '1':

system(\"cls\"); HighPriority(); break; case '2':

system(\"cls\"); RoundRobin(); break; default: break; }

system(\"pause\"); return 0; }

char Choice() {

printf(\"\\n\\n\");

printf(\" ********************************************* \\n\");

printf(\" 进程调度演示\\n\");

printf(\" ********************************************* \\n\\n\\n\");

printf(\" 1.演示最高优先数优先算法。\\n\"); printf(\" 2.演示轮转法算法。\\n\"); printf(\" 3.退出程序。\\n\\n\\n\\n\");

printf(\" 选择进程调度方法:\"); charch = getchar(); returnch;

system(\"cls\"); }

voidHighPriority() {

struct PCB *processes, *pt;

//pt作为临时节点来创建链表

processes = pt = (struct PCB*)malloc(sizeof(struct PCB)); for (inti = 0; i != 5; ++i) {

struct PCB *p = (struct PCB*)malloc(sizeof(struct PCB)); printf(\"进程号No.%d:\\n\

printf(\"输入进程名:\"); scanf(\"%s\printf(\"输入进程优先数:\"); scanf(\"%d\printf(\"输入进程运行时间:\"); scanf(\"%d\p->p_runTime = 0; p->p_state = 'W'; p->next = NULL; pt->next = p; pt = p;

printf(\"\\n\\n\"); }

getchar(); //接受回车

//processes作为头结点来存储链表 processes = processes->next; int cases = 0;

struct PCB *psorted = processes; while (1) {

++cases; pt = processes;

//对链表按照优先数排序

//psorted用来存放排序后的链表 psorted = SortList(psorted);

printf(\"The execute number: %d\\n\\n\

printf(\"**** 当前正在运行的进程是:%s\\n\psorted->p_state = 'R';

printf(\"qname state super ndtime runtime\\n\");

printf(\"%s\%c\%d\%d\%d\\\n\\n\psorted->p_priority, psorted->p_needTime, psorted->p_runTime); pt->p_state = 'W';

psorted->p_runTime++; psorted->p_priority--;

printf(\"**** 当前就绪状态的队列为:\\n\\n\"); //pt指向已经排序的队列 pt = psorted->next; while (pt != NULL) {

printf(\"qname state super ndtime runtime\\n\");

printf(\"%s\%c\%d\%d\%d\\\n\\n\pt->p_needTime, pt->p_runTime); pt = pt->next; }

//pt指向已经排序的链表,判断链表是否有已用时间啊等于需要时间的 pt = psorted; struct PCB *ap;

ap = NULL; //ap指向pt的前一个节点 while (pt != NULL) {

if (pt->p_needTime == pt->p_runTime) { if (ap == NULL) { pt = psorted->next; psorted = pt;

} else

ap->next = pt->next; } ap = pt;

pt = pt->next; }

if (psorted->next == NULL) break; getchar(); } }

struct PCB* SortList(PCB* HL) {

struct PCB* SL;

SL = (struct PCB*)malloc(sizeof(struct PCB)); SL = NULL;

struct PCB* r = HL; while (r != NULL) {

struct PCB* t = r->next; struct PCB* cp = SL; struct PCB* ap = NULL; while (cp != NULL) {

if (r->p_priority>cp->p_priority) break; else

{ ap = cp;

cp = cp->next;

} }

if (ap == NULL) { r->next = SL;

SL = r; } else

{ r->next = cp; ap->next = r; } r = t; } return SL; }

//轮转算法

voidRoundRobin() {

struct PCB *processes, *pt;

//pt作为临时节点来创建链表

processes = pt = (struct PCB*)malloc(sizeof(struct PCB)); for (inti = 0; i != 5; ++i) {

struct PCB *p = (struct PCB*)malloc(sizeof(struct PCB)); printf(\"进程号No.%d:\\n\printf(\"输入进程名:\"); scanf(\"%s\

printf(\"输入进程运行时间:\"); scanf(\"%d\p->p_runTime = 0; p->p_state = 'W'; p->next = NULL; pt->next = p; pt = p;

printf(\"\\n\\n\"); }

getchar(); //接受回车

//processes作为头结点来存储链表 processes = processes->next; int cases = 0; while (1) {

++cases;

pt = processes;

printf(\"The execute number: %d\\n\\n\

printf(\"**** 当前正在运行的进程是:%s\\n\pt->p_state = 'R';

printf(\"qname state super ndtime runtime\\n\");

printf(\"%s\%c\%d\%d\%d\\\n\\n\pt->p_needTime, pt->p_runTime); pt->p_state = 'W'; pt->p_runTime++; pt->p_priority--;

printf(\"**** 当前就绪状态的队列为:\\n\\n\"); pt = pt->next;

while (pt != NULL) {

printf(\"qname state super ndtime runtime\\n\");

printf(\"%s\%c\%d\%d\%d\\\n\\n\pt->p_needTime, pt->p_runTime); pt = pt->next; }

//检测是否运行时间等于需要时间,是的话从队列里面删除,不是的话加到队列最尾部 pt = processes;

if (pt->p_needTime == pt->p_runTime) {

pt->p_state = 'C'; pt = processes->next; processes = pt; } else

{

if (pt ->next != NULL) {

//寻找最后一个节点 while (pt->next != NULL) pt = pt->next;

struct PCB* ptem;//临时节点用来帮助把头结点插到尾部 ptem = processes->next; pt->next = processes; processes->next = NULL; processes = ptem; } } pt = processes; if (pt == NULL)

break; getchar(); } }

四、实验结果

输入进程名字,进程优先数和进程时间:

图3

图4

图5

图6

图7

图8

PS:仅显示前6个时间片。

五、实验总结

静态优先级 (1)含义

静态优先级是在创建进程时确定进程的优先级,并且规定它在进程的整个运行期间保持不变。

(2)确定优先级的依据

确定优先级的依据通常有下面几个方面:

①进程的类型。通常系统进程优先级高于一般用户进程的优先级;交互型的用户进程的优先级高于批处理作业所对应的进程的优先级。

②进程对资源的需求。例如,进程的估计执行时间及内存需求量少的进程,应赋于较高的优先级,这有利缩小作业的平均周转时间。

③根据用户的要求。用户可以根据自己作业的紧迫程度来指定一个合适的优先级。 (3)优缺点

静态优先级法的优点是 ①简单易行 ②系统开销小。 缺点是

①不太灵活,很可能出现低优先级的作业(进程),长期得不到调度而等待的情况。

②静态优先级法仅适用于实时要求不太高的系统。 动态优先级 (1)含义

动态优先级是在创建进程时赋予该进程一个初始优先级,然后其优先级随着进程的执行情况的变化而改变,以便获得更好的调度性能。

(2)优缺点

动态优先级优点是使相应的优先级调度算法比较灵活、科学,可防止有些进程一直得不到调度,也可防止有些进程长期垄断处理机。动态优先级缺点是需要花费相当多的执行程序时间,因而花费的系统开销比较大。

因篇幅问题不能全部显示,请点此查看更多更全内容