磁盘非跨盘访问算法实现

1. 背景说明

本算法基于已将磁盘分布合并并排序为升序线性表。实现示例为:磁盘扇区大小:32(可自定义),待拆分磁盘内存: [0 - 50],[60 - 100](可增加)。示意图如下:

2. 示例代码

allocateAddr.c

/* 地址分配算法 */

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 10
#define SEC_SIZE 32

typedef struct {
	int startAddr;
	int endAddr;
} IoAddr;

int GetUpBound(const IoAddr *addr)
{
	int i;
	for (i = 1; i <= SEC_SIZE; ++i) {
		if ((addr->startAddr + i) % SEC_SIZE == 0) {
			return i - 1;
		}
	}

	return 0;
}

int GetMin(int a, int b)
{
	return (a <= b) ? a : b;
}

IoAddr *Process(int addrSize, int *detaSize, IoAddr *addr)
{
	IoAddr *detatch = (IoAddr *)malloc(sizeof(IoAddr) * MAX_SIZE);
	int secLength;
	int upBound;
	*detaSize = 0;
	int min;
	for (int i = 0; i < addrSize; ++i) {
		secLength = (addr + i)->endAddr - (addr + i)->startAddr + 1;
		while (secLength) {
			upBound = GetUpBound(addr + i);
			min = GetMin(upBound, secLength - 1);
			detatch[*detaSize].startAddr = (addr + i)->startAddr;
			detatch[*detaSize].endAddr = (addr + i)->startAddr + min;
			++(*detaSize);
			(addr + i)->startAddr += (min + 1);
			if ((addr + i)->startAddr > (addr + i)->endAddr) {
				break;
			}

			secLength = (addr + i)->endAddr - (addr + i)->startAddr + 1;
		}
	}

	return detatch;
}

int main(void)
{
	IoAddr *memory = (IoAddr *)malloc(sizeof(IoAddr) * 2);
	memory[0].startAddr = 0;
	memory[0].endAddr = 50;
	memory[1].startAddr = 60;
	memory[1].endAddr = 100;
	int detaSize;
	IoAddr *detatch = Process(2, &detaSize, memory);
	printf("The allocation is as follows:\n\n");
	for (int i = 0; i < detaSize; ++i) {
		printf("[%-3d %-3d]\n", detatch[i].startAddr, detatch[i].endAddr);
	}

	free(memory);
	free(detatch);

	return 0;
}

3. 运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供磁盘调度Q-SCAN算法的Java实现。Q-SCAN算法是一种磁盘调度算法,它可以优化磁盘的读写速度,提高系统的效率。以下是基于Java语言的Q-SCAN算法实现代码: ``` import java.util.*; public class QSCAN { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入磁盘访问序列,用空格隔开:"); String s = sc.nextLine(); String[] str = s.split(" "); int[] arr = new int[str.length]; System.out.println("请输入磁头的起始位置:"); int start = sc.nextInt(); System.out.println("请输入磁道数:"); int num = sc.nextInt(); for (int i = 0; i < str.length; i++) { arr[i] = Integer.parseInt(str[i]); } Arrays.sort(arr); int index = 0, sum = 0, direction = 1; List<Integer> left = new ArrayList<>(); List<Integer> right = new ArrayList<>(); for (int i = 0; i < arr.length; i++) { if (arr[i] < start) { left.add(arr[i]); } else { right.add(arr[i]); } } while (left.size() > 0 || right.size() > 0) { if (direction == 1) { if (right.size() == 0) { direction = -1; continue; } int min = num + 1; for (int i = 0; i < right.size(); i++) { if (right.get(i) < min) { min = right.get(i); index = i; } } start = right.get(index); right.remove(index); sum += start; } else { if (left.size() == 0) { direction = 1; continue; } int max = -1; for (int i = 0; i < left.size(); i++) { if (left.get(i) > max) { max = left.get(i); index = i; } } start = left.get(index); left.remove(index); sum += start; } } System.out.println("磁盘移动总距离为:" + sum); } } ``` 您可以将上述代码复制到Java开发环境中进行编译和运行。在运行程序时,您需要输入磁盘访问序列、磁头的起始位置和磁道数等信息,程序将自动计算出磁盘移动的总距离,并将结果输出到屏幕上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值