操作系统原理课程设计

一、实验目的和要求

1、通过设计程序,实现磁盘寻道算法中FCFS、SSTF、SCAN和CSCAN四种算法,加深对磁盘寻道算法的理解和掌握。

二、实验设备、环境

设备:操作系统为WINDOWS系统的计算机;

环境:C、C++、JAVA编程实现均可

三、实验步骤

1、根据题目要求设计进程调度算法所需数据结构;

2、分析题意,重点分析题目要求并给出解决方法;

3、按题目要求实现磁盘寻道的各种算法功能,完成本实验报告,并将实验报告以学号+姓名+实验五命名;

4、提交完成的实验结果。

四、实验内容(选用C、C++、JAVA语言实现均可)

设计程序,实现磁盘寻道的各种算法功能。具体要求如下:

1、数据结构的设计:磁盘寻道算法中主要包含两个初始数据项:磁盘寻道序列和当前磁头运动方向(SCAN和CSCAN专用),请根据题目的要求,完成数据项的设定。

2、具体功能需求:

(1)数据初始化:

数据初始化阶段,包含了磁盘寻道序列的初始化。应要求用户输入序列长度,如:

请输入磁盘寻道序列长度(10-20,含端点):

初始化阶段应包含检测功能,如用户输入数字不在给定区间,应要求用户重新输入,如:

您输入的磁盘寻道序列长度超出给定范围,请重新输入10-20(含端点)的数字:

请输入磁盘寻道序列长度(10-20,含端点):

页面访问序列,直接采取随机生成方式,随机生成0-200之间的数字,作为磁道号,随机生成时请避免出现大量连续相同数字。

(2)序列随机生成后,输出初始化的数据,并要求用户进行算法的选择,如

   磁盘访问序列为:0,502535。。。。(逗号间隔)

   请选择要执行的磁盘寻道算法:1FCFS2SSTF3SCAN4CSACN

   如用户选择的不在范围内,要求用户重新输入,输出样例略。

(3)SCAN和CSCAN算法,应在用户选择该算法后,提示用户进一步选择当前磁头运动方向,如:

   请继续选择当前磁头运动方向:1、由低到高;2、由高到低

4)算法执行过程及输出

您选择了FCFS算法,执行结果如下:

当前磁道号              下一磁道号                          绝对差

0                       50                                   50

50                      25                                   25

25                      35                                   10

35                      。。。                                。。。

寻道序列总长**FCFS算法的平均寻道长度为****

您选择了SCAN算法,当前磁头运动方向为由低到高,执行结果如下:

当前磁道号              下一磁道号                          绝对差

0                       25                                   25

25                      35                                   10

35                      50                                   15

50                      。。。                                。。。

寻道序列总长**SCAN(由低到高)算法的平均寻道长度为****

算法执行结果输出完毕后,应提示用户,是否用同一组数据,继续其他算法,如:

本次计算已完成,请选择:1、继续尝试其他算法;2、更换数据;3、结束程序

                               

五、实验代码及测试截图

     要求:测试样例截图需提供所有系统功能的截图

     代码:

1)序列长度输入成功/错误截图

2)算法选择成功/失败截图

3FCFS算法执行结果截图

4SSTF算法执行结果截图

5)选择磁头运动方向截图

6SCAN算法执行结果截图

7CSCAN算法执行结果截图

8)算法执行完毕后,选择功能截图

六、实验体会和收获

(自由发挥)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个简单的时间片轮转调度算法的C语言代码实现,代码中使用了链表来存储进程控制块(PCB): ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME_LENGTH 20 #define TIME_SLICE 2 // 进程状态定义 typedef enum {Ready, Run, Finish} State; // 进程控制块(PCB)结构体 typedef struct pcb { char name[MAX_NAME_LENGTH]; int round; int cputime; int needtime; State state; struct pcb *next; } PCB; // 初始化进程控制块 void init_pcb(PCB *pcb, char *name, int round, int needtime) { strcpy(pcb->name, name); pcb->round = round; pcb->cputime = 0; pcb->needtime = needtime; pcb->state = Ready; pcb->next = NULL; } // 插入进程控制块到链表尾部 void insert_pcb(PCB **head, PCB *pcb) { if (*head == NULL) { *head = pcb; } else { PCB *p = *head; while (p->next != NULL) { p = p->next; } p->next = pcb; } } // 从链表中删除进程控制块 void delete_pcb(PCB **head, PCB *pcb) { if (*head == NULL) { return; } if (*head == pcb) { *head = pcb->next; } else { PCB *p = *head; while (p->next != NULL && p->next != pcb) { p = p->next; } if (p->next == pcb) { p->next = pcb->next; } } } // 时间片轮转调度算法 void round_robin_scheduling(PCB **head) { if (*head == NULL) { return; } PCB *p = *head; while (p != NULL) { if (p->state == Run) { p->cputime += TIME_SLICE; p->needtime -= TIME_SLICE; if (p->needtime <= 0) { p->state = Finish; printf("Process %s finished.\n", p->name); } else if (p->cputime >= p->round) { p->state = Ready; p->cputime = 0; printf("Process %s time slice ended.\n", p->name); } break; } p = p->next; } if (p == NULL) { p = *head; } else { p = p->next; } while (p != *head) { if (p->state == Ready) { p->state = Run; printf("Process %s is running.\n", p->name); break; } p = p->next; } if (p == *head && p->state != Run) { printf("No process to run.\n"); } } // 打印进程状态 void print_state(PCB *pcb) { switch (pcb->state) { case Ready: printf("Ready"); break; case Run: printf("Run"); break; case Finish: printf("Finish"); break; } } // 打印所有进程状态 void print_all_state(PCB *head) { PCB *p = head; while (p != NULL) { printf("Process %s, round %d, cputime %d, needtime %d, state ", p->name, p->round, p->cputime, p->needtime); print_state(p); printf("\n"); p = p->next; } } int main() { PCB *head = NULL; PCB *p1 = (PCB *)malloc(sizeof(PCB)); init_pcb(p1, "Process1", 4, 10); insert_pcb(&head, p1); PCB *p2 = (PCB *)malloc(sizeof(PCB)); init_pcb(p2, "Process2", 2, 8); insert_pcb(&head, p2); PCB *p3 = (PCB *)malloc(sizeof(PCB)); init_pcb(p3, "Process3", 3, 6); insert_pcb(&head, p3); print_all_state(head); printf("\n"); while(head != NULL) { round_robin_scheduling(&head); print_all_state(head); printf("\n"); } return 0; } ``` 这段代码实现了一个包含三个进程的时间片轮转调度算法。在运行时,程序会输出每个进程的状态,包括进程名、轮转时间片、已占用的CPU时间、剩余需要的CPU时间和状态(Ready、Run、Finish)。每次调度后,程序会输出当前正在运行的进程名和所有进程的状态。如果没有进程可以运行了,则输出“No process to run.”。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值