实验要求:
C语言读盘程序设计:块方式或文件方式(电子版)
(1).写的代码要有注释说明。
(2).要有运行结果截图。
(3).以实验报告的形式提交。
输入:磁头所在的位置以及对块的请求序列
输出:对块的调度访问序列
算法:你自己用C语言模拟一个读盘的调度算法
实验内容与算法分析:
NOOP电梯算法实现了一个简单的FIFO队列,它像电梯的工作主法一样对I/O请求进行组织,当有一个新的请求到来时,它将请求合并到最近的请求之后,以此来保证请求同一介质.NOOP倾向饿死读而利于写.因为写请求比读请求更容易.写请求通过文件系统cache,不需要等一次写完成,就可以开始下一次写操作,写请求通过合并,堆积到I/O队列中.读请求需要等到它前面所有的读操作完成,才能进行下一次读操作.在读操作之间有几毫秒时间,而写请求在这之间就到来,饿死了后面的读请求.
实验运行记录
第一个参数为当前读取位置,后续参数为请求的数字
C语言源码
#include <stdio.h>
#include <stdlib.h>
intcmp(const void *a, const void *b){
return *(int *)a > *(int *)b;
}
int main(intargc, char *argv[]){ // 第一个参数为当前读取位置,后续参数为请求的数字int stack[100];
intpos = atoi(argv[1]);
inti;
intstack_top;
int requests[100];
if(argc< 3){
fprintf(stderr, "至少2参数\n");
return 1;
}
else if(argc> 102){
fprintf(stderr, "数字数量太多\n");
return 2;
}
for(i = 2; i<argc; i++){
requests[i - 2] = atoi(argv[i]);
}
qsort(requests, argc - 2, sizeof(int), cmp); //对请求排序
for(i = 0; i<argc - 2; i++){
if(requests[i] <pos){
stack[i] = requests[i]; //存储位置比当前指针小的数据
stack_top = i;
}else{
printf("%d, ", requests[i]); //输出位置比当前指针大的数据}
}
for(; stack_top>= 0; stack_top--){
printf("%d, ", stack[stack_top]); // 反向输出位置比当前指针大的数据}
printf("\n");
}。