操作系统自学笔记代码篇——磁盘调度算法之FSCAN

该程序首先接收用户输入的磁盘总数和磁块范围,然后生成随机磁块序列。接着,它将磁块按扫描方向分配到两个队列,并对每个队列进行排序。最后,程序输出磁盘调度顺序,优化磁盘访问效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#include <limits.h>

// 计算两个磁块之间的距离
int Distance(int block1, int block2) {
    return abs(block2 - block1);
}

int main() {
    int disk_num, disk_range;

    printf("请输入磁盘总数:");
    scanf("%d", &disk_num);

    printf("请输入磁块范围:");
    scanf("%d", &disk_range);

    // 初始化随机数种子
    srand((unsigned int)time(NULL));

    // 生成随机磁块序列
    int* disk_list = (int*)malloc(disk_num * sizeof(int));
    printf("随机生成的磁块序列为:");
    for (int i = 0; i < disk_num; i++) {
        disk_list[i] = rand() % (disk_range + 1);
        printf("%d ", disk_list[i]);
    }
    printf("\n");

    // 初始化队列
    int* queue1 = (int*)malloc(disk_num * sizeof(int));
    int* queue2 = (int*)malloc(disk_num * sizeof(int));
    int front1 = 0, rear1 = 0;
    int front2 = 0, rear2 = 0;

    // 将请求按照扫描方向分配到两个队列
    int current_block = 0;
    for (int i = 0; i < disk_num; i++) {
        if (disk_list[i] < current_block) {
            queue1[rear1++] = disk_list[i];
        }
        else {
            queue2[rear2++] = disk_list[i];
        }
    }

    // 对两个队列分别进行排序
    for (int i = front1; i < rear1 - 1; i++) {
        for (int j = front1; j < rear1 - i - 1; j++) {
            if (queue1[j] < queue1[j + 1]) {
                int temp = queue1[j];
                queue1[j] = queue1[j + 1];
                queue1[j + 1] = temp;
            }
        }
    }

    for (int i = front2; i < rear2 - 1; i++) {
        for (int j = front2; j < rear2 - i - 1; j++) {
            if (queue2[j] > queue2[j + 1]) {
                int temp = queue2[j];
                queue2[j] = queue2[j + 1];
                queue2[j + 1] = temp;
            }
        }
    }

    printf("磁盘调度顺序为:");

    // 先输出队列2中的磁块序列
    for (int i = front2; i < rear2; i++) {
        printf("%d ", queue2[i]);
        current_block = queue2[i];
    }

    // 再输出队列1中的磁块序列
    for (int i = front1; i < rear1; i++) {
        printf("%d ", queue1[i]);
        current_block = queue1[i];
    }

    printf("\n");

    free(disk_list);
    free(queue1);
    free(queue2);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值